diff --git a/dist/all.js b/dist/all.js index cd8718d..6d66449 100644 --- a/dist/all.js +++ b/dist/all.js @@ -66,7 +66,7 @@ }); } - function allEqual(vals) { + function allEqual(vals, excludes) { var first = _.first(vals); if (_.isArray(first) && !_.isObject(_.first(first))) { return _.allEqual(vals.map(function (v) { @@ -74,11 +74,38 @@ })); } if (_.isObject(first)) { - return _.every(vals, _.matches(first)); + if (!_.isArray(first)) { + return _.every(vals, _.matches(first)); + } else { + return arrayDeepEqual(vals, first, _.isArray(excludes) ? excludes : []); + } } return _.uniq(vals).length === 1; } + function arrayDeepEqual(vals, val, excludes) { + var lengthCheck = vals.map(function (v) { + return v.length; + }).every(function (l) { + return l === val.length; + }); + if (!lengthCheck) return false; + var result = true; + + var _loop = function _loop(i) { + var clonedVal = Object.assign({}, _.omit(val[i], excludes)); + var clonedVals = vals.map(function (val) { + return val[i]; + }); + result = result && _.all(clonedVals, clonedVal); + }; + + for (var i = 0; i < val.length; i++) { + _loop(i); + } + return result; + }; + function empty(obj) { if (_.isArray(obj)) { obj.length = 0; diff --git a/dist/all.min.js b/dist/all.min.js index cc2c259..a0a3939 100644 --- a/dist/all.min.js +++ b/dist/all.min.js @@ -1,2 +1,2 @@ -"use strict";!function(){function r(r,t){if(r&&r.length){var n=r.length;if(t+=t<0?n:0,t>n)return r[t]}}function t(r){return!r||!!_.isObject(r)&&(!_.isDate(r)&&!_.isRegExp(r)&&(!!_.isEmpty(r)||_.every(r,_.isFalsy)))}function n(r){for(var t=arguments.length,n=Array(t>1?t-1:0),e=1;e100?e=100:e<0&&(e=0)),e}function y(r,t){r=Number(r),t=Number(t);for(var n=[],e=r<=t?1:-1;r!==t;)n.push(r),r+=e;return n}function d(r){return _.flow(_.words,_.partial(_.map,_,_.capitalize),function(r){return r.join(" ")})(r)}_.mixin({allEqual:e,empty:i,add:o,subtract:u,multiply:a,divide:c,round:l,floor:f,ceil:s,percentage:p,isFalsy:t,isTrulyEmpty:n,nth:r,range:y,titleCase:d})}();var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(r){return typeof r}:function(r){return r&&"function"==typeof Symbol&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r};!function(){angular.module("cn.util",[]).factory("cnUtil",function(){function r(){for(var r=arguments.length,t=Array(r),n=0;n1?t.reduceRight(function(r,t){return _.assign(r,t)},{}):t[0],_.isString(t)?t:angular.toJson(t)):""}function t(t){for(var n=arguments.length,e=Array(n>1?n-1:0),i=1;i'+r.description+"

"}),t}function p(r,t,n){return r.forEach(function(r){r.popoverHtml='

Name: '+r[t]+'

ID: '+r[n]+"

"}),r}var y={"delete":function(r,t){delete r[t]},"null":function(r,t){r[t]=null}};return{buildParams:r,buildSref:t,cleanModel:n,cleanModelVal:e,cleanEmptyJson:u,diff:i,getModified:o,inheritCommon:l,extend:f,constructErrorMessageAsHtml:s,constructPopoverHtml:p,equals:c}})}(); +"use strict";!function(){function r(r,t){if(r&&r.length){var n=r.length;if(t+=t<0?n:0,t>n)return r[t]}}function t(r){return!r||!!_.isObject(r)&&(!_.isDate(r)&&!_.isRegExp(r)&&(!!_.isEmpty(r)||_.every(r,_.isFalsy)))}function n(r){for(var t=arguments.length,n=Array(t>1?t-1:0),e=1;e100?e=100:e<0&&(e=0)),e}function d(r,t){r=Number(r),t=Number(t);for(var n=[],e=r<=t?1:-1;r!==t;)n.push(r),r+=e;return n}function v(r){return _.flow(_.words,_.partial(_.map,_,_.capitalize),function(r){return r.join(" ")})(r)}_.mixin({allEqual:e,empty:o,add:u,subtract:a,multiply:c,divide:l,round:f,floor:s,ceil:p,percentage:y,isFalsy:t,isTrulyEmpty:n,nth:r,range:d,titleCase:v})}();var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(r){return typeof r}:function(r){return r&&"function"==typeof Symbol&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r};!function(){angular.module("cn.util",[]).factory("cnUtil",function(){function r(){for(var r=arguments.length,t=Array(r),n=0;n1?t.reduceRight(function(r,t){return _.assign(r,t)},{}):t[0],_.isString(t)?t:angular.toJson(t)):""}function t(t){for(var n=arguments.length,e=Array(n>1?n-1:0),i=1;i'+r.description+"

"}),t}function p(r,t,n){return r.forEach(function(r){r.popoverHtml='

Name: '+r[t]+'

ID: '+r[n]+"

"}),r}var y={"delete":function(r,t){delete r[t]},"null":function(r,t){r[t]=null}};return{buildParams:r,buildSref:t,cleanModel:n,cleanModelVal:e,cleanEmptyJson:u,diff:i,getModified:o,inheritCommon:l,extend:f,constructErrorMessageAsHtml:s,constructPopoverHtml:p,equals:c}})}(); //# sourceMappingURL=all.min.js.map diff --git a/dist/all.min.js.map b/dist/all.min.js.map index 8c25d26..9263d92 100644 --- a/dist/all.min.js.map +++ b/dist/all.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["all.min.js","_.mixins.js","cn-util.js"],"names":["nth","array","n","length","l","isFalsy","x","_","isObject","isDate","isRegExp","isEmpty","every","isTrulyEmpty","_len","arguments","emptyVals","Array","_key","undefined","some","v","y","_ref","apply","concat","allEqual","vals","first","isArray","map","JSON","stringify","matches","uniq","empty","obj","each","val","key","add","slice","call","reduce","a","b","parseFloat","Math","round","subtract","multiply","divide","p","pow","floor","ceil","percentage","overflow","result","range","start","end","Number","dir","push","titleCase","str","flow","words","partial","capitalize","w","join","mixin","_typeof","Symbol","iterator","constructor","prototype","angular","module","factory","buildParams","params","reduceRight","prev","cur","assign","isString","toJson","buildSref","state","_len2","_key2","cleanModel","model","cleanModelVal","modelVal","forEach","diff","original","current","deep","removeStrategy","getModified","copy","shallow","removeHandler","removeStretegies","eq","equals","modified","cleanEmptyJson","tmp","i","ret","k","get","isUndefined","undefinedAndFalsy","ta","tb","ks","getTime","toString","Object","create","charAt","isFunction","inheritCommon","from","to","extend","base","sub","ogProto","defineProperty","enumerable","value","constructErrorMessageAsHtml","errors","errorMessage","error","description","constructPopoverHtml","objectsArray","nameKey","idKey","object","popoverHtml","delete","null"],"mappings":"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","file":"all.min.js","sourcesContent":["\"use strict\";\n\n(function () {\n 'use strict';\n\n /**\n * Some useful util functions to add to lodash/underscore\n *\n * author: dzuch\n */\n\n _.mixin({\n allEqual: allEqual,\n empty: empty,\n add: add,\n subtract: subtract,\n multiply: multiply,\n divide: divide,\n round: round,\n floor: floor,\n ceil: ceil,\n percentage: percentage,\n isFalsy: isFalsy,\n isTrulyEmpty: isTrulyEmpty,\n /* deprecate if upgrading lodash to v4 */\n nth: nth,\n\n /* TODO: remove this, not needed and can achieve with lodash\n * Override lodash's range to allow high to low ranges\n */\n range: range,\n titleCase: titleCase\n });\n\n ////////\n\n function nth(array, n) {\n if (array && array.length) {\n var l = array.length;\n n += n < 0 ? l : 0;\n if (n > l) return array[n];\n }\n }\n\n function isFalsy(x) {\n if (!x) return true;\n if (_.isObject(x)) {\n if (_.isDate(x) || _.isRegExp(x)) return false;\n if (_.isEmpty(x)) return true;\n return _.every(x, _.isFalsy);\n }\n return false;\n }\n\n function isTrulyEmpty(x) {\n for (var _len = arguments.length, emptyVals = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n emptyVals[_key - 1] = arguments[_key];\n }\n\n return x === undefined || _.some(emptyVals, function (v) {\n return x === v;\n }) || _.isObject(x) && !x.length && _.every(x, function (y) {\n var _ref;\n\n return (_ref = _).isTrulyEmpty.apply(_ref, [y].concat(emptyVals));\n });\n }\n\n function allEqual(vals) {\n var first = _.first(vals);\n if (_.isArray(first) && !_.isObject(_.first(first))) {\n return _.allEqual(vals.map(function (v) {\n return JSON.stringify(v);\n }));\n }\n if (_.isObject(first)) {\n return _.every(vals, _.matches(first));\n }\n return _.uniq(vals).length === 1;\n }\n\n function empty(obj) {\n if (_.isArray(obj)) {\n obj.length = 0;\n return obj;\n }\n _.each(obj, function (val, key) {\n delete obj[key];\n });\n return obj;\n }\n\n function add(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function (a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return (Math.round(a * 100) + Math.round(b * 100)) / 100;\n });\n }\n\n function subtract(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function (a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return (Math.round(a * 100) - Math.round(b * 100)) / 100;\n });\n }\n\n function multiply(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function (a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return Math.round(a * 100) * Math.round(b * 100) / 10000;\n });\n }\n\n function divide(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function (a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return Math.round(a * 100) / Math.round(b * 100);\n });\n }\n\n function round(x, p) {\n p = Math.pow(10, p || 0);\n return Math.round(parseFloat(x) * p) / p;\n }\n\n function floor(x, p) {\n p = Math.pow(10, p || 0);\n return Math.floor(parseFloat(x) * p) / p;\n }\n\n function ceil(x, p) {\n p = Math.pow(10, p || 0);\n return Math.ceil(parseFloat(x) * p) / p;\n }\n\n function percentage(a, b, overflow) {\n var result = _.round(100 * a / b);\n if (!overflow) {\n if (result > 100) result = 100;else if (result < 0) result = 0;\n }\n return result;\n }\n\n function range(start, end) {\n start = Number(start);\n end = Number(end);\n var result = [],\n dir = start <= end ? 1 : -1;\n //end = end + dir;\n while (start !== end) {\n result.push(start);\n start += dir;\n }\n return result;\n }\n\n function titleCase(str) {\n return _.flow(_.words, _.partial(_.map, _, _.capitalize), function (w) {\n return w.join(\" \");\n })(str);\n }\n})();\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function () {\n 'use strict';\n /**\n * Definition for the cn.model module\n */\n\n angular.module('cn.util', []).factory('cnUtil', function () {\n var removeStretegies = {\n 'delete': function _delete(obj, key) {\n delete obj[key];\n },\n 'null': function _null(obj, key) {\n obj[key] = null;\n }\n };\n\n return {\n buildParams: buildParams,\n buildSref: buildSref,\n cleanModel: cleanModel,\n cleanModelVal: cleanModelVal,\n cleanEmptyJson: cleanEmptyJson,\n diff: diff,\n getModified: getModified,\n inheritCommon: inheritCommon,\n extend: extend,\n constructErrorMessageAsHtml: constructErrorMessageAsHtml,\n constructPopoverHtml: constructPopoverHtml,\n equals: equals\n };\n\n /////////\n\n function buildParams() {\n for (var _len = arguments.length, params = Array(_len), _key = 0; _key < _len; _key++) {\n params[_key] = arguments[_key];\n }\n\n if (!params[0]) return '';\n if (_.isArray(params[0])) params = params[0];\n\n if (params.length > 1) {\n params = params.reduceRight(function (prev, cur) {\n return _.assign(prev, cur);\n }, {});\n } else params = params[0];\n return _.isString(params) ? params : angular.toJson(params);\n }\n\n function buildSref(state) {\n for (var _len2 = arguments.length, params = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n params[_key2 - 1] = arguments[_key2];\n }\n\n return state + '(' + buildParams.apply(undefined, params) + ')';\n }\n\n function cleanModel(model) {\n _.each(model, cleanModelVal);\n return model;\n }\n\n function cleanModelVal(modelVal) {\n // if array,\n if (_.isArray(modelVal)) {\n modelVal.forEach(cleanModelVal);\n } else if (_.isObject(modelVal)) {\n _.each(modelVal, function (val, key) {\n if (val === null || val === undefined) delete modelVal[key];else if (_.isArray(val)) val.forEach(cleanModelVal);else if (_.isObject(val)) cleanModelVal(val);\n });\n }\n }\n\n function diff(original, current, deep, removeStrategy) {\n return getModified(original, current, removeStrategy, !deep);\n }\n\n function getModified(original, copy, removeStrategy, shallow) {\n var removeHandler = removeStretegies[removeStrategy] || removeStretegies[null];\n var eq = shallow ? equals : angular.equals;\n\n if (eq(original, copy)) return;\n if (_.isObject(copy) && !_.isArray(copy)) {\n var modified = {};\n _.each(copy, function (val, key) {\n if (shallow) {\n if (!eq(val, original[key])) {\n modified[key] = cleanEmptyJson(val, original[key]);\n }\n } else {\n var tmp = original[key] ? getModified(original[key], val, removeStrategy) : val;\n if (tmp !== undefined && !eq(original[key], tmp)) modified[key] = tmp;\n }\n });\n _.each(original, function (val, key) {\n if (val && (copy[key] === null || copy[key] === undefined)) {\n removeHandler(modified, key);\n }\n });\n return _.isEmpty(modified) ? undefined : modified;\n }\n return copy;\n }\n\n function cleanEmptyJson(copy, original) {\n if (_.isArray(copy)) {\n return _.map(copy, function (x, i) {\n return cleanEmptyJson(x, original ? original[i] : undefined);\n });\n }\n if (_.isObject(copy)) {\n var ret = {},\n k = void 0,\n v = void 0,\n a = void 0,\n b = void 0;\n for (k in copy) {\n a = copy[k];\n b = _.get(original, k);\n if (!_.isTrulyEmpty(a, null)) {\n v = cleanEmptyJson(a, b);\n if (!_.isUndefined(v)) ret[k] = v;\n }\n }\n return _.isEmpty(ret) ? undefined : ret;\n }\n return copy;\n }\n\n function undefinedAndFalsy(a, b) {\n return (a === undefined || b === undefined) && (a === false || a === 0 || b === false || b === 0);\n }\n\n /* Ripping off angular.equals but treating empty array and undefined/null as equal */\n function equals(a, b) {\n if (a === b || _.isTrulyEmpty(a, null) && _.isTrulyEmpty(b, null) && !undefinedAndFalsy(a, b)) return true;\n var ta = typeof a === 'undefined' ? 'undefined' : _typeof(a),\n tb = typeof b === 'undefined' ? 'undefined' : _typeof(b),\n l = void 0,\n k = void 0,\n ks = void 0;\n if (ta === tb && ta === 'object' && _.isObject(a) && _.isObject(b)) {\n if (_.isArray(a)) {\n if (!_.isArray(b)) return false;\n if ((l = a.length) === b.length) {\n for (k = 0; k < l; k++) {\n if (!equals(a[k], b[k])) return false;\n }\n return true;\n }\n } else if (_.isDate(a)) {\n return _.isDate(b) && equals(a.getTime(), b.getTime());\n } else if (_.isRegExp(a)) {\n return _.isRegExp(b) && a.toString() === b.toString();\n } else {\n if (_.isArray(b) || _.isDate(b) || _.isRegExp(b)) return false;\n ks = Object.create(null);\n for (k in a) {\n if (k.charAt(0) === '$' || _.isFunction(a[k])) continue;\n if (!equals(a[k], b[k])) return false;\n if (!_.isTrulyEmpty(a[k], null)) ks[k] = true;\n }\n for (k in b) {\n if (!(k in ks) && k.charAt(0) !== '$' && !_.isTrulyEmpty(b[k], null) && !_.isFunction(b[k])) return false;\n }\n return true;\n }\n }\n return false;\n }\n\n function inheritCommon(from, to) {\n _.each(to, function (val, key) {\n if (key in from) {\n val = from[key];\n if (_.isObject(val) && !_.isArray(val) && to[key]) {\n to[key] = inheritCommon(val, to[key]);\n } else {\n to[key] = val;\n }\n }\n });\n return to;\n }\n\n function extend(base, sub) {\n // Avoid instantiating the base class just to setup inheritance\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create\n // for a polyfill\n // Also, do a recursive merge of two prototypes, so we don't overwrite\n // the existing prototype, but still maintain the inheritance chain\n // Thanks to @ccnokes\n var ogProto = sub.prototype;\n sub.prototype = Object.create(base.prototype);\n _.extend(sub.prototype, ogProto);\n // Remember the constructor property was set wrong, let's fix it\n sub.prototype.constructor = sub;\n // In ECMAScript5+ (all modern browsers), you can make the constructor property\n // non-enumerable if you define it like this instead\n Object.defineProperty(sub.prototype, 'constructor', {\n enumerable: false,\n value: sub\n });\n }\n\n /**\n * Used to build an HTML representation of the description keys in the errors array.\n * See: API call GET /campaigns/:id/subCampaigns/status<\n *\n * Sample HTML

One error
Another error

\n *\n * @param errors{array}\n * @returns {string}\n */\n function constructErrorMessageAsHtml(errors) {\n var errorMessage = '';\n errors.forEach(function (error) {\n errorMessage = errorMessage + '

' + error.description + '

';\n });\n return errorMessage;\n }\n\n /**\n * Used to append a popoverHtml key on the objects (campaigns, adSets, ads)\n * that contains the name and id of the object so it can be show in in the popover\n *\n * @param objectsArray\n * @param nameKey\n * @param idKey\n * @returns {*}\n */\n function constructPopoverHtml(objectsArray, nameKey, idKey) {\n objectsArray.forEach(function (object) {\n object.popoverHtml = '

Name: ' + object[nameKey] + '

' + '

ID: ' + object[idKey] + '

';\n });\n return objectsArray;\n }\n });\n})();","(function() {\n 'use strict';\n\n /**\n * Some useful util functions to add to lodash/underscore\n *\n * author: dzuch\n */\n\n _.mixin({\n allEqual,\n empty,\n add,\n subtract,\n multiply,\n divide,\n round,\n floor,\n ceil,\n percentage,\n isFalsy,\n isTrulyEmpty,\n /* deprecate if upgrading lodash to v4 */\n nth,\n\n /* TODO: remove this, not needed and can achieve with lodash\n * Override lodash's range to allow high to low ranges\n */\n range,\n titleCase\n });\n\n ////////\n\n function nth(array, n) {\n if(array && array.length) {\n let l = array.length;\n n += n < 0 ? l : 0;\n if(n > l) return array[n];\n }\n }\n\n function isFalsy(x) {\n if(!x) return true;\n if(_.isObject(x)) {\n if(_.isDate(x) || _.isRegExp(x)) return false;\n if(_.isEmpty(x)) return true;\n return _.every(x, _.isFalsy);\n }\n return false;\n }\n\n function isTrulyEmpty(x, ...emptyVals) {\n return (\n x === undefined ||\n _.some(emptyVals, v => x === v) ||\n _.isObject(x) && !x.length && _.every(x, y => _.isTrulyEmpty(y, ...emptyVals))\n );\n }\n\n function allEqual(vals) {\n let first = _.first(vals);\n if(_.isArray(first) && !_.isObject(_.first(first))) {\n return _.allEqual(vals.map(v => JSON.stringify(v)));\n }\n if(_.isObject(first)) {\n return _.every(vals, _.matches(first));\n }\n return _.uniq(vals).length === 1;\n }\n\n function empty(obj) {\n if(_.isArray(obj)) {\n obj.length = 0;\n return obj;\n }\n _.each(obj, function(val, key) {\n delete obj[key];\n });\n return obj;\n }\n\n function add(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function(a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return (Math.round(a * 100) + Math.round(b * 100)) / 100;\n });\n }\n\n function subtract(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function(a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return (Math.round(a * 100) - Math.round(b * 100)) / 100;\n });\n }\n\n function multiply(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function(a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return (Math.round(a * 100) * Math.round(b * 100)) / 10000;\n });\n }\n\n function divide(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function(a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return (Math.round(a * 100) / Math.round(b * 100));\n });\n }\n\n function round(x, p) {\n p = Math.pow(10, p || 0);\n return Math.round(parseFloat(x) * p) / p;\n }\n\n function floor(x, p) {\n p = Math.pow(10, p || 0);\n return Math.floor(parseFloat(x) * p) / p;\n }\n\n function ceil(x, p) {\n p = Math.pow(10, p || 0);\n return Math.ceil(parseFloat(x) * p) / p;\n }\n\n function percentage(a, b, overflow) {\n var result = _.round(100 * a / b);\n if(!overflow) {\n if(result > 100) result = 100;\n else if(result < 0) result = 0;\n }\n return result;\n }\n\n function range(start, end) {\n start = Number(start);\n end = Number(end);\n var result = [],\n dir = (start <= end) ? 1 : -1;\n //end = end + dir;\n while(start !== end) {\n result.push(start);\n start += dir;\n }\n return result;\n }\n\n function titleCase(str) {\n return _.flow(\n _.words,\n _.partial(_.map, _, _.capitalize),\n w => w.join(\" \")\n )(str);\n }\n\n})();\n","(function() {\n 'use strict';\n /**\n * Definition for the cn.model module\n */\n angular.module('cn.util', [])\n .factory('cnUtil', function() {\n let removeStretegies = {\n 'delete': (obj, key) => {delete obj[key];},\n 'null': (obj, key) => {obj[key] = null;}\n };\n\n return {\n buildParams,\n buildSref,\n cleanModel,\n cleanModelVal,\n cleanEmptyJson,\n diff,\n getModified,\n inheritCommon,\n extend,\n constructErrorMessageAsHtml,\n constructPopoverHtml,\n equals\n };\n\n /////////\n\n function buildParams(...params) {\n if(!params[0]) return '';\n if(_.isArray(params[0])) params = params[0];\n\n if(params.length > 1) {\n params = params.reduceRight((prev, cur) => _.assign(prev, cur), {});\n }\n else params = params[0];\n return _.isString(params) ? params : angular.toJson(params);\n }\n\n function buildSref(state, ...params) {\n return `${state}(${buildParams(...params)})`;\n }\n\n function cleanModel(model) {\n _.each(model, cleanModelVal);\n return model;\n }\n\n function cleanModelVal(modelVal) {\n // if array,\n if(_.isArray(modelVal)) {\n modelVal.forEach(cleanModelVal);\n }\n else if(_.isObject(modelVal)) {\n _.each(modelVal, (val, key) => {\n if(val === null || val === undefined) delete modelVal[key];\n else if(_.isArray(val)) val.forEach(cleanModelVal);\n else if(_.isObject(val)) cleanModelVal(val);\n });\n }\n }\n\n function diff(original, current, deep, removeStrategy) {\n return getModified(original, current, removeStrategy, !deep);\n }\n\n function getModified(original, copy, removeStrategy, shallow) {\n let removeHandler = removeStretegies[removeStrategy] || removeStretegies[null];\n let eq = shallow ? equals : angular.equals;\n\n if(eq(original, copy)) return;\n if(_.isObject(copy) && !_.isArray(copy)) {\n let modified = {};\n _.each(copy, (val, key) => {\n if(shallow) {\n if(!eq(val, original[key])) {\n modified[key] = cleanEmptyJson(val, original[key]);\n }\n }\n else {\n let tmp = original[key] ?\n getModified(original[key], val, removeStrategy) :\n val;\n if(tmp !== undefined && !eq(original[key], tmp)) modified[key] = tmp;\n }\n });\n _.each(original, (val, key) => {\n if(val && (copy[key] === null || copy[key] === undefined)) {\n removeHandler(modified, key);\n }\n });\n return _.isEmpty(modified) ? undefined : modified;\n }\n return copy;\n }\n\n function cleanEmptyJson(copy, original) {\n if(_.isArray(copy)) {\n return _.map(\n copy,\n (x, i) => cleanEmptyJson(x, original ? original[i] : undefined)\n );\n }\n if(_.isObject(copy)) {\n let ret = {}, k, v, a, b;\n for(k in copy) {\n a = copy[k];\n b = _.get(original, k);\n if(!_.isTrulyEmpty(a, null)) {\n v = cleanEmptyJson(a, b);\n if(!_.isUndefined(v)) ret[k] = v;\n }\n }\n return _.isEmpty(ret) ? undefined : ret;\n }\n return copy;\n }\n\n function undefinedAndFalsy(a, b) {\n return (\n (a === undefined || b === undefined) &&\n (a === false || a === 0 || b === false || b === 0)\n );\n }\n\n /* Ripping off angular.equals but treating empty array and undefined/null as equal */\n function equals(a, b) {\n if(a === b ||\n (_.isTrulyEmpty(a, null) &&\n _.isTrulyEmpty(b, null) &&\n !undefinedAndFalsy(a, b))\n ) return true;\n let ta = typeof a, tb = typeof b, l, k, ks;\n if(ta === tb && ta === 'object' && _.isObject(a) && _.isObject(b)) {\n if(_.isArray(a)) {\n if(!_.isArray(b)) return false;\n if((l = a.length) === b.length) {\n for(k = 0; k < l; k++) {\n if(!equals(a[k], b[k])) return false;\n }\n return true;\n }\n }\n else if(_.isDate(a)) {\n return _.isDate(b) && equals(a.getTime(), b.getTime());\n }\n else if(_.isRegExp(a)) {\n return _.isRegExp(b) && a.toString() === b.toString();\n }\n else {\n if(_.isArray(b) || _.isDate(b) || _.isRegExp(b)) return false;\n ks = Object.create(null);\n for(k in a) {\n if(k.charAt(0) === '$' || _.isFunction(a[k])) continue;\n if(!equals(a[k], b[k])) return false;\n if(!_.isTrulyEmpty(a[k], null)) ks[k] = true;\n }\n for(k in b) {\n if(!(k in ks) &&\n k.charAt(0) !== '$' &&\n !_.isTrulyEmpty(b[k], null) &&\n !_.isFunction(b[k])) return false;\n }\n return true;\n }\n }\n return false;\n }\n\n function inheritCommon(from, to) {\n _.each(to, function(val, key) {\n if(key in from) {\n val = from[key];\n if(_.isObject(val) && !_.isArray(val) && to[key]) {\n to[key] = inheritCommon(val, to[key]);\n }\n else {\n to[key] = val;\n }\n }\n });\n return to;\n }\n\n function extend(base, sub) {\n // Avoid instantiating the base class just to setup inheritance\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create\n // for a polyfill\n // Also, do a recursive merge of two prototypes, so we don't overwrite\n // the existing prototype, but still maintain the inheritance chain\n // Thanks to @ccnokes\n var ogProto = sub.prototype;\n sub.prototype = Object.create(base.prototype);\n _.extend(sub.prototype, ogProto);\n // Remember the constructor property was set wrong, let's fix it\n sub.prototype.constructor = sub;\n // In ECMAScript5+ (all modern browsers), you can make the constructor property\n // non-enumerable if you define it like this instead\n Object.defineProperty(sub.prototype, 'constructor', {\n enumerable: false,\n value: sub\n });\n }\n\n /**\n * Used to build an HTML representation of the description keys in the errors array.\n * See: API call GET /campaigns/:id/subCampaigns/status<\n *\n * Sample HTML

One error
Another error

\n *\n * @param errors{array}\n * @returns {string}\n */\n function constructErrorMessageAsHtml(errors) {\n var errorMessage = '';\n errors.forEach(function(error) {\n errorMessage = errorMessage + '

' + error.description + '

';\n });\n return errorMessage;\n }\n\n /**\n * Used to append a popoverHtml key on the objects (campaigns, adSets, ads)\n * that contains the name and id of the object so it can be show in in the popover\n *\n * @param objectsArray\n * @param nameKey\n * @param idKey\n * @returns {*}\n */\n function constructPopoverHtml(objectsArray, nameKey, idKey) {\n objectsArray.forEach(function(object) {\n object.popoverHtml = '

Name: ' + object[nameKey] + '

' + '

ID: ' + object[idKey] + '

';\n });\n return objectsArray;\n }\n });\n})();\n"]} \ No newline at end of file +{"version":3,"sources":["all.min.js","_.mixins.js","cn-util.js"],"names":["nth","array","n","length","l","isFalsy","x","_","isObject","isDate","isRegExp","isEmpty","every","isTrulyEmpty","_len","arguments","emptyVals","Array","_key","undefined","some","v","y","_ref","apply","concat","allEqual","vals","excludes","first","isArray","map","JSON","stringify","arrayDeepEqual","matches","uniq","val","lengthCheck","result","_loop","i","clonedVal","Object","assign","omit","clonedVals","all","empty","obj","each","key","add","slice","call","reduce","a","b","parseFloat","Math","round","subtract","multiply","divide","p","pow","floor","ceil","percentage","overflow","range","start","end","Number","dir","push","titleCase","str","flow","words","partial","capitalize","w","join","mixin","_typeof","Symbol","iterator","constructor","prototype","angular","module","factory","buildParams","params","reduceRight","prev","cur","isString","toJson","buildSref","state","_len2","_key2","cleanModel","model","cleanModelVal","modelVal","forEach","diff","original","current","deep","removeStrategy","getModified","copy","shallow","removeHandler","removeStretegies","eq","equals","modified","cleanEmptyJson","tmp","ret","k","get","isUndefined","undefinedAndFalsy","ta","tb","ks","getTime","toString","create","charAt","isFunction","inheritCommon","from","to","extend","base","sub","ogProto","defineProperty","enumerable","value","constructErrorMessageAsHtml","errors","errorMessage","error","description","constructPopoverHtml","objectsArray","nameKey","idKey","object","popoverHtml","delete","null"],"mappings":"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","file":"all.min.js","sourcesContent":["\"use strict\";\n\n(function () {\n 'use strict';\n\n /**\n * Some useful util functions to add to lodash/underscore\n *\n * author: dzuch\n */\n\n _.mixin({\n allEqual: allEqual,\n empty: empty,\n add: add,\n subtract: subtract,\n multiply: multiply,\n divide: divide,\n round: round,\n floor: floor,\n ceil: ceil,\n percentage: percentage,\n isFalsy: isFalsy,\n isTrulyEmpty: isTrulyEmpty,\n /* deprecate if upgrading lodash to v4 */\n nth: nth,\n\n /* TODO: remove this, not needed and can achieve with lodash\n * Override lodash's range to allow high to low ranges\n */\n range: range,\n titleCase: titleCase\n });\n\n ////////\n\n function nth(array, n) {\n if (array && array.length) {\n var l = array.length;\n n += n < 0 ? l : 0;\n if (n > l) return array[n];\n }\n }\n\n function isFalsy(x) {\n if (!x) return true;\n if (_.isObject(x)) {\n if (_.isDate(x) || _.isRegExp(x)) return false;\n if (_.isEmpty(x)) return true;\n return _.every(x, _.isFalsy);\n }\n return false;\n }\n\n function isTrulyEmpty(x) {\n for (var _len = arguments.length, emptyVals = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n emptyVals[_key - 1] = arguments[_key];\n }\n\n return x === undefined || _.some(emptyVals, function (v) {\n return x === v;\n }) || _.isObject(x) && !x.length && _.every(x, function (y) {\n var _ref;\n\n return (_ref = _).isTrulyEmpty.apply(_ref, [y].concat(emptyVals));\n });\n }\n\n function allEqual(vals, excludes) {\n var first = _.first(vals);\n if (_.isArray(first) && !_.isObject(_.first(first))) {\n return _.allEqual(vals.map(function (v) {\n return JSON.stringify(v);\n }));\n }\n if (_.isObject(first)) {\n if (!_.isArray(first)) {\n return _.every(vals, _.matches(first));\n } else {\n return arrayDeepEqual(vals, first, _.isArray(excludes) ? excludes : []);\n }\n }\n return _.uniq(vals).length === 1;\n }\n\n function arrayDeepEqual(vals, val, excludes) {\n var lengthCheck = vals.map(function (v) {\n return v.length;\n }).every(function (l) {\n return l === val.length;\n });\n if (!lengthCheck) return false;\n var result = true;\n\n var _loop = function _loop(i) {\n var clonedVal = Object.assign({}, _.omit(val[i], excludes));\n var clonedVals = vals.map(function (val) {\n return val[i];\n });\n result = result && _.all(clonedVals, clonedVal);\n };\n\n for (var i = 0; i < val.length; i++) {\n _loop(i);\n }\n return result;\n };\n\n function empty(obj) {\n if (_.isArray(obj)) {\n obj.length = 0;\n return obj;\n }\n _.each(obj, function (val, key) {\n delete obj[key];\n });\n return obj;\n }\n\n function add(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function (a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return (Math.round(a * 100) + Math.round(b * 100)) / 100;\n });\n }\n\n function subtract(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function (a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return (Math.round(a * 100) - Math.round(b * 100)) / 100;\n });\n }\n\n function multiply(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function (a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return Math.round(a * 100) * Math.round(b * 100) / 10000;\n });\n }\n\n function divide(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function (a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return Math.round(a * 100) / Math.round(b * 100);\n });\n }\n\n function round(x, p) {\n p = Math.pow(10, p || 0);\n return Math.round(parseFloat(x) * p) / p;\n }\n\n function floor(x, p) {\n p = Math.pow(10, p || 0);\n return Math.floor(parseFloat(x) * p) / p;\n }\n\n function ceil(x, p) {\n p = Math.pow(10, p || 0);\n return Math.ceil(parseFloat(x) * p) / p;\n }\n\n function percentage(a, b, overflow) {\n var result = _.round(100 * a / b);\n if (!overflow) {\n if (result > 100) result = 100;else if (result < 0) result = 0;\n }\n return result;\n }\n\n function range(start, end) {\n start = Number(start);\n end = Number(end);\n var result = [],\n dir = start <= end ? 1 : -1;\n //end = end + dir;\n while (start !== end) {\n result.push(start);\n start += dir;\n }\n return result;\n }\n\n function titleCase(str) {\n return _.flow(_.words, _.partial(_.map, _, _.capitalize), function (w) {\n return w.join(\" \");\n })(str);\n }\n})();\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function () {\n 'use strict';\n /**\n * Definition for the cn.model module\n */\n\n angular.module('cn.util', []).factory('cnUtil', function () {\n var removeStretegies = {\n 'delete': function _delete(obj, key) {\n delete obj[key];\n },\n 'null': function _null(obj, key) {\n obj[key] = null;\n }\n };\n\n return {\n buildParams: buildParams,\n buildSref: buildSref,\n cleanModel: cleanModel,\n cleanModelVal: cleanModelVal,\n cleanEmptyJson: cleanEmptyJson,\n diff: diff,\n getModified: getModified,\n inheritCommon: inheritCommon,\n extend: extend,\n constructErrorMessageAsHtml: constructErrorMessageAsHtml,\n constructPopoverHtml: constructPopoverHtml,\n equals: equals\n };\n\n /////////\n\n function buildParams() {\n for (var _len = arguments.length, params = Array(_len), _key = 0; _key < _len; _key++) {\n params[_key] = arguments[_key];\n }\n\n if (!params[0]) return '';\n if (_.isArray(params[0])) params = params[0];\n\n if (params.length > 1) {\n params = params.reduceRight(function (prev, cur) {\n return _.assign(prev, cur);\n }, {});\n } else params = params[0];\n return _.isString(params) ? params : angular.toJson(params);\n }\n\n function buildSref(state) {\n for (var _len2 = arguments.length, params = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n params[_key2 - 1] = arguments[_key2];\n }\n\n return state + '(' + buildParams.apply(undefined, params) + ')';\n }\n\n function cleanModel(model) {\n _.each(model, cleanModelVal);\n return model;\n }\n\n function cleanModelVal(modelVal) {\n // if array,\n if (_.isArray(modelVal)) {\n modelVal.forEach(cleanModelVal);\n } else if (_.isObject(modelVal)) {\n _.each(modelVal, function (val, key) {\n if (val === null || val === undefined) delete modelVal[key];else if (_.isArray(val)) val.forEach(cleanModelVal);else if (_.isObject(val)) cleanModelVal(val);\n });\n }\n }\n\n function diff(original, current, deep, removeStrategy) {\n return getModified(original, current, removeStrategy, !deep);\n }\n\n function getModified(original, copy, removeStrategy, shallow) {\n var removeHandler = removeStretegies[removeStrategy] || removeStretegies[null];\n var eq = shallow ? equals : angular.equals;\n\n if (eq(original, copy)) return;\n if (_.isObject(copy) && !_.isArray(copy)) {\n var modified = {};\n _.each(copy, function (val, key) {\n if (shallow) {\n if (!eq(val, original[key])) {\n modified[key] = cleanEmptyJson(val, original[key]);\n }\n } else {\n var tmp = original[key] ? getModified(original[key], val, removeStrategy) : val;\n if (tmp !== undefined && !eq(original[key], tmp)) modified[key] = tmp;\n }\n });\n _.each(original, function (val, key) {\n if (val && (copy[key] === null || copy[key] === undefined)) {\n removeHandler(modified, key);\n }\n });\n return _.isEmpty(modified) ? undefined : modified;\n }\n return copy;\n }\n\n function cleanEmptyJson(copy, original) {\n if (_.isArray(copy)) {\n return _.map(copy, function (x, i) {\n return cleanEmptyJson(x, original ? original[i] : undefined);\n });\n }\n if (_.isObject(copy)) {\n var ret = {},\n k = void 0,\n v = void 0,\n a = void 0,\n b = void 0;\n for (k in copy) {\n a = copy[k];\n b = _.get(original, k);\n if (!_.isTrulyEmpty(a, null)) {\n v = cleanEmptyJson(a, b);\n if (!_.isUndefined(v)) ret[k] = v;\n }\n }\n return _.isEmpty(ret) ? undefined : ret;\n }\n return copy;\n }\n\n function undefinedAndFalsy(a, b) {\n return (a === undefined || b === undefined) && (a === false || a === 0 || b === false || b === 0);\n }\n\n /* Ripping off angular.equals but treating empty array and undefined/null as equal */\n function equals(a, b) {\n if (a === b || _.isTrulyEmpty(a, null) && _.isTrulyEmpty(b, null) && !undefinedAndFalsy(a, b)) return true;\n var ta = typeof a === 'undefined' ? 'undefined' : _typeof(a),\n tb = typeof b === 'undefined' ? 'undefined' : _typeof(b),\n l = void 0,\n k = void 0,\n ks = void 0;\n if (ta === tb && ta === 'object' && _.isObject(a) && _.isObject(b)) {\n if (_.isArray(a)) {\n if (!_.isArray(b)) return false;\n if ((l = a.length) === b.length) {\n for (k = 0; k < l; k++) {\n if (!equals(a[k], b[k])) return false;\n }\n return true;\n }\n } else if (_.isDate(a)) {\n return _.isDate(b) && equals(a.getTime(), b.getTime());\n } else if (_.isRegExp(a)) {\n return _.isRegExp(b) && a.toString() === b.toString();\n } else {\n if (_.isArray(b) || _.isDate(b) || _.isRegExp(b)) return false;\n ks = Object.create(null);\n for (k in a) {\n if (k.charAt(0) === '$' || _.isFunction(a[k])) continue;\n if (!equals(a[k], b[k])) return false;\n if (!_.isTrulyEmpty(a[k], null)) ks[k] = true;\n }\n for (k in b) {\n if (!(k in ks) && k.charAt(0) !== '$' && !_.isTrulyEmpty(b[k], null) && !_.isFunction(b[k])) return false;\n }\n return true;\n }\n }\n return false;\n }\n\n function inheritCommon(from, to) {\n _.each(to, function (val, key) {\n if (key in from) {\n val = from[key];\n if (_.isObject(val) && !_.isArray(val) && to[key]) {\n to[key] = inheritCommon(val, to[key]);\n } else {\n to[key] = val;\n }\n }\n });\n return to;\n }\n\n function extend(base, sub) {\n // Avoid instantiating the base class just to setup inheritance\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create\n // for a polyfill\n // Also, do a recursive merge of two prototypes, so we don't overwrite\n // the existing prototype, but still maintain the inheritance chain\n // Thanks to @ccnokes\n var ogProto = sub.prototype;\n sub.prototype = Object.create(base.prototype);\n _.extend(sub.prototype, ogProto);\n // Remember the constructor property was set wrong, let's fix it\n sub.prototype.constructor = sub;\n // In ECMAScript5+ (all modern browsers), you can make the constructor property\n // non-enumerable if you define it like this instead\n Object.defineProperty(sub.prototype, 'constructor', {\n enumerable: false,\n value: sub\n });\n }\n\n /**\n * Used to build an HTML representation of the description keys in the errors array.\n * See: API call GET /campaigns/:id/subCampaigns/status<\n *\n * Sample HTML

One error
Another error

\n *\n * @param errors{array}\n * @returns {string}\n */\n function constructErrorMessageAsHtml(errors) {\n var errorMessage = '';\n errors.forEach(function (error) {\n errorMessage = errorMessage + '

' + error.description + '

';\n });\n return errorMessage;\n }\n\n /**\n * Used to append a popoverHtml key on the objects (campaigns, adSets, ads)\n * that contains the name and id of the object so it can be show in in the popover\n *\n * @param objectsArray\n * @param nameKey\n * @param idKey\n * @returns {*}\n */\n function constructPopoverHtml(objectsArray, nameKey, idKey) {\n objectsArray.forEach(function (object) {\n object.popoverHtml = '

Name: ' + object[nameKey] + '

' + '

ID: ' + object[idKey] + '

';\n });\n return objectsArray;\n }\n });\n})();","(function() {\n 'use strict';\n\n /**\n * Some useful util functions to add to lodash/underscore\n *\n * author: dzuch\n */\n\n _.mixin({\n allEqual,\n empty,\n add,\n subtract,\n multiply,\n divide,\n round,\n floor,\n ceil,\n percentage,\n isFalsy,\n isTrulyEmpty,\n /* deprecate if upgrading lodash to v4 */\n nth,\n\n /* TODO: remove this, not needed and can achieve with lodash\n * Override lodash's range to allow high to low ranges\n */\n range,\n titleCase\n });\n\n ////////\n\n function nth(array, n) {\n if(array && array.length) {\n let l = array.length;\n n += n < 0 ? l : 0;\n if(n > l) return array[n];\n }\n }\n\n function isFalsy(x) {\n if(!x) return true;\n if(_.isObject(x)) {\n if(_.isDate(x) || _.isRegExp(x)) return false;\n if(_.isEmpty(x)) return true;\n return _.every(x, _.isFalsy);\n }\n return false;\n }\n\n function isTrulyEmpty(x, ...emptyVals) {\n return (\n x === undefined ||\n _.some(emptyVals, v => x === v) ||\n _.isObject(x) && !x.length && _.every(x, y => _.isTrulyEmpty(y, ...emptyVals))\n );\n }\n\n function allEqual(vals, excludes) {\n let first = _.first(vals);\n if(_.isArray(first) && !_.isObject(_.first(first))) {\n return _.allEqual(vals.map(v => JSON.stringify(v)));\n }\n if(_.isObject(first)) {\n if (!_.isArray(first)) {\n return _.every(vals, _.matches(first));\n } else {\n return arrayDeepEqual(vals, first, _.isArray(excludes) ? excludes : []);\n }\n }\n return _.uniq(vals).length === 1;\n }\n\n function arrayDeepEqual(vals, val, excludes) {\n const lengthCheck = vals.map(v => v.length).every(l => l === val.length);\n if (!lengthCheck) return false;\n let result = true;\n for (let i = 0; i < val.length; i++) {\n const clonedVal = Object.assign({}, _.omit(val[i], excludes));\n const clonedVals = vals.map(val => val[i]);\n result = result && _.all(clonedVals, clonedVal);\n } \n return result;\n };\n\n function empty(obj) {\n if(_.isArray(obj)) {\n obj.length = 0;\n return obj;\n }\n _.each(obj, function(val, key) {\n delete obj[key];\n });\n return obj;\n }\n\n function add(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function(a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return (Math.round(a * 100) + Math.round(b * 100)) / 100;\n });\n }\n\n function subtract(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function(a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return (Math.round(a * 100) - Math.round(b * 100)) / 100;\n });\n }\n\n function multiply(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function(a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return (Math.round(a * 100) * Math.round(b * 100)) / 10000;\n });\n }\n\n function divide(x) {\n x = _.isArray(x) ? x : [].slice.call(arguments);\n\n return _.reduce(x, function(a, b) {\n a = parseFloat(a);\n b = parseFloat(b);\n return (Math.round(a * 100) / Math.round(b * 100));\n });\n }\n\n function round(x, p) {\n p = Math.pow(10, p || 0);\n return Math.round(parseFloat(x) * p) / p;\n }\n\n function floor(x, p) {\n p = Math.pow(10, p || 0);\n return Math.floor(parseFloat(x) * p) / p;\n }\n\n function ceil(x, p) {\n p = Math.pow(10, p || 0);\n return Math.ceil(parseFloat(x) * p) / p;\n }\n\n function percentage(a, b, overflow) {\n var result = _.round(100 * a / b);\n if(!overflow) {\n if(result > 100) result = 100;\n else if(result < 0) result = 0;\n }\n return result;\n }\n\n function range(start, end) {\n start = Number(start);\n end = Number(end);\n var result = [],\n dir = (start <= end) ? 1 : -1;\n //end = end + dir;\n while(start !== end) {\n result.push(start);\n start += dir;\n }\n return result;\n }\n\n function titleCase(str) {\n return _.flow(\n _.words,\n _.partial(_.map, _, _.capitalize),\n w => w.join(\" \")\n )(str);\n }\n\n})();\n","(function() {\n 'use strict';\n /**\n * Definition for the cn.model module\n */\n angular.module('cn.util', [])\n .factory('cnUtil', function() {\n let removeStretegies = {\n 'delete': (obj, key) => {delete obj[key];},\n 'null': (obj, key) => {obj[key] = null;}\n };\n\n return {\n buildParams,\n buildSref,\n cleanModel,\n cleanModelVal,\n cleanEmptyJson,\n diff,\n getModified,\n inheritCommon,\n extend,\n constructErrorMessageAsHtml,\n constructPopoverHtml,\n equals\n };\n\n /////////\n\n function buildParams(...params) {\n if(!params[0]) return '';\n if(_.isArray(params[0])) params = params[0];\n\n if(params.length > 1) {\n params = params.reduceRight((prev, cur) => _.assign(prev, cur), {});\n }\n else params = params[0];\n return _.isString(params) ? params : angular.toJson(params);\n }\n\n function buildSref(state, ...params) {\n return `${state}(${buildParams(...params)})`;\n }\n\n function cleanModel(model) {\n _.each(model, cleanModelVal);\n return model;\n }\n\n function cleanModelVal(modelVal) {\n // if array,\n if(_.isArray(modelVal)) {\n modelVal.forEach(cleanModelVal);\n }\n else if(_.isObject(modelVal)) {\n _.each(modelVal, (val, key) => {\n if(val === null || val === undefined) delete modelVal[key];\n else if(_.isArray(val)) val.forEach(cleanModelVal);\n else if(_.isObject(val)) cleanModelVal(val);\n });\n }\n }\n\n function diff(original, current, deep, removeStrategy) {\n return getModified(original, current, removeStrategy, !deep);\n }\n\n function getModified(original, copy, removeStrategy, shallow) {\n let removeHandler = removeStretegies[removeStrategy] || removeStretegies[null];\n let eq = shallow ? equals : angular.equals;\n\n if(eq(original, copy)) return;\n if(_.isObject(copy) && !_.isArray(copy)) {\n let modified = {};\n _.each(copy, (val, key) => {\n if(shallow) {\n if(!eq(val, original[key])) {\n modified[key] = cleanEmptyJson(val, original[key]);\n }\n }\n else {\n let tmp = original[key] ?\n getModified(original[key], val, removeStrategy) :\n val;\n if(tmp !== undefined && !eq(original[key], tmp)) modified[key] = tmp;\n }\n });\n _.each(original, (val, key) => {\n if(val && (copy[key] === null || copy[key] === undefined)) {\n removeHandler(modified, key);\n }\n });\n return _.isEmpty(modified) ? undefined : modified;\n }\n return copy;\n }\n\n function cleanEmptyJson(copy, original) {\n if(_.isArray(copy)) {\n return _.map(\n copy,\n (x, i) => cleanEmptyJson(x, original ? original[i] : undefined)\n );\n }\n if(_.isObject(copy)) {\n let ret = {}, k, v, a, b;\n for(k in copy) {\n a = copy[k];\n b = _.get(original, k);\n if(!_.isTrulyEmpty(a, null)) {\n v = cleanEmptyJson(a, b);\n if(!_.isUndefined(v)) ret[k] = v;\n }\n }\n return _.isEmpty(ret) ? undefined : ret;\n }\n return copy;\n }\n\n function undefinedAndFalsy(a, b) {\n return (\n (a === undefined || b === undefined) &&\n (a === false || a === 0 || b === false || b === 0)\n );\n }\n\n /* Ripping off angular.equals but treating empty array and undefined/null as equal */\n function equals(a, b) {\n if(a === b ||\n (_.isTrulyEmpty(a, null) &&\n _.isTrulyEmpty(b, null) &&\n !undefinedAndFalsy(a, b))\n ) return true;\n let ta = typeof a, tb = typeof b, l, k, ks;\n if(ta === tb && ta === 'object' && _.isObject(a) && _.isObject(b)) {\n if(_.isArray(a)) {\n if(!_.isArray(b)) return false;\n if((l = a.length) === b.length) {\n for(k = 0; k < l; k++) {\n if(!equals(a[k], b[k])) return false;\n }\n return true;\n }\n }\n else if(_.isDate(a)) {\n return _.isDate(b) && equals(a.getTime(), b.getTime());\n }\n else if(_.isRegExp(a)) {\n return _.isRegExp(b) && a.toString() === b.toString();\n }\n else {\n if(_.isArray(b) || _.isDate(b) || _.isRegExp(b)) return false;\n ks = Object.create(null);\n for(k in a) {\n if(k.charAt(0) === '$' || _.isFunction(a[k])) continue;\n if(!equals(a[k], b[k])) return false;\n if(!_.isTrulyEmpty(a[k], null)) ks[k] = true;\n }\n for(k in b) {\n if(!(k in ks) &&\n k.charAt(0) !== '$' &&\n !_.isTrulyEmpty(b[k], null) &&\n !_.isFunction(b[k])) return false;\n }\n return true;\n }\n }\n return false;\n }\n\n function inheritCommon(from, to) {\n _.each(to, function(val, key) {\n if(key in from) {\n val = from[key];\n if(_.isObject(val) && !_.isArray(val) && to[key]) {\n to[key] = inheritCommon(val, to[key]);\n }\n else {\n to[key] = val;\n }\n }\n });\n return to;\n }\n\n function extend(base, sub) {\n // Avoid instantiating the base class just to setup inheritance\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create\n // for a polyfill\n // Also, do a recursive merge of two prototypes, so we don't overwrite\n // the existing prototype, but still maintain the inheritance chain\n // Thanks to @ccnokes\n var ogProto = sub.prototype;\n sub.prototype = Object.create(base.prototype);\n _.extend(sub.prototype, ogProto);\n // Remember the constructor property was set wrong, let's fix it\n sub.prototype.constructor = sub;\n // In ECMAScript5+ (all modern browsers), you can make the constructor property\n // non-enumerable if you define it like this instead\n Object.defineProperty(sub.prototype, 'constructor', {\n enumerable: false,\n value: sub\n });\n }\n\n /**\n * Used to build an HTML representation of the description keys in the errors array.\n * See: API call GET /campaigns/:id/subCampaigns/status<\n *\n * Sample HTML

One error
Another error

\n *\n * @param errors{array}\n * @returns {string}\n */\n function constructErrorMessageAsHtml(errors) {\n var errorMessage = '';\n errors.forEach(function(error) {\n errorMessage = errorMessage + '

' + error.description + '

';\n });\n return errorMessage;\n }\n\n /**\n * Used to append a popoverHtml key on the objects (campaigns, adSets, ads)\n * that contains the name and id of the object so it can be show in in the popover\n *\n * @param objectsArray\n * @param nameKey\n * @param idKey\n * @returns {*}\n */\n function constructPopoverHtml(objectsArray, nameKey, idKey) {\n objectsArray.forEach(function(object) {\n object.popoverHtml = '

Name: ' + object[nameKey] + '

' + '

ID: ' + object[idKey] + '

';\n });\n return objectsArray;\n }\n });\n})();\n"]} \ No newline at end of file diff --git a/src/_.mixins.js b/src/_.mixins.js index d62047a..0dde43c 100644 --- a/src/_.mixins.js +++ b/src/_.mixins.js @@ -58,17 +58,33 @@ ); } - function allEqual(vals) { + function allEqual(vals, excludes) { let first = _.first(vals); if(_.isArray(first) && !_.isObject(_.first(first))) { return _.allEqual(vals.map(v => JSON.stringify(v))); } if(_.isObject(first)) { - return _.every(vals, _.matches(first)); + if (!_.isArray(first)) { + return _.every(vals, _.matches(first)); + } else { + return arrayDeepEqual(vals, first, _.isArray(excludes) ? excludes : []); + } } return _.uniq(vals).length === 1; } + function arrayDeepEqual(vals, val, excludes) { + const lengthCheck = vals.map(v => v.length).every(l => l === val.length); + if (!lengthCheck) return false; + let result = true; + for (let i = 0; i < val.length; i++) { + const clonedVal = Object.assign({}, _.omit(val[i], excludes)); + const clonedVals = vals.map(val => val[i]); + result = result && _.all(clonedVals, clonedVal); + } + return result; + }; + function empty(obj) { if(_.isArray(obj)) { obj.length = 0;