'use strict';
/**
* @author Marco Lehmann <marco.lehmann@kiwigrid.com>
* @copyright Kiwigrid GmbH 2014-2015
* @module keta.services.TagSet
* @description TagSet Provider
*/
angular.module('keta.services.TagSet',
[
'keta.services.Tag'
])
/**
* @class ketaTagSetProvider
* @propertyOf keta.services.TagSet
* @description TagSet Provider
*/
.provider('ketaTagSet', function TagSetProvider() {
this.$get = function TagSetService() {
/**
* @class TagSetInstance
* @propertyOf TagSetProvider
* @description TagSet Instance
*/
var TagSetInstance = function() {
// keep reference
var that = this;
// internal array of tags
var tags = [];
// internal map of tags
var tagsAsHierarchy = {};
/**
* @name getTags
* @function
* @description
* <p>
* Returns tags as an Array.
* </p>
* @returns {Array} tags
* @example
* angular.module('exampleApp', ['keta.services.TagSet'])
* .controller('ExampleController', function(ketaTagSet) {
* var tagSet = ketaTagSet.create();
* var tags = tagSet.getTags();
* });
*/
that.getTags = function() {
return tags;
};
/**
* @name getTagsAsHierarchy
* @function
* @description
* <p>
* Returns tags as hierarchically organized Object. First level represents devices
* specified by <code>guid</code> property. On the second level <code>name</code> property
* is used as key pointing to the <code>Tag</code> object.
* </p>
* @returns {Object} tagsAsHierarchy
* @example
* angular.module('exampleApp', ['keta.services.TagSet'])
* .controller('ExampleController', function(ketaTagSet) {
* var tagSet = ketaTagSet.create();
* var hierarchy = tagSet.getTagsAsHierarchy();
* });
*/
that.getTagsAsHierarchy = function() {
return tagsAsHierarchy;
};
/**
* @name add
* @function
* @description
* <p>
* Adds a <code>Tag</code> object to the <code>TagSet</code> if it doesn't exist already.
* In this case nothing will be changed.
* </p>
* @param {TagInstance} tag Tag to add
* @returns {TagSetInstance} TagSetInstance with added TagInstance
* @example
* angular.module('exampleApp', ['keta.services.TagSet'])
* .controller('ExampleController', function(ketaTagSet) {
* ketaTagSet
* .create()
* .add(Tag.create({
* guid: 'guid',
* name: 'name',
* sampleRate: 10
* }));
* });
*/
that.add = function(tag) {
if (!angular.isDefined(tagsAsHierarchy[tag.getGuid()]) ||
!angular.isDefined(tagsAsHierarchy[tag.getGuid()][tag.getName()])) {
if (!angular.isDefined(tagsAsHierarchy[tag.getGuid()])) {
tagsAsHierarchy[tag.getGuid()] = {};
}
tagsAsHierarchy[tag.getGuid()][tag.getName()] = tag;
tags.push(tag);
}
return that;
};
/**
* @name remove
* @function
* @description
* <p>
* Removes a <code>Tag</code> object from the <code>TagSet</code> if it still exists.
* Otherwise nothing will be changed.
* </p>
* @param {TagInstance} tag Tag to remove
* @returns {TagSetInstance} TagSetInstance with removed TagInstance
* @example
* angular.module('exampleApp', ['keta.services.TagSet'])
* .controller('ExampleController', function(ketaTagSet) {
* var tag = Tag.create({
* guid: 'guid',
* name: 'name',
* sampleRate: 10
* });
* ketaTagSet
* .create()
* .add(tag)
* .remove(tag);
* });
*/
that.remove = function(tag) {
if (angular.isDefined(tagsAsHierarchy[tag.getGuid()][tag.getName()])) {
delete tagsAsHierarchy[tag.getGuid()][tag.getName()];
if (Object.keys(tagsAsHierarchy[tag.getGuid()]).length === 0) {
delete tagsAsHierarchy[tag.getGuid()];
}
tags.splice(tags.indexOf(tag), 1);
}
return that;
};
};
/**
* @class TagSet
* @propertyOf TagSetProvider
* @description TagSet Service
*/
var api = {
/**
* @name create
* @function
* @description
* <p>
* Creates a TagSetInstance.
* </p>
* @returns {TagSetInstance} TagSetInstance created
* @example
* angular.module('exampleApp', ['keta.services.TagSet'])
* .controller('ExampleController', function(ketaTagSet) {
* var tagSet = ketaTagSet.create();
* });
*/
create: function() {
return new TagSetInstance();
}
};
return api;
};
});