X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=manifoldapi%2Fstatic%2Fjs%2Fplugin.js;h=82a3cd03c4fe183875c13023ff23af9824bb6cb4;hb=0f9507be5bc87bdef40b3f34d6514bd888ee2abe;hp=22e4be5230140a253c741a93df47cc84b7909789;hpb=8f594dc33c4811a06f6f352984f57bc4b8f9ea51;p=unfold.git diff --git a/manifoldapi/static/js/plugin.js b/manifoldapi/static/js/plugin.js index 22e4be52..82a3cd03 100644 --- a/manifoldapi/static/js/plugin.js +++ b/manifoldapi/static/js/plugin.js @@ -19,6 +19,108 @@ ManifoldApp.filter('offset', function() { }; }); +// http://stackoverflow.com/questions/19992090/angularjs-group-by-directive +ManifoldApp.filter('groupBy', ['$parse', function ($parse) { + return function (list, group_by) { + + var filtered = []; + var prev_item = null; + var group_changed = false; + // this is a new field which is added to each item where we append "_CHANGED" + // to indicate a field change in the list + //was var new_field = group_by + '_CHANGED'; - JB 12/17/2013 + var new_field = 'group_by_CHANGED'; + + // loop through each item in the list + angular.forEach(list, function (item) { + + group_changed = false; + + // if not the first item + if (prev_item !== null) { + + // check if any of the group by field changed + + //force group_by into Array + group_by = angular.isArray(group_by) ? group_by : [group_by]; + + //check each group by parameter + for (var i = 0, len = group_by.length; i < len; i++) { + if ($parse(group_by[i])(prev_item) !== $parse(group_by[i])(item)) { + group_changed = true; + } + } + + + }// otherwise we have the first item in the list which is new + else { + group_changed = true; + } + + // if the group changed, then add a new field to the item + // to indicate this + if (group_changed) { + item[new_field] = true; + } else { + item[new_field] = false; + } + + filtered.push(item); + prev_item = item; + + }); + + return filtered; + }; +}]); + +// https://github.com/angular-ui/angular-ui-OLDREPO/blob/master/modules/filters/unique/unique.js +/** + * Filters out all duplicate items from an array by checking the specified key + * @param [key] {string} the name of the attribute of each object to compare for uniqueness + if the key is empty, the entire object will be compared + if the key === false then no filtering will be performed + * @return {array} + */ +ManifoldApp.filter('unique', function () { + + return function (items, filterOn) { + + if (filterOn === false) { + return items; + } + + if ((filterOn || angular.isUndefined(filterOn)) && angular.isArray(items)) { + var hashCheck = {}, newItems = []; + + var extractValueToCompare = function (item) { + if (angular.isObject(item) && angular.isString(filterOn)) { + return item[filterOn]; + } else { + return item; + } + }; + + angular.forEach(items, function (item) { + var valueToCheck, isDuplicate = false; + + for (var i = 0; i < newItems.length; i++) { + if (angular.equals(extractValueToCompare(newItems[i]), extractValueToCompare(item))) { + isDuplicate = true; + break; + } + } + if (!isDuplicate) { + newItems.push(item); + } + + }); + items = newItems; + } + return items; + }; +}); + // INHERITANCE // http://alexsexton.com/blog/2010/02/using-inheritance-patterns-to-organize-large-jquery-applications/ // We will use John Resig's proposal