@base-framework/base 3.5.37 → 3.5.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/base.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/shared/arrays.js", "../src/shared/types.js", "../src/shared/objects.js", "../src/main/data-tracker/tracker-types.js", "../src/main/data-tracker/tracker.js", "../src/main/data-tracker/data-tracker.js", "../src/main/equals.js", "../src/main/events/events.js", "../src/main/events/event-methods.js", "../src/main/base.js", "../src/modules/ajax/xhr-default-settings.js", "../src/modules/ajax/base-ajax-methods.js", "../src/shared/strings.js", "../src/modules/ajax/xhr-request.js", "../src/modules/ajax/ajax.js", "../src/modules/component/prop-utils.js", "../src/modules/data-binder/connection-tracker/connection-tracker.js", "../src/modules/data-binder/sources/source.js", "../src/modules/data-binder/sources/one-way-source.js", "../src/modules/data-binder/connection-tracker/connections/connection.js", "../src/modules/data-binder/connection-tracker/connections/one-way-connection.js", "../src/modules/data-binder/sources/two-way-source.js", "../src/modules/data-binder/sources/data-source.js", "../src/shared/dom.js", "../src/modules/data-binder/sources/get-bind-attr.js", "../src/modules/data-binder/sources/element-source.js", "../src/modules/data-binder/connection-tracker/connections/two-way-connection.js", "../src/modules/data-binder/data-pub-sub.js", "../src/modules/data-binder/data-binder.js", "../src/modules/layout/directives/core/reactive/get-parent-data.js", "../src/modules/html/html.js", "../src/modules/layout/html-helper.js", "../src/modules/layout/watcher-helper.js", "../src/modules/atom/atom.js", "../src/modules/data/data-proxy.js", "../src/modules/data/local-data.js", "../src/modules/data/types/model/attrs.js", "../src/modules/data/types/basic-data.js", "../src/modules/data/types/deep-data/data-utils.js", "../src/modules/data/types/deep-data/property-helper.js", "../src/modules/data/types/deep-data/publisher.js", "../src/modules/data/types/deep-data/deep-data.js", "../src/shared/encode/json.js", "../src/shared/encode/encode.js", "../src/modules/data/types/model/model-service.js", "../src/modules/data/types/model/model.js", "../src/modules/data/types/simple-data.js", "../src/modules/state/state.js", "../src/modules/state/state-target.js", "../src/modules/state/state-tracker.js", "../src/modules/component/event-helper.js", "../src/modules/component/state-helper.js", "../src/modules/component/parse-args.js", "../src/modules/component/unit.js", "../src/modules/component/component.js", "../src/modules/component/shorthand-methods.js", "../src/modules/component/jot.js", "../src/modules/component/pod.js", "../src/modules/date/date-time.js", "../src/modules/layout/directives/directive.js", "../src/modules/layout/directives/directives.js", "../src/modules/layout/element/attribute-directive.js", "../src/modules/layout/element/attribute.js", "../src/modules/layout/element/element.js", "../src/modules/layout/element/parser.js", "../src/modules/layout/render/render.js", "../src/modules/layout/render/browser-render.js", "../src/modules/layout/html-to-string.js", "../src/modules/layout/render/server-render.js", "../src/modules/layout/render/render-controller.js", "../src/modules/layout/builder.js", "../src/modules/import/group.js", "../src/modules/import/layout-manager.js", "../src/modules/import/module-loader.js", "../src/modules/import/import-wrapper.js", "../src/modules/import/import.js", "../src/modules/layout/directives/core/animate/animate.js", "../src/modules/layout/directives/core/dom-methods.js", "../src/modules/layout/directives/core/reactive/on-set.js", "../src/modules/layout/directives/core/aria/aria.js", "../src/modules/layout/directives/core/attribute-helpers.js", "../src/modules/layout/directives/core/context/context-directives.js", "../src/modules/layout/directives/core/data.js", "../src/modules/layout/directives/core/debug.js", "../src/modules/layout/directives/core/parent/parent-directives.js", "../src/modules/layout/directives/core/reactive/bind.js", "../src/modules/layout/directives/core/reactive/on-state.js", "../src/modules/layout/directives/core/reactive/data-set.js", "../src/modules/layout/directives/core/reactive/for-each.js", "../src/modules/layout/directives/core/reactive/map.js", "../src/modules/layout/directives/core/reactive/on-created.js", "../src/modules/layout/directives/core/reactive/on-destroyed.js", "../src/modules/layout/directives/core/reactive/watch.js", "../src/modules/router/history/history.js", "../src/modules/router/history/browser-history.js", "../src/modules/router/history/hash-history.js", "../src/modules/router/history/history-controller.js", "../src/modules/component/cloak.js", "../src/modules/router/routes/component-helper.js", "../src/modules/router/routes/param-pattern.js", "../src/modules/router/routes/route-pattern.js", "../src/modules/router/routes/route.js", "../src/modules/router/set-title.js", "../src/modules/router/utils.js", "../src/modules/router/nav-link.js", "../src/modules/router/router.js", "../src/modules/layout/directives/core/route.js", "../src/modules/layout/directives/core/state.js", "../src/modules/layout/directives/core/switch.js", "../src/modules/layout/directives/core/default-directives.js", "../src/base.js"],
4
- "sourcesContent": ["/**\r\n * Arrays\r\n *\r\n * This will contain methods for working with arrays.\r\n *\r\n * @module\r\n * @name Arrays\r\n */\r\nexport class Arrays\r\n{\r\n\t/**\r\n\t * This will convert an object or collection into an array.\r\n\t *\r\n\t * @param {object} list\r\n\t * @returns {array}\r\n\t */\r\n\tstatic toArray(list)\r\n\t{\r\n\t\treturn Array.from(list);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a value is found in an array.\r\n\t *\r\n\t * @param {array} array\r\n\t * @param {string} element\r\n\t * @param {number} [fromIndex]\r\n\t * @returns {number} This will return -1 if not found.\r\n\t */\r\n\tstatic inArray(array, element, fromIndex)\r\n\t{\r\n\t\tif (!Array.isArray(array))\r\n\t\t{\r\n\t\t\treturn -1;\r\n\t\t}\r\n\r\n\t\treturn array.indexOf(element, fromIndex);\r\n\t}\r\n}\r\n", "/**\r\n * Types\r\n *\r\n * Utility class for working with variable types.\r\n *\r\n * @module\r\n * @name Types\r\n */\r\nexport class Types\r\n{\r\n\t/**\r\n\t * Gets the type of a variable.\r\n\t *\r\n\t * @param {*} data - The data whose type is to be determined.\r\n\t * @returns {string} The type of the variable ('undefined', 'object', 'function', 'array', etc.).\r\n\t */\r\n\tstatic getType(data)\r\n\t{\r\n\t\tconst type = typeof data;\r\n\t\tif (type !== \"object\")\r\n\t\t{\r\n\t\t\treturn type;\r\n\t\t}\r\n\r\n\t\treturn Array.isArray(data) ? \"array\" : \"object\"; // Directly check for array type.\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if a value is undefined.\r\n\t *\r\n\t * @param {*} data - The data to check.\r\n\t * @returns {boolean} True if the data is undefined.\r\n\t */\r\n\tstatic isUndefined(data)\r\n\t{\r\n\t\treturn typeof data === \"undefined\";\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if a value is an object (excluding arrays).\r\n\t *\r\n\t * @param {*} data - The data to check.\r\n\t * @returns {boolean} True if the data is a plain object.\r\n\t */\r\n\tstatic isObject(data)\r\n\t{\r\n\t\treturn data !== null && typeof data === \"object\" && !Array.isArray(data);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if a value is a function.\r\n\t *\r\n\t * @param {*} data - The data to check.\r\n\t * @returns {boolean} True if the data is a function.\r\n\t */\r\n\tstatic isFunction(data)\r\n\t{\r\n\t\treturn typeof data === \"function\";\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if a value is a string.\r\n\t *\r\n\t * @param {*} data - The data to check.\r\n\t * @returns {boolean} True if the data is a string.\r\n\t */\r\n\tstatic isString(data)\r\n\t{\r\n\t\treturn typeof data === \"string\";\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if a value is an array.\r\n\t *\r\n\t * @param {*} data - The data to check.\r\n\t * @returns {boolean} True if the data is an array.\r\n\t */\r\n\tstatic isArray(data)\r\n\t{\r\n\t\treturn Array.isArray(data);\r\n\t}\r\n}", "import { Types } from \"./types.js\";\r\n\r\n/**\r\n * Objects\r\n *\r\n * Contains methods for working with objects.\r\n *\r\n * @module\r\n * @name Objects\r\n */\r\nexport const Objects =\r\n{\r\n\t/**\r\n\t * Creates a new object, optionally extending from another object.\r\n\t *\r\n\t * @param {object} [prototype] - The prototype object to extend from.\r\n\t * @returns {object} The newly created object.\r\n\t */\r\n\tcreate(prototype)\r\n\t{\r\n\t\treturn Object.create(prototype || null);\r\n\t},\r\n\r\n\t/**\r\n\t * Extends properties from the source object to the target object.\r\n\t * Only copies properties that are not already defined on the target object.\r\n\t *\r\n\t * @param {object} sourceObj - The source object.\r\n\t * @param {object} targetObj - The target object to extend.\r\n\t * @returns {object|false} The extended target object or false if invalid.\r\n\t */\r\n\textendObject(sourceObj, targetObj)\r\n\t{\r\n\t\tif (!Types.isObject(sourceObj) || !Types.isObject(targetObj))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tObject.keys(sourceObj).forEach((key) =>\r\n\t\t{\r\n\t\t\tif (!this.hasOwnProp(targetObj, key))\r\n\t\t\t{\r\n\t\t\t\ttargetObj[key] = sourceObj[key];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn targetObj;\r\n\t},\r\n\r\n\t/**\r\n\t * Deep clones an object in a safe and scalable manner.\r\n\t *\r\n\t * @param {object} obj - The object to clone.\r\n\t * @returns {object} A deep clone of the object.\r\n\t */\r\n\tclone(obj)\r\n\t{\r\n\t\tif (!obj || !Types.isObject(obj))\r\n\t\t{\r\n\t\t\treturn {};\r\n\t\t}\r\n\r\n\t\treturn JSON.parse(JSON.stringify(obj));\r\n\t},\r\n\r\n\t/**\r\n\t * Retrieves the prototype of a class or object.\r\n\t *\r\n\t * @param {function|object} entity - The class or object.\r\n\t * @returns {object} The prototype of the entity.\r\n\t */\r\n\tgetClassObject(entity)\r\n\t{\r\n\t\treturn typeof entity === \"function\" ? entity.prototype : entity;\r\n\t},\r\n\r\n\t/**\r\n\t * Extends a class or object with the properties of another class or object.\r\n\t *\r\n\t * @param {function|object} sourceClass - The source class or object.\r\n\t * @param {function|object} targetClass - The target class or object.\r\n\t * @returns {object|false} The resulting extended object or false if invalid.\r\n\t */\r\n\textendClass(sourceClass, targetClass)\r\n\t{\r\n\t\tconst source = this.getClassObject(sourceClass);\r\n\t\tconst target = this.getClassObject(targetClass);\r\n\t\tif (typeof source !== 'object' || typeof target !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to create a new object and add the source\r\n\t\tprototype to the new object */\r\n\t\tconst obj = Object.create(source);\r\n\r\n\t\t/* we want to add any additional properties from the\r\n\t\ttarget class to the new object */\r\n\t\tfor (var prop in target)\r\n\t\t{\r\n\t\t\tobj[prop] = target[prop];\r\n\t\t}\r\n\r\n\t\treturn obj;\r\n\t},\r\n\r\n\t/**\r\n\t * Checks if an object has a specific property.\r\n\t *\r\n\t * @param {object} obj - The object to check.\r\n\t * @param {string} prop - The property to check for.\r\n\t * @returns {boolean} True if the object has the property.\r\n\t */\r\n\thasOwnProp(obj, prop)\r\n\t{\r\n\t\treturn Object.prototype.hasOwnProperty.call(obj, prop);\r\n\t},\r\n\r\n\t/**\r\n\t * Determines if a value is a plain object.\r\n\t *\r\n\t * @param {object} obj - The value to check.\r\n\t * @returns {boolean} True if the value is a plain object.\r\n\t */\r\n\tisPlainObject(obj)\r\n\t{\r\n\t\treturn !!obj && Object.prototype.toString.call(obj) === \"[object Object]\";\r\n\t},\r\n\r\n\t/**\r\n\t * Checks if an object is empty.\r\n\t *\r\n\t * @param {object} obj - The object to check.\r\n\t * @returns {boolean} True if the object has no own properties.\r\n\t */\r\n\tisEmpty(obj)\r\n\t{\r\n\t\tif (!Types.isObject(obj))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn Object.keys(obj).length === 0;\r\n\t}\r\n};", "/**\r\n * TrackerTypes\r\n *\r\n * This will add and remove tracker types to the data tracker.\r\n *\r\n * @type {object} TrackerTypes\r\n *\r\n */\r\nexport const TrackerTypes =\r\n{\r\n /**\r\n * @member {object} types The Type and callBack that is called\r\n * when the type is removed from the object.\r\n */\r\n types: {},\r\n\r\n /**\r\n * This will add a type.\r\n *\r\n * @param {string} type\r\n * @param {function} callBack The function to call when an object\r\n * is having the type removed.\r\n * @returns {void}\r\n */\r\n add(type, callBack)\r\n {\r\n this.types[type] = callBack;\r\n },\r\n\r\n /**\r\n * This will get a type or return false.\r\n *\r\n * @param {string} type\r\n * @returns {(Function|false)} The callBack or false.\r\n */\r\n get(type)\r\n {\r\n return this.types[type] || false;\r\n },\r\n\r\n /**\r\n * This will remove a type.\r\n *\r\n * @param {string} type\r\n * @returns {void}\r\n */\r\n remove(type)\r\n {\r\n delete this.types[type];\r\n }\r\n};", "import { TrackerTypes } from './tracker-types.js';\r\n\r\n/**\r\n * Tracker\r\n *\r\n * This will create a tracker for an object that will\r\n * store each type added and the data stored to\r\n * each type.\r\n *\r\n * @class\r\n */\r\nexport class Tracker\r\n{\r\n\t/**\r\n\t * This will create a new tracker.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {Map} types\r\n\t\t */\r\n\t\tthis.types = new Map();\r\n\t}\r\n\r\n\t/**\r\n\t * This will add data to a type.\r\n\t *\r\n\t * @public\r\n\t * @param {string} addingType The type of data.\r\n\t * @param {*} data The data to store\r\n\t * @returns {void}\r\n\t */\r\n\tadd(addingType, data)\r\n\t{\r\n\t\tif (!this.types.has(addingType))\r\n\t\t{\r\n\t\t\tthis.types.set(addingType, []);\r\n\t\t}\r\n\t\tthis.types.get(addingType).push(data);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get all the data stored to a data type.\r\n\t * @param {string} type\r\n\t * @returns {*} the data or false.\r\n\t */\r\n\tget(type)\r\n\t{\r\n\t\treturn this.types.get(type) || false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a type exists.\r\n\t * @param {*} type\r\n\t * @returns {boolean}\r\n\t */\r\n\thas(type)\r\n\t{\r\n\t\treturn this.types.has(type);\r\n\t}\r\n\r\n\t/**\r\n\t * This will call the callBack with the data.\r\n\t *\r\n\t * @private\r\n\t * @param {function} callBack\r\n\t * @param {*} data\r\n\t * @returns {void}\r\n\t */\r\n\tremoveByCallBack(callBack, data)\r\n\t{\r\n\t\tif (typeof callBack === 'function')\r\n\t\t{\r\n\t\t\tcallBack(data);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the data by type.\r\n\t *\r\n\t * @private\r\n\t * @param {string} removingType\r\n\t * @returns {void}\r\n\t */\r\n\tremoveType(removingType)\r\n\t{\r\n\t\tif (!this.types.has(removingType))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst typeData = this.types.get(removingType);\r\n\t\tif (!typeData.length)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet data,\r\n\t\tcallBack = TrackerTypes.get(removingType);\r\n\t\tif (!callBack)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (var i = 0, length = typeData.length; i < length; i++)\r\n\t\t{\r\n\t\t\tdata = typeData[i];\r\n\t\t\tif (!data)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// this will stop any circular referrences\r\n\t\t\ttypeData[i] = null;\r\n\r\n\t\t\tthis.removeByCallBack(callBack, data);\r\n\t\t}\r\n\t\tthis.types.delete(removingType);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the data by type or all if no type is\r\n\t * set.\r\n\t *\r\n\t * @public\r\n\t * @param {string} [type]\r\n\t * @returns {void}\r\n\t */\r\n\tremove(type)\r\n\t{\r\n\t\tif (type)\r\n\t\t{\r\n\t\t\tthis.removeType(type);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.types.forEach((value, typeKey) =>\r\n\t\t{\r\n\t\t\tif (!typeKey)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis.removeType(typeKey);\r\n\t\t});\r\n\r\n\t\tthis.types.clear();\r\n\t}\r\n}", "import { TrackerTypes } from './tracker-types.js';\r\nimport { Tracker } from './tracker.js';\r\n\r\n/**\r\n * DataTracker\r\n *\r\n * This will add data tracking for objects. The DataTracker is\r\n * a single point where any data can be tracked to an object\r\n * or element. Modules can register types to store their own\r\n * data that can allow the data to be removed when the element\r\n * is removed.\r\n *\r\n * @class\r\n */\r\nexport class DataTracker\r\n{\r\n\t/**\r\n\t * @private\r\n\t * @static\r\n\t * @member {Map} trackers This is an object that stores all tracker\r\n\t * objects by tracking id.\r\n\t */\r\n\tstatic trackers = new Map();\r\n\r\n\t/**\r\n\t * @private\r\n\t * @static\r\n\t * @member {number} trackingCount\r\n\t */\r\n\tstatic trackingCount = 0;\r\n\r\n\t/**\r\n\t * This will add a new type to the data tracker.\r\n\t *\r\n\t * @public\r\n\t * @param {string} type The new type.\r\n\t * @param {function} callBack The callBack to help clean\r\n\t * up data when removed.\r\n\t * @returns {void}\r\n\t */\r\n\tstatic addType(type, callBack)\r\n\t{\r\n\t\tTrackerTypes.add(type, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a type from the data tracker.\r\n\t *\r\n\t * @param {string} type\r\n\t * @returns {void}\r\n\t */\r\n\tstatic removeType(type)\r\n\t{\r\n\t\tTrackerTypes.remove(type);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the object tracking id or set it if\r\n\t * not set.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {string}\r\n\t */\r\n\tstatic getTrackingId(obj)\r\n\t{\r\n\t\tif (!obj)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\treturn obj.trackingId || (obj.trackingId = `dt${this.trackingCount++}`);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add data to an object.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} type The type name.\r\n\t * @param {*} data The data to track.\r\n\t * @returns {void}\r\n\t */\r\n\tstatic add(obj, type, data)\r\n\t{\r\n\t\tconst id = this.getTrackingId(obj),\r\n\t\ttracker = this.find(id);\r\n\t\ttracker.add(type, data);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the data from a type or the tracker object\r\n\t * if type is not set.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} [type]\r\n\t * @returns {*}\r\n\t */\r\n\tstatic get(obj, type)\r\n\t{\r\n\t\tconst id = obj.trackingId;\r\n\t\tconst tracker = this.trackers.get(id);\r\n\t\tif (!tracker)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn (type)? tracker.get(type) : tracker;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if an object has a specific type.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} type\r\n\t * @returns {boolean}\r\n\t */\r\n\tstatic has(obj, type)\r\n\t{\r\n\t\tconst id = this.getTrackingId(obj);\r\n\t\tif (!id)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst tracker = this.trackers.get(id);\r\n\t\tif (!tracker)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn (type)? tracker.has(type) : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the tracker or create a new tracker\r\n\t * if no tracker is set.\r\n\t *\r\n\t * @param {string} id\r\n\t * @returns {object} The tracker.\r\n\t */\r\n\tstatic find(id)\r\n\t{\r\n\t\tif (!this.trackers.has(id))\r\n\t\t{\r\n\t\t\tthis.trackers.set(id, new Tracker());\r\n\t\t}\r\n\t\treturn this.trackers.get(id);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if an object is empty.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {boolean}\r\n\t */\r\n\tstatic isEmpty(obj)\r\n\t{\r\n\t\tif (!obj || typeof obj !== 'object')\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn (obj.size === 0);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a type or all data for an object if\r\n\t * no type is set.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} [type]\r\n\t * @returns {void}\r\n\t */\r\n\tstatic remove(obj, type)\r\n\t{\r\n\t\tconst id = obj.trackingId;\r\n\t\tif (!id || !this.trackers.has(id))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst tracker = this.trackers.get(id);\r\n\r\n\t\t/**\r\n\t\t * if no type is set then remove the whole tracker.\r\n\t\t */\r\n\t\tif (!type)\r\n\t\t{\r\n\t\t\ttracker.remove();\r\n\t\t\tthis.trackers.delete(id);\r\n\t\t\tdelete obj.trackingId;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ttracker.remove(type);\r\n\r\n\t\t/**\r\n\t\t * if the tracker is empty then remove the tracker.\r\n\t\t */\r\n\t\tif (this.isEmpty(tracker.types))\r\n\t\t{\r\n\t\t\tthis.trackers.delete(id);\r\n\t\t\tdelete obj.trackingId;\r\n\t\t}\r\n\t}\r\n}", "import { Objects } from '../shared/objects.js';\r\n\r\n/**\r\n * This will count the properties of an object.\r\n *\r\n * @param {object} obj\r\n * @returns {number}\r\n */\r\nconst countProperty = (obj) =>\r\n{\r\n\tlet count = 0;\r\n\tfor (let [property, value] of Object.entries(obj))\r\n\t{\r\n\t\tcount++;\r\n\r\n\t\t/**\r\n\t\t * We want to do a recursive count to get\r\n\t\t * any child properties.\r\n\t\t */\r\n\t\tif (typeof obj[property] === 'object')\r\n\t\t{\r\n\t\t\tcount += countProperty(obj[property]);\r\n\t\t}\r\n\t}\r\n\treturn count;\r\n};\r\n\r\n/**\r\n * This will validate if the object properties match another object.\r\n *\r\n * @param {object} obj1\r\n * @param {object} obj2\r\n * @returns {boolean}\r\n */\r\nconst matchProperties = (obj1, obj2) =>\r\n{\r\n\tlet matched = false;\r\n\r\n\tif (typeof obj1 !== 'object' || typeof obj2 !== 'object')\r\n\t{\r\n\t\treturn matched;\r\n\t}\r\n\r\n\t/**\r\n\t * We want to check each object1 property to the\r\n\t * object 2 property.\r\n\t */\r\n\tfor (let [property, value1] of Object.entries(obj1))\r\n\t{\r\n\t\t/**\r\n\t\t * We want to check if the property is owned by the\r\n\t\t * object and that they have matching types.\r\n\t\t */\r\n\t\tif (!Objects.hasOwnProp(obj2, property))\r\n\t\t{\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tconst value2 = obj2[property];\r\n\t\tif (typeof value1 !== typeof value2)\r\n\t\t{\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\t/* we want to check if the type is an object */\r\n\t\tif (typeof value1 === 'object')\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * This will do a recursive check to the\r\n\t\t\t * child properties.\r\n\t\t\t */\r\n\t\t\tmatched = matchProperties(value1, value2);\r\n\t\t\tif (matched !== true)\r\n\t\t\t{\r\n\t\t\t\t/* if a property did not match we can stop\r\n\t\t\t\tthe comparison */\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif (value1 === value2)\r\n\t\t\t{\r\n\t\t\t\tmatched = true;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn matched;\r\n};\r\n\r\n/**\r\n * This will compare if two objects match.\r\n *\r\n * @param {object} obj1\r\n * @param {object} obj2\r\n * @returns {boolean}\r\n */\r\nconst compareObjects = (obj1, obj2) =>\r\n{\r\n\t/* we want to check if they have the same number of\r\n\tproperties */\r\n\tconst option1Count = countProperty(obj1),\r\n\toption2Count = countProperty(obj2);\r\n\tif (option1Count !== option2Count)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\treturn matchProperties(obj1, obj2);\r\n};\r\n\r\n/**\r\n * This will compare if two values match.\r\n *\r\n * @param {*} option1\r\n * @param {*} option2\r\n * @returns {boolean}\r\n */\r\nexport const equals = (option1, option2) =>\r\n{\r\n\t/* we want to check if there types match */\r\n\tconst option1Type = typeof option1,\r\n\toption2Type = typeof option2;\r\n\tif (option1Type !== option2Type)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/* we need to check if the options are objects\r\n\tbecause we will want to match all the\r\n\tproperties */\r\n\tif (option1Type === 'object')\r\n\t{\r\n\t\treturn compareObjects(option1, option2);\r\n\t}\r\n\r\n\treturn (option1 === option2);\r\n};", "import { Types } from '../../shared/types.js';\r\nimport { DataTracker } from '../data-tracker/data-tracker.js';\r\n\r\n/**\r\n * Events\r\n *\r\n * This will add event adding, tracking, and\r\n * removing to an object.\r\n */\r\nexport const Events =\r\n{\r\n\t/**\r\n\t * This will get the events on an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {array}\r\n\t */\r\n\tgetEvents(obj)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\treturn DataTracker.get(obj, 'events');\r\n\t},\r\n\r\n\t/**\r\n\t * This will create an object to use with the dataTracker.\r\n\t *\r\n\t * @param {string} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @param {boolean} [swapped]\r\n\t * @param {function} [originalFn]\r\n\t * @returns {object}\r\n\t */\r\n\tcreate(event, obj, fn, capture = false, swapped = false, originalFn = null)\r\n\t{\r\n\t\t/* we want to check if the swapped param was set */\r\n\t\tswapped = (swapped === true);\r\n\r\n\t\treturn {\r\n\t\t\tevent,\r\n\t\t\tobj,\r\n\t\t\tfn,\r\n\t\t\tcapture,\r\n\t\t\tswapped,\r\n\t\t\toriginalFn\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * This will add an event to an object.\r\n\t *\r\n\t * @param {string|array} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object} The events object.\r\n\t */\r\n\ton(event, obj, fn, capture)\r\n\t{\r\n\t\tif (Array.isArray(event))\r\n\t\t{\r\n\t\t\tevent.forEach((evt) => this.add(evt, obj, fn, capture));\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.add(event, obj, fn, capture);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove an event from an object.\r\n\t *\r\n\t * @param {string|array} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object} The events object.\r\n\t */\r\n\toff(event, obj, fn, capture)\r\n\t{\r\n\t\tif (Array.isArray(event))\r\n\t\t{\r\n\t\t\tvar evt;\r\n\t\t\tevent.forEach((evt) => this.remove(evt, obj, fn, capture));\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.remove(event, obj, fn, capture);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will add an event to an object.\r\n\t *\r\n\t * @param {string} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {object|boolean} [capture]\r\n\t * @param {boolean} [swapped]\r\n\t * @param {function} [originalFn]\r\n\t * @returns {object} The events object.\r\n\t */\r\n\tadd(event, obj, fn, capture = false, swapped = false, originalFn = null)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* we want to create an event object and add it the\r\n\t\tthe active events to track */\r\n\t\tconst data = this.create(event, obj, fn, capture, swapped, originalFn);\r\n\t\tDataTracker.add(obj, 'events', data);\r\n\r\n\t\tobj.addEventListener(event, fn, capture);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove an event from an object.\r\n\t *\r\n\t * @param {string} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {object|boolean} [capture]\r\n\t * @returns {object} a reference to the event object.\r\n\t */\r\n\tremove(event, obj, fn, capture = false)\r\n\t{\r\n\t\tconst result = this.getEvent(event, obj, fn, capture);\r\n\t\tif (result === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif (typeof result === 'object')\r\n\t\t{\r\n\t\t\t/* we want to use the remove event method and just\r\n\t\t\tpass the listener object */\r\n\t\t\tthis.removeEvent(result);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove an event listener.\r\n\t * @param {object} listener\r\n\t * @returns {object} a reference to the event object.\r\n\t */\r\n\tremoveEvent(listener)\r\n\t{\r\n\t\tif (typeof listener === 'object')\r\n\t\t{\r\n\t\t\tconst obj = listener.obj;\r\n\t\t\tobj.removeEventListener(listener.event, listener.fn, listener.capture);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will search for an event.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object|boolean}\r\n\t */\r\n\tgetEvent(event, obj, fn, capture)\r\n\t{\r\n\t\tif (typeof obj !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst events = this.getEvents(obj);\r\n\t\tif (!events || events.length < 1)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst eventObj = this.create(event, obj, fn, capture);\r\n\t\t/* if the search returns anything but false we\r\n\t\tfound our active event */\r\n\t\treturn this.search(eventObj, events);\r\n\t},\r\n\r\n\t/**\r\n\t * This will search for an event from the object events.\r\n\t *\r\n\t * @param {object} eventObj\r\n\t * @param {array} events\r\n\t * @returns {object|boolean}\r\n\t */\r\n\tsearch(eventObj, events)\r\n\t{\r\n\t\tlet listener,\r\n\t\tswappable = this.isSwappable(eventObj.event);\r\n\t\tfor (var i = 0, maxLength = events.length; i < maxLength; i++)\r\n\t\t{\r\n\t\t\tlistener = events[i];\r\n\t\t\tif (listener.event !== eventObj.event || listener.obj !== eventObj.obj)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif (listener.fn === eventObj.fn || (swappable === true && listener.originalFn === eventObj.fn))\r\n\t\t\t{\r\n\t\t\t\treturn listener;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove all events on an object.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {object} a reference to the events object.\r\n\t */\r\n\tremoveEvents(obj)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tDataTracker.remove(obj, 'events');\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * @member {array} swap The swappable events.\r\n\t */\r\n\tswap: [\r\n\t\t'DOMMouseScroll',\r\n\t\t'wheel',\r\n\t\t'mousewheel',\r\n\t\t'mousemove',\r\n\t\t'popstate'\r\n\t],\r\n\r\n\t/**\r\n\t * This will a event type to the swappable array.\r\n\t *\r\n\t * @param {string} type\r\n\t */\r\n\taddSwapped(type)\r\n\t{\r\n\t\tthis.swap.push(type);\r\n\t},\r\n\r\n\t/**\r\n\t * This will check if an event is swappable.\r\n\t *\r\n\t * @param {string} event\r\n\t * @returns {boolean}\r\n\t */\r\n\tisSwappable(event)\r\n\t{\r\n\t\treturn this.swap.includes(event);\r\n\t}\r\n};\r\n\r\n/**\r\n * This will register the event system to the data tracker\r\n * to remove events that have been added in layouts.\r\n */\r\nDataTracker.addType('events', (data) =>\r\n{\r\n\tEvents.removeEvent(data);\r\n});", "import { Types } from '../../shared/types.js';\r\nimport { Events } from './events.js';\r\n\r\n/**\r\n * This will create an object that can be added to base to\r\n * add event methods.\r\n */\r\nexport const EventMethods =\r\n{\r\n\t/**\r\n\t * @member {Events} events\r\n\t */\r\n\tevents: Events,\r\n\r\n\t/**\r\n\t * This will add an event to an object.\r\n\t *\r\n\t * @param {string} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object}\r\n\t */\r\n\taddListener(event, obj, fn, capture)\r\n\t{\r\n\t\tthis.events.add(event, obj, fn, capture);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will add an event to an object.\r\n\t *\r\n\t * @param {string|array} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object}\r\n\t */\r\n\ton(event, obj, fn, capture)\r\n\t{\r\n\t\tconst events = this.events;\r\n\t\tif (Array.isArray(event))\r\n\t\t{\r\n\t\t\tevent.forEach((evt) =>\r\n\t\t\t{\r\n\t\t\t\tevents.add(evt, obj, fn, capture);\r\n\t\t\t});\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tevents.add(event, obj, fn, capture);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove an event from an object.\r\n\t *\r\n\t * @param {string|array} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object}\r\n\t */\r\n\toff(event, obj, fn, capture)\r\n\t{\r\n\t\tconst events = this.events;\r\n\t\tif (Array.isArray(event))\r\n\t\t{\r\n\t\t\tevent.forEach((evt) =>\r\n\t\t\t{\r\n\t\t\t\tevents.remove(evt, obj, fn, capture);\r\n\t\t\t});\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tevents.remove(event, obj, fn, capture);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove an event from an object.\r\n\t *\r\n\t * @param {string} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object}\r\n\t */\r\n\tremoveListener(event, obj, fn, capture)\r\n\t{\r\n\t\t/* we want to remove this from the active events */\r\n\t\tthis.events.remove(event, obj, fn, capture);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will create a custom event.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} event\r\n\t * @param {string} eventType\r\n\t * @param {object} [settings]\r\n\t * @param {object} [params]\r\n\t * @returns {object}\r\n\t */\r\n\t_createEvent(event, eventType, settings, params)\r\n\t{\r\n\t\tlet e;\r\n\t\tswitch (eventType)\r\n\t\t{\r\n\t\t\tcase 'HTMLEvents':\r\n\t\t\t\te = new Event(event, settings);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'MouseEvents':\r\n\t\t\t\te = new MouseEvent(event, settings);\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\te = new CustomEvent(event, params);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\treturn e;\r\n\t},\r\n\r\n\t/**\r\n\t * This will create a custom event. This supports html, mouse,\r\n\t * and customevents.\r\n\t *\r\n\t * @param {string} event\r\n\t * @param {object} obj\r\n\t * @param {object} [options]\r\n\t * @param {object} [params]\r\n\t * @returns {object}\r\n\t */\r\n\tcreateEvent(event, obj, options, params)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet settings =\r\n\t\t{\r\n\t\t\tpointerX: 0,\r\n\t\t\tpointerY: 0,\r\n\t\t\tbutton: 0,\r\n\t\t\tview: window,\r\n\t\t\tdetail: 1,\r\n\t\t\tscreenX: 0,\r\n\t\t\tscreenY: 0,\r\n\t\t\tclientX: 0,\r\n\t\t\tclientY: 0,\r\n\t\t\tctrlKey: false,\r\n\t\t\taltKey: false,\r\n\t\t\tshiftKey: false,\r\n\t\t\tmetaKey: false,\r\n\t\t\tbubbles: true,\r\n\t\t\tcancelable: true,\r\n\t\t\trelatedTarget: null\r\n\t\t};\r\n\r\n\t\tif (Types.isObject(options))\r\n\t\t{\r\n\t\t\tsettings = Object.assign(settings, options);\r\n\t\t}\r\n\r\n\t\tconst eventType = this._getEventType(event);\r\n\t\treturn this._createEvent(event, eventType, settings, params);\r\n\t},\r\n\r\n\t/**\r\n\t * This will get thetype of an event.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} event\r\n\t * @returns {string}\r\n\t */\r\n\t_getEventType(event)\r\n\t{\r\n\t\tconst eventTypes = {\r\n\t\t\t'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,\r\n\t\t\t'MouseEvents': /^(?:click|dblclick|mouse(?:down|up|over|move|out))$/\r\n\t\t};\r\n\r\n\t\tlet eventType = 'CustomEvent';\r\n\t\tfor (const [prop, value] of Object.entries(eventTypes))\r\n\t\t{\r\n\t\t\tif (event.match(value))\r\n\t\t\t{\r\n\t\t\t\teventType = prop;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn eventType;\r\n\t},\r\n\r\n\t/**\r\n\t * This will trigger an event.\r\n\t *\r\n\t * @param {string|object} event\r\n\t * @param {object} obj\r\n\t * @param {object} [params]\r\n\t * @returns {object}\r\n\t */\r\n\ttrigger(event, obj, params)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst e = (typeof event === 'string')? this.createEvent(event, obj, null, params) : event;\r\n\t\tobj.dispatchEvent(e);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * @member {string} mouseWheelEventType The mouse wheel event name.\r\n\t * @protected\r\n\t */\r\n\tmouseWheelEventType: null,\r\n\r\n\t/**\r\n\t * This will get the system mouse event.\r\n\t *\r\n\t * @protected\r\n\t * @returns {string}\r\n\t */\r\n\tgetWheelEventType()\r\n\t{\r\n\t\tconst getMouseWheelType = () =>\r\n\t\t{\r\n\t\t\tlet type = 'wheel';\r\n\t\t\tif ('onmousewheel' in self)\r\n\t\t\t{\r\n\t\t\t\ttype = 'mousewheel';\r\n\t\t\t}\r\n\t\t\telse if ('DOMMouseScroll' in self)\r\n\t\t\t{\r\n\t\t\t\ttype = 'DOMMouseScroll';\r\n\t\t\t}\r\n\t\t\treturn type;\r\n\t\t};\r\n\r\n\t\t/* this will get the event type or\r\n\t\tone time set the type and return the type */\r\n\t\treturn this.mouseWheelEventType || (\r\n\t\t\tthis.mouseWheelEventType = getMouseWheelType()\r\n\t\t);\r\n\t},\r\n\r\n\t/**\r\n\t * This will add a mouse event to an object.\r\n\t *\r\n\t * @param {function} callBackFn\r\n\t * @param {object} [obj]\r\n\t * @param {boolean} [cancelDefault]\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object} base object.\r\n\t */\r\n\tonMouseWheel(callBackFn, obj, cancelDefault, capture = false)\r\n\t{\r\n\t\tif (typeof obj === \"undefined\")\r\n\t\t{\r\n\t\t\tobj = window;\r\n\t\t}\r\n\r\n\t\t/* we want to return the mousewheel data\r\n\t\tto this private callback function before\r\n\t\treturning to the call back function*/\r\n\t\tconst mouseWheelResults = (e) =>\r\n\t\t{\r\n\t\t\tconst delta = Math.max(-1, Math.min(1, (-e.deltaY || e.wheelDelta || -e.detail)));\r\n\r\n\t\t\t/* we can now send the mouse wheel results to\r\n\t\t\tthe call back function */\r\n\t\t\tif (typeof callBackFn === 'function')\r\n\t\t\t{\r\n\t\t\t\tcallBackFn(delta, e);\r\n\t\t\t}\r\n\r\n\t\t\t/* we want to check to cancel default */\r\n\t\t\tif (cancelDefault === true)\r\n\t\t\t{\r\n\t\t\t\te.preventDefault();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst event = this.getWheelEventType();\r\n\t\tthis.events.add(event, obj, mouseWheelResults, capture, true, callBackFn);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove a mouse event\r\n\t *\r\n\t * @param {function} callBackFn\r\n\t * @param {object} [obj]\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object} base object.\r\n\t */\r\n\toffMouseWheel(callBackFn, obj, capture = false)\r\n\t{\r\n\t\tif (typeof obj === \"undefined\")\r\n\t\t{\r\n\t\t\tobj = window;\r\n\t\t}\r\n\r\n\t\tconst event = this.getWheelEventType();\r\n\t\tthis.off(event, obj, callBackFn, capture);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will prevent default on an event.\r\n\t *\r\n\t * @param {object} e\r\n\t * @returns {object} base object.\r\n\t */\r\n\tpreventDefault(e)\r\n\t{\r\n\t\tif (typeof e.preventDefault === 'function')\r\n\t\t{\r\n\t\t\te.preventDefault();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\te.returnValue = false;\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will stop an event from propigating.\r\n\t *\r\n\t * @param {object} e\r\n\t * @returns {object} base object.\r\n\t */\r\n\tstopPropagation(e)\r\n\t{\r\n\t\tif (typeof e.stopPropagation === 'function')\r\n\t\t{\r\n\t\t\te.stopPropagation();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\te.cancelBubble = true;\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n};", "/**\r\n * Base Framework\r\n * @version 3.5.0\r\n * @author Chris Durfee\r\n * @file This is a javascript framework to allow complex\r\n * functions to work in many browsers and versions.\r\n */\r\n\r\nimport { Arrays } from '../shared/arrays.js';\r\nimport { Objects } from '../shared/objects.js';\r\nimport { Types } from '../shared/types.js';\r\nimport { DataTracker } from './data-tracker/data-tracker.js';\r\nimport { equals } from './equals.js';\r\nimport { EventMethods } from './events/event-methods.js';\r\n\r\n/**\r\n * Base\r\n *\r\n * This is the base framework.\r\n *\r\n * @class\r\n */\r\nclass Base\r\n{\r\n\t/**\r\n\t * This will create an instance of base.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {array} errors\r\n\t\t */\r\n\t\tthis.errors = [];\r\n\r\n\t\t/**\r\n\t\t * @member {object} dataTracker\r\n\t\t */\r\n\t\tthis.dataTracker = DataTracker;\r\n\t}\r\n\r\n\t/**\r\n\t * this will augement the base framework with new functionality.\r\n\t *\r\n\t * @param {object} methods The new methods to add.\r\n\t * @returns {object} An instance of base.\r\n\t */\r\n\taugment(methods)\r\n\t{\r\n\t\tif (!Types.isObject(methods))\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst prototype = this.constructor.prototype;\r\n\t\tfor (var property in methods)\r\n\t\t{\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(methods, property))\r\n\t\t\t{\r\n\t\t\t\tprototype[property] = methods[property];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will override a method function with a new function.\r\n\t *\r\n\t * @param {object} obj The object being modified.\r\n\t * @param {string} methodName the method name being overriden.\r\n\t * @param {function} overrideMethod The new function to call.\r\n\t * @param {array} args The args to pass to the first function call.\r\n\t * @returns {*} The results of the function being called.\r\n\t */\r\n\toverride(obj, methodName, overrideMethod, args)\r\n\t{\r\n\t\treturn (obj[methodName] = overrideMethod).apply(obj, Arrays.toArray(args));\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the last error.\r\n\t *\r\n\t * @returns {(object|boolean)} The last error or false.\r\n\t */\r\n\tgetLastError()\r\n\t{\r\n\t\tconst errors = this.errors;\r\n\t\treturn (errors.length)? errors.pop() : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an error.\r\n\t *\r\n\t * @param {object} err\r\n\t * @returns {void}\r\n\t */\r\n\taddError(err)\r\n\t{\r\n\t\tthis.errors.push(err);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value from a property on an object.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {*} [defaultText] A value if no value is set.\r\n\t * @returns {string}\r\n\t */\r\n\tgetProperty(obj, property, defaultText)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tconst value = obj[property];\r\n\t\tif (typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\t/* if no value was available\r\n\t\twe want to return an empty string */\r\n\t\treturn (typeof defaultText !== 'undefined')? defaultText : '';\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a callBack.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {function} method\r\n\t * @param {array} [argArray] Default args to pass.\r\n\t * @param {boolean} [addArgs] Set to add merge args from the\r\n\t * curried function.\r\n\t * @returns {function|boolean} The callBack function or false.\r\n\t */\r\n\tcreateCallBack(obj, method, argArray = [], addArgs = false)\r\n\t{\r\n\t\tif (typeof method !== 'function')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn (...args) =>\r\n\t\t{\r\n\t\t\tif (addArgs === true)\r\n\t\t\t{\r\n\t\t\t\targArray = argArray.concat(args);\r\n\t\t\t}\r\n\r\n\t\t\treturn method.apply(obj, argArray);\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind scope to a method.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {function} method\r\n\t * @returns {function}\r\n\t */\r\n\tbind(obj, method)\r\n\t{\r\n\t\treturn method.bind(obj);\r\n\t}\r\n}\r\n\r\n/**\r\n * This will return the base prototype to allow the module\r\n * to be added to base as a module.\r\n *\r\n * @returns {object} the base prototype.\r\n */\r\nBase.prototype.extend = (function()\r\n{\r\n\treturn Base.prototype;\r\n})();\r\n\r\n/**\r\n * This is the instance of base that all modules will use.\r\n *\r\n * @global\r\n */\r\nexport const base = new Base();\r\n\r\n/**\r\n * This will add the augmented methods to base.\r\n */\r\nbase.augment({\r\n\t...Objects,\r\n\t...EventMethods,\r\n\t...Types,\r\n\tequals\r\n});", "/**\r\n * This is the default xhr (ajax) settings.\r\n */\r\nexport const XhrDefaultSettings =\r\n{\r\n\t/**\r\n\t * @member {string} url This is the url of the server\r\n\t */\r\n\turl: '',\r\n\r\n\t/**\r\n\t * @member {string} params This is the responseType of the server\r\n\t */\r\n\tresponseType: 'json',\r\n\r\n\t/**\r\n\t * @member {string} method This is the method of the request\r\n\t */\r\n\tmethod: 'POST',\r\n\r\n\t/**\r\n\t * @member {object|string} params This can fix a param string\r\n\t * to be added to every ajax request.\r\n\t */\r\n\tfixedParams: '',\r\n\r\n\t/**\r\n\t * @member {object} headers This is the headers of the request\r\n\t */\r\n\theaders:\r\n\t{\r\n\t\t'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'\r\n\t},\r\n\r\n\t/**\r\n\t * @member {array} beforeSend This is an array of callbacks\r\n\t */\r\n\tbeforeSend: [],\r\n\r\n\t/**\r\n\t * @member {boolean} async This is the async of the request\r\n\t */\r\n\tasync: true,\r\n\r\n\t/**\r\n\t * @member {boolean} crossDomain This will allow cross domain requests\r\n\t */\r\n\tcrossDomain: false,\r\n\r\n\t/**\r\n\t * @member {boolean} withCredentials CORS with credentials\r\n\t */\r\n\twithCredentials: false,\r\n\r\n\t/**\r\n\t * @member {function|null} completed This is the completed callback\r\n\t */\r\n\tcompleted: null,\r\n\r\n\t/**\r\n\t * @member {function|null} failed This is the failed callback\r\n\t */\r\n\tfailed: null,\r\n\r\n\t/**\r\n\t * @member {function|null} aborted This is the aborted callback\r\n\t */\r\n\taborted: null,\r\n\r\n\t/**\r\n\t * @member {function|null} progress This is the progress callback\r\n\t */\r\n\tprogress: null\r\n};\r\n", "import { base } from '../../main/base.js';\r\nimport { Objects } from '../../shared/objects.js';\r\nimport { XhrDefaultSettings } from './xhr-default-settings.js';\r\n\r\n/**\r\n * This will add ajax settings and methods to the base class.\r\n */\r\nexport const setupBaseAjaxMethods = () =>\r\n{\r\n\t/* this will add ajax settings to the base class */\r\n\tbase.augment(\r\n\t{\r\n\t\t/**\r\n\t\t * @member {object} xhrSettings\r\n\t\t */\r\n\t\txhrSettings: XhrDefaultSettings,\r\n\r\n\t\t/**\r\n\t\t * This will add fixed params to each xhr request.\r\n\t\t *\r\n\t\t * @param {(string|object)} params\r\n\t\t */\r\n\t\taddFixedParams(params)\r\n\t\t{\r\n\t\t\tthis.xhrSettings.fixedParams = params;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * This will add a callback that will be called before\r\n\t\t * each request.\r\n\t\t *\r\n\t\t * @param {function} callBack\r\n\t\t */\r\n\t\tbeforeSend(callBack)\r\n\t\t{\r\n\t\t\tthis.xhrSettings.beforeSend.push(callBack);\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * This will update the xhr settings.\r\n\t\t *\r\n\t\t * @param {object} settingsObj\r\n\t\t */\r\n\t\tajaxSettings(settingsObj)\r\n\t\t{\r\n\t\t\tif (typeof settingsObj === 'object')\r\n\t\t\t{\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tthis.xhrSettings = Objects.extendClass(base.xhrSettings, settingsObj);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * This will reset the xhr settings.\r\n\t\t */\r\n\t\tresetAjaxSettings()\r\n\t\t{\r\n\t\t\tthis.xhrSettings = XhrDefaultSettings;\r\n\t\t}\r\n\t});\r\n};\r\n", "/**\r\n * Strings\r\n *\r\n * This will contain methods for working with strings.\r\n *\r\n * @module\r\n * @name Strings\r\n */\r\nexport class Strings\r\n{\r\n\t/**\r\n\t * This will limit the length of a string.\r\n\t *\r\n\t * @param {string} str\r\n\t * @param {number} [maxLength]\r\n\t * @returns {string}\r\n\t */\r\n\tstatic limit(str, maxLength = 1000000)\r\n\t{\r\n\t\tif (typeof str !== 'string')\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\treturn str.substring(0, maxLength);\r\n\t}\r\n\r\n\t/**\r\n\t * This will parse a query string.\r\n\t *\r\n\t * @param {string} [str] The string to parse or the global\r\n\t * location will be parsed.\r\n\t * @param {boolean} [decode]\r\n\t * @returns {object}\r\n\t */\r\n\tstatic parseQueryString(str, decode, limit = true)\r\n\t{\r\n\t\tif (typeof str !== 'string')\r\n\t\t{\r\n\t\t\tstr = window.location.search;\r\n\t\t}\r\n\r\n\t\tstr = this.limit(str);\r\n\r\n\t\tconst objURL = {},\r\n\t\tregExp = /([^?=&]+)(=([^&]*))?/g;\r\n\t\t// @ts-ignore\r\n\t\tstr.replace(regExp, function(a, b, c, d)\r\n\t\t{\r\n\t\t\t/* we want to save the key and the\r\n\t\t\tvalue to the objURL */\r\n\t\t\tobjURL[b] = (decode !== false)? decodeURIComponent(d) : d;\r\n\t\t});\r\n\r\n\t\treturn objURL;\r\n\t}\r\n\r\n\t/**\r\n\t * This will camelCase a string.\r\n\t *\r\n\t * @param {string} str\r\n\t * @returns {string} The string or false.\r\n\t */\r\n\tstatic camelCase(str)\r\n\t{\r\n\t\tstr = this.limit(str);\r\n\r\n\t\tconst regExp = /(-|\\s|_)+\\w{1}/g;\r\n\t\treturn str.replace(regExp, (match) => match[1].toUpperCase());\r\n\t}\r\n\r\n\t/**\r\n\t * This will uncamel-case a string.\r\n\t *\r\n\t * @param {string} str\r\n\t * @param {string} [delimiter]\r\n\t * @returns {string} The string.\r\n\t */\r\n\tstatic uncamelCase(str, delimiter = '-')\r\n\t{\r\n\t\tstr = this.limit(str);\r\n\r\n\t\tconst regExp = /([A-Z]{1,})/g;\r\n\t\treturn str.replace(regExp, (match) => delimiter + match.toLowerCase()).toLowerCase();\r\n\t}\r\n\r\n\t/**\r\n\t * This will title case a string.\r\n\t *\r\n\t * @param {string} str\r\n\t * @returns {string} The string.\r\n\t */\r\n\tstatic titleCase(str)\r\n\t{\r\n\t\tif (!str)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tstr = this.limit(str);\r\n\r\n\t\tconst pattern = /\\w\\S*/;\r\n\t\treturn str.replace(pattern, (txt) =>\r\n\t\t{\r\n\t\t\treturn txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();\r\n\t\t});\r\n\t}\r\n}", "import { base } from '../../main/base.js';\r\nimport { Events } from '../../main/events/events.js';\r\nimport { Objects } from '../../shared/objects.js';\r\nimport { Strings } from '../../shared/strings.js';\r\nimport { XhrDefaultSettings } from './xhr-default-settings.js';\r\n\r\n/**\r\n * XhrRequest\r\n *\r\n * This will create an xhr request object.\r\n *\r\n * @class\r\n */\r\nexport class XhrRequest\r\n{\r\n\t/**\r\n\t * This will create an xhr request object.\r\n\t *\r\n\t * @constructor\r\n\t * @param {*} args\r\n\t */\r\n\tconstructor(args)\r\n\t{\r\n\t\tthis.settings = null;\r\n\t\tthis.xhr = null;\r\n\t\tthis.setup(args);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the xhr request.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} args\r\n\t */\r\n\tsetup(args)\r\n\t{\r\n\t\tthis.getXhrSettings(args);\r\n\r\n\t\tconst xhr = this.xhr = this.createXHR();\r\n\t\tconst {method, url, async} = this.settings;\r\n\t\txhr.open(method, url, async);\r\n\r\n\t\tthis.setupHeaders();\r\n\t\tthis.addXhrEvents();\r\n\t\tthis.beforeSend();\r\n\r\n\t\t/* this will setup the params and send the\r\n\t\txhr request */\r\n\t\txhr.send(this.getParams());\r\n\t}\r\n\r\n\t/**\r\n\t * This will call all before send callbacks.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tbeforeSend()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst items = XhrDefaultSettings.beforeSend;\r\n\t\tif (items.length < 1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst xhr = this.xhr;\r\n\t\tconst settings = this.settings;\r\n\t\tfor (var i = 0, length = items.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar callBack = items[i];\r\n\t\t\tif (callBack)\r\n\t\t\t{\r\n\t\t\t\tcallBack(xhr, settings);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will convert an object to a string.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} object\r\n\t * @returns {string}\r\n\t */\r\n\tobjectToString(object)\r\n\t{\r\n\t\tconst params = [];\r\n\t\tfor (var prop in object)\r\n\t\t{\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(object, prop))\r\n\t\t\t{\r\n\t\t\t\tparams.push(prop + '=' + encodeURIComponent(object[prop]));\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn params.join('&');\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the base params to the request params.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} params\r\n\t * @param {*} addingParams\r\n\t * @returns {*}\r\n\t */\r\n\tsetupParams(params, addingParams)\r\n\t{\r\n\t\tconst paramsType = typeof params;\r\n\t\tif (!addingParams)\r\n\t\t{\r\n\t\t\tif ((params instanceof FormData) === false && paramsType === 'object')\r\n\t\t\t{\r\n\t\t\t\tparams = this.objectToString(params);\r\n\t\t\t}\r\n\t\t\treturn params;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will convert the adding params to match\r\n\t\t * the params type.\r\n\t\t */\r\n\t\tconst addingType = typeof addingParams;\r\n\t\tif (paramsType === 'string')\r\n\t\t{\r\n\t\t\tif (addingType !== 'string')\r\n\t\t\t{\r\n\t\t\t\taddingParams = this.objectToString(addingParams);\r\n\t\t\t}\r\n\r\n\t\t\tconst char = (params === '')? '?' : '&';\r\n\t\t\tparams += char + addingParams;\r\n\t\t\treturn params;\r\n\t\t}\r\n\r\n\t\tif (addingType === 'string')\r\n\t\t{\r\n\t\t\taddingParams = Strings.parseQueryString(addingParams, false);\r\n\t\t}\r\n\r\n\t\tif (params instanceof FormData)\r\n\t\t{\r\n\t\t\tfor (var key in addingParams)\r\n\t\t\t{\r\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(addingParams, key))\r\n\t\t\t\t{\r\n\t\t\t\t\tparams.append(key, addingParams[key]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (paramsType === 'object')\r\n\t\t{\r\n\t\t\t/* we don't want to modify the original object\r\n\t\t\tso we need to clone the object before extending */\r\n\t\t\tparams = Objects.clone(params);\r\n\r\n\t\t\tparams = Object.assign(addingParams, params);\r\n\t\t\tparams = this.objectToString(params);\r\n\t\t}\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the params.\r\n\t *\r\n\t * @protected\r\n\t * @returns {*}\r\n\t */\r\n\tgetParams()\r\n\t{\r\n\t\tconst settings = this.settings;\r\n\t\tconst fixedParams = settings.fixedParams;\r\n\t\tlet params = settings.params;\r\n\t\tif (params)\r\n\t\t{\r\n\t\t\tparams = this.setupParams(params, fixedParams);\r\n\t\t}\r\n\t\telse if(fixedParams)\r\n\t\t{\r\n\t\t\tparams = this.setupParams(fixedParams);\r\n\t\t}\r\n\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the settings from the args.\r\n\t *\r\n\t * @protected\r\n\t * @param {array} args\r\n\t * @returns {void}\r\n\t */\r\n\tgetXhrSettings(args)\r\n\t{\r\n\t\t/* we want to create a clone of the default\r\n\t\tsettings before adding the new settings */\r\n\t\t// @ts-ignore\r\n\t\tlet settings = this.settings = {...base.xhrSettings};\r\n\r\n\t\t/* we want to check if we are adding the ajax settings by\r\n\t\tindividual args or by a settings object */\r\n\t\tif (args.length >= 2 && typeof args[0] !== 'object')\r\n\t\t{\r\n\t\t\tfor (var i = 0, maxLength = args.length; i < maxLength; i++)\r\n\t\t\t{\r\n\t\t\t\tvar arg = args[i];\r\n\r\n\t\t\t\tswitch (i)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase 0:\r\n\t\t\t\t\t\tsettings.url = arg;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\tsettings.params = arg;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 2:\r\n\t\t\t\t\t\tsettings.completed = arg;\r\n\t\t\t\t\t\tsettings.failed = arg;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 3:\r\n\t\t\t\t\t\tsettings.responseType = arg || 'json';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 4:\r\n\t\t\t\t\t\tsettings.method = (arg)? arg.toUpperCase() : 'POST';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 5:\r\n\t\t\t\t\t\tsettings.async = (typeof arg !== 'undefined')? arg : true;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t/* override the default settings with the args\r\n\t\t\tsettings object */\r\n\t\t\tsettings = this.settings = Objects.extendClass(this.settings, args[0]);\r\n\r\n\t\t\t/* we want to check to add the completed callback\r\n\t\t\tas the error and aborted if not set */\r\n\t\t\tif (typeof settings.completed === 'function')\r\n\t\t\t{\r\n\t\t\t\tif (typeof settings.failed !== 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.failed = settings.completed;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (typeof settings.aborted !== 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.aborted = settings.failed;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the xhr object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\tcreateXHR()\r\n\t{\r\n\t\tconst settings = this.settings,\r\n\t\txhr = new XMLHttpRequest();\r\n\t\txhr.responseType = settings.responseType;\r\n\r\n\t\tif (settings.withCredentials === true)\r\n\t\t{\r\n\t\t\txhr.withCredentials = true;\r\n\t\t}\r\n\r\n\t\treturn xhr;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the request headers.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetupHeaders()\r\n\t{\r\n\t\tconst settings = this.settings;\r\n\t\tif (!settings || typeof settings.headers !== 'object')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* we want to add a header for each\r\n\t\tproperty in the object */\r\n\t\tlet headers = settings.headers;\r\n\t\tfor (var header in headers)\r\n\t\t{\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(headers, header))\r\n\t\t\t{\r\n\t\t\t\tthis.xhr.setRequestHeader(header, headers[header]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the request status.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} e\r\n\t * @param {string} [overrideType]\r\n\t */\r\n\tupdate(e, overrideType)\r\n\t{\r\n\t\tconst xhr = this.xhr;\r\n\r\n\t\t/* this will remove the xhr events from the active events\r\n\t\tafter the events are completed, aborted, or errored */\r\n\t\tconst removeEvents = () =>\r\n\t\t{\r\n\t\t\tEvents.removeEvents(xhr.upload);\r\n\t\t\tEvents.removeEvents(xhr);\r\n\t\t};\r\n\r\n\t\tconst settings = this.settings;\r\n\t\tif (!settings)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst type = overrideType || e.type;\r\n\t\tswitch (type)\r\n\t\t{\r\n\t\t\tcase 'load':\r\n\t\t\t\tif (typeof settings.completed === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tlet response = this.getResponseData();\r\n\t\t\t\t\tsettings.completed(response, this.xhr);\r\n\t\t\t\t}\r\n\t\t\t\tremoveEvents();\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'error':\r\n\t\t\t\tif (typeof settings.failed === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.failed(false, this.xhr);\r\n\t\t\t\t}\r\n\t\t\t\tremoveEvents();\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'progress':\r\n\t\t\t\tif (typeof settings.progress === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.progress(e);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'abort':\r\n\t\t\t\tif (typeof settings.aborted === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.aborted(false, this.xhr);\r\n\t\t\t\t}\r\n\t\t\t\tremoveEvents();\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the response data.\r\n\t *\r\n\t * @protected\r\n\t * @returns {*}\r\n\t */\r\n\tgetResponseData()\r\n\t{\r\n\t\tconst xhr = this.xhr;\r\n\t\tconst responseType = xhr.responseType;\r\n\t\tif (!responseType || responseType === 'text')\r\n\t\t{\r\n\t\t\treturn xhr.responseText;\r\n\t\t}\r\n\r\n\t\treturn xhr.response;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the xhr events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\taddXhrEvents()\r\n\t{\r\n\t\tconst settings = this.settings;\r\n\t\tif (!settings)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst xhr = this.xhr,\r\n\t\tcallBack = this.update.bind(this);\r\n\t\tEvents.on(['load', 'error', 'abort'], xhr, callBack);\r\n\t\tEvents.on('progress', xhr.upload, callBack);\r\n\t}\r\n}\r\n", "import { setupBaseAjaxMethods } from './base-ajax-methods.js';\r\nimport { XhrRequest } from './xhr-request.js';\r\n\r\n/* Setup base ajax methods */\r\nsetupBaseAjaxMethods();\r\n\r\n/**\r\n * This will make an xhr (ajax) request.\r\n *\r\n * @overload\r\n * @param {string} url\r\n * @param {string} [params]\r\n * @param {function} [callBackFn]\r\n * @param {string} [responseType]\r\n * @param {string} [method=POST]\r\n * @param {boolean} [async]\r\n *\r\n * @overload\r\n * @param {object} settings\r\n * @example\r\n * {\r\n * \turl: '',\r\n * \tparams: '',\r\n * \tcompleted(response)\r\n * \t{\r\n *\r\n * \t}\r\n * }\r\n *\r\n * @returns {XMLHttpRequest} xhr object.\r\n */\r\nexport const Ajax = (...args) =>\r\n{\r\n\t/* we want to save the args so we can check\r\n\twhich way we are adding the ajax settings */\r\n\tconst ajax = new XhrRequest(args);\r\n\treturn ajax.xhr;\r\n};\r\n\r\n/* Re-export XhrRequest for backwards compatibility */\r\nexport { XhrRequest };\r\n\r\n", "/**\r\n * This will prepare the children.\r\n *\r\n * @param {*} value\r\n * @returns {*}\r\n */\r\nconst prepareChildren = (value) =>\r\n{\r\n\tif (typeof value !== 'string')\r\n\t{\r\n\t\treturn value;\r\n\t}\r\n\r\n\treturn setChildString(value);\r\n};\r\n\r\n/**\r\n * This will set the child string.\r\n *\r\n * @param {string} value\r\n * @returns {Array<object>}\r\n */\r\nconst setChildString = (value) =>\r\n{\r\n\treturn [{\r\n\t\ttag: 'text',\r\n\t\ttextContent: value\r\n\t}];\r\n};\r\n\r\n/**\r\n * This will set the default props.\r\n *\r\n * @returns {object}\r\n */\r\nexport const DefaultProps = () => ({\r\n props: {},\r\n children: []\r\n});\r\n\r\n/**\r\n * This will set the string prop.\r\n *\r\n * @param {string} value\r\n * @returns {object}\r\n */\r\nexport const StringProp = (value) => ({\r\n props: {},\r\n children: setChildString(value)\r\n});\r\n\r\n/**\r\n * This will set the array prop.\r\n *\r\n * @param {array} value\r\n * @returns {object}\r\n */\r\nexport const ArrayProp = (value) => ({\r\n props: {},\r\n children: value\r\n});\r\n\r\n/**\r\n * This will set the object prop.\r\n *\r\n * @param {array} args\r\n * @returns {object}\r\n */\r\nexport const ObjectProp = (args) => ({\r\n props: args[0] || {}, // this will set an empty object if no props are passed.\r\n children: prepareChildren(args[1])\r\n});", "\r\n/**\r\n * ConnectionTracker\r\n *\r\n * Tracks active connections in the data binder. Supports multiple\r\n * connections per element+attribute pair.\r\n *\r\n * @class\r\n */\r\nexport class ConnectionTracker\r\n{\r\n\t/**\r\n\t * Creates a connection tracker.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {Map<string, Map<string, object|object[]>>} connections\r\n\t\t */\r\n\t\tthis.connections = new Map();\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a connection to be tracked.\r\n\t *\r\n\t * @param {string} id\r\n\t * @param {string} attr\r\n\t * @param {object} connection\r\n\t * @returns {object}\r\n\t */\r\n\tadd(id, attr, connection)\r\n\t{\r\n\t\tconst attrMap = this.getOrCreate(id);\r\n\t\tconst existing = attrMap.get(attr);\r\n\t\tif (!existing)\r\n\t\t{\r\n\t\t\tattrMap.set(attr, connection);\r\n\t\t}\r\n\t\telse if (Array.isArray(existing))\r\n\t\t{\r\n\t\t\texisting.push(connection);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tattrMap.set(attr, [existing, connection]);\r\n\t\t}\r\n\r\n\t\treturn connection;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the most recent connection for an element+attribute.\r\n\t *\r\n\t * @param {string} id\r\n\t * @param {string} attr\r\n\t * @returns {object|false}\r\n\t */\r\n\tget(id, attr)\r\n\t{\r\n\t\tconst value = this.connections.get(id)?.get(attr);\r\n\t\tif (!value)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn Array.isArray(value) ? (value[value.length - 1] || false) : value;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets or creates the attribute map for an element.\r\n\t *\r\n\t * @param {string} id\r\n\t * @returns {Map<string, object|object[]>}\r\n\t */\r\n\tgetOrCreate(id)\r\n\t{\r\n\t\tlet attrMap = this.connections.get(id);\r\n\t\tif (!attrMap)\r\n\t\t{\r\n\t\t\tattrMap = new Map();\r\n\t\t\tthis.connections.set(id, attrMap);\r\n\t\t}\r\n\t\treturn attrMap;\r\n\t}\r\n\r\n\t/**\r\n\t * Removes connections by id, or by id+attr.\r\n\t *\r\n\t * @param {string} id\r\n\t * @param {string} [attr]\r\n\t * @returns {void}\r\n\t */\r\n\tremove(id, attr)\r\n\t{\r\n\t\tconst attrMap = this.connections.get(id);\r\n\t\tif (!attrMap)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (attr)\r\n\t\t{\r\n\t\t\tthis.unsubscribe(attrMap.get(attr));\r\n\t\t\tattrMap.delete(attr);\r\n\r\n\t\t\tif (attrMap.size === 0)\r\n\t\t\t{\r\n\t\t\t\tthis.connections.delete(id);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tfor (const connection of attrMap.values())\r\n\t\t\t{\r\n\t\t\t\tthis.unsubscribe(connection);\r\n\t\t\t}\r\n\t\t\tthis.connections.delete(id);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Unsubscribes a connection or array of connections.\r\n\t *\r\n\t * @private\r\n\t * @param {object|object[]|undefined} connection\r\n\t * @returns {void}\r\n\t */\r\n\tunsubscribe(connection)\r\n\t{\r\n\t\tif (!connection)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (Array.isArray(connection))\r\n\t\t{\r\n\t\t\tfor (let i = 0, len = connection.length; i < len; i++)\r\n\t\t\t{\r\n\t\t\t\tconnection[i]?.unsubscribe();\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tconnection.unsubscribe();\r\n\t\t}\r\n\t}\r\n}", "/**\r\n * Source\r\n *\r\n * This will create a new source to use with\r\n * a connection.\r\n *\r\n * @class\r\n */\r\nexport class Source\r\n{\r\n\t/**\r\n\t * This will create a new source.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {string} msg\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.msg = null;\r\n\r\n\t\t/**\r\n\t\t * @member {string} token\r\n\t\t */\r\n\t\tthis.token = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the token.\r\n\t *\r\n\t * @param {string} token\r\n\t * @returns {void}\r\n\t */\r\n\tsetToken(token)\r\n\t{\r\n\t\tthis.token = token;\r\n\t}\r\n}", "import { Source } from './source.js';\r\n\r\n/**\r\n * OneWaySource\r\n *\r\n * This will create a one way source to use with\r\n * a connection.\r\n *\r\n * @class\r\n * @augments Source\r\n */\r\nexport class OneWaySource extends Source\r\n{\r\n\t/**\r\n\t * This will setup the data source.\r\n\t *\r\n\t * @param {object} data\r\n\t */\r\n\tconstructor(data)\r\n\t{\r\n\t\tsuper();\r\n\t\tthis.data = data;\r\n\t}\r\n\r\n\t/**\r\n\t * This will subscribe to a message.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {function} callBack\r\n\t * @returns {void}\r\n\t */\r\n\tsubscribe(msg, callBack)\r\n\t{\r\n\t\tthis.msg = msg;\r\n\t\tthis.token = this.data.on(msg, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will unsubscribe from the message.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tif (this.data && this.msg && this.token)\r\n\t\t{\r\n\t\t\tthis.data.off(this.msg, this.token);\r\n\t\t}\r\n\t\tthis.data = null;\r\n\t\tthis.msg = null;\r\n\t\tthis.token = null;\r\n\t}\r\n}", "/**\r\n * Connection\r\n *\r\n * This will create a connection.\r\n *\r\n * @class\r\n */\r\nexport class Connection\r\n{\r\n\t/**\r\n\t * This will be used to unsubscribe.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\r\n\t}\r\n}", "import { OneWaySource } from '../../sources/one-way-source.js';\r\nimport { Connection } from './connection.js';\r\n\r\n/**\r\n * OneWayConnection\r\n *\r\n * This will create a one way connection.\r\n *\r\n * @class\r\n * @augments Connection\r\n */\r\nexport class OneWayConnection extends Connection\r\n{\r\n\t/**\r\n\t * This will create a one way connection.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\tsuper();\r\n\r\n\t\t/**\r\n\t\t * @member {object|null} source\r\n\t\t */\r\n\t\tthis.source = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the connection source.\r\n\t *\r\n\t * @param {object} data\r\n\t * @returns {object}\r\n\t */\r\n\taddSource(data)\r\n\t{\r\n\t\treturn (this.source = new OneWaySource(data));\r\n\t}\r\n\r\n\t/**\r\n\t * This will be used to unsubscribe.\r\n\t *\r\n\t * @override\r\n\t * @returns {void}\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tthis.source.unsubscribe();\r\n\t\tthis.source = null;\r\n\t}\r\n}", "import { Source } from './source.js';\r\n\r\n/**\r\n * TwoWaySource\r\n *\r\n * This will create a two way source to use with\r\n * a connection.\r\n *\r\n * @class\r\n * @augments Source\r\n */\r\nexport class TwoWaySource extends Source\r\n{\r\n\t/**\r\n\t * This will create a new source.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} pubSub\r\n\t */\r\n\tconstructor(pubSub)\r\n\t{\r\n\t\tsuper();\r\n\r\n\t\t/**\r\n\t\t * @member {object} pubSub\r\n\t\t */\r\n\t\tthis.pubSub = pubSub;\r\n\t}\r\n\r\n\t/**\r\n\t * This will subscribe to a message.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @returns {void}\r\n\t */\r\n\tsubscribe(msg)\r\n\t{\r\n\t\tthis.msg = msg;\r\n\r\n\t\tconst callBack = this.callBack.bind(this);\r\n\t\tthis.token = this.pubSub.on(msg, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will unsubscribe from a message.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tif (this.pubSub && this.msg && this.token)\r\n\t\t{\r\n\t\t\tthis.pubSub.off(this.msg, this.token);\r\n\t\t}\r\n\t\tthis.pubSub = null;\r\n\t\tthis.msg = null;\r\n\t\tthis.token = null;\r\n\t}\r\n\r\n\t/**\r\n\t * Override this to setup cource callBack.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tcallBack()\r\n\t{\r\n\r\n\t}\r\n}", "import { TwoWaySource } from './two-way-source.js';\r\n\r\n/**\r\n * DataSource\r\n *\r\n * This will create a data source to use with\r\n * a connection.\r\n *\r\n * @class\r\n * @augments TwoWaySource\r\n */\r\nexport class DataSource extends TwoWaySource\r\n{\r\n\t/**\r\n\t * This will create a new data source.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {object} pubSub\r\n\t */\r\n\tconstructor(data, prop, pubSub)\r\n\t{\r\n\t\tsuper(pubSub);\r\n\r\n\t\t/**\r\n\t\t * @member {object} data\r\n\t\t */\r\n\t\tthis.data = data;\r\n\r\n\t\t/**\r\n\t\t * @member {string} prop\r\n\t\t */\r\n\t\tthis.prop = prop;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the data value.\r\n\t *\r\n\t * @param {*} value\r\n\t * @returns {void}\r\n\t */\r\n\tset(value)\r\n\t{\r\n\t\tthis.data.set(this.prop, value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the data value.\r\n\t *\r\n\t * @returns {*}\r\n\t */\r\n\tget()\r\n\t{\r\n\t\treturn this.data.get(this.prop);\r\n\t}\r\n\r\n\t/**\r\n\t * The callBack when updated.\r\n\t *\r\n\t * @overload\r\n\t * @param {*} value\r\n\t * @param {object} committer\r\n\t * @returns {void}\r\n\t */\r\n\t// @ts-ignore\r\n\tcallBack(value, committer)\r\n\t{\r\n\t\tif (this.data !== committer)\r\n\t\t{\r\n\t\t\tthis.data.set(this.prop, value, committer);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will clean up the data source.\r\n\t *\r\n\t * @override\r\n\t * @returns {void}\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tsuper.unsubscribe();\r\n\t\tthis.data = null;\r\n\t\tthis.prop = null;\r\n\t}\r\n}", "import { Arrays } from './arrays.js';\r\nimport { Strings } from './strings.js';\r\nimport { Types } from './types.js';\r\n\r\n/**\r\n * Dom\r\n *\r\n * This will contain methods for working with the dom.\r\n *\r\n * @module\r\n * @name Dom\r\n */\r\nexport class Dom\r\n{\r\n\t/**\r\n\t * This will select an element by id.\r\n\t *\r\n\t * @param {string} id\r\n\t * @returns {object|boolean} The element object or false.\r\n\t */\r\n\tstatic getById(id)\r\n\t{\r\n\t\tif (typeof id !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst obj = document.getElementById(id);\r\n\t\treturn (obj || false);\r\n\t}\r\n\r\n\t/**\r\n\t * This will select elements by name.\r\n\t *\r\n\t * @param {string} name\r\n\t * @returns {object|boolean} The elements array or false.\r\n\t */\r\n\tstatic getByName(name)\r\n\t{\r\n\t\tif (typeof name !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst obj = document.getElementsByName(name);\r\n\t\treturn (obj)? Arrays.toArray(obj) : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will select by css selector.\r\n\t *\r\n\t * @param {string} selector\r\n\t * @param {boolean} single Set to true if you only want one result.\r\n\t * @returns {*}\r\n\t */\r\n\tstatic getBySelector(selector, single)\r\n\t{\r\n\t\tif (typeof selector !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we are only selecting\r\n\t\tthe first element or all elements */\r\n\t\tsingle = single || false;\r\n\t\tif (single === true)\r\n\t\t{\r\n\t\t\tconst obj = document.querySelector(selector);\r\n\t\t\treturn (obj || false);\r\n\t\t}\r\n\r\n\t\tconst elements = document.querySelectorAll(selector);\r\n\t\tif (!elements)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* if there is only one result just return the\r\n\t\tfirst element in the node list */\r\n\t\treturn (elements.length === 1)? elements[0] : Arrays.toArray(elements);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set the innerHTML or an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} [html] If the html is not set, the html of the\r\n\t * element will be returned.\r\n\t *\r\n\t * @returns {*}\r\n\t */\r\n\tstatic html(obj, html)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we are getting the\r\n\t\thtml or adding the html */\r\n\t\tif (Types.isUndefined(html) === false)\r\n\t\t{\r\n\t\t\tobj.innerHTML = html;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn obj.innerHTML;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the css property of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} value\r\n\t * @returns {object} an instance of base.\r\n\t */\r\n\tstatic setCss(obj, property, value)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false || Types.isUndefined(property))\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tproperty = Strings.uncamelCase(property);\r\n\t\tobj.style[property] = value;\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the css property of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @returns {*}\r\n\t */\r\n\tstatic getCss(obj, property)\r\n\t{\r\n\t\tif (!obj || typeof property === 'undefined')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tproperty = Strings.uncamelCase(property);\r\n\t\tlet css = obj.style[property];\r\n\t\tif (css !== '')\r\n\t\t{\r\n\t\t\treturn css;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we have an inherited\r\n\t\tvalue */\r\n\t\tlet currentValue = null;\r\n\t\tconst currentStyle = obj.currentStyle;\r\n\t\tif (currentStyle && (currentValue = currentStyle[property]))\r\n\t\t{\r\n\t\t\treturn currentValue;\r\n\t\t}\r\n\r\n\t\tconst inheritedStyle = window.getComputedStyle(obj, null);\r\n\t\tif (inheritedStyle)\r\n\t\t{\r\n\t\t\treturn inheritedStyle[property];\r\n\t\t}\r\n\r\n\t\treturn css;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set the css propety or an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} [value]\r\n\t * @returns {*}\r\n\t */\r\n\tstatic css(obj, property, value)\r\n\t{\r\n\t\t/* we want to check if we are getting the\r\n\t\tvalue or setting the value */\r\n\t\tif (typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\tthis.setCss(obj, property, value);\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn this.getCss(obj, property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an attribute from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @returns {object} an instance of base.\r\n\t */\r\n\tstatic removeAttr(obj, property)\r\n\t{\r\n\t\tif (Types.isObject(obj))\r\n\t\t{\r\n\t\t\tobj.removeAttribute(property);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set an attribute of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} value\r\n\t * @returns {void}\r\n\t */\r\n\tstatic setAttr(obj, property, value)\r\n\t{\r\n\t\tobj.setAttribute(property, value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get an attribute of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @returns {string}\r\n\t */\r\n\tstatic getAttr(obj, property)\r\n\t{\r\n\t\treturn obj.getAttribute(property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set an attribute from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} [value]\r\n\t * @returns {*}\r\n\t */\r\n\tstatic attr(obj, property, value)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we are getting the\r\n\t\tvalue or setting the value */\r\n\t\tif (typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\t/* we want to check to set the value */\r\n\t\t\tthis.setAttr(obj, property, value);\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn this.getAttr(obj, property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will prefix a string with \"data-\" if not set.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} prop\r\n\t * @returns {string}\r\n\t */\r\n\tstatic _checkDataPrefix(prop)\r\n\t{\r\n\t\tif (typeof prop !== 'string')\r\n\t\t{\r\n\t\t\treturn prop;\r\n\t\t}\r\n\r\n\t\t/* we want to de camelcase if set */\r\n\t\tprop = Strings.uncamelCase(prop);\r\n\t\tif (prop.substring(0, 5) !== 'data-')\r\n\t\t{\r\n\t\t\tprop = 'data-' + prop;\r\n\t\t}\r\n\r\n\t\treturn prop;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove \"data-\" from a string.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} prop\r\n\t * @returns {string}\r\n\t */\r\n\tstatic removeDataPrefix(prop)\r\n\t{\r\n\t\tif (typeof prop === 'string' && prop.substring(0, 5) === 'data-')\r\n\t\t{\r\n\t\t\tprop = prop.substring(5);\r\n\t\t}\r\n\t\treturn prop;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set data to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} value\r\n\t */\r\n\tstatic setData(obj, property, value)\r\n\t{\r\n\t\t/* this will return the property without the data prefix */\r\n\t\tproperty = this.removeDataPrefix(property);\r\n\t\tproperty = Strings.camelCase(property);\r\n\r\n\t\tobj.dataset[property] = value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get data from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @returns {string}\r\n\t */\r\n\tstatic getData(obj, property)\r\n\t{\r\n\t\tproperty = Strings.camelCase(this.removeDataPrefix(property));\r\n\t\treturn obj.dataset[property];\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set data to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} [value]\r\n\t * @returns {*}\r\n\t */\r\n\tstatic data(obj, property, value)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\tthis.setData(obj, property, value);\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn this.getData(obj, property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will find elements in an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} queryString\r\n\t * @returns {array}\r\n\t */\r\n\tstatic find(obj, queryString)\r\n\t{\r\n\t\tif (!obj || typeof queryString !== 'string')\r\n\t\t{\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\treturn obj.querySelectorAll(queryString);\r\n\t}\r\n\r\n\t/**\r\n\t * This will display an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {object} An instance of base.\r\n\t */\r\n\tstatic show(obj)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* we want to get the previous display style\r\n\t\tfrom the data-style-display attr */\r\n\t\tconst previous = this.data(obj, 'style-display'),\r\n\t\tvalue = (typeof previous === 'string')? previous : '';\r\n\r\n\t\tthis.css(obj, 'display', value);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will hide an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {object} An instance of base.\r\n\t */\r\n\tstatic hide(obj)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* we want to set the previous display style\r\n\t\ton the element as a data attr */\r\n\t\tconst previous = this.css(obj, 'display');\r\n\t\tif (previous !== 'none' && previous)\r\n\t\t{\r\n\t\t\tthis.data(obj, 'style-display', previous);\r\n\t\t}\r\n\r\n\t\tthis.css(obj, 'display', 'none');\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will toggle the display an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {object} An instance of base.\r\n\t */\r\n\tstatic toggle(obj)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst mode = this.css(obj, 'display');\r\n\t\tif (mode !== 'none')\r\n\t\t{\r\n\t\t\tthis.hide(obj);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.show(obj);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the size of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {object|boolean} A size object or false.\r\n\t */\r\n\tstatic getSize(obj)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\twidth: this.getWidth(obj),\r\n\t\t\theight: this.getHeight(obj)\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the width of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {number|boolean} A width or false.\r\n\t */\r\n\tstatic getWidth(obj)\r\n\t{\r\n\t\t/* we want to check if the object is not supplied */\r\n\t\treturn (Types.isObject(obj))? obj.offsetWidth : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the height of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {number|boolean} A height or false.\r\n\t */\r\n\tstatic getHeight(obj)\r\n\t{\r\n\t\t/* we want to check if the object is not supplied */\r\n\t\treturn (Types.isObject(obj))? obj.offsetHeight : false;\r\n\t}\r\n\r\n\t/**\r\n\t* This will get the scroll position.\r\n\t*\r\n\t* @param {object} [obj] The element or document element if not set.\r\n\t* @returns {object}\r\n\t*/\r\n\tstatic getScrollPosition(obj)\r\n\t{\r\n\t\tlet left = 0, top = 0;\r\n\t\tswitch (typeof obj)\r\n\t\t{\r\n\t\t\tcase 'undefined':\r\n\t\t\t\tobj = document.documentElement;\r\n\t\t\t\tleft = obj.scrollLeft;\r\n\t\t\t\ttop = obj.scrollTop;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'object':\r\n\t\t\t\tleft = obj.scrollLeft;\r\n\t\t\t\ttop = obj.scrollTop;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tleft: left - (obj.clientLeft || 0),\r\n\t\t\ttop: top - (obj.clientTop || 0)\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the scroll top position.\r\n\t *\r\n\t * @param {object} [obj] The element or document element if not set.\r\n\t * @returns {number|null}\r\n\t */\r\n\tstatic getScrollTop(obj)\r\n\t{\r\n\t\tconst position = this.getScrollPosition(obj);\r\n\t\treturn position.top;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the scroll left position.\r\n\t *\r\n\t * @param {object} [obj] The element or document element if not set.\r\n\t * @returns {number|null}\r\n\t */\r\n\tstatic getScrollLeft(obj)\r\n\t{\r\n\t\tconst position = this.getScrollPosition(obj);\r\n\t\treturn position.left;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the window size.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tstatic getWindowSize()\r\n\t{\r\n\t\tconst w = window,\r\n\t\tdoc = document,\r\n\t\tde = doc.documentElement,\r\n\t\tb = doc.getElementsByTagName('body')[0],\r\n\t\twidth = w.innerWidth || de.clientWidth || b.clientWidth,\r\n\t\theight = w.innerHeight || de.clientHeight || b.clientHeight;\r\n\r\n\t\treturn {\r\n\t\t\twidth,\r\n\t\t\theight\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the document size.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tstatic getDocumentSize()\r\n\t{\r\n\t\tconst doc = document,\r\n\t\tbody = doc.body,\r\n\t\thtml = doc.documentElement,\r\n\r\n\t\theight = Math.max(\r\n\t\t\tbody.scrollHeight,\r\n\t\t\tbody.offsetHeight,\r\n\t\t\thtml.clientHeight,\r\n\t\t\thtml.scrollHeight,\r\n\t\t\thtml.offsetHeight\r\n\t\t),\r\n\r\n\t\twidth = Math.max(\r\n\t\t\tbody.scrollWidth,\r\n\t\t\tbody.offsetWidth,\r\n\t\t\thtml.clientWidth,\r\n\t\t\thtml.scrollWidth,\r\n\t\t\thtml.offsetWidth\r\n\t\t);\r\n\r\n\t\treturn {\r\n\t\t\twidth,\r\n\t\t\theight\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the document height.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tstatic getDocumentHeight()\r\n\t{\r\n\t\treturn this.getDocumentSize().height;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the position of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {number} [depth] The number of levels, default is 1, 0 is to the root.\r\n\t * @returns {object}\r\n\t */\r\n\tstatic position(obj, depth = 1)\r\n\t{\r\n\t\tconst position = {x: 0, y: 0};\r\n\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn position;\r\n\t\t}\r\n\r\n\t\t/* if the depth is 0 we will travel to the\r\n\t\ttop element */\r\n\t\tlet count = 0;\r\n\t\twhile (obj && (depth === 0 || count < depth))\r\n\t\t{\r\n\t\t\tcount++;\r\n\t\t\tposition.x += (obj.offsetLeft + obj.clientLeft);\r\n\t\t\tposition.y += (obj.offsetTop + obj.clientTop);\r\n\t\t\tobj = obj.offsetParent;\r\n\t\t}\r\n\r\n\t\treturn position;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a class to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} tmpClassName\r\n\t * @returns {object}\r\n\t */\r\n\tstatic addClass(obj, tmpClassName)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false || tmpClassName === '')\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif (typeof tmpClassName === 'string')\r\n\t\t{\r\n\t\t\t/* we want to divide the string by spaces and\r\n\t\t\tadd any class listed */\r\n\t\t\tconst adding = tmpClassName.split(' ');\r\n\t\t\tfor (var i = 0, maxLength = adding.length; i < maxLength; i++)\r\n\t\t\t{\r\n\t\t\t\tobj.classList.add(tmpClassName);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a class or classes from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} [tmpClassName]\r\n\t * @returns {object}\r\n\t */\r\n\tstatic removeClass(obj, tmpClassName)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false || tmpClassName === '')\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* if no className was specified we will remove all classes from object */\r\n\t\tif (typeof tmpClassName === 'undefined')\r\n\t\t{\r\n\t\t\tobj.className = '';\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tobj.classList.remove(tmpClassName);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if an element has a class.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} tmpClassName\r\n\t * @returns {boolean}\r\n\t */\r\n\tstatic hasClass(obj, tmpClassName)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false || tmpClassName === '')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn obj.classList.contains(tmpClassName);\r\n\t}\r\n\r\n\t/**\r\n\t * This will toggle a class on an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} tmpClassName\r\n\t * @returns {object}\r\n\t */\r\n\tstatic toggleClass(obj, tmpClassName)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tobj.classList.toggle(tmpClassName);\r\n\t\treturn this;\r\n\t}\r\n}", "/**\r\n * Get the binding attribute for an element.\r\n *\r\n * @param {object|null} element\r\n * @returns {string}\r\n */\r\nexport const getBindAttr = (element) =>\r\n{\r\n /**\r\n * If no custom attr has been requested we will get the\r\n * default attr of the element.\r\n */\r\n let attr = 'textContent';\r\n if (!element || typeof element !== 'object')\r\n {\r\n return attr;\r\n }\r\n\r\n /**\r\n * This will get the default attr by the element type.\r\n */\r\n const tagName = element.tagName.toLowerCase();\r\n if (tagName === \"input\" || tagName === \"textarea\" || tagName === \"select\")\r\n {\r\n const type = element.type;\r\n if (!type)\r\n {\r\n attr = 'value';\r\n return attr;\r\n }\r\n\r\n switch (type)\r\n {\r\n case 'checkbox':\r\n attr = 'checked';\r\n break;\r\n case 'file':\r\n attr = 'files';\r\n break;\r\n default:\r\n attr = 'value';\r\n }\r\n }\r\n return attr;\r\n};", "import { Dom } from '../../../shared/dom.js';\r\nimport { getBindAttr } from './get-bind-attr.js';\r\nimport { TwoWaySource } from './two-way-source.js';\r\n\r\n/**\r\n * This will set an element attr by the setAttribute method.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\nconst SetAttr = (element, attr, value) =>\r\n{\r\n\tDom.setAttr(element, attr, value);\r\n};\r\n\r\n/**\r\n * This will update a radio element attr.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\nconst UpdateRadioAttr = (element, attr, value) =>\r\n{\r\n\telement.checked = (element.value == value);\r\n};\r\n\r\n/**\r\n * This will update a checkbox element attr.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\nconst UpdateCheckboxAttr = (element, attr, value) =>\r\n{\r\n\tvalue = (value == 1);\r\n\tUpdateAttr(element, attr, value);\r\n};\r\n\r\n/**\r\n * This will update an element attr by the bracket notation.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\nconst UpdateAttr = (element, attr, value) =>\r\n{\r\n\telement[attr] = value;\r\n};\r\n\r\n/**\r\n * This will get an element attr by the getAttribute method.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @returns {*}\r\n */\r\nconst GetAttr = (element, attr) =>\r\n{\r\n\treturn Dom.getAttr(element, attr);\r\n};\r\n\r\n/**\r\n * This will get an element attr by the bracket notation.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @returns {*}\r\n */\r\nconst GetAttribute = (element, attr) =>\r\n{\r\n\treturn element[attr];\r\n};\r\n\r\n/**\r\n * ElementSource\r\n *\r\n * This will create an element source to use with\r\n * a connection.\r\n *\r\n * @class\r\n * @augments TwoWaySource\r\n */\r\nexport class ElementSource extends TwoWaySource\r\n{\r\n\t/**\r\n\t * This will create a new element source.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} element\r\n\t * @param {string} attr\r\n\t * @param {string|function} filter\r\n\t * @param {object} pubSub\r\n\t */\r\n\tconstructor(element, attr, filter, pubSub)\r\n\t{\r\n\t\tsuper(pubSub);\r\n\r\n\t\t/**\r\n\t\t * @member {object} element\r\n\t\t */\r\n\t\tthis.element = element;\r\n\r\n\t\t/**\r\n\t\t * @member {string} attr\r\n\t\t */\r\n\t\tthis.attr = this.getAttrBind(attr);\r\n\t\tthis.addSetMethod(element, this.attr);\r\n\r\n\t\t/**\r\n\t\t * @member {function} filter\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis.filter = (typeof filter === 'string')? this.setupFilter(filter) : filter;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the set and get methods.\r\n\t *\r\n\t * @private\r\n\t * @param {object} element\r\n\t * @param {string} attr\r\n\t * @returns {object}\r\n\t */\r\n\taddSetMethod(element, attr)\r\n\t{\r\n\t\tif (attr.substring(4, 1) === '-')\r\n\t\t{\r\n\t\t\tthis.setValue = SetAttr;\r\n\t\t\tthis.getValue = GetAttr;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tthis.getValue = GetAttribute;\r\n\r\n\t\tconst type = element.type;\r\n\t\tif (type)\r\n\t\t{\r\n\t\t\tswitch (type)\r\n\t\t\t{\r\n\t\t\t\tcase 'checkbox':\r\n\t\t\t\t\tthis.setValue = UpdateCheckboxAttr;\r\n\t\t\t\t\treturn;\r\n\t\t\t\tcase 'radio':\r\n\t\t\t\t\tthis.setValue = UpdateRadioAttr;\r\n\t\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.setValue = UpdateAttr;\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the bind attribute.\r\n\t *\r\n\t * @private\r\n\t * @param {string} [customAttr]\r\n\t * @returns {string}\r\n\t */\r\n\tgetAttrBind(customAttr)\r\n\t{\r\n\t\t/**\r\n\t\t * This will setup the custom attr if the prop\r\n\t\t * has specified one.\r\n\t\t */\r\n\t\tif (customAttr)\r\n\t\t{\r\n\t\t\treturn customAttr;\r\n\t\t}\r\n\r\n\t\treturn getBindAttr(this.element);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a filter callBack.\r\n\t *\r\n\t * @private\r\n\t * @param {string} filter\r\n\t * @returns {function}\r\n\t */\r\n\tsetupFilter(filter)\r\n\t{\r\n\t\tconst pattern = /(\\[\\[[^\\]]+\\]\\])/;\r\n\t\treturn (value) =>\r\n\t\t{\r\n\t\t\treturn filter.replace(pattern, value);\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will set a value on an element.\r\n\t *\r\n\t * @param {*} value\r\n\t * @returns {object}\r\n\t */\r\n\tset(value)\r\n\t{\r\n\t\tconst element = this.element;\r\n\t\tif (!element || typeof element !== 'object')\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* this will check to apply the option filter before\r\n\t\tsetting the value */\r\n\t\tif (this.filter)\r\n\t\t{\r\n\t\t\tvalue = this.filter(value);\r\n\t\t}\r\n\r\n\t\tthis.setValue(element, this.attr, value);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value from an element.\r\n\t *\r\n\t * @returns {*}\r\n\t */\r\n\tget()\r\n\t{\r\n\t\tconst element = this.element;\r\n\t\tif (!element || typeof element !== 'object')\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\treturn this.getValue(element, this.attr);\r\n\t}\r\n\r\n\t/**\r\n\t * The callBack when updated.\r\n\t *\r\n\t * @overload\r\n\t * @param {*} value\r\n\t * @param {object} committer\r\n\t * @returns {object}\r\n\t */\r\n\t// @ts-ignore\r\n\tcallBack(value, committer)\r\n\t{\r\n\t\tif (committer !== this.element)\r\n\t\t{\r\n\t\t\tthis.set(value);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will clean up the element source.\r\n\t *\r\n\t * @override\r\n\t * @returns {void}\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tsuper.unsubscribe();\r\n\t\tthis.element = null;\r\n\t\tthis.attr = null;\r\n\t\tthis.filter = null;\r\n\t\tthis.setValue = null;\r\n\t\tthis.getValue = null;\r\n\t}\r\n}", "import { DataSource } from '../../sources/data-source.js';\r\nimport { ElementSource } from '../../sources/element-source.js';\r\nimport { Connection } from './connection.js';\r\n\r\n/**\r\n * TwoWayConnection\r\n *\r\n * This will setup a two way connection.\r\n *\r\n * @class\r\n * @augments Connection\r\n */\r\nexport class TwoWayConnection extends Connection\r\n{\r\n\t/**\r\n\t * This will create a two way connection.\r\n\t *\r\n\t * @param {object} pubSub\r\n\t * @constructor\r\n\t */\r\n\tconstructor(pubSub)\r\n\t{\r\n\t\tsuper();\r\n\r\n\t\t/**\r\n\t\t * @member {object|null} element\r\n\t\t */\r\n\t\tthis.element = null;\r\n\r\n\t\t/**\r\n\t\t * @member {object|null} data\r\n\t\t */\r\n\t\tthis.data = null;\r\n\r\n\t\t/**\r\n\t\t * @member {object} pubSub\r\n\t\t */\r\n\t\tthis.pubSub = pubSub;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element source.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {string} attr\r\n\t * @param {(string|function)} filter\r\n\t * @returns {object}\r\n\t */\r\n\taddElement(element, attr, filter)\r\n\t{\r\n\t\treturn (this.element = new ElementSource(element, attr, filter, this.pubSub));\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the data source.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @returns {object}\r\n\t */\r\n\taddData(data, prop)\r\n\t{\r\n\t\treturn (this.data = new DataSource(data, prop, this.pubSub));\r\n\t}\r\n\r\n\t/**\r\n\t * This will unsubscribe from a source.\r\n\t *\r\n\t * @param {object} source\r\n\t * @returns {object}\r\n\t */\r\n\tunsubscribeSource(source)\r\n\t{\r\n\t\tif (source)\r\n\t\t{\r\n\t\t\tsource.unsubscribe();\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will be used to unsubscribe.\r\n\t *\r\n\t * @override\r\n\t * @returns {object}\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tthis.unsubscribeSource(this.element);\r\n\t\tthis.unsubscribeSource(this.data);\r\n\r\n\t\tthis.element = null;\r\n\t\tthis.data = null;\r\n\t\treturn this;\r\n\t}\r\n}", "let lastToken = -1;\r\n\r\n/**\r\n * DataPubSub\r\n *\r\n * This is a pub sub class to allow subscribers to\r\n * listen for updates when published by publishers.\r\n *\r\n * @class\r\n */\r\nexport class DataPubSub\r\n{\r\n\t/**\r\n\t * This will create a data pub sub.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {Map} callBacks\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.callBacks = new Map();\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a subscriber array.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @returns {Map}\r\n\t */\r\n\tget(msg)\r\n\t{\r\n\t\tif (!this.callBacks.has(msg))\r\n\t\t{\r\n this.callBacks.set(msg, new Map());\r\n }\r\n return this.callBacks.get(msg);\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset pub sub.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\treset()\r\n\t{\r\n\t\tthis.callBacks.clear();\r\n\t\tlastToken = -1;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a subscriber.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {function} callBack\r\n\t * @returns {string} The subscriber token.\r\n\t */\r\n\ton(msg, callBack)\r\n\t{\r\n\t\tconst token = (++lastToken).toString();\r\n\t\tthis.get(msg).set(token, callBack);\r\n\r\n\t\treturn token;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a subscriber.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {string} token\r\n\t * @returns {void}\r\n\t */\r\n\toff(msg, token)\r\n\t{\r\n\t\tconst subscribers = this.callBacks.get(msg);\r\n if (subscribers)\r\n\t\t{\r\n\t\t\ttoken = String(token);\r\n subscribers.delete(token);\r\n if (subscribers.size === 0)\r\n\t\t\t{\r\n this.callBacks.delete(msg);\r\n }\r\n }\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete a message.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @returns {void}\r\n\t */\r\n\tremove(msg)\r\n\t{\r\n\t\tthis.callBacks.delete(msg);\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish a message.\r\n\t *\r\n\t * @overload\r\n\t * @param {string} msg\r\n\t * @param {string} value\r\n\t * @param {object} [committer]\r\n\t * @returns {void}\r\n\t */\r\n\tpublish(msg, ...args)\r\n\t{\r\n\t\tconst subscribers = this.callBacks.get(msg);\r\n if (!subscribers)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n for (const callBack of subscribers.values())\r\n\t\t{\r\n if (callBack)\r\n\t\t\t{\r\n callBack.apply(this, args);\r\n }\r\n }\r\n\r\n\t}\r\n}", "import { Events } from '../../main/events/events.js';\r\nimport { Types } from '../../shared/types.js';\r\nimport { ConnectionTracker } from './connection-tracker/connection-tracker.js';\r\nimport { OneWayConnection } from './connection-tracker/connections/one-way-connection.js';\r\nimport { TwoWayConnection } from './connection-tracker/connections/two-way-connection.js';\r\nimport { DataPubSub } from './data-pub-sub.js';\r\n\r\n/**\r\n * DataBinder\r\n *\r\n * This will create a data binder object that can\r\n * create one way and two way data bindings.\r\n *\r\n * @class\r\n */\r\nexport class DataBinder\r\n{\r\n\t/**\r\n\t * This will create a data binder.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {string} version\r\n\t\t */\r\n\t\tthis.version = \"1.0.1\";\r\n\r\n\t\t/**\r\n\t\t * @member {string} attr\r\n\t\t */\r\n\t\tthis.attr = 'bindId';\r\n\r\n\t\t/**\r\n\t\t * @member {array} blockedKeys\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.blockedKeys = [\r\n\t\t\t20, //caps lock\r\n\t\t\t37, //arrows\r\n\t\t\t38,\r\n\t\t\t39,\r\n\t\t\t40\r\n\t\t];\r\n\r\n\t\t/**\r\n\t\t * @member {object} connections\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.connections = new ConnectionTracker();\r\n\r\n\t\t/**\r\n\t\t * @member {object} pubSub\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.pubSub = new DataPubSub();\r\n\r\n\t\t/**\r\n\t\t * @member {number} idCount\r\n\t\t */\r\n\t\tthis.idCount = 0;\r\n\t\tthis.setup();\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.setupEvents();\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind an element to a data property.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {(string|function)} [filter]\r\n\t * @returns {object} an instance of the databinder.\r\n\t */\r\n\tbind(element, data, prop, filter)\r\n\t{\r\n\t\tlet bindProp = prop,\r\n\t\tbindAttr = null;\r\n\r\n\t\tif (prop.indexOf(':') !== -1)\r\n\t\t{\r\n\t\t\t/* this will setup the custom attr if the prop\r\n\t\t\thas specified one. */\r\n\t\t\tconst parts = prop.split(':');\r\n\t\t\tif (parts.length > 1)\r\n\t\t\t{\r\n\t\t\t\tbindProp = parts[1];\r\n\t\t\t\tbindAttr = parts[0];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will setup the model bind attr to the element\r\n\t\t * and assign a bind id attr to support two way\r\n\t\t * binding.\r\n\t\t */\r\n\t\tconst connection = this.setupConnection(element, data, bindProp, bindAttr, filter);\r\n\r\n\t\t/**\r\n\t\t * We want to get the starting value of the data and\r\n\t\t * et it on our element.\r\n\t\t */\r\n\t\tconst connectionElement = connection.element;\r\n\t\tlet value = data.get(bindProp);\r\n\t\tif (typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\tconnectionElement.set(value);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * This will set the element value as the\r\n\t\t\t * prop value.\r\n\t\t\t */\r\n\t\t\tvalue = connectionElement.get();\r\n\t\t\tif (value !== '')\r\n\t\t\t{\r\n\t\t\t\tconnection.data.set(value);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind an element to a data property.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {string} customAttr\r\n\t * @param {(string|function)} [filter]\r\n\t * @returns {object} The new connection.\r\n\t */\r\n\tsetupConnection(element, data, prop, customAttr, filter)\r\n\t{\r\n\t\tconst id = this.getBindId(element),\r\n\t\tconnection = new TwoWayConnection(this.pubSub),\r\n\r\n\t\t/**\r\n\t\t * This will create the data source and\r\n\t\t * subscribe the element to the data.\r\n\t\t */\r\n\t\tdataSource = connection.addData(data, prop);\r\n\t\tdataSource.subscribe(id);\r\n\r\n\t\t/**\r\n\t\t * This will add the data binding attr to our\r\n\t\t * element so it will subscribe to the two\r\n\t\t * data changes.\r\n\t\t */\r\n\t\tconst dataId = data.getDataId();\r\n\t\tconst msg = `${dataId}:${prop}`;\r\n\r\n\t\t/**\r\n\t\t * This will create the element source and subscribe\r\n\t\t * the data to the element.\r\n\t\t */\r\n\t\tconst elementSource = connection.addElement(element, customAttr, filter);\r\n\t\telementSource.subscribe(msg);\r\n\r\n\t\tthis.addConnection(id, 'bind', connection);\r\n\r\n\t\treturn connection;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new connection to the\r\n\t * connection tracker.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} id\r\n\t * @param {string} attr\r\n\t * @param {object} connection\r\n\t * @returns {object}\r\n\t */\r\n\taddConnection(id, attr, connection)\r\n\t{\r\n\t\tthis.connections.add(id, attr, connection);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the bind id.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} element\r\n\t * @returns {string}\r\n\t */\r\n\tsetBindId(element)\r\n\t{\r\n\t\tconst id = 'db-' + this.idCount++;\r\n\r\n\t\tif (element.dataset)\r\n\t\t{\r\n\t\t\telement.dataset[this.attr] = id;\r\n\t\t}\r\n\t\telement[this.attr] = id;\r\n\t\treturn id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the bind id.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} element\r\n\t * @returns {string}\r\n\t */\r\n\tgetBindId(element)\r\n\t{\r\n\t\treturn element[this.attr] || this.setBindId(element);\r\n\t}\r\n\r\n\t/**\r\n\t * This will unbind the element.\r\n\t *\r\n\t * @param {object} element\r\n\t * @returns {object} an instance of the data binder.\r\n\t */\r\n\tunbind(element)\r\n\t{\r\n\t\tconst id = element[this.attr];\r\n\t\tif (id)\r\n\t\t{\r\n\t\t\tthis.connections.remove(id);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a watcher for an element.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {function} callBack\r\n\t * @returns {object}\r\n\t */\r\n\twatch(element, data, prop, callBack)\r\n\t{\r\n\t\tif (Types.isObject(element) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst connection = new OneWayConnection();\r\n\r\n\t\t/**\r\n\t\t * This will setup the data source and subscribe\r\n\t\t * the element to the data.\r\n\t\t */\r\n\t\tconst source = connection.addSource(data);\r\n\t\tsource.subscribe(prop, callBack);\r\n\r\n\t\t// this will add the new connection to the connection tracker\r\n\t\tconst id = this.getBindId(element),\r\n\t\tattr = data.getDataId() + ':' + prop;\r\n\t\tthis.addConnection(id, attr, connection);\r\n\r\n\t\t/**\r\n\t\t * This will get the starting value of the data and\r\n\t\t * call the callback if the value is defined.\r\n\t\t */\r\n\t\tconst value = data.get(prop);\r\n\t\tcallBack(value);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a watcher from an element.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @returns {object}\r\n\t */\r\n\tunwatch(element, data, prop)\r\n\t{\r\n\t\tif (Types.isObject(element) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst id = element[this.attr];\r\n\t\tif (id)\r\n\t\t{\r\n\t\t\tconst attr = data.getDataId() + ':' + prop;\r\n\t\t\tthis.connections.remove(id, attr);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish to the pub sub.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {*} value\r\n\t * @param {object} committer\r\n\t * @returns {object} an instance of the data binder.\r\n\t */\r\n\tpublish(msg, value, committer)\r\n\t{\r\n\t\tthis.pubSub.publish(msg, value, committer);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if an element is bound.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} element\r\n\t * @returns {?string}\r\n\t */\r\n\tisDataBound(element)\r\n\t{\r\n\t\tif (!element)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst id = element[this.attr];\r\n\t\treturn (id) ? id : null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the key is blocked.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} evt\r\n\t * @returns {boolean}\r\n\t */\r\n\tisBlocked(evt)\r\n\t{\r\n\t\tif (evt.type !== 'keyup')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* this will check to block ctrl, shift or alt +\r\n\t\tbuttons */\r\n\t\treturn (this.blockedKeys.indexOf(evt.keyCode) !== -1);\r\n\t}\r\n\r\n\t/**\r\n\t * This is the callBack for the chnage event.\r\n\t *\r\n\t * @param {object} evt\r\n\t */\r\n\tbindHandler(evt)\r\n\t{\r\n\t\tif (this.isBlocked(evt))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tconst target = evt.target || evt.srcElement,\r\n\t\tid = this.isDataBound(target);\r\n\t\tif (id !== null)\r\n\t\t{\r\n\t\t\tconst connection = this.connections.get(id, 'bind');\r\n\t\t\tif (connection)\r\n\t\t\t{\r\n\t\t\t\tconst value = connection.element.get();\r\n\t\t\t\t/* this will publish to the ui and to the\r\n\t\t\t\tmodel that subscribes to the element */\r\n\t\t\t\tthis.pubSub.publish(id, value, target);\r\n\t\t\t}\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\t/**\r\n\t * This wil setup the events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetupEvents()\r\n\t{\r\n\t\tthis.changeHandler = this.bindHandler.bind(this);\r\n\t\tthis.addEvents();\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\taddEvents()\r\n\t{\r\n\t\tif (typeof document !== 'undefined')\r\n\t\t{\r\n\t\t\tEvents.on([\"change\", \"paste\", \"input\"], document, this.changeHandler, false);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tremoveEvents()\r\n\t{\r\n\t\tif (typeof document !== 'undefined')\r\n\t\t{\r\n\t\t\tEvents.off([\"change\", \"paste\", \"input\"], document, this.changeHandler, false);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport const dataBinder = new DataBinder();", "/**\r\n * This will get the parent set data.\r\n *\r\n * @param {object} parent\r\n * @returns {object|null}\r\n */\r\nexport const getParentData = (parent) =>\r\n{\r\n\tif (parent.data)\r\n\t{\r\n\t\treturn parent.data;\r\n\t}\r\n\r\n\tif (parent.context && parent.context.data)\r\n\t{\r\n\t\treturn parent.context.data;\r\n\t}\r\n\r\n\tif (parent.state)\r\n\t{\r\n\t\treturn parent.state;\r\n\t}\r\n\r\n\treturn null;\r\n};", "import { DataTracker } from '../../main/data-tracker/data-tracker.js';\r\nimport { Events } from '../../main/events/events.js';\r\nimport { Dom } from '../../shared/dom.js';\r\nimport { Types } from '../../shared/types.js';\r\nimport { dataBinder } from '../data-binder/data-binder.js';\r\n\r\n/**\r\n * This is a look up object to normalize the attribute names.\r\n *\r\n * @type {object} NORMALIZED_NAMES\r\n */\r\nconst NORMALIZED_NAMES =\r\n{\r\n\tclass: 'className',\r\n\ttext: 'textContent',\r\n\tfor: 'htmlFor',\r\n\treadonly: 'readOnly',\r\n\tmaxlength: 'maxLength',\r\n\tcellspacing: 'cellSpacing',\r\n\trowspan: 'rowSpan',\r\n\tcolspan: 'colSpan',\r\n\ttabindex: 'tabIndex',\r\n\tcelpadding: 'cellPadding',\r\n\tuseMap: 'useMap',\r\n\tframeborder: 'frameBorder',\r\n\tcontenteditable: 'contentEditable'\r\n};\r\n\r\n/**\r\n * This will get the javascript property name.\r\n *\r\n * @param {string} prop\r\n * @returns {string}\r\n */\r\nexport const normalizeAttr = (prop) =>\r\n{\r\n\treturn NORMALIZED_NAMES[prop] || prop;\r\n};\r\n\r\n/**\r\n * This will remove on from a property.\r\n *\r\n * @param {string} prop\r\n * @returns {string}\r\n */\r\nexport const removeEventPrefix = (prop) =>\r\n{\r\n\tif (typeof prop === 'string' && prop.substring(0, 2) === 'on')\r\n\t{\r\n\t\treturn prop.substring(2);\r\n\t}\r\n\treturn prop;\r\n};\r\n\r\n/**\r\n * Html\r\n *\r\n * This will create html elements.\r\n *\r\n * @class\r\n */\r\nexport class Html\r\n{\r\n\t/**\r\n\t * This will create a new element.\r\n\t *\r\n\t * @param {string} node The node name.\r\n\t * @param {object} attrs The node attributes.\r\n\t * @param {object} container The node container.\r\n\t * @param {boolean} [prepend=false] Add to the begining of the container.\r\n\t * @returns {object} The new element.\r\n\t */\r\n\tstatic create(node, attrs, container, prepend)\r\n\t{\r\n\t\tconst obj = document.createElement(node);\r\n\t\tthis.addAttributes(obj, attrs);\r\n\r\n\t\t/* we want to check if the new element should be\r\n\t\tadded to the begining or end */\r\n\t\tif (prepend === true)\r\n\t\t{\r\n\t\t\tthis.prepend(container, obj);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.append(container, obj);\r\n\t\t}\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element attributes.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {object} attrs\r\n\t * @returns {void}\r\n\t */\r\n\tstatic addAttributes(obj, attrs)\r\n\t{\r\n\t\t/* we want to check if we have attrributes to add */\r\n\t\tif (!attrs || typeof attrs !== 'object')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* we need to add the type if set to stop ie\r\n\t\tfrom removing the value if set after the value is\r\n\t\tadded */\r\n\t\tconst type = attrs.type;\r\n\t\tif (typeof type !== 'undefined')\r\n\t\t{\r\n\t\t\tDom.setAttr(obj, 'type', type);\r\n\t\t}\r\n\r\n\t\t/* we want to add each attr to the obj */\r\n\t\tfor (const [prop, value] of Object.entries(attrs))\r\n\t\t{\r\n\t\t\t/* we want to check to add the attr settings\r\n\t\t\t by property name */\r\n\t\t\tif (prop === 'innerHTML')\r\n\t\t\t{\r\n\t\t\t\tobj.innerHTML = value;\r\n\t\t\t}\r\n\t\t\telse if (prop.indexOf('-') !== -1)\r\n\t\t\t{\r\n\t\t\t\t// this will handle data and aria attributes\r\n\t\t\t\tDom.setAttr(obj, prop, value);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.addAttr(obj, prop, value);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add html to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} content\r\n\t * @returns {object}\r\n\t */\r\n\tstatic addHtml(obj, content)\r\n\t{\r\n\t\tif (typeof content === 'undefined' || content === '')\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* we need to check if we are adding inner\r\n\t\thtml content or just a string */\r\n\t\tconst pattern = /(?:<[a-z][\\s\\S]*>)/i;\r\n\t\tif (pattern.test(content))\r\n\t\t{\r\n\t\t\t/* html */\r\n\t\t\tobj.innerHTML = content;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t/* string */\r\n\t\t\tobj.textContent = content;\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an element attribute.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @param {*} value\r\n\t * @returns {void}\r\n\t */\r\n\tstatic addAttr(obj, attr, value)\r\n\t{\r\n\t\tif (value === '' || !attr)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* we want to check to add a value or an event listener */\r\n\t\tconst type = typeof value;\r\n\t\tif (type === 'function')\r\n\t\t{\r\n\t\t\t/* this will add the event using the events\r\n\t\t\tso the event is tracked */\r\n\t\t\tattr = removeEventPrefix(attr);\r\n\r\n\t\t\t/**\r\n\t\t\t * If the function has an originalCallback reference (added by Parser),\r\n\t\t\t * pass it to Events.add so it can be properly tracked and removed.\r\n\t\t\t */\r\n\t\t\tif (value.originalCallback)\r\n\t\t\t{\r\n\t\t\t\tEvents.add(attr, obj, value, false, false, value.originalCallback);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tEvents.add(attr, obj, value);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tconst attrName = normalizeAttr(attr);\r\n\t\t\tobj[attrName] = value;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a doc fragment.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tstatic createDocFragment()\r\n\t{\r\n\t\treturn document.createDocumentFragment();\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a text node.\r\n\t *\r\n\t * @param {string} text\r\n\t * @param {object} container\r\n\t * @returns {object}\r\n\t */\r\n\tstatic createText(text, container)\r\n\t{\r\n\t\tconst obj = document.createTextNode(text);\r\n\r\n\t\tif (container)\r\n\t\t{\r\n\t\t\tthis.append(container, obj);\r\n\t\t}\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a text node.\r\n\t *\r\n\t * @param {string} text\r\n\t * @param {object} container\r\n\t * @returns {object}\r\n\t */\r\n\tstatic createComment(text, container)\r\n\t{\r\n\t\tconst obj = document.createComment(text);\r\n\r\n\t\tif (container)\r\n\t\t{\r\n\t\t\tthis.append(container, obj);\r\n\t\t}\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the options on a select.\r\n\t *\r\n\t * @param {object} selectElem\r\n\t * @param {array} optionArray\r\n\t * @param {string} [defaultValue]\r\n\t */\r\n\tstatic setupSelectOptions(selectElem, optionArray, defaultValue)\r\n\t{\r\n\t\tif (!Types.isObject(selectElem))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!Types.isArray(optionArray))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\toptionArray.forEach((settings) =>\r\n\t\t{\r\n\t\t\tconst option = new Option(settings.label, settings.value);\r\n\t\t\tselectElem.options.add(option);\r\n\r\n\t\t\t/* we can select an option if a default value\r\n\t\t\thas been sumbitted */\r\n\t\t\tif (defaultValue !== null && option.value == defaultValue)\r\n\t\t\t{\r\n\t\t\t\toption.selected = true;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an elements data.\r\n\t *\r\n\t * @param {object} ele\r\n\t */\r\n\tstatic removeElementData(ele)\r\n\t{\r\n\t\tDataTracker.remove(ele);\r\n\r\n\t\t/* we want to do a recursive remove child\r\n\t\tremoval */\r\n\t\tconst children = ele.childNodes;\r\n\t\tif (children)\r\n\t\t{\r\n\t\t\tconst length = children.length - 1;\r\n\t\t\tfor (var i = length; i >= 0; i--)\r\n\t\t\t{\r\n\t\t\t\tvar child = children[i];\r\n\t\t\t\tif (!child)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/* this will remove the child element data\r\n\t\t\t\tbefore the parent is removed */\r\n\t\t\t\tthis.removeElementData(child);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst bound = ele.bindId;\r\n\t\tif (bound)\r\n\t\t{\r\n\t\t\t/* this will check to remove any data bindings\r\n\t\t\tto the element */\r\n\t\t\tdataBinder.unbind(ele);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an element and its data.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {object} this\r\n\t */\r\n\tstatic removeElement(obj)\r\n\t{\r\n\t\tif (!obj)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will check if the element has a manual destroy tracker.\r\n\t\t */\r\n\t\tconst manualDestroy = DataTracker.has(obj, 'manual-destroy');\r\n\r\n\t\t/* this will remove all element data and binding\r\n\t\tand remove from the parent container */\r\n\t\tthis.removeElementData(obj);\r\n\r\n\t\t/**\r\n\t\t * This will only remove the element if it does not have a\r\n\t\t * manual destroy tracker.\r\n\t\t */\r\n\t\tif (manualDestroy === false)\r\n\t\t{\r\n\t\t\tobj.remove();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an element.\r\n\t *\r\n\t * @param {object} child\r\n\t * @returns {object} this\r\n\t */\r\n\tstatic removeChild(child)\r\n\t{\r\n\t\tthis.removeElement(child);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove all elements from the container.\r\n\t *\r\n\t * @param {object} container\r\n\t * @returns {object} this\r\n\t */\r\n\tstatic removeAll(container)\r\n\t{\r\n\t\tif (!Types.isObject(container))\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst children = container.childNodes;\r\n\t\tfor (var child in children)\r\n\t\t{\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(children, child))\r\n\t\t\t{\r\n\t\t\t\tthis.removeElementData(children[child]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tcontainer.innerHTML = '';\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This change the parent of an element.\r\n\t *\r\n\t * @param {object} child\r\n\t * @param {object} newParent\r\n\t * @returns {object} this\r\n\t */\r\n\tstatic changeParent(child, newParent)\r\n\t{\r\n\t\tnewParent.appendChild(child);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will append a child element.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @param {object} child\r\n\t * @returns {object} this\r\n\t */\r\n\tstatic append(parent, child)\r\n\t{\r\n\t\tparent.appendChild(child);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepend a child element.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @param {object} child\r\n\t * @param {object} [optionalNode]\r\n\t * @returns {object}\r\n\t */\r\n\tstatic prepend(parent, child, optionalNode)\r\n\t{\r\n\t\tconst node = optionalNode || parent.firstChild;\r\n\t\tparent.insertBefore(child, node);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will clone an element.\r\n\t *\r\n\t * @param {object} node\r\n\t * @param {boolean} [deepCopy=false]\r\n\t * @returns {object}\r\n\t */\r\n\tstatic clone(node, deepCopy = false)\r\n\t{\r\n\t\tif (!Types.isObject(node))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn node.cloneNode(deepCopy);\r\n\t}\r\n}", "import { Events } from \"../../main/events/events.js\";\r\nimport { Dom } from '../../shared/dom.js';\r\nimport { Html, normalizeAttr, removeEventPrefix } from '../html/html.js';\r\n\r\n/**\r\n * HtmlHelper\r\n *\r\n * This will build JSON layouts.\r\n *\r\n * @class\r\n * @extends Html\r\n */\r\n// @ts-ignore\r\nexport class HtmlHelper extends Html\r\n{\r\n\t/**\r\n\t * This will create a new element.\r\n\t *\r\n\t * @override\r\n\t * @param {string} nodeName The node name.\r\n\t * @param {array} attrs The node attributes.\r\n\t * @param {object} container The node container.\r\n\t * @param {object} parent\r\n\t * @returns {object} The new element.\r\n\t */\r\n\tstatic create(nodeName, attrs, container, parent)\r\n\t{\r\n\t\tconst ele = document.createElement(nodeName);\r\n this.addAttributes(ele, attrs, parent);\r\n\r\n\t\tcontainer.appendChild(ele);\r\n\t\treturn ele;\r\n }\r\n\r\n\t/**\r\n\t * This will add the element attributes.\r\n\t *\r\n\t * @overload\r\n\t * @param {object} ele\r\n\t * @param {array} attrs\r\n\t * @param {object} parent\r\n * @returns {void}\r\n\t */\r\n\tstatic addAttributes(ele, attrs, parent)\r\n\t{\r\n if (!attrs || attrs.length < 1)\r\n {\r\n return;\r\n }\r\n\r\n attrs.forEach(item =>\r\n\t\t{\r\n const { key: prop, value } = item;\r\n\t\t\tthis.addAttr(ele, prop, value, parent);\r\n });\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an element attribute.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {string} attr\r\n\t * @param {*} value\r\n * @returns {void}\r\n\t */\r\n\tstatic addAttr(ele, attr, value, parent)\r\n\t{\r\n\t\tif (value === '' || !attr)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Prevent setting reserved DOM properties that have read-only getters.\r\n\t\t * 'children' is a read-only property on all DOM elements.\r\n\t\t */\r\n\t\tif (attr === 'children')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (attr === 'innerHTML')\r\n\t\t{\r\n\t\t\tele.innerHTML = value;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* we want to check to add a value or an event listener */\r\n\t\tconst type = typeof value;\r\n\t\tif (type === 'function')\r\n\t\t{\r\n\t\t\t/* this will add the event using the base events\r\n\t\t\tso the event is tracked */\r\n\t\t\tattr = removeEventPrefix(attr);\r\n\t\t\tEvents.add(attr, ele, function(e)\r\n\t\t\t{\r\n\t\t\t\tvalue.call(this, e, parent);\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (attr.substr(4, 1) === '-')\r\n\t\t{\r\n\t\t\t// this will handle data and aria attributes\r\n\t\t\tDom.setAttr(ele, attr, value);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst attrName = normalizeAttr(attr);\r\n\t\tele[attrName] = value;\r\n\t}\r\n\r\n\t/**\r\n * This will add content to an element.\r\n *\r\n * @param {object} ele\r\n * @param {object|null} content\r\n */\r\n static addContent(ele, content)\r\n {\r\n if (!content)\r\n {\r\n return;\r\n }\r\n\r\n if (content.textContent !== null)\r\n {\r\n ele.textContent = content.textContent;\r\n }\r\n else if (content.innerHTML)\r\n {\r\n ele.innerHTML = content.innerHTML;\r\n }\r\n }\r\n\r\n\t/**\r\n\t * This will append a child element to a parent.\r\n\t *\r\n\t * @override\r\n\t * @param {object} parent\r\n\t * @param {object} child\r\n * @returns {void}\r\n\t */\r\n\tstatic append(parent, child)\r\n\t{\r\n\t\tparent.appendChild(child);\r\n\t}\r\n}", "import { Types } from '../../shared/types.js';\r\nimport { dataBinder } from '../data-binder/data-binder.js';\r\nimport { getParentData } from './directives/core/reactive/get-parent-data.js';\r\nimport { HtmlHelper } from './html-helper.js';\r\n\r\n/**\r\n * WATCHER_PATTERN\r\n *\r\n * This is the pattern used to match watcher strings.\r\n *\r\n * @type {RegExp} WATCHER_PATTERN\r\n */\r\nconst WATCHER_PATTERN = /(\\[\\[(.*?(?:\\[\\d+\\])?)\\]\\])/g;\r\n\r\n/**\r\n * WatcherHelper\r\n *\r\n * This helper creates watcher callBacks, parses watcher strings\r\n * and sets up watchers.\r\n *\r\n * @type {object} WatcherHelper\r\n */\r\nexport const WatcherHelper =\r\n{\r\n\t/**\r\n\t * This will check if the value is a watcher.\r\n\t *\r\n\t * @param {*} value\r\n\t * @returns {boolean}\r\n\t * @static\r\n\t * @private\r\n\t */\r\n\tisWatching(value)\r\n\t{\r\n\t\t/**\r\n\t\t * This will check if we are watching using an array.\r\n\t\t */\r\n\t\tif (Array.isArray(value))\r\n\t\t{\r\n\t\t\treturn typeof value[0] === 'string' && this.hasParams(value[0]);\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will check if we are watching using a string.\r\n\t\t */\r\n\t\treturn this.hasParams(value);\r\n\t},\r\n\r\n\t/**\r\n\t * This will check if a string has params.\r\n\t *\r\n\t * @param {string} string\r\n\t * @returns {boolean}\r\n\t */\r\n\thasParams(string)\r\n\t{\r\n\t\treturn Types.isString(string) && string.includes('[[');\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the property names to be watched.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} string\r\n\t * @returns {(array|null)}\r\n\t */\r\n\t_getWatcherProps(string)\r\n\t{\r\n\t\tconst matches = string.match(WATCHER_PATTERN);\r\n\t\tif (!matches)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t};\r\n\r\n\t\treturn matches.map(match => match.slice(2, -2)); // Trim `[[` and `]]`\r\n\t},\r\n\r\n\t/**\r\n\t * This will update an element attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {string} attr\r\n\t * @param {string} value\r\n\t * @returns {void}\r\n\t */\r\n\tupdateAttr(ele, attr, value)\r\n\t{\r\n\t\tswitch (attr) {\r\n\t\t\tcase 'text':\r\n\t\t\tcase 'textContent':\r\n\t\t\t\tele.textContent = value;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'disabled':\r\n\t\t\t\tele.disabled = (!value);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'checked':\r\n\t\t\t\tele.checked = (Boolean(value) !== false);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'required':\r\n\t\t\t\tele.required = (Boolean(value) !== false);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'src':\r\n\t\t\t\tif (ele.tagName.toLowerCase() === 'img')\r\n\t\t\t\t{\r\n\t\t\t\t\tele.src = (value && (value.indexOf('.') !== -1 || value.indexOf('blob:') !== -1))? value : '';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tele.src = value;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tHtmlHelper.addAttr(ele, attr, value);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will replace the params in a string with the data values.\r\n\t *\r\n\t * @param {string} string\r\n\t * @param {object} data\r\n\t * @param {boolean} isArray\r\n\t * @returns {string}\r\n\t */\r\n\treplaceParams(string, data, isArray = false)\r\n\t{\r\n\t\tlet count = 0;\r\n\t\treturn string.replace(WATCHER_PATTERN, function()\r\n\t\t{\r\n\t\t\tconst watcherData = (isArray)? data[count] : data;\r\n\t\t\tcount++;\r\n\r\n\t\t\tconst result = watcherData.get(arguments[2]);\r\n\t\t\treturn ((typeof result !== 'undefined' && result !== null)? result : '');\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * This will get a watcher callBack.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {(string|array)} data\r\n\t * @param {string} string\r\n\t * @param {string} attr\r\n\t * @param {boolean} isArray\r\n\t * @returns {function}\r\n\t */\r\n\t_getWatcherCallBack(ele, data, string, attr, isArray)\r\n\t{\r\n\t\treturn () =>\r\n\t\t{\r\n\t\t\tlet value = this.replaceParams(string, data, isArray);\r\n\t\t\tthis.updateAttr(ele, attr, value);\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * This will get a watcher value.\r\n\t *\r\n\t * @private\r\n\t * @param {(string|object)} settings\r\n\t * @param {object} parent\r\n\t * @returns {array}\r\n\t */\r\n\tgetValue(settings, parent)\r\n\t{\r\n\t\tconst value = settings.value;\r\n\t\tif (Array.isArray(value) === false)\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * This will setup an array watcher based on a string.\r\n\t\t\t */\r\n\t\t\treturn [value, getParentData(parent)];\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will check to add the default data.\r\n\t\t */\r\n\t\tif (value.length < 2)\r\n\t\t{\r\n\t\t\tvalue.push(getParentData(parent));\r\n\t\t}\r\n\t\treturn value;\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the prop values.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {array} props\r\n\t * @param {boolean} isArray\r\n\t * @returns {array}\r\n\t */\r\n\tgetPropValues(data, props, isArray)\r\n\t{\r\n\t\tconst values = [];\r\n\r\n\t\tfor (var i = 0, length = props.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar watcherData = (isArray)? data[i] : data;\r\n\t\t\tvar value = watcherData.get(props[i]);\r\n\t\t\tvalue = (typeof value !== 'undefined'? value : '');\r\n\t\t\tvalues.push(value);\r\n\t\t}\r\n\r\n\t\treturn values;\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the watcher callBack.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @param {object} ele\r\n\t * @param {object} data\r\n\t * @param {string} string\r\n\t * @param {boolean} isDataArray\r\n\t * @returns {function}\r\n\t */\r\n\tgetCallBack(settings, ele, data, string, isDataArray)\r\n\t{\r\n\t\t/**\r\n\t\t * This will get the attribute to update.\r\n\t\t * If no attribute is set, we will default to textContent.\r\n\t\t */\r\n\t\tconst attr = settings.attr || 'textContent';\r\n\r\n\t\t/**\r\n\t\t * This will check if we have an override callBack that\r\n\t\t * will be used instead of the default callBack.\r\n\t\t */\r\n\t\tconst overrideCallBack = settings.callBack;\r\n\t\tif (typeof overrideCallBack === 'function')\r\n\t\t{\r\n\t\t\tconst props = string.match(WATCHER_PATTERN) || [];\r\n\t\t\tconst isMultiProp = (props && props.length > 1);\r\n\r\n\t\t\treturn (value, committer) =>\r\n\t\t\t{\r\n\t\t\t\t/**\r\n\t\t\t\t * This will get the watcher values to pass to the callBack.\r\n\t\t\t\t */\r\n\t\t\t\tvalue = (isMultiProp !== true)? value : this.getPropValues(data, props, isDataArray);\r\n\t\t\t\tconst result = overrideCallBack(value, ele, committer);\r\n\t\t\t\tif (typeof result !== 'undefined')\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.updateAttr(ele, attr, result);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn this._getWatcherCallBack(ele, data, string, attr, isDataArray);\r\n\t},\r\n\r\n\t/**\r\n\t * This will add a data watcher.\r\n\t *\r\n\t * @private\r\n\t * @param {object} ele\r\n\t * @param {(string|object)} settings\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\taddDataWatcher(ele, settings, parent)\r\n\t{\r\n\t\tconst value = this.getValue(settings, parent),\r\n\r\n\t\t/**\r\n\t\t * This will check if the data is set in the watcher value array.\r\n\t\t * If not, we will use the parent data.\r\n\t\t */\r\n\t\tdata = value[1] ?? parent?.data ?? parent?.context?.data ?? parent?.state ?? null;\r\n\t\tif (!data)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst string = value[0],\r\n\r\n\t\t/**\r\n\t\t * This will check if we are watching multiple data objects.\r\n\t\t */\r\n\t\tisDataArray = Array.isArray(data);\r\n\r\n\t\t/**\r\n\t\t * This will set up the watcher callBack.\r\n\t\t *\r\n\t\t * @type {function} callBack\r\n\t\t */\r\n\t\tconst callBack = this.getCallBack(settings, ele, data, string, isDataArray),\r\n\r\n\t\t/**\r\n\t\t * This will get the props to watch.\r\n\t\t *\r\n\t\t * @type {array} props\r\n\t\t */\r\n\t\tprops = this._getWatcherProps(string);\r\n\r\n\t\t/**\r\n\t\t * This will add the watcher for each prop.\r\n\t\t */\r\n\t\tfor (var i = 0, length = props.length; i < length; i++)\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * This will set the coreect data object for the watcher\r\n\t\t\t * based on the isDataArray flag.\r\n\t\t\t */\r\n\t\t\tvar watcherData = (isDataArray)? data[i] : data;\r\n\t\t\tthis.addWatcher(ele, watcherData, props[i], callBack);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the watcher array settings.\r\n\t *\r\n\t * @param {string|object|array} settings\r\n\t * @param {string} [attribute=null]\r\n\t * @returns {object}\r\n\t */\r\n\tgetWatcherSettings(settings, attribute = null)\r\n\t{\r\n\t\t/**\r\n\t\t * Handle case where `watch` is a string (multi-property string updating).\r\n\t\t */\r\n\t\tif (typeof settings === \"string\")\r\n\t\t{\r\n\t\t\treturn { attr: attribute, value: settings };\r\n\t\t}\r\n\r\n\t\tif (Array.isArray(settings))\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * Handle shorthand syntax (array).\r\n\t\t\t */\r\n\t\t\tlet lastItem = settings[settings.length - 1];\r\n\t\t\tif (lastItem && typeof lastItem === \"object\")\r\n\t\t\t{\r\n\t\t\t\tlastItem = (attribute !== null) ? attribute : null;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will set up the value based on length to support\r\n\t\t\t * optional data and callback parameters.\r\n\t\t\t */\r\n\t\t\tconst value = (settings[1] && typeof settings[1] === 'object')\r\n\t\t\t\t? [settings[0], settings[1]] // `['[[id]]', data]`\r\n\t\t\t\t: [settings[0]]; // `['[[id]]'`\r\n\r\n\t\t\treturn ((typeof lastItem === \"function\")\r\n\t\t\t\t? { attr: attribute, value, callBack: lastItem } // Callback format\r\n\t\t\t\t: { attr: lastItem || \"textContent\", value }); // Attribute format\r\n\t\t}\r\n\r\n\t\treturn settings;\r\n\t},\r\n\r\n\t/**\r\n\t * This will setup a data watcher.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {(string|object)} settings\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tsetup(ele, settings, parent)\r\n\t{\r\n\t\tif (!settings)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.addDataWatcher(\r\n\t\t\tele,\r\n\t\t\tthis.getWatcherSettings(settings),\r\n\t\t\tparent\r\n\t\t);\r\n\t},\r\n\r\n\t/**\r\n\t * This will add a watcher.\r\n\t *\r\n\t * @private\r\n\t * @param {object} ele\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {function} callBack\r\n\t * @returns {void}\r\n\t */\r\n\taddWatcher(ele, data, prop, callBack)\r\n\t{\r\n\t\tdataBinder.watch(ele, data, prop, callBack);\r\n\t}\r\n};", "import { ArrayProp, DefaultProps, ObjectProp, StringProp } from \"../component/prop-utils.js\";\r\nimport { WatcherHelper } from \"../layout/watcher-helper.js\";\r\n\r\n/**\r\n * This will create a watcher prop.\r\n *\r\n * @param {array} watch\r\n * @returns {object}\r\n */\r\nconst WatcherProp = (watch) => ({\r\n\tprops: {\r\n\t\twatch\r\n\t},\r\n\tchildren: []\r\n});\r\n\r\n/**\r\n * This will parse the arguments passed to the atom.\r\n *\r\n * @param {array} args\r\n * @returns {object}\r\n */\r\nconst parseArgs = (args) =>\r\n{\r\n\tif (!args)\r\n\t{\r\n\t\treturn DefaultProps();\r\n\t}\r\n\r\n\t/**\r\n\t * This will handle string children and allow them\r\n\t * to have watcher props.\r\n\t */\r\n\tconst first = args[0];\r\n\tconst firstType = typeof first;\r\n\tif (firstType === 'string' || firstType === 'number')\r\n\t{\r\n\t\treturn StringProp(first);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if we have a child array or\r\n\t * a watcher array.\r\n\t */\r\n\tif (Array.isArray(first))\r\n\t{\r\n\t\t/**\r\n\t\t * This will handle the child array.\r\n\t\t */\r\n\t\tif (WatcherHelper.isWatching(first) === false)\r\n\t\t{\r\n\t\t\treturn ArrayProp(first);\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will handle the watcher array.\r\n\t\t */\r\n\t\treturn WatcherProp(first);\r\n\t}\r\n\r\n\t// @ts-ignore\r\n\tconst children = args[1] ?? args[0] ?? [];\r\n\tif (children && Array.isArray(children))\r\n\t{\r\n\t\t/**\r\n\t\t * This will check if the first child is a watcher array\r\n\t\t * and set it as a watcher prop.\r\n\t\t */\r\n\t\tif (WatcherHelper.isWatching(children) === true)\r\n\t\t{\r\n\t\t\targs[0] = (!Array.isArray(args[0]))? args[0] : {};\r\n\t\t\t// @ts-ignore\r\n\t\t\targs[0].watch = children;\r\n\t\t\targs[1] = [];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will handle default props and children.\r\n\t */\r\n\treturn ObjectProp(args);\r\n};\r\n\r\n/**\r\n * This will create an atom.\r\n *\r\n * @param {function} callBack\r\n * @returns {function}\r\n */\r\nexport const Atom = (callBack) =>\r\n{\r\n\t/**\r\n\t * This will create a closure that will\r\n\t * parse the arguments and then call the\r\n\t * callback.\r\n\t */\r\n\treturn (...args) =>\r\n\t{\r\n\t\t/**\r\n\t\t * This will allow the atom to access optional args.\r\n\t\t */\r\n\t\tconst {props, children} = parseArgs(args);\r\n\t\treturn callBack(props, children);\r\n\t};\r\n};", "import { Objects } from \"../../shared/objects.js\";\r\n\r\n/**\r\n * This will get hte path of the prop.\r\n *\r\n * @param {string} path\r\n * @param {string} prop\r\n * @returns {string}\r\n */\r\nfunction getNewPath(path, prop)\r\n{\r\n const isNan = isNaN(Number(prop));\r\n const propPath = isNan ? prop : `[${prop}]`;\r\n if (path === '')\r\n {\r\n return propPath;\r\n }\r\n\r\n return isNan ?`${path}.${propPath}` : `${path}${propPath}`;\r\n}\r\n\r\n/**\r\n * This will create a handler for the proxy.\r\n *\r\n * @param {object} data\r\n * @param {string} path\r\n * @param {string} dataRoot\r\n * @returns {Proxy}\r\n */\r\nfunction createHandler(data, path = '', dataRoot = '')\r\n{\r\n return {\r\n\r\n /**\r\n * This will get the value of the prop.\r\n *\r\n * @param {object} target\r\n * @param {string} prop\r\n * @param {object} receiver\r\n * @returns {*}\r\n */\r\n // @ts-ignore\r\n get(target, prop, receiver)\r\n {\r\n let value = target[prop];\r\n // Directly return the property if it's on the root level and we're at the root path\r\n if (path === '' && prop in target)\r\n {\r\n if (typeof value === 'function')\r\n {\r\n return value.bind(target);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n // Access the property within the dataRoot\r\n const dataTarget = target[dataRoot] || target;\r\n value = Reflect.get(dataTarget, prop, receiver);\r\n\r\n // Return the value directly if it's not an object\r\n if (Objects.isPlainObject(value) || Array.isArray(value))\r\n {\r\n // Create a new handler for nested properties\r\n const newPath = getNewPath(path, prop);\r\n // @ts-ignore\r\n return new Proxy(value, createHandler(data, newPath, dataRoot));\r\n }\r\n\r\n return value;\r\n },\r\n\r\n /**\r\n * This will set the value of the prop.\r\n *\r\n * @param {object} target\r\n * @param {string} prop\r\n * @param {*} value\r\n * @param {object} receiver\r\n * @returns {*}\r\n */\r\n set(target, prop, value, receiver)\r\n {\r\n // Set the property at the root level if we're at the root path\r\n if (path === '' && prop in target)\r\n {\r\n target[prop] = value;\r\n return true;\r\n }\r\n\r\n const newPath = getNewPath(path, prop);\r\n data.set(newPath, value);\r\n\r\n return true;\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * This will create a data proxy.\r\n *\r\n * @param {object} data\r\n * @returns {Proxy}\r\n */\r\n// @ts-ignore\r\nexport const DataProxy = (data, root = 'stage') => new Proxy(data, createHandler(data, '', root));", "/**\r\n * LocalData\r\n *\r\n * This will help manage the local data.\r\n *\r\n * @class\r\n */\r\nexport class LocalData\r\n{\r\n\t/**\r\n\t * This will restore the data from local storage.\r\n\t *\r\n * @static\r\n * @param {string} key\r\n\t * @param {*} defaultValue\r\n\t * @returns {*}\r\n\t */\r\n\tstatic resume(key, defaultValue)\r\n\t{\r\n\t\tif (!key)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tlet data;\r\n\t\tconst value = localStorage.getItem(key);\r\n\t\tif (value === null)\r\n\t\t{\r\n\t\t\tif (defaultValue)\r\n\t\t\t{\r\n\t\t\t\tdata = defaultValue;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdata = JSON.parse(value);\r\n\t\t}\r\n\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/**\r\n\t * This will store the data to the local stoage under\r\n\t * the storage key.\r\n\t *\r\n * @static\r\n * @param {string} key\r\n * @param {*} data\r\n\t * @returns {boolean}\r\n\t */\r\n\tstatic store(key, data)\r\n\t{\r\n\t\tif (!key)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!data)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst value = JSON.stringify(data);\r\n\t\tlocalStorage.setItem(key, value);\r\n\t\treturn true;\r\n\t}\r\n\r\n /**\r\n * This will remove the data from the local storage.\r\n *\r\n * @static\r\n * @param {string} key\r\n * @returns {boolean}\r\n */\r\n static remove(key)\r\n {\r\n if (!key)\r\n {\r\n return false;\r\n }\r\n\r\n localStorage.removeItem(key);\r\n return true;\r\n }\r\n}", "import { Objects } from \"../../../../shared/objects.js\";\r\nimport { Types } from \"../../../../shared/types.js\";\r\n\r\n/**\r\n * This will get the data attribute settings.\r\n *\r\n * @param {object} [settings={}]\r\n * @returns {object}\r\n */\r\nexport const setupAttrSettings = (settings = {}) =>\r\n{\r\n\tconst attributes = {};\r\n\tif (!Types.isObject(settings))\r\n\t{\r\n\t\treturn attributes;\r\n\t}\r\n\r\n\tconst clonedSettings = Objects.clone(settings);\r\n\tObject.keys(clonedSettings).forEach(prop =>\r\n\t{\r\n\t\tconst settingValue = clonedSettings[prop];\r\n if (typeof settingValue !== 'function')\r\n\t\t{\r\n attributes[prop] = settingValue;\r\n }\r\n\t});\r\n\treturn attributes;\r\n};", "import { Objects } from '../../../shared/objects.js';\r\nimport { dataBinder } from '../../data-binder/data-binder.js';\r\nimport { DataPubSub } from '../../data-binder/data-pub-sub.js';\r\nimport { DataProxy } from '../data-proxy.js';\r\nimport { LocalData } from '../local-data.js';\r\nimport { setupAttrSettings } from './model/attrs.js';\r\n\r\nlet dataNumber = 0;\r\n\r\n/**\r\n * EVENT\r\n *\r\n * This will hold the event strings for the data object.\r\n *\r\n * @type {object} EVENT\r\n * @property {string} CHANGE\r\n * @property {string} DELETE\r\n * @readonly\r\n * @enum {string} EVENT - The event strings for the data object.\r\n * @const\r\n */\r\nexport const EVENT =\r\n{\r\n\tCHANGE: 'change',\r\n\tDELETE: 'delete'\r\n};\r\n\r\n/**\r\n * createEventMessage\r\n *\r\n * This will create an event message.\r\n *\r\n * @param {string} attr\r\n * @param {string} event\r\n * @returns {string} The event message.\r\n */\r\nexport const createEventMessage = (attr, event) =>\r\n{\r\n\treturn `${attr}:${event}`;\r\n};\r\n\r\n/**\r\n * BasicData\r\n *\r\n * This will create a bindable base class. This will\r\n * allow shallow one level deep data to be created\r\n * and watched.\r\n *\r\n * @class\r\n */\r\nexport class BasicData\r\n{\r\n\t/**\r\n\t * This will create a basic data object.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} [settings]\r\n\t */\r\n\tconstructor(settings = {})\r\n\t{\r\n\t\t/**\r\n\t\t * @member {boolean} dirty\r\n\t\t * @default false\r\n\t\t */\r\n\t\tthis.dirty = false;\r\n\r\n\t\t/**\r\n\t\t * @member {object} links\r\n\t\t * @default {}\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.links = new Map();\r\n\r\n\t\tthis._init();\r\n\t\tthis.setup();\r\n\r\n\t\t/**\r\n\t\t * @member {string} dataTypeId\r\n\t\t */\r\n\t\tthis.dataTypeId = 'bd';\r\n\r\n\t\t/* this will setup the event sub for\r\n\t\tone way binding */\r\n\t\tthis.eventSub = new DataPubSub();\r\n\r\n\t\t/* this will set the construct attributes */\r\n\t\tconst attributes = setupAttrSettings(settings);\r\n\t\tthis.set(attributes);\r\n\r\n\t\t// @ts-ignore\r\n\t\treturn DataProxy(this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the data object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {object} stage\r\n\t\t */\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the number and unique id of the data object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\t_init()\r\n\t{\r\n\t\tconst id = (++dataNumber);\r\n\t\tthis._dataNumber = id;\r\n\r\n\t\tthis._id = `dt-${id}`;\r\n\t\tthis._dataId = `${this._id}:`;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the data id.\r\n\t *\r\n\t * @returns {string}\r\n\t */\r\n\tgetDataId()\r\n\t{\r\n\t\treturn this._id;\r\n\t}\r\n\r\n\t/**\r\n\t * This is a placeholder.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tremove()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a one way bind.\r\n\t *\r\n\t * @param {string} attrName\r\n\t * @param {function} callBack\r\n\t * @returns {string} The subscription token.\r\n\t */\r\n\ton(attrName, callBack)\r\n\t{\r\n\t\tconst message = createEventMessage(attrName, EVENT.CHANGE);\r\n\t\tconst token = this.eventSub.on(message, callBack);\r\n\t\treturn token;\r\n\t}\r\n\r\n\t/**\r\n\t * This will unbind from a one way bind.\r\n\t *\r\n\t * @param {string} attrName\r\n\t * @param {string} token\r\n\t * @returns {void}\r\n\t */\r\n\toff(attrName, token)\r\n\t{\r\n\t\tconst message = createEventMessage(attrName, EVENT.CHANGE);\r\n\t\tthis.eventSub.off(message, token);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the attribute value.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {object} committer\r\n\t * @param {boolean} stopMerge\r\n\t * @returns {void}\r\n\t */\r\n\t_setAttr(attr, val, committer = this, stopMerge = false)\r\n\t{\r\n\t\tconst prevValue = this.stage[attr];\r\n\t\tif (val === prevValue)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.stage[attr] = val;\r\n\r\n\t\t/* this will publish the data to the data binder\r\n\t\tto update any ui elements that are subscribed */\r\n\t\tthis._publish(attr, val, committer, EVENT.CHANGE);\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish a local event.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {object|null} committer\r\n\t * @param {string} event\r\n\t * @returns {void}\r\n\t */\r\n\tpublishLocalEvent(attr, val, committer, event)\r\n\t{\r\n\t\t/**\r\n\t\t * This will publish the event to the event sub.\r\n\t\t */\r\n\t\tconst message = createEventMessage(attr, event);\r\n\t\tthis.eventSub.publish(message, val, committer);\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish an update to the data binder.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {*} committer\r\n\t * @param {string} event\r\n\t * @returns {void}\r\n\t */\r\n\t_publish(attr, val, committer, event)\r\n\t{\r\n\t\t/**\r\n\t\t * This will publish the event to the event sub.\r\n\t\t */\r\n\t\tthis.publishLocalEvent(attr, val, committer, event);\r\n\r\n\t\t/**\r\n\t\t * This will set the committer to the current object if it is not set.\r\n\t\t * This is deferred until the local event is published.\r\n\t\t *\r\n\t\t * This will publish the event to the data binder.\r\n\t\t */\r\n\t\tcommitter = committer || this;\r\n\t\tdataBinder.publish(this._dataId + attr, val, committer);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the data value of an attribute or attributes.\r\n\t *\r\n\t * @overload\r\n\t * @param {string} key\r\n\t * @param {*} value\r\n\t * @param {object} [committer]\r\n\t *\r\n\t * @overload\r\n\t * @param {object} data\r\n\t * @returns {object} this\r\n\t */\r\n\tset(...args)\r\n\t{\r\n\t\tif (typeof args[0] !== 'object')\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis._setAttr(...args);\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst [items, committer, stopMerge] = args;\r\n\t\tObject.entries(items).forEach(([attr, value]) =>\r\n\t\t{\r\n\t\t\tif (typeof value === 'function')\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tthis._setAttr(attr, value, committer, stopMerge);\r\n\t\t});\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the model data.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object}\r\n\t */\r\n\tgetModelData()\r\n\t{\r\n\t\treturn this.stage;\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete an attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @param {object} [committer]\r\n\t * @returns {void}\r\n\t */\r\n\t_deleteAttr(obj, attr, committer = this)\r\n\t{\r\n\t\tdelete obj[attr];\r\n\r\n\t\t/**\r\n\t\t * This will pulish the delete event to the event sub only. This will\r\n\t\t * not publish the delete event to the data binder.\r\n\t\t */\r\n\t\tthis.publishLocalEvent(attr, null, committer, EVENT.DELETE);\r\n\t}\r\n\r\n\t/**\r\n\t * This will toggle a bool attribute.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @returns {object} this\r\n\t */\r\n\ttoggle(attr)\r\n\t{\r\n\t\tif (typeof attr === 'undefined')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.set(attr, !this.get(attr));\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will increment an attribute.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {number|null} value\r\n\t * @returns {object} this\r\n\t */\r\n\tincrement(attr, value = null)\r\n\t{\r\n\t\tif (typeof attr === 'undefined')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// this will ensure we have a number value\r\n\t\tvalue = (value !== null && typeof value === 'number' ? value : 1);\r\n\r\n\t\tlet val = this.get(attr);\r\n\t\tthis.set(attr, val + value);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will decrement an attribute.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {number|null} value\r\n\t * @returns {object} this\r\n\t */\r\n\tdecrement(attr, value = null)\r\n\t{\r\n\t\tif (typeof attr === 'undefined')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// this will ensure we have a number value\r\n\t\tvalue = (value !== null && typeof value === 'number' ? value : 1);\r\n\r\n\t\tlet val = this.get(attr);\r\n\t\tthis.set(attr, val - value);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will concat an attribute.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @returns {object} this\r\n\t */\r\n\tconcat(attr, value)\r\n\t{\r\n\t\tif (typeof attr === 'undefined')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst currentValue = this.get(attr);\r\n\t\tthis.set(attr, currentValue + value);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the key value if it is null.\r\n\t *\r\n\t * @param {string} key\r\n\t * @param {*} value\r\n\t * @returns {object} this\r\n\t */\r\n\tifNull(key, value)\r\n\t{\r\n\t\tif (this.get(key) === null)\r\n\t\t{\r\n\t\t\tthis.set(key, value);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the data local storage key.\r\n\t *\r\n\t * @param {string} key\r\n\t * @returns {object} this\r\n\t */\r\n\tsetKey(key)\r\n\t{\r\n\t\tthis.key = key;\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will restore the data from local storage.\r\n\t *\r\n\t * @param {*} defaultValue\r\n\t * @returns {object} this\r\n\t */\r\n\tresume(defaultValue)\r\n\t{\r\n\t\tconst data = LocalData.resume(this.key, defaultValue);\r\n\t\tif (!data)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tthis.set(data);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will store the data to the local stoage under\r\n\t * the storage key.\r\n\t *\r\n\t * @returns {boolean}\r\n\t */\r\n\tstore()\r\n\t{\r\n\t\tconst data = this.get();\r\n\t\treturn LocalData.store(this.key, data);\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete a property value or the model data.\r\n\t *\r\n\t * @param {object|string|null} [attrName]\r\n\t * @returns {object} this\r\n\t */\r\n\tdelete(attrName)\r\n\t{\r\n\t\tif (typeof attrName === 'string')\r\n\t\t{\r\n\t\t\tthis._deleteAttr(this.stage, attrName);\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t// this will clear the stage and attributes\r\n\t\tthis.setup();\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value of an attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @returns {*}\r\n\t */\r\n\t_getAttr(obj, attr)\r\n\t{\r\n\t\treturn obj[attr];\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a property value or the model data.\r\n\t *\r\n\t * @param {string} [attrName]\r\n\t * @returns {*}\r\n\t */\r\n\tget(attrName)\r\n\t{\r\n\t\tif (typeof attrName !== 'undefined')\r\n\t\t{\r\n\t\t\treturn this._getAttr(this.stage, attrName);\r\n\t\t}\r\n\r\n\t\treturn this.getModelData();\r\n\t}\r\n\r\n\t/**\r\n\t * This will link a data source property to another data source.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string|object} attr\r\n\t * @param {string} alias\r\n\t * @returns {string|array}\r\n\t */\r\n\tlink(data, attr, alias)\r\n\t{\r\n\t\t// this will get the data source attrs if sending a whole data object\r\n\t\tif (arguments.length === 1 && data.isData === true)\r\n\t\t{\r\n\t\t\tattr = data.get();\r\n\t\t}\r\n\r\n\t\tif (typeof attr !== 'object')\r\n\t\t{\r\n\t\t\treturn this.remoteLink(data, attr, alias);\r\n\t\t}\r\n\r\n\t\tconst tokens = [];\r\n\t\tObject.entries(attr).forEach(([prop]) =>\r\n\t\t{\r\n\t\t\ttokens.push(this.remoteLink(data, prop));\r\n\t\t});\r\n\r\n\t\treturn tokens;\r\n\t}\r\n\r\n\t/**\r\n\t * This will link a remote data source by property.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string} attr\r\n\t * @param {string} [alias]\r\n\t * @returns {string}\r\n\t */\r\n\tremoteLink(data, attr, alias)\r\n\t{\r\n\t\tconst childAttr = alias || attr;\r\n\t\tconst value = data.get(attr);\r\n\t\tif (typeof value !== 'undefined' && this.get(attr) !== value)\r\n\t\t{\r\n\t\t\tthis.set(attr, value);\r\n\t\t}\r\n\r\n\t\tconst token = data.on(attr, (propValue, committer) =>\r\n\t\t{\r\n\t\t\tif(committer === this)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tthis.set(childAttr, propValue, data);\r\n\t\t});\r\n\r\n\t\tthis.addLink(token, data);\r\n\r\n\t\tconst remoteToken = this.on(childAttr, (propValue, committer) =>\r\n\t\t{\r\n\t\t\tif (committer === data)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tdata.set(attr, propValue, this);\r\n\t\t});\r\n\r\n\t\tdata.addLink(remoteToken, this);\r\n\t\treturn token;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a link token to the links array.\r\n\t *\r\n\t * @param {string} token\r\n\t * @param {object} data\r\n\t * @returns {void}\r\n\t */\r\n\taddLink(token, data)\r\n\t{\r\n\t\tthis.links.set(token, data);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a link or all links if no token is provided.\r\n\t *\r\n\t * @param {string|null} [token=null]\r\n\t * @returns {void}\r\n\t */\r\n\tunlink(token)\r\n\t{\r\n\t\tif (token)\r\n\t\t{\r\n\t\t\tthis.removeLink(token);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst links = this.links;\r\n\t\tif (Objects.isEmpty(links))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlinks.forEach((data, token) =>\r\n\t\t{\r\n\t\t\tthis.removeLink(token, false);\r\n\t\t});\r\n\t\tthis.links = new Map();\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the linked subscription.\r\n\t *\r\n\t * @param {string} token\r\n\t * @param {boolean} [removeFromLinks=true]\r\n\t * @returns {void}\r\n\t */\r\n\tremoveLink(token, removeFromLinks = true)\r\n\t{\r\n\t\tconst data = this.links.get(token);\r\n\t\tif (data)\r\n\t\t{\r\n\t\t\tdata.off(token);\r\n\t\t}\r\n\r\n\t\tif (removeFromLinks === false)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.links.delete(token);\r\n\t}\r\n}\r\n\r\nBasicData.prototype.isData = true;", "/**\r\n * This is a utility class for data.\r\n */\r\nexport const DataUtils =\r\n{\r\n /**\r\n * @member {RexExp} deepDataPattern\r\n */\r\n\tdeepDataPattern: /(\\w+)|(?:\\[(\\d)\\))/g,\r\n\r\n\t/**\r\n\t * This will check if a string has deep data.\r\n\t *\r\n\t * @param {string} str\r\n\t * @returns {boolean}\r\n\t */\r\n\thasDeepData(str)\r\n\t{\r\n\t\treturn (str.indexOf('.') !== -1 || str.indexOf('[') !== -1);\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the deep data segments.\r\n\t *\r\n\t * @param {string} str\r\n\t * @returns {array}\r\n\t */\r\n\tgetSegments(str)\r\n\t{\r\n\t\tconst pattern = this.deepDataPattern;\r\n\t\treturn str.match(pattern);\r\n\t}\r\n};", "import { DataUtils as utils } from './data-utils.js';\r\n\r\n/**\r\n * PropertyHelper\r\n *\r\n * This will help get, set, and delete properties from a data object.\r\n *\r\n * @class\r\n */\r\nexport class PropertyHelper\r\n{\r\n\t/**\r\n\t * This will set the attribute value.\r\n\t *\r\n\t * @static\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @returns {void}\r\n\t */\r\n\tstatic set(obj, attr, val)\r\n\t{\r\n\t\t/* this will check if we need to update\r\n\t\tdeep nested data */\r\n\t\tif (!utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\tobj[attr] = val;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet prop,\r\n\t\tprops = utils.getSegments(attr),\r\n\t\tlength = props.length,\r\n\t\tend = length - 1;\r\n\r\n\t\tfor (var i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\tprop = props[i];\r\n\r\n\t\t\t/* this will add the value to the last prop */\r\n\t\t\tif (i === end)\r\n\t\t\t{\r\n\t\t\t\tobj[prop] = val;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tif (obj[prop] === undefined)\r\n\t\t\t{\r\n\t\t\t\t/* this will check to setup a new object\r\n\t\t\t\tor an array if the prop is a number */\r\n\t\t\t\tobj[prop] = isNaN(prop)? {} : [];\r\n\t\t\t}\r\n\t\t\tobj = obj[prop];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete an attribute.\r\n\t *\r\n\t * @static\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @returns {void}\r\n\t */\r\n\tstatic delete(obj, attr)\r\n\t{\r\n\t\tif (!utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\tdelete obj[attr];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst props = utils.getSegments(attr),\r\n\t\tlength = props.length,\r\n\t\tend = length - 1;\r\n\r\n\t\tfor (var i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\tvar prop = props[i];\r\n\t\t\tvar propValue = obj[prop];\r\n\t\t\tif (propValue === undefined)\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tif (i === end)\r\n\t\t\t{\r\n\t\t\t\tif (Array.isArray(obj))\r\n\t\t\t\t{\r\n\t\t\t\t\tobj.splice(Number(prop), 1);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdelete obj[prop];\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tobj = propValue;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value of an attribute.\r\n\t *\r\n\t * @static\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @returns {*}\r\n\t */\r\n\tstatic get(obj, attr)\r\n\t{\r\n\t\tif (!utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\treturn obj[attr] ?? undefined;\r\n\t\t}\r\n\r\n\t\tconst props = utils.getSegments(attr),\r\n\t\tlength = props.length,\r\n\t\tend = length - 1;\r\n\r\n\t\tfor (var i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\tvar prop = props[i];\r\n\t\t\tvar propValue = obj[prop] ?? undefined;\r\n\t\t\tif (propValue === undefined)\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tobj = propValue;\r\n\r\n\t\t\tif (i === end)\r\n\t\t\t{\r\n\t\t\t\treturn obj;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t}\r\n}", "import { DataUtils as utils } from './data-utils.js';\r\n\r\n/**\r\n * Publisher\r\n *\r\n * This will contain methods for publishing data.\r\n *\r\n * @class\r\n */\r\nexport class Publisher\r\n{\r\n\t/**\r\n\t * This will publish deep data.\r\n\t *\r\n * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n * @param {function} callBack\r\n\t * @returns {void}\r\n\t */\r\n\tstatic publishDeep(obj, attr, val, callBack)\r\n\t{\r\n\t\tif (!utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\tthis.publish(attr, val, callBack);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet prop,\r\n\t\tprops = utils.getSegments(attr),\r\n\t\tlength = props.length,\r\n\t\tend = length - 1;\r\n\r\n\t\t/* the path is a string equivalent of the javascript dot notation path\r\n\t\tof the object being published. */\r\n\t\tlet path = '';\r\n\t\tfor (var i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\tprop = props[i];\r\n\r\n\t\t\t/* we need to setup the object to go to the next level\r\n\t\t\tof the data object before calling the next property. */\r\n\t\t\tobj = obj[prop];\r\n\r\n\t\t\tif (i > 0)\r\n\t\t\t{\r\n\t\t\t\t/* this will add the property to the path based on if its an\r\n\t\t\t\tobject property or an array. */\r\n\t\t\t\tif (isNaN(prop))\r\n\t\t\t\t{\r\n\t\t\t\t\tpath += '.' + prop;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tpath = prop;\r\n\t\t\t}\r\n\r\n\t\t\tvar publish;\r\n\t\t\tif (i === end)\r\n\t\t\t{\r\n\t\t\t\t/* if the loop is on the last pass it only needs to publish\r\n\t\t\t\tthe val. */\r\n\t\t\t\tpublish = val;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t/* we only want to publish the modified branches. we need to\r\n\t\t\t\tget the next property in the props array and create a publish\r\n\t\t\t\tobject or array with the next property value. */\r\n\t\t\t\tvar nextProp = props[i + 1];\r\n\t\t\t\tif (isNaN(nextProp) === false)\r\n\t\t\t\t{\r\n\t\t\t\t\tpath += '[' + nextProp + ']';\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar nextAttr = {};\r\n\t\t\t\tnextAttr[nextProp] = obj[nextProp];\r\n\t\t\t\tpublish = nextAttr;\r\n\t\t\t}\r\n\r\n\t\t\tthis.publish(path, publish, callBack);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish an update to the data binder.\r\n\t *\r\n\t * @param {string} pathString\r\n\t * @param {*} obj\r\n * @param {function} callBack\r\n\t * @returns {void}\r\n\t */\r\n\tstatic publish(pathString, obj, callBack)\r\n\t{\r\n /**\r\n * This will publish the data path to get the\r\n * root attr before publishing deeper.\r\n */\r\n\t\tpathString = pathString || \"\";\r\n\t\tcallBack(pathString, obj);\r\n\r\n\t\tif (!obj || typeof obj !== 'object')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (Array.isArray(obj))\r\n\t\t{\r\n\t\t\tthis.publishArray(pathString, obj, callBack);\r\n return;\r\n\t\t}\r\n\r\n this.publishObject(pathString, obj, callBack);\r\n\t}\r\n\r\n /**\r\n * This will publish an array to the data binder.\r\n *\r\n * @protected\r\n * @param {string} pathString\r\n * @param {array} obj\r\n * @param {function} callBack\r\n * @returns {void}\r\n */\r\n static publishArray(pathString, obj, callBack)\r\n {\r\n let subPath, value;\r\n const length = obj.length;\r\n for (var i = 0; i < length; i++)\r\n {\r\n value = obj[i];\r\n subPath = pathString + '[' + i + ']';\r\n this._checkPublish(subPath, value, callBack);\r\n }\r\n }\r\n\r\n /**\r\n * This will publish an object to the data binder.\r\n *\r\n * @protected\r\n * @param {string} pathString\r\n * @param {object} obj\r\n * @param {function} callBack\r\n * @returns {void}\r\n */\r\n static publishObject(pathString, obj, callBack)\r\n {\r\n let subPath, value;\r\n for (var prop in obj)\r\n {\r\n if (!Object.prototype.hasOwnProperty.call(obj, prop))\r\n {\r\n continue;\r\n }\r\n\r\n value = obj[prop];\r\n subPath = pathString + '.' + prop;\r\n this._checkPublish(subPath, value, callBack);\r\n }\r\n }\r\n\r\n\t/**\r\n\t * This will check if the value is an object and publish\r\n\t * the value or the object.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} subPath\r\n\t * @param {*} val\r\n * @param {function} callBack\r\n\t * @returns {void}\r\n\t */\r\n\tstatic _checkPublish(subPath, val, callBack)\r\n\t{\r\n\t\tif (!val || typeof val !== 'object')\r\n\t\t{\r\n\t\t\tcallBack(subPath, val);\r\n return;\r\n\t\t}\r\n\r\n this.publish(subPath, val, callBack);\r\n\t}\r\n}", "import { Objects } from '../../../../shared/objects.js';\r\nimport { dataBinder } from '../../../data-binder/data-binder.js';\r\nimport { BasicData, EVENT } from '../basic-data.js';\r\nimport { PropertyHelper } from './property-helper.js';\r\nimport { Publisher } from './publisher.js';\r\n\r\n/**\r\n * Data\r\n *\r\n * This will create a new data object that can be used to\r\n * bind elements to values.\r\n *\r\n * @class\r\n * @augments BasicData\r\n */\r\nexport class Data extends BasicData\r\n{\r\n\t/**\r\n\t * This will setup the stage and attributes object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.attributes = {};\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the attribute value.\r\n\t *\r\n\t * @override\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {object} committer\r\n\t * @param {boolean} stopMerge\r\n\t * @returns {void}\r\n\t */\r\n\t_setAttr(attr, val, committer, stopMerge)\r\n\t{\r\n\t\tif (typeof val !== 'object' && val === this.get(attr))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* this will check to update the model based on who\r\n\t\tupdated it. if the data binder updated the data only\r\n\t\tthe stage data is updated */\r\n\t\tif (!committer && stopMerge !== true)\r\n\t\t{\r\n\t\t\t/* this will update the attribute data because\r\n\t\t\tit was updated outside the data binder */\r\n\t\t\tPropertyHelper.set(this.attributes, attr, val);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif (this.dirty === false)\r\n\t\t\t{\r\n\t\t\t\tthis.dirty = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tPropertyHelper.set(this.stage, attr, val);\r\n\r\n\t\t/* this will publish the data to the data binder\r\n\t\tto update any ui elements that are subscribed */\r\n\t\tcommitter = committer || this;\r\n\t\tthis._publish(attr, val, committer, EVENT.CHANGE);\r\n\t}\r\n\r\n\t/**\r\n\t * This will link a data attr object to another data object.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string} attr\r\n\t * @returns {void}\r\n\t */\r\n\tlinkAttr(data, attr)\r\n\t{\r\n\t\tconst value = data.get(attr);\r\n\t\tif (!value)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (var prop in value)\r\n\t\t{\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(value, prop))\r\n\t\t\t{\r\n\t\t\t\tthis.link(data, attr + '.' + prop, prop);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a new data source by scoping the parent\r\n\t * data attr and linking the two sources.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {object} [constructor]\r\n\t * @returns {object}\r\n\t */\r\n\tscope(attr, constructor)\r\n\t{\r\n\t\tconst value = this.get(attr);\r\n\t\tif (!value)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconstructor = constructor || this.constructor;\r\n\t\tconst data = new constructor(value);\r\n\r\n\t\t/* this will link the new data to the parent attr */\r\n\t\tdata.linkAttr(this, attr);\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/**\r\n\t * This will splice a value from an array and set\r\n\t * the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {number} index\r\n\t * @returns {object} this\r\n\t */\r\n\tsplice(attr, index)\r\n\t{\r\n\t\tthis.delete(attr + '[' + index + ']');\r\n\t\tthis.refresh(attr);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a value to an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {*} value\r\n\t * @returns {object} this\r\n\t */\r\n\tpush(attr, value)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif (Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\tcurrentValue = [];\r\n\t\t}\r\n\r\n\t\tcurrentValue.push(value);\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will concatenate values to an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {array} values\r\n\t * @returns {object} this\r\n\t */\r\n\tconcat(attr, values)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif (Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\tcurrentValue = [];\r\n\t\t}\r\n\r\n\t\tcurrentValue = currentValue.concat(values);\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a value to an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {*} value\r\n\t * @returns {object} this\r\n\t */\r\n\tunshift(attr, value)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif (Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\tcurrentValue = [];\r\n\t\t}\r\n\r\n\t\tcurrentValue.unshift(value);\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a value to an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @returns {*}\r\n\t */\r\n\tshift(attr)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif (Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst value = currentValue.shift();\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the index of the value in the array.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {*} key\r\n\t * @param {*} value\r\n\t * @returns {number}\r\n\t */\r\n\tgetIndex(attr, key, value)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif (Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\treturn -1;\r\n\t\t}\r\n\r\n\t\tconst firstItem = currentValue[0];\r\n\t\tif (typeof firstItem !== 'object')\r\n\t\t{\r\n\t\t\treturn currentValue.indexOf(key);\r\n\t\t}\r\n\r\n\t\treturn currentValue.findIndex((item) => item[key] === value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will pop the last value from an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @returns {*}\r\n\t */\r\n\tpop(attr)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif (Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst value = currentValue.pop();\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will refresh the value.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @returns {object} this\r\n\t */\r\n\trefresh(attr)\r\n\t{\r\n\t\tthis.set(attr, this.get(attr));\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish an update to the data binder.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {*} committer\r\n\t * @param {string} event\r\n\t * @returns {void}\r\n\t */\r\n\t_publish(attr, val, committer, event)\r\n\t{\r\n\t\tconst callBack = (path, obj) => this._publishAttr(path, obj, committer, event);\r\n\t\tPublisher.publish(attr, val, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish an update on an attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} subPath\r\n\t * @param {*} val\r\n\t * @param {object} committer\r\n\t * @param {string} event\r\n\t * @returns {void}\r\n\t */\r\n\t_publishAttr(subPath, val, committer, event)\r\n\t{\r\n\t\t/**\r\n\t\t * This will publish the data to the data binder\r\n\t\t * to update any subscribers.\r\n\t\t */\r\n\t\tconst path = this._dataId + subPath;\r\n\t\tdataBinder.publish(path, val, committer);\r\n\r\n\t\t/**\r\n\t\t * This will publish to the local subscribers.\r\n\t\t */\r\n\t\tthis.publishLocalEvent(subPath, val, committer, event);\r\n\t}\r\n\r\n\t/**\r\n\t * This will merge the attribute with the stage.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tmergeStage()\r\n\t{\r\n\t\t/* this will clone the stage object to the\r\n\t\tattribute object */\r\n\t\tthis.attributes = Objects.clone(this.stage);\r\n\t\tthis.dirty = false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the model data.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tgetModelData()\r\n\t{\r\n\t\tthis.mergeStage();\r\n\t\treturn this.attributes;\r\n\t}\r\n\r\n\t/**\r\n\t * This will revert the stage back to the previous attributes.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\trevert()\r\n\t{\r\n\t\t/* this will reset the stage to the previous\r\n\t\tattributes */\r\n\t\tthis.set(this.attributes);\r\n\t\tthis.dirty = false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete an attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {object|string} obj\r\n\t * @param {string} attr\r\n\t * @param {object} committer\r\n\t * @returns {void}\r\n\t */\r\n\t_deleteAttr(obj, attr, committer = this)\r\n\t{\r\n\t\tPropertyHelper.delete(obj, attr);\r\n\r\n\t\t/**\r\n\t\t * This will only publish the delete event to the\r\n\t\t * local subscribers.\r\n\t\t */\r\n\t\tconst callBack = (path, obj) => this.publishLocalEvent(path, obj, committer, EVENT.DELETE);\r\n\t\tPublisher.publish(attr, attr, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value of an attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @returns {*}\r\n\t */\r\n\t_getAttr(obj, attr)\r\n\t{\r\n\t\treturn PropertyHelper.get(obj, attr);\r\n\t}\r\n}", "/**\r\n * This will store the replacements.\r\n *\r\n * @type {object} replacements\r\n */\r\nconst replacements = { '\\n': '\\\\n', '\\r': '\\\\n', '\\t': '\\\\t' };\r\n\r\n/**\r\n * This will escape chars.\r\n *\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst escapeChars = (str, removeNewLines) =>\r\n{\r\n\tif (typeof str !== 'string')\r\n\t{\r\n\t\tstr = String(str);\r\n\t}\r\n\r\n\tconst pattern = removeNewLines ? /[\\n\\r\\t]/g : /\\t/g;\r\n\treturn str.replace(pattern, match => replacements[match]);\r\n};\r\n\r\n/**\r\n * This will sanitize the text.\r\n *\r\n * @param {string} text\r\n * @param {boolean} [removeNewLines]\r\n * @returns {string}\r\n */\r\nconst sanitize = (text, removeNewLines) =>\r\n{\r\n\tif (typeof text !== 'string')\r\n\t{\r\n\t\treturn text;\r\n\t}\r\n\r\n\t/* we need to escape chars and encode the uri\r\n\tcomponents */\r\n\ttext = escapeChars(text, removeNewLines);\r\n\ttext = encodeURIComponent(text);\r\n\r\n\t/* we want to re-encode the double quotes so they\r\n\twill be escaped by the json encoder */\r\n\tconst pattern = /%22/g;\r\n\treturn text.replace(pattern, '\"');\r\n};\r\n\r\n/**\r\n * This will prepare the url.\r\n *\r\n * @param {*} data\r\n * @param {boolean} [removeNewLines]\r\n * @returns {string}\r\n */\r\nexport const prepareUrl = (data, removeNewLines) =>\r\n{\r\n\tconst type = typeof data;\r\n\tif (type === \"undefined\")\r\n\t{\r\n\t\treturn data;\r\n\t}\r\n\r\n\tif (type !== 'object')\r\n\t{\r\n\t\tdata = sanitize(data);\r\n\t\treturn data;\r\n\t}\r\n\r\n\tObject.entries(data).forEach(([prop, value]) =>\r\n\t{\r\n\t\tif (value === null)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdata[prop] = (typeof value === 'string') ? prepareUrl(value, removeNewLines) : sanitize(value, removeNewLines);\r\n\t});\r\n\treturn data;\r\n};\r\n\r\n/**\r\n * This will parse JSON data.\r\n *\r\n * @param {string} data\r\n * @returns {*}\r\n */\r\nexport function decode(data)\r\n{\r\n\treturn (typeof data !== \"undefined\" && data.length > 0)? JSON.parse(data) : false;\r\n}\r\n\r\n/**\r\n * This will encode JSON data.\r\n *\r\n * @param {*} data\r\n * @returns {?string}\r\n */\r\nexport function encode(data)\r\n{\r\n\treturn (typeof data !== \"undefined\")? JSON.stringify(data) : null;\r\n}", "import { Objects } from \"../objects.js\";\r\nimport { decode, encode, prepareUrl } from \"./json.js\";\r\n\r\n/**\r\n * Encode\r\n *\r\n * This will contain methods for working with encoding.\r\n *\r\n * @module\r\n * @name Encode\r\n */\r\nexport class Encode\r\n{\r\n /**\r\n\t * This will prepare a json object to be used in an\r\n\t * xhr request. This will sanitize the object values\r\n\t * by encoding them to not break the param string.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {boolean} [removeNewLines]\r\n\t * @returns {string}\r\n\t */\r\n\tstatic prepareJsonUrl(obj, removeNewLines = false)\r\n\t{\r\n\t\t/* we want to check to clone object so we won't modify the\r\n\t\toriginal object */\r\n\t\tconst before = (typeof obj === 'object')? Objects.clone(obj) : obj,\r\n\t\tafter = prepareUrl(before, removeNewLines);\r\n\t\treturn encode(after);\r\n\t}\r\n\r\n\t/**\r\n\t * This will encode and decode json data.\r\n\t *\r\n\t * @member {object} json\r\n\t */\r\n\tstatic json = {\r\n\t\tencode,\r\n\t\tdecode,\r\n\t};\r\n\r\n\t/**\r\n\t * This will parse xml data.\r\n\t *\r\n\t * @param {string} data\r\n\t * @returns {object}\r\n\t */\r\n\tstatic xmlParse(data)\r\n\t{\r\n\t\tif (typeof data === \"undefined\")\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst parser = new DOMParser();\r\n\t\treturn parser.parseFromString(data, \"text/xml\");\r\n\t}\r\n}", "import { Encode } from '../../../../shared/encode/encode.js';\r\nimport { Strings } from '../../../../shared/strings.js';\r\nimport { Ajax } from '../../../ajax/ajax.js';\r\nimport { WatcherHelper } from '../../../layout/watcher-helper.js';\r\n\r\n/**\r\n * ModelService\r\n *\r\n * This will create a new model service.\r\n *\r\n * @class\r\n */\r\nexport class ModelService\r\n{\r\n\t/**\r\n\t * This will create a model service.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} model\r\n\t */\r\n\tconstructor(model)\r\n\t{\r\n\t\t/**\r\n\t\t * @member {Model} model\r\n\t\t */\r\n\t\tthis.model = model;\r\n\r\n\t\t/**\r\n\t\t * @member {string} objectType The return type.\r\n\t\t */\r\n\t\tthis.objectType = this.objectType || 'item';\r\n\r\n\t\t/**\r\n\t\t * @member {string} url\r\n\t\t */\r\n\t\tthis.url = '';\r\n\r\n\t\t/**\r\n\t\t * @member {function} validateCallBack\r\n\t\t */\r\n\t\tthis.validateCallBack = null;\r\n\t\tthis.init();\r\n\t}\r\n\r\n\t/**\r\n\t * This will initialize the model service.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tinit()\r\n\t{\r\n\t\tconst model = this.model;\r\n\t\tif (model && model.url)\r\n\t\t{\r\n\t\t\tthis.url = model.url;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the model is valid.\r\n\t *\r\n\t * @returns {boolean}\r\n\t */\r\n\tisValid()\r\n\t{\r\n\t\tconst result = this.validate();\r\n\t\tif (result !== false)\r\n\t\t{\r\n\t\t\tconst callBack = this.validateCallBack;\r\n\t\t\tif (typeof callBack === 'function')\r\n\t\t\t{\r\n\t\t\t\tcallBack(result);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\r\n\t/**\r\n\t * This should be overriden to validate the model\r\n\t * before submitting.\r\n\t *\r\n\t * @returns {boolean}\r\n\t */\r\n\tvalidate()\r\n\t{\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * This can be overriden to add default params\r\n\t * with each request.\r\n\t *\r\n\t * @protected\r\n\t * @returns {string}\r\n\t */\r\n\tgetDefaultParams()\r\n\t{\r\n\t\treturn '';\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the request params.\r\n\t *\r\n\t * @protected\r\n\t * @param {(string|object)} params\r\n\t * @returns {(string|object)}\r\n\t */\r\n\tsetupParams(params)\r\n\t{\r\n\t\tconst defaults = this.getDefaultParams();\r\n\t\tparams = this.addParams(params, defaults);\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will convert an object to a string.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} object\r\n\t * @returns {string}\r\n\t */\r\n\tobjectToString(object)\r\n\t{\r\n\t\tconst params = [];\r\n\t\tfor (var prop in object)\r\n\t\t{\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(object, prop))\r\n\t\t\t{\r\n\t\t\t\tparams.push(prop + '=' + object[prop]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn params.join('&');\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the params.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} params\r\n\t * @param {*} addingParams\r\n\t * @returns {string|object}\r\n\t */\r\n\taddParams(params, addingParams)\r\n\t{\r\n\t\tparams = params || {};\r\n\t\tif (typeof params === 'string')\r\n\t\t{\r\n\t\t\tparams = Strings.parseQueryString(params, false);\r\n\t\t}\r\n\r\n\t\tif (!addingParams)\r\n\t\t{\r\n\t\t\treturn (!this._isFormData(params))? this.objectToString(params) : params;\r\n\t\t}\r\n\r\n\t\tif (typeof addingParams === 'string')\r\n\t\t{\r\n\t\t\taddingParams = Strings.parseQueryString(addingParams, false);\r\n\t\t}\r\n\r\n\t\tif (this._isFormData(params))\r\n\t\t{\r\n\t\t\tfor (var key in addingParams)\r\n\t\t\t{\r\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(addingParams, key))\r\n\t\t\t\t{\r\n\t\t\t\t\tparams.append(key, addingParams[key]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tparams = Object.assign(params, addingParams);\r\n\t\t\tparams = this.objectToString(params);\r\n\t\t}\r\n\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the model by id.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\tget(instanceParams, callBack)\r\n\t{\r\n\t\tconst id = this.model.get('id'),\r\n\t\tparams = 'id=' + id;\r\n\r\n\t\tconst model = this.model;\r\n\t\treturn this._get(`/${id}`, params, instanceParams, callBack, (response) =>\r\n\t\t{\r\n\t\t\tif (response)\r\n\t\t\t{\r\n\t\t\t\t/* this will update the model with the get request\r\n\t\t\t\tresponse */\r\n\t\t\t\tconst object = this.getObject(response);\r\n\t\t\t\tif (object)\r\n\t\t\t\t{\r\n\t\t\t\t\tmodel.set(object);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the object from the response.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} response\r\n\t * @returns {object}\r\n\t */\r\n\tgetObject(response)\r\n\t{\r\n\t\t/* this will update the model with the get request\r\n\t\tresponse */\r\n\t\tconst object = response[this.objectType] || response;\r\n\t\treturn object || false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will return a string with the model data json encoded.\r\n\t *\r\n\t * @protected\r\n\t * @returns {string}\r\n\t */\r\n\tsetupObjectData()\r\n\t{\r\n\t\tconst item = this.model.get();\r\n\t\treturn this.objectType + '=' + Encode.prepareJsonUrl(item);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add or update the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @returns {XMLHttpRequest|void}\r\n\t */\r\n\tsetup(instanceParams, callBack)\r\n\t{\r\n\t\tif (!this.isValid())\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet params = this.setupObjectData();\r\n\t\tconst id = this.model.id;\r\n\t\tconst url = (typeof id === 'undefined')? '' : `/${id}`;\r\n\r\n\t\treturn this._put(url, params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @returns {XMLHttpRequest|void}\r\n\t */\r\n\tadd(instanceParams, callBack)\r\n\t{\r\n\t\tif (!this.isValid())\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet params = this.setupObjectData();\r\n\t\tconst id = this.model.id;\r\n\t\tconst url = (typeof id === 'undefined')? '' : `/${id}`;\r\n\r\n\t\treturn this._post(url, params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @returns {XMLHttpRequest|void}\r\n\t */\r\n\tupdate(instanceParams, callBack)\r\n\t{\r\n\t\tif (!this.isValid())\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet params = this.setupObjectData();\r\n\t\tconst id = this.model.id;\r\n\t\tconst url = (typeof id === 'undefined')? '' : `/${id}`;\r\n\r\n\t\treturn this._patch(url, params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\tdelete(instanceParams, callBack)\r\n\t{\r\n\t\tconst id = this.model.get('id');\r\n\t\tconst params = (typeof id !== 'undefined')? 'id=' + id : this.setupObjectData();\r\n\t\tconst url = (typeof id === 'undefined')? '' : `/${id}`;\r\n\r\n\t\treturn this._delete(url, params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will list rows of the model.\r\n\t *\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {number} offset\r\n\t * @param {number} limit\r\n\t * @param {*} lastCursor\r\n\t * @param {*} since\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\tall(instanceParams, callBack, offset, limit, lastCursor = null, since = null)\r\n\t{\r\n\t\tconst data = this.model.get();\r\n\t\toffset = !isNaN(offset)? offset : 0;\r\n\t\tlimit = !isNaN(limit)? limit : 50;\r\n\t\tconst search = data.search || '';\r\n\r\n\t\tlet filter = data.filter || '';\r\n\t\tif (typeof filter === 'object')\r\n\t\t{\r\n\t\t\tfilter = JSON.stringify(filter);\r\n\t\t}\r\n\r\n\t\tlet dates = data.dates || '';\r\n\t\tif (typeof dates === 'object')\r\n\t\t{\r\n\t\t\tdates = JSON.stringify(dates);\r\n\t\t}\r\n\r\n\t\tlet orderBy = data.orderBy || '';\r\n\t\tif (typeof orderBy === 'object')\r\n\t\t{\r\n\t\t\torderBy = JSON.stringify(orderBy);\r\n\t\t}\r\n\r\n\t\tlet groupBy = data.groupBy || '';\r\n\t\tif (Array.isArray(groupBy))\r\n\t\t{\r\n\t\t\tgroupBy = JSON.stringify(groupBy);\r\n\t\t}\r\n\r\n\t\tlet params = '&filter=' + filter +\r\n\t\t\t'&offset=' + offset +\r\n\t\t\t'&limit=' + limit +\r\n\t\t\t'&dates=' + dates +\r\n\t\t\t'&orderBy=' + orderBy +\r\n\t\t\t'&groupBy=' + groupBy +\r\n\t\t\t'&search=' + search +\r\n\t\t\t'&lastCursor=' + ((typeof lastCursor !== 'undefined' && lastCursor !== null) ? lastCursor : '') +\r\n\t\t\t'&since=' + ((typeof since !== 'undefined' && since !== null) ? since : '');\r\n\r\n\t\treturn this._get('', params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the url.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @returns {string}\r\n\t */\r\n\tgetUrl(url)\r\n\t{\r\n\t\tlet baseUrl = this.url;\r\n\t\tif (!url)\r\n\t\t{\r\n\t\t\treturn this.replaceUrl(baseUrl);\r\n\t\t}\r\n\r\n\t\tif (url[0] === '/')\r\n\t\t{\r\n\t\t\turl = url.substring(1);\r\n\t\t}\r\n\r\n\t\tconst fullUrl = (url[0] === '?')\r\n\t\t? baseUrl + url\r\n\t\t: baseUrl + '/' + url;\r\n\r\n\t\treturn this.replaceUrl(fullUrl);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make an ajax request.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @param {string} method\r\n\t * @param {(string|object)} params\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\tsetupRequest(url, method, params, callBack, requestCallBack)\r\n\t{\r\n\t\tconst settings = {\r\n\t\t\turl: this.getUrl(url),\r\n\t\t\tmethod,\r\n\t\t\tparams,\r\n\t\t\tcompleted: (response, xhr) =>\r\n\t\t\t{\r\n\t\t\t\tif (typeof requestCallBack === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\trequestCallBack(response);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getResponse(response, callBack, xhr);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst overrideHeader = this._isFormData(params);\r\n\t\tif (overrideHeader)\r\n\t\t{\r\n\t\t\tsettings.headers = {};\r\n\t\t}\r\n\r\n\t\treturn Ajax(settings);\r\n\t}\r\n\r\n\t/**\r\n\t * Set up an EventSource for real-time activity updates with auto-reconnection.\r\n\t *\r\n\t * @param {string} url - The URL path relative to the model's base URL.\r\n\t * @param {string} params - The query parameters.\r\n\t * @param {function} callBack - The callback function for incoming updates.\r\n\t * @param {function|null} onOpenCallBack - Optional callback when connection opens.\r\n\t * @param {boolean} [reconnect=true] - Whether to auto-reconnect on disconnection.\r\n\t * @returns {object} Object with source and cleanup function\r\n\t */\r\n\tsetupEventSource(url, params, callBack, onOpenCallBack, reconnect = true)\r\n\t{\r\n\t\tlet source = null;\r\n\t\tlet reconnectTimer = null;\r\n\t\tlet intentionallyClosed = false;\r\n\r\n\t\t/**\r\n\t\t * Connects to the EventSource and sets up event handlers.\r\n\t\t *\r\n\t\t * @returns {void}\r\n\t\t */\r\n\t\tconst connect = () =>\r\n\t\t{\r\n\t\t\tif (intentionallyClosed)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst fullUrl = this.getUrl(url);\r\n\t\t\tconst queryString = params ? '?' + params : '';\r\n\t\t\tsource = new EventSource(fullUrl + queryString, { withCredentials: true });\r\n\r\n\t\t\tsource.onopen = () =>\r\n\t\t\t{\r\n\t\t\t\tif (onOpenCallBack)\r\n\t\t\t\t{\r\n\t\t\t\t\tonOpenCallBack();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tsource.onerror = (error) =>\r\n\t\t\t{\r\n\t\t\t\tsource.close();\r\n\r\n\t\t\t\tif (!intentionallyClosed && reconnect)\r\n\t\t\t\t{\r\n\t\t\t\t\tconst RECONNECT_DELAY = 3000; // 3 seconds\r\n\t\t\t\t\treconnectTimer = setTimeout(() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tconnect();\r\n\t\t\t\t\t}, RECONNECT_DELAY);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tsource.onmessage = (event) =>\r\n\t\t\t{\r\n\t\t\t\ttry\r\n\t\t\t\t{\r\n\t\t\t\t\tconst data = JSON.parse(event.data);\r\n\t\t\t\t\tif (callBack)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcallBack(data);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (error)\r\n\t\t\t\t{\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tconnect();\r\n\r\n\t\t// Return object with source getter and cleanup function\r\n\t\treturn {\r\n\t\t\tget source() { return source; },\r\n\t\t\tclose: () =>\r\n\t\t\t{\r\n\t\t\t\tintentionallyClosed = true;\r\n\t\t\t\tif (reconnectTimer && reconnect)\r\n\t\t\t\t{\r\n\t\t\t\t\tclearTimeout(reconnectTimer);\r\n\t\t\t\t}\r\n\t\t\t\tif (source)\r\n\t\t\t\t{\r\n\t\t\t\t\tsource.close();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will replace the url params with the model data.\r\n\t *\r\n\t * @param {string} url\r\n\t * @returns {string}\r\n\t */\r\n\treplaceUrl(url)\r\n\t{\r\n\t\tif (WatcherHelper.isWatching(url))\r\n\t\t{\r\n\t\t\turl = WatcherHelper.replaceParams(url, this.model);\r\n\t\t}\r\n\r\n\t\tif (url.endsWith('/'))\r\n\t\t{\r\n\t\t\turl = url.substring(0, url.length - 1);\r\n\t\t}\r\n\r\n\t\treturn url;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the data is a form data object.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} data\r\n\t * @returns {boolean}\r\n\t */\r\n\t_isFormData(data)\r\n\t{\r\n\t\treturn data instanceof FormData;\r\n\t}\r\n\r\n\t/**\r\n\t * This will make an ajax request.\r\n\t *\r\n\t * @protected\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\trequest(params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request('', 'POST', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a GET request.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\t_get(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\tparams = this.setupParams(params);\r\n\t\tparams = this.addParams(params, instanceParams);\r\n\r\n\t\turl = url || '';\r\n\r\n\t\tif (params)\r\n\t\t{\r\n\t\t\turl += '?' + params;\r\n\t\t}\r\n\r\n\t\treturn this.setupRequest(url, \"GET\", '', callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a POST request.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\t_post(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'POST', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a PUT request.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\t_put(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'PUT', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a PATCH request.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\t_patch(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'PATCH', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a DELETE request.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\t_delete(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'DELETE', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make an ajax request.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @param {string} method\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\t_request(url, method, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\tparams = this.setupParams(params);\r\n\t\tparams = this.addParams(params, instanceParams);\r\n\r\n\t\treturn this.setupRequest(url, method, params, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the response.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} response\r\n\t * @param {function} callBack\r\n\t * @param {object} xhr\r\n\t * @returns {void}\r\n\t */\r\n\tgetResponse(response, callBack, xhr)\r\n\t{\r\n\t\t/* this will check to return the response\r\n\t\tto the callBack function */\r\n\t\tif (typeof callBack === 'function')\r\n\t\t{\r\n\t\t\tcallBack(response, xhr);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will extend the model service.\r\n\t *\r\n\t * @param {object} child\r\n\t * @returns {object}\r\n\t */\r\n\tstatic extend(child)\r\n\t{\r\n\t\tif (!child)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst parent = this;\r\n\t\tclass service extends parent\r\n\t\t{\r\n\t\t\tconstructor(model)\r\n\t\t\t{\r\n\t\t\t\tsuper(model);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tObject.assign(service.prototype, child);\r\n\t\treturn service;\r\n\t}\r\n}", "import { Types } from '../../../../shared/types.js';\r\nimport { Data } from '../deep-data/deep-data.js';\r\nimport { setupAttrSettings } from './attrs.js';\r\nimport { ModelService } from './model-service.js';\r\n\r\n/**\r\n * Gets the default attributes from the given settings object.\r\n *\r\n * @function setupDefaultAttr\r\n * @param {object} settings - An object which may contain a `defaults` property.\r\n * @param {object} [settings.defaults] - A set of default attributes, where each property is a key-value pair for attributes.\r\n * @returns {object} A shallow copy of the `defaults` object if it exists, otherwise an empty object.\r\n */\r\nconst setupDefaultAttr = (settings) =>\r\n{\r\n\tconst attributes = {};\r\n\tif (!Types.isObject(settings) || !settings.defaults)\r\n\t{\r\n\t\treturn attributes;\r\n\t}\r\n\r\n\tconst { defaults } = settings;\r\n\tObject.keys(defaults).forEach(prop =>\r\n\t{\r\n\t\tconst attr = defaults[prop];\r\n\t\tif (typeof attr !== 'function')\r\n\t\t{\r\n\t\t\tattributes[prop] = attr;\r\n\t\t}\r\n\t});\r\n\r\n\tdelete settings.defaults;\r\n\treturn attributes;\r\n};\r\n\r\n/**\r\n * Extracts the `xhr` configuration from the given settings object.\r\n *\r\n * @function getXhr\r\n * @param {object} settings - The settings object that may contain `xhr` config.\r\n * @param {object} [settings.xhr] - An object containing properties to configure an XHR or remote request.\r\n * @returns {object} A shallow copy of `settings.xhr` if it exists, otherwise an empty object.\r\n */\r\nconst getXhr = (settings) =>\r\n{\r\n\tif (!settings || typeof settings.xhr !== 'object')\r\n\t{\r\n\t\treturn {};\r\n\t}\r\n\r\n\tconst xhr = { ...settings.xhr };\r\n\tdelete settings.xhr;\r\n\treturn xhr;\r\n};\r\n\r\n/**\r\n * Tracks the incremental number of model types created.\r\n *\r\n * @type {number}\r\n * @default 0\r\n */\r\nlet modelTypeNumber = 0;\r\n\r\n/**\r\n * The Model class extends Data to provide structure\r\n * for connecting to a remote service.\r\n *\r\n * @class Model\r\n * @extends Data\r\n */\r\nexport class Model extends Data\r\n{\r\n\t/**\r\n\t * Creates a new Model instance.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} [settings] - Optional configuration for the model.\r\n\t */\r\n\tconstructor(settings)\r\n\t{\r\n\t\tconst proxy = super(settings);\r\n\t\tthis.initialize();\r\n\r\n\t\t// @ts-ignore (returning the proxy for Data's built-in behavior)\r\n\t\treturn proxy;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets up initial properties for this model instance.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.attributes = {};\r\n\t\tthis.stage = {};\r\n\t\tthis.url = this.url || '';\r\n\t\tthis.xhr = this.xhr || {};\r\n\t}\r\n\r\n\t/**\r\n\t * Called after the model is constructed to allow\r\n\t * additional initialization logic.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tinitialize()\r\n\t{\r\n\t\t// ...\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a new subclass of the current Model and returns its constructor.\r\n\t *\r\n\t * @static\r\n\t * @param {object} [settings={}] - Configuration for the extended model.\r\n\t * @returns {typeof Model} The extended model class (subclass of Model).\r\n\t */\r\n\tstatic extend(settings = {})\r\n\t{\r\n\t\tconst parent = this;\r\n\t\tconst xhr = getXhr(settings);\r\n\t\tconst service = parent.prototype.service.extend(xhr);\r\n\t\tconst defaultAttributes = setupDefaultAttr(settings);\r\n\r\n\t\tclass ExtendedModel extends parent\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * Creates a new ExtendedModel instance.\r\n\t\t\t *\r\n\t\t\t * @constructor\r\n\t\t\t * @param {object} [instanceSettings] - Instance-specific attribute settings.\r\n\t\t\t */\r\n\t\t\tconstructor(instanceSettings)\r\n\t\t\t{\r\n\t\t\t\tconst instanceAttr = {\r\n\t\t\t\t\t...defaultAttributes,\r\n\t\t\t\t\t...setupAttrSettings(instanceSettings)\r\n\t\t\t\t};\r\n\t\t\t\tsuper(instanceAttr);\r\n\r\n\t\t\t\tthis.xhr = new service(this);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * A unique identifier for this model type.\r\n\t\t\t *\r\n\t\t\t * @type {string}\r\n\t\t\t */\r\n\t\t\tdataTypeId = `bm${modelTypeNumber++}`;\r\n\t\t}\r\n\r\n\t\tObject.assign(ExtendedModel.prototype, settings);\r\n\t\tExtendedModel.prototype.service = service;\r\n\r\n\t\treturn ExtendedModel;\r\n\t}\r\n}\r\n\r\nModel.prototype.service = ModelService;", "import { BasicData } from './basic-data.js';\r\n\r\n/**\r\n * SimpleData\r\n *\r\n * This will extend Data to add a simple data object\r\n * that doesn't allow deep nested data.\r\n *\r\n * @class\r\n * @augments BasicData\r\n */\r\nexport class SimpleData extends BasicData\r\n{\r\n\r\n}", "import { SimpleData } from '../data/data.js';\r\n\r\n /**\r\n * State\r\n *\r\n * This will create a state to track the state\r\n * of an object.\r\n *\r\n * @class\r\n * @augments SimpleData\r\n */\r\nexport class State extends SimpleData\r\n{\r\n\t/**\r\n\t * This will setup the state object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t * @override\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an action to the state.\r\n\t *\r\n\t * @param {string} action\r\n\t * @param {*} state\r\n\t * @returns {object} self\r\n\t */\r\n\taddAction(action, state)\r\n\t{\r\n\t\tif (typeof state !== 'undefined')\r\n\t\t{\r\n\t\t\tthis.set(action, state);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the state of an action.\r\n\t *\r\n\t * @param {string} action\r\n\t * @returns {*}\r\n\t */\r\n\tgetState(action)\r\n\t{\r\n\t\treturn this.get(action);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an action or a callBack\r\n\t * from an action. if no token is passed the\r\n\t * whole action is removed.\r\n\t *\r\n\t * @param {string} action\r\n\t * @param {string} [token]\r\n\t * @returns {object} self\r\n\t */\r\n\tremoveAction(action, token)\r\n\t{\r\n\t\t/* if we have a token then the token will be\r\n\t\tthe only item removed */\r\n\t\tif (token)\r\n\t\t{\r\n\t\t\tthis.off(action, token);\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst actions = this.stage;\r\n\t\tif (typeof actions[action] !== 'undefined')\r\n\t\t{\r\n\t\t\tdelete actions[action];\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n}", "import { State } from './state.js';\r\n\r\n /**\r\n * StateTarget\r\n *\r\n * This will create a state target to track the state\r\n * of an object.\r\n *\r\n * @class\r\n * @augments State\r\n */\r\nexport class StateTarget extends State\r\n{\r\n\t/**\r\n\t * This will create a state target.\r\n\t *\r\n\t * @constructor\r\n\t * @param {string} id\r\n\t */\r\n\tconstructor(id)\r\n\t{\r\n\t\tsuper();\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the state target object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t * @override\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.stage = {};\r\n\t\tthis.id = null;\r\n\t}\r\n}", "import { StateTarget } from './state-target.js';\r\n\r\n /**\r\n * StateTracker\r\n *\r\n * This will create a state tracker that can\r\n * add and remove targets, actions, and action\r\n * subscriber callBack functions.\r\n *\r\n * @class\r\n */\r\nexport class StateTracker\r\n{\r\n\t/**\r\n\t * @member {Map} targets\r\n\t * @private\r\n\t */\r\n\tstatic targets = new Map();\r\n\r\n\t/**\r\n\t * This will restore a state target.\r\n\t *\r\n\t * @param {string} id\r\n\t * @param {StateTarget} target\r\n\t * @returns {void}\r\n\t */\r\n\tstatic restore(id, target)\r\n\t{\r\n\t\tthis.targets.set(id, target);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the state target.\r\n\t *\r\n\t * @param {string} id\r\n\t * @returns {StateTarget}\r\n\t */\r\n\tstatic getTarget(id)\r\n\t{\r\n\t\tif (!this.targets.has(id))\r\n\t\t{\r\n this.targets.set(id, new StateTarget(id));\r\n }\r\n return this.targets.get(id);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the state of an action.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @returns {*}\r\n\t */\r\n\tstatic getActionState(targetId, action)\r\n\t{\r\n\t\tconst target = this.getTarget(targetId);\r\n\t\treturn target.get(action);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new target.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} [action]\r\n\t * @param {*} [state] the primary action state\r\n\t * @returns {StateTarget}\r\n\t */\r\n\tstatic add(targetId, action, state)\r\n\t{\r\n\t\tconst target = this.getTarget(targetId);\r\n\t\tif (action)\r\n\t\t{\r\n\t\t\ttarget.addAction(action, state);\r\n\t\t}\r\n\t\treturn target;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new action to a target.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {string} [state]\r\n\t * @returns {StateTarget}\r\n\t */\r\n\tstatic addAction(targetId, action, state)\r\n\t{\r\n\t\treturn this.add(targetId, action, state);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the action from a target.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {string} [token]\r\n\t * @returns {void}\r\n\t */\r\n\tstatic removeAction(targetId, action, token)\r\n\t{\r\n\t\tthis.off(targetId, action, token);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new subscriber to the action.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {function} callBack\r\n\t * @returns {?string}\r\n\t */\r\n\tstatic on(targetId, action, callBack)\r\n\t{\r\n\t\tconst target = this.getTarget(targetId);\r\n\t\tif (action)\r\n\t\t{\r\n\t\t\treturn target.on(action, callBack);\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a subscriber from an action.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {string} token\r\n\t * @returns {void}\r\n\t */\r\n\tstatic off(targetId, action, token)\r\n\t{\r\n\t\tthis.remove(targetId, action, token);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a target or action or callBack.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} [action]\r\n\t * @param {string} [token]\r\n\t * @returns {void}\r\n\t */\r\n\tstatic remove(targetId, action, token)\r\n\t{\r\n\t\tconst targets = this.targets,\r\n\t\ttarget = targets.get(targetId);\r\n\t\tif (!target)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (action)\r\n\t\t{\r\n\t\t\ttarget.off(action, token);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.targets.delete(targetId);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the action state.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {*} state\r\n\t * @returns {void}\r\n\t */\r\n\tstatic set(targetId, action, state)\r\n\t{\r\n\t\tconst target = this.getTarget(targetId);\r\n\t\ttarget.set(action, state);\r\n\t}\r\n}", "import { Events } from \"../../main/events/events.js\";\r\n\r\n/**\r\n * EventHelper\r\n *\r\n * This will create an event object to make\r\n * adding and removing events easier.\r\n *\r\n * @class\r\n */\r\nexport class EventHelper\r\n{\r\n\t/**\r\n\t * This will create an event helper.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {Array<object>} events\r\n\t\t */\r\n\t\tthis.events = [];\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an array of events.\r\n\t *\r\n\t * @param {Array<Array>} events\r\n\t * @returns {void}\r\n\t */\r\n\taddEvents(events)\r\n\t{\r\n\t\tconst length = events.length;\r\n\t\tif (length < 1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tevents.forEach((event) =>\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * @type {array} event\r\n\t\t\t */\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.on(...event);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an event.\r\n\t *\r\n\t * @param {string|Array<string>} event\r\n\t * @param {object} obj\r\n\t * @param {function} callBack\r\n\t * @param {boolean} capture\r\n\t * @returns {void}\r\n\t */\r\n\ton(event, obj, callBack, capture)\r\n\t{\r\n\t\tEvents.on(event, obj, callBack, capture);\r\n\r\n\t\tthis.events.push({\r\n\t\t\tevent,\r\n\t\t\tobj,\r\n\t\t\tcallBack,\r\n\t\t\tcapture\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an event.\r\n\t *\r\n\t * @param {string|Array<string>} event\r\n\t * @param {object} obj\r\n\t * @param {function} callBack\r\n\t * @param {boolean} capture\r\n\t * @returns {void}\r\n\t */\r\n\toff(event, obj, callBack, capture)\r\n\t{\r\n\t\tEvents.off(event, obj, callBack, capture);\r\n\r\n\t\tlet option,\r\n\t\tevents = this.events;\r\n\t\tfor (var i = 0, length = events.length; i < length; i++)\r\n\t\t{\r\n\t\t\toption = events[i];\r\n\t\t\tif (option.event === event && option.obj === obj)\r\n\t\t\t{\r\n\t\t\t\tevents.splice(i, 1);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will set all events.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tset()\r\n\t{\r\n\t\tthis.events.forEach((event) =>\r\n\t\t{\r\n\t\t\tEvents.on(event.event, event.obj, event.callBack, event.capture);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will unset all events.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tunset()\r\n\t{\r\n\t\tthis.events.forEach((event) =>\r\n\t\t{\r\n\t\t\tEvents.off(event.event, event.obj, event.callBack, event.capture);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset the events.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\treset()\r\n\t{\r\n\t\tthis.unset();\r\n\t\tthis.events = [];\r\n\t}\r\n}", "import { StateTracker } from '../state/state-tracker.js';\r\n\r\n/**\r\n * StateHelper\r\n *\r\n * This is a helper to manage component states.\r\n *\r\n * @class\r\n */\r\nexport class StateHelper\r\n{\r\n\t/**\r\n\t * This will create a state helper.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} state\r\n\t * @param {object} states\r\n\t */\r\n\tconstructor(state, states)\r\n\t{\r\n\t\t/**\r\n\t\t * @member {array} remoteStates\r\n\t\t */\r\n\t\tthis.remoteStates = [];\r\n\r\n\t\tconst actions = this.convertStates(states);\r\n\t\tthis.addStatesToTarget(state, actions);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add states to a state.\r\n\t *\r\n\t * @param {object} state\r\n\t * @param {object} states\r\n\t * @returns {void}\r\n\t */\r\n\taddStates(state, states)\r\n\t{\r\n\t\tconst actions = this.convertStates(states);\r\n\t\tthis.addStatesToTarget(state, actions);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a state object.\r\n\t *\r\n\t * @param {string} action\r\n\t * @param {*} state\r\n\t * @param {function} callBack\r\n\t * @param {string} [targetId]\r\n\t * @returns {object}\r\n\t */\r\n\tcreateState(action, state, callBack, targetId)\r\n\t{\r\n\t\treturn {\r\n\t\t\taction,\r\n\t\t\tstate,\r\n\t\t\tcallBack,\r\n\t\t\ttargetId,\r\n\t\t\ttoken: null\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will convert an action object to a state array.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} action\r\n\t * @returns {array}\r\n\t */\r\n\tconvertStates(action)\r\n\t{\r\n\t\tconst actions = [];\r\n\t\tfor (var prop in action)\r\n\t\t{\r\n\t\t\tif (!Object.prototype.hasOwnProperty.call(action, prop))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif (prop === 'remotes')\r\n\t\t\t{\r\n\t\t\t\tthis.setupRemoteStates(action[prop], actions);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar targetId = null,\r\n\t\t\tcallBack = null,\r\n\t\t\tstate = action[prop];\r\n\t\t\tif (state && typeof state === 'object')\r\n\t\t\t{\r\n\t\t\t\tcallBack = state.callBack;\r\n\t\t\t\ttargetId = state.id || state.targetId;\r\n\t\t\t\tstate = state.state;\r\n\t\t\t}\r\n\r\n\t\t\tactions.push(this.createState(\r\n\t\t\t\tprop,\r\n\t\t\t\tstate,\r\n\t\t\t\tcallBack,\r\n\t\t\t\ttargetId\r\n\t\t\t));\r\n\t\t}\r\n\t\treturn actions;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup remote states.\r\n\t *\r\n\t * @protected\r\n\t * @param {array} remotes\r\n\t * @param {array} actions\r\n\t * @returns {void}\r\n\t */\r\n\tsetupRemoteStates(remotes, actions)\r\n\t{\r\n\t\tlet remote;\r\n\t\tfor (var i = 0, length = remotes.length; i < length; i++)\r\n\t\t{\r\n\t\t\tremote = remotes[i];\r\n\t\t\tif (!remote)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tfor (var prop in remote)\r\n\t\t\t{\r\n\t\t\t\tif (!Object.prototype.hasOwnProperty.call(remote, prop) || prop === 'id')\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar callBack = null,\r\n\t\t\t\tvalue = remote[prop],\r\n\t\t\t\tstate = (value !== null)? value : undefined;\r\n\t\t\t\tif (state && typeof state === 'object')\r\n\t\t\t\t{\r\n\t\t\t\t\tcallBack = state.callBack;\r\n\t\t\t\t\tstate = state.state;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tactions.push(this.createState(\r\n\t\t\t\t\tprop,\r\n\t\t\t\t\tstate,\r\n\t\t\t\t\tcallBack,\r\n\t\t\t\t\tremote.id\r\n\t\t\t\t));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove remote states.\r\n\t *\r\n\t * @param {object} state\r\n\t * @returns {void}\r\n\t */\r\n\tremoveRemoteStates(state)\r\n\t{\r\n\t\tconst remoteStates = this.remoteStates;\r\n\t\tif (remoteStates)\r\n\t\t{\r\n\t\t\tthis.removeActions(state, remoteStates);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the actions.\r\n\t *\r\n\t * @param {object} state\r\n\t * @param {array} actions\r\n\t * @returns {void}\r\n\t */\r\n\tremoveActions(state, actions)\r\n\t{\r\n\t\tif (actions.length < 1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (var i = 0, length = actions.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar action = actions[i];\r\n\t\t\tif (action.token)\r\n\t\t\t{\r\n\t\t\t\tthis.unbindRemoteState(state, action.token);\r\n\t\t\t}\r\n\t\t\tStateTracker.remove(action.targetId, action.action, action.token);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will restore a state.\r\n\t *\r\n\t * @param {object} state\r\n\t * @returns {void}\r\n\t */\r\n\trestore(state)\r\n\t{\r\n\t\tStateTracker.restore(state.id, state);\r\n\r\n\t\tconst remotes = this.remoteStates;\r\n\t\tif (!remotes)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (var i = 0, length = remotes.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar action = remotes[i];\r\n\t\t\taction.token = this.bindRemoteState(state, action.action, action.targetId);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a two way bind to a remote state.\r\n\t *\r\n\t * @param {object} target\r\n\t * @param {string} actionEvent\r\n\t * @param {string} remoteTargetId\r\n\t * @returns {string}\r\n\t */\r\n\tbindRemoteState(target, actionEvent, remoteTargetId)\r\n\t{\r\n\t\tconst remoteTarget = StateTracker.getTarget(remoteTargetId);\r\n\t\treturn target.link(remoteTarget, actionEvent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will unbind a remote state.\r\n\t *\r\n\t * @param {object} target\r\n\t * @param {string} token\r\n\t * @return {void}\r\n\t */\r\n\tunbindRemoteState(target, token)\r\n\t{\r\n\t\ttarget.unlink(token);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the states to the target.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} state\r\n\t * @param {array} actions\r\n\t * @returns {void}\r\n\t */\r\n\taddStatesToTarget(state, actions)\r\n\t{\r\n\t\tconst remotes = this.remoteStates;\r\n\r\n\t\tfor (var i = 0, length = actions.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar action = actions[i],\r\n\t\t\ttoken = this.addAction(state, action);\r\n\r\n\t\t\tif (action.targetId)\r\n\t\t\t{\r\n\t\t\t\taction.token = token;\r\n\t\t\t\tremotes.push(action);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (remotes.length < 1)\r\n\t\t{\r\n\t\t\tthis.remoteStates = [];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an action.\r\n\t *\r\n\t * @param {object} target\r\n\t * @param {object} action\r\n\t * @returns {string}\r\n\t */\r\n\taddAction(target, action)\r\n\t{\r\n\t\tlet token,\r\n\t\tactionEvent = action.action;\r\n\r\n\t\t/* this will check to select the remote target if set */\r\n\t\tconst targetId = action.targetId;\r\n\t\tif (targetId)\r\n\t\t{\r\n\t\t\ttoken = this.bindRemoteState(target, actionEvent, targetId);\r\n\t\t}\r\n\r\n\t\tif (typeof action.state !== 'undefined')\r\n\t\t{\r\n\t\t\ttarget.addAction(actionEvent, action.state);\r\n\t\t}\r\n\r\n\t\tconst callBack = action.callBack;\r\n\t\tif (typeof callBack === 'function')\r\n\t\t{\r\n\t\t\ttarget.on(actionEvent, callBack);\r\n\t\t}\r\n\r\n\t\treturn token;\r\n\t}\r\n}", "import { ArrayProp, DefaultProps, ObjectProp, StringProp } from \"./prop-utils.js\";\r\n\r\n/**\r\n * This will parse the arguments passed to the atom.\r\n *\r\n * @param {array} args\r\n * @returns {object}\r\n */\r\nexport const parseArgs = (args) =>\r\n{\r\n\tif (!args)\r\n\t{\r\n\t\treturn DefaultProps();\r\n\t}\r\n\r\n\t/**\r\n\t * This will handle string children and allow them\r\n\t * to have watcher props.\r\n\t */\r\n\tconst first = args[0];\r\n\tconst firstType = typeof first;\r\n\tif (firstType === 'string' || firstType === 'number')\r\n\t{\r\n\t\treturn StringProp(first);\r\n\t}\r\n\r\n\t/**\r\n\t * This will handle the child array.\r\n\t */\r\n\tif (Array.isArray(first))\r\n\t{\r\n\t\treturn ArrayProp(first);\r\n\t}\r\n\r\n\t/**\r\n\t * This will handle default props and children.\r\n\t */\r\n\treturn ObjectProp(args);\r\n};", "import { DataTracker } from '../../main/data-tracker/data-tracker.js';\r\nimport { Html } from '../html/html.js';\r\nimport { parseArgs } from './parse-args.js';\r\n\r\n/**\r\n * This will register the component system to the data\r\n * tracker to remove components that have been nested\r\n * in layouts.\r\n */\r\nDataTracker.addType('components', (data) =>\r\n{\r\n\tif (!data)\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst component = data.component;\r\n\tif (!component || !component.isUnit)\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (component.persistToken && component.parent)\r\n\t{\r\n\t\tcomponent.parent.removePersistedChild(component.persistToken);\r\n\t}\r\n\r\n\tif (component.rendered === true)\r\n\t{\r\n\t\tcomponent.prepareDestroy();\r\n\t\tcomponent.cleanUpAfterDestroy();\r\n\t}\r\n});\r\n\r\n/**\r\n * @type {number} unitNumber\r\n */\r\nlet unitNumber = 0;\r\n\r\n/**\r\n * Unit\r\n *\r\n * @class\r\n *\r\n * This will allow units to be extended\r\n * from a single factory.\r\n *\r\n * @param {...any} args\r\n *\r\n * @example\r\n * class Alert extends Unit\r\n *\t{\r\n *\t\trender()\r\n *\t\t{\r\n *\t\t\treturn {\r\n *\r\n *\t\t\t};\r\n *\t\t}\r\n *\t}\r\n */\r\nexport class Unit\r\n{\r\n\t/**\r\n\t * This will create a unit.\r\n\t *\r\n\t * @constructor\r\n\t * @param {...any} args\r\n\t */\r\n\tconstructor(...args)\r\n\t{\r\n\t\t/**\r\n\t\t * @member {boolean} isUnit\r\n\t\t */\r\n\t\tthis.isUnit = true;\r\n\r\n\t\t/**\r\n\t\t * @member {Data|null} data\r\n\t\t */\r\n\t\tthis.data = null;\r\n\r\n\t\t/**\r\n\t\t * @member {boolean|null} persist\r\n\t\t */\r\n\t\tthis.persist = null;\r\n\r\n\t\t/**\r\n\t\t * @member {?array} nest\r\n\t\t */\r\n\t\tthis.nest = null;\r\n\r\n\t\t/**\r\n\t\t * @member {StateTarget|null} state\r\n\t\t */\r\n\t\tthis.state = null;\r\n\r\n\t\t/**\r\n\t\t * @member {?object} panel\r\n\t\t */\r\n\t\tthis.panel = null;\r\n\r\n\t\t/**\r\n\t\t * @member {?Unit} parent\r\n\t\t */\r\n\t\tthis.parent = null;\r\n\r\n\t\t/**\r\n\t\t * @member {?string} unitType\r\n\t\t */\r\n\t\tthis.unitType = null;\r\n\r\n\t\t/**\r\n\t\t * @member {array} cached\r\n\t\t */\r\n\t\tthis.cached = [];\r\n\r\n\t\tthis.init();\r\n\r\n\t\t/**\r\n\t\t * This will allow the unit to access optional args.\r\n\t\t */\r\n\t\tconst {props, children} = parseArgs(args);\r\n\t\tthis.setupProps(props);\r\n\r\n\t\t/**\r\n\t\t * @member {array} children\r\n\t\t */\r\n\t\tthis.children = children || [];\r\n\t\tthis.persistedChildren = {};\r\n\t\tthis.persistedCount = 0;\r\n\r\n\t\tthis.onCreated();\r\n\r\n\t\t/**\r\n\t\t * @member {boolean} rendered\r\n\t\t */\r\n\t\tthis.rendered = false;\r\n\r\n\t\t/**\r\n\t\t * @member {?object} container\r\n\t\t */\r\n\t\tthis.container = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the component number and unique\r\n\t * instance id for the component elements.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tinit()\r\n\t{\r\n\t\tthis.id = 'cp-' + (unitNumber++);\r\n\t\t// @ts-ignore\r\n\t\tthis.unitType = this.constructor.name.toLowerCase();\r\n\t}\r\n\r\n\t/**\r\n\t * This will declare the component props.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tdeclareProps()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a persisted child.\r\n\t *\r\n\t * @param {object} child\r\n\t * @returns {string}\r\n\t */\r\n\taddPersistedChild(child)\r\n\t{\r\n\t\tconst count = this.persistedCount++;\r\n\t\tlet token = ('pc' + count);\r\n\r\n\t\tconst keys = Object.keys(this.persistedChildren);\r\n\t\tconst key = keys[count];\r\n\r\n\t\t/**\r\n\t\t * Check to see if the child has a persisted state\r\n\t\t * and if so, resume the scope with the persisted state.\r\n\t\t */\r\n\t\tconst persistedChild = this.persistedChildren[key];\r\n\t\tif (persistedChild)\r\n\t\t{\r\n\t\t\tif (child.unitType === persistedChild.unitType)\r\n\t\t\t{\r\n\t\t\t\ttoken = key;\r\n\t\t\t\tchild.resumeScope(persistedChild);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tchild.persistToken = token;\r\n\r\n\t\t/**\r\n\t\t * This will add the child to the persisted children\r\n\t\t * so that it can be resumed later.\r\n\t\t */\r\n\t\tthis.persistedChildren[token] = child;\r\n\t\treturn token;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a persisted child by its token.\r\n\t *\r\n\t * @param {string} token\r\n\t * @returns {void}\r\n\t */\r\n\tremovePersistedChild(token)\r\n\t{\r\n\t\tif (!this.rendered)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!token || !this.persistedChildren[token])\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdelete this.persistedChildren[token];\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the component props.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} [props]\r\n\t * @returns {void}\r\n\t */\r\n\tsetupProps(props)\r\n\t{\r\n\t\tthis.declareProps();\r\n\t\tif (!props || typeof props !== 'object')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (var prop in props)\r\n\t\t{\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(props, prop))\r\n\t\t\t{\r\n\t\t\t\tthis[prop] = props[prop];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the child scope instance of the component.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tgetChildScope()\r\n\t{\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the parent context.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetParentContext()\r\n\t{\r\n\t\tif (!this.parent)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn this.parent.getContext();\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the context.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetupContext()\r\n\t{\r\n\t\tconst parentContext = this.getParentContext();\r\n\t\tconst context = this.setContext(parentContext);\r\n\t\tif (context)\r\n\t\t{\r\n\t\t\tthis.context = context;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.context = parentContext;\r\n\t\tthis.setupAddingContext();\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the adding context.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetupAddingContext()\r\n\t{\r\n\t\tconst parentContext = this.context;\r\n\t\tconst context = this.addContext(parentContext);\r\n\t\tif (!context)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst branchName = context[0];\r\n\t\tif (!branchName)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.addingContext = true;\r\n\t\tthis.contextBranchName = branchName;\r\n\t\tthis.addContextBranch(branchName, context[1]);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a branch to the context.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} branchName\r\n\t * @param {*} value\r\n\t * @returns {void}\r\n\t */\r\n\taddContextBranch(branchName, value)\r\n\t{\r\n\t\tthis.context ??= {};\r\n\t\tthis.context[branchName] = value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the component context.\r\n\t *\r\n\t * @param {object|null} context\r\n\t * @returns {object|null}\r\n\t */\r\n\tsetContext(context)\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add context to the parent context.\r\n\t *\r\n\t * @param {object|null} context\r\n\t * @returns {array|null}\r\n\t */\r\n\taddContext(context)\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the added context from the parent.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tremoveContext()\r\n\t{\r\n\t\tif (!this.addingContext)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.removeContextBranch(this.contextBranchName);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a context branch.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} branch\r\n\t * @returns {void}\r\n\t */\r\n\tremoveContextBranch(branch)\r\n\t{\r\n\t\tif (!branch)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdelete this.context[branch];\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the context.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetContext()\r\n\t{\r\n\t\treturn this.context;\r\n\t}\r\n\r\n\t/**\r\n\t * override this to do something when created.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tonCreated()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the component.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\treturn {\r\n\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will cache the layout panel and set the main id.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} layout\r\n\t * @returns {object}\r\n\t */\r\n\t_cacheRoot(layout)\r\n\t{\r\n\t\tif (!layout)\r\n\t\t{\r\n\t\t\treturn layout;\r\n\t\t}\r\n\r\n\t\tif (!layout.id)\r\n\t\t{\r\n\t\t\tlayout.id = this.getId();\r\n\t\t}\r\n\r\n\t\tlayout.cache = 'panel';\r\n\t\treturn layout;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the component layout.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object}\r\n\t */\r\n\t_createLayout()\r\n\t{\r\n\t\treturn this.render();\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepare the layout.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object}\r\n\t */\r\n\tprepareLayout()\r\n\t{\r\n\t\tconst layout = this._createLayout();\r\n\t\treturn this._cacheRoot(layout);\r\n\t}\r\n\r\n\t/**\r\n\t * This will build the layout.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tafterBuild()\r\n\t{\r\n\t\tDataTracker.add(this.panel, 'components',\r\n\t\t{\r\n\t\t\tcomponent: this\r\n\t\t});\r\n\r\n\t\tthis.rendered = true;\r\n\t\tthis.afterLayout();\r\n\t}\r\n\r\n\t/**\r\n\t * This will activate the post build actions.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tafterLayout()\r\n\t{\r\n\t\tthis.afterSetup();\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the content on condition of a property.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} prop\r\n\t * @param {*} content\r\n\t * @returns {object}\r\n\t */\r\n\tif(prop, content)\r\n\t{\r\n\t\treturn (!prop)? null : (content || prop);\r\n\t}\r\n\r\n\t/**\r\n\t * This will map an array to children elements.\r\n\t *\r\n\t * @protected\r\n\t * @param {array} items\r\n\t * @param {function} callBack\r\n\t * @returns {array}\r\n\t */\r\n\tmap(items, callBack)\r\n\t{\r\n\t\tconst children = [];\r\n\t\tif (!items || items.length < 1)\r\n\t\t{\r\n\t\t\treturn children;\r\n\t\t}\r\n\r\n\t\tfor (var i = 0, length = items.length; i < length; i++)\r\n\t\t{\r\n\t\t\tconst item = callBack(items[i], i);\r\n\t\t\tchildren.push(item);\r\n\t\t}\r\n\t\treturn children;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove children from an element.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @returns {object}\r\n\t */\r\n\tremoveAll(ele)\r\n\t{\r\n\t\treturn Html.removeAll(ele);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get an id of the component or the full\r\n\t * id that has the component id prepended to the\r\n\t * requested id.\r\n\t *\r\n\t * @param {string} [id]\r\n\t * @returns {string}\r\n\t */\r\n\tgetId(id)\r\n\t{\r\n\t\tlet mainId = this.id;\r\n\t\tif (typeof id === 'string')\r\n\t\t{\r\n\t\t\tmainId += '-' + id;\r\n\t\t}\r\n\t\treturn mainId;\r\n\t}\r\n\r\n\t/**\r\n\t * This will cache an element to the component.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {string} propName\r\n\t * @returns {void}\r\n\t */\r\n\tcacheEle(ele, propName)\r\n\t{\r\n\t\tif (!propName)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis[propName] = ele;\r\n\t\tthis.cached.push(propName);\r\n\t}\r\n\r\n\t/**\r\n\t * This will initialize the component.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tinitialize()\r\n\t{\r\n\t\tthis.setupContext();\r\n\t\tthis.beforeSetup();\r\n\t}\r\n\r\n\t/**\r\n\t * override this to do something before setup.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tbeforeSetup()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * override this to do something after setup.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tafterSetup()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup and render the component.\r\n\t *\r\n\t * @param {object} container\r\n\t * @returns {void}\r\n\t */\r\n\tsetup(container)\r\n\t{\r\n\t\tthis.setContainer(container);\r\n\t\tthis.initialize();\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the container.\r\n\t *\r\n\t * @param {object} container\r\n\t * @returns {void}\r\n\t */\r\n\tsetContainer(container)\r\n\t{\r\n\t\tthis.container = container;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the component.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\t_remove()\r\n\t{\r\n\t\tthis.prepareDestroy();\r\n\t\tthis.removeContext();\r\n\r\n\t\tconst panel = this.panel || this.id;\r\n\t\tHtml.removeElement(panel);\r\n\r\n\t\tthis.cleanUpAfterDestroy();\r\n\t}\r\n\r\n\t/**\r\n\t * This will clean up after destroy.\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tcleanUpAfterDestroy()\r\n\t{\r\n\t\t/**\r\n\t\t * This will clear the panel and container references\r\n\t\t * to prevent memory leaks.\r\n\t\t */\r\n\t\tthis.panel = null;\r\n\t\tthis.container = null;\r\n\r\n\t\t/**\r\n\t\t * This will clear all cached element references\r\n\t\t * to prevent memory leaks.\r\n\t\t */\r\n\t\tthis.cached.forEach(propName =>\r\n\t\t{\r\n\t\t\tthis[propName] = null;\r\n\t\t});\r\n\t\tthis.cached = [];\r\n\r\n\t\t/**\r\n\t\t * This will clear the component data if it is not\r\n\t\t * set to persist to free up memory.\r\n\t\t */\r\n\t\tif (this.persist !== true)\r\n\t\t{\r\n\t\t\tthis.data = null;\r\n\t\t\tthis.state = null;\r\n\t\t\tthis.stateHelper = null;\r\n\t\t\tthis.children = [];\r\n\t\t\tthis.context = null;\r\n\t\t\tthis.parent = null;\r\n\t\t\tthis.persistedChildren = {};\r\n\t\t\tthis.unitType = null;\r\n\t\t\tthis.id = null;\r\n\t\t\tthis.persistToken = null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepare the component to be destroyed.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tprepareDestroy()\r\n\t{\r\n\t\tthis.persistedCount = 0;\r\n\t\tthis.rendered = false;\r\n\t\tthis.beforeDestroy();\r\n\r\n\t\t/**\r\n\t\t * This will unlink the data to prevent memory leaks.\r\n\t\t */\r\n\t\tif (this.data && typeof this.data.unlink === 'function')\r\n\t\t{\r\n\t\t\tthis.data.unlink();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Override this to do something before destroy.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tbeforeDestroy()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will destroy the component.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tdestroy()\r\n\t{\r\n\t\tthis._remove();\r\n\t}\r\n}", "import { Objects } from '../../shared/objects.js';\r\nimport { StateTracker } from '../state/state-tracker.js';\r\nimport { EventHelper } from './event-helper.js';\r\nimport { StateHelper } from './state-helper.js';\r\nimport { Unit } from './unit.js';\r\n\r\n/**\r\n * Component\r\n *\r\n * This will allow components to be extended\r\n * from a single factory.\r\n *\r\n * @class\r\n * @augments Unit\r\n *\r\n * @param {...any} args\r\n *\r\n * @example\r\n * class QuickFlashPanel extends Component\r\n *\t{\r\n *\t\trender()\r\n *\t\t{\r\n *\t\t\treturn {\r\n *\r\n *\t\t\t};\r\n *\t\t}\r\n *\t}\r\n */\r\nexport class Component extends Unit\r\n{\r\n\t/**\r\n\t * This will create a component.\r\n\t *\r\n\t * @constructor\r\n\t * @param {...any} args\r\n\t */\r\n\tconstructor(...args)\r\n\t{\r\n\t\tsuper(...args);\r\n\r\n\t\t/**\r\n\t\t * @param {boolean} isComponent\r\n\t\t */\r\n\t\tthis.isComponent = true;\r\n\r\n\t\t/**\r\n\t\t * @param {boolean} stateResumed\r\n\t\t */\r\n\t\tthis.stateResumed = false;\r\n\r\n\t\t/* this will allow the component to override the\r\n\t\tstate target id to add a custom id */\r\n\t\t/**\r\n\t\t * @member {string} [stateTargetId] // optional override of state id\r\n\t\t */\r\n\t\tthis.stateTargetId = null;\r\n\t\tthis._setupData();\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the data.\r\n\t *\r\n\t * @returns {object|null}\r\n\t */\r\n\tsetData()\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the component data.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\t_setupData()\r\n\t{\r\n\t\tif (this.data)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst data = this.setData();\r\n\t\tif (data)\r\n\t\t{\r\n\t\t\tthis.data = data;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume the component scope when persisting.\r\n\t *\r\n\t * @param {object} persistedLayout\r\n\t * @returns {void}\r\n\t */\r\n\tresumeScope(persistedLayout)\r\n\t{\r\n\t\tthis.data = persistedLayout.data;\r\n\t\tthis.state = persistedLayout.state;\r\n\t\tthis.stateHelper = persistedLayout.stateHelper;\r\n\t\tthis.persistedChildren = persistedLayout.persistedChildren;\r\n\t\tthis.id = persistedLayout.id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will initialize the component.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object}\r\n\t */\r\n\tinitialize()\r\n\t{\r\n\t\tthis.setupContext();\r\n\t\tthis.addStates();\r\n\t\tthis.beforeSetup();\r\n\t}\r\n\r\n\t/**\r\n\t * This will activate the post build actions.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tafterLayout()\r\n\t{\r\n\t\tthis.addEvents();\r\n\t\tthis.afterSetup();\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the state target.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} [id]\r\n\t * @returns {void}\r\n\t */\r\n\tsetupStateTarget(id)\r\n\t{\r\n\t\tconst targetId = id || this.stateTargetId || this.id;\r\n\t\tthis.state = StateTracker.getTarget(targetId);\r\n\t}\r\n\r\n\t/**\r\n\t * Override this to setup the component states.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object}\r\n\t *\r\n\t * @example\r\n\t * return {\r\n\t *\r\n\t * \t// simple state\r\n\t * \taction: 'state', // any primitive value\r\n\t *\r\n\t * \t// a more complex state\r\n\t * \tcomplexAction: {\r\n\t * \t\tstate: 'state', // any primitive value\r\n\t * \t\tcallBack(state, prevState)\r\n\t * \t\t{\r\n\t * \t\t\t// do something\r\n\t * \t\t}\r\n\t * \t}\r\n\t * };\r\n\t */\r\n\tsetupStates()\r\n\t{\r\n\t\t/*\r\n\t\treturn {\r\n\t\t\taction: 'state'\r\n\t\t};\r\n\r\n\t\tor\r\n\r\n\t\treturn {\r\n\t\t\taction:\r\n\t\t\t{\r\n\t\t\t\tstate: 'state',\r\n\t\t\t\tcallBack(state, prevState)\r\n\t\t\t\t{\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};*/\r\n\r\n\t\treturn {\r\n\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the states.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\taddStates()\r\n\t{\r\n\t\t/* this will check to restore previous a previous state if the\r\n\t\tcomponent has been preserved. */\r\n\t\tconst state = this.state;\r\n\t\tif (state)\r\n\t\t{\r\n\t\t\tthis.stateResumed = true;\r\n\t\t\tthis.stateHelper.restore(state);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* this will only setupa state manager if\r\n\t\twe have states */\r\n\t\tconst states = this.setupStates();\r\n\t\tif (Objects.isEmpty(states))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.setStateHelper(states);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the state helper.\r\n\t *\r\n\t * @param {object} [states]\r\n\t * @returns {void}\r\n\t */\r\n\tsetStateHelper(states = {})\r\n\t{\r\n\t\t/**\r\n\t\t * This will prevent the state helper from being\r\n\t\t * reset.\r\n\t\t */\r\n\t\tif (this.state)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.setupStateTarget();\r\n\t\tthis.stateHelper = new StateHelper(this.state, states);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a state.\r\n\t *\r\n\t * @param {object} state\r\n\t * @returns {void}\r\n\t */\r\n\taddState(state)\r\n\t{\r\n\t\t/**\r\n\t\t * This will prevet new states from being added if the\r\n\t\t * component has been resumed or the state helper is\r\n\t\t * missing.\r\n\t\t */\r\n\t\tif (!this.stateHelper || this.stateResumed == true)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.stateHelper.addStates(this.state, state);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the states.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tremoveStates()\r\n\t{\r\n\t\tconst state = this.state;\r\n\t\tif (!state)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.stateHelper.removeRemoteStates(state);\r\n\t\tstate.remove();\r\n\t\tthis.stateResumed = false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the event helper.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tsetEventHelper()\r\n\t{\r\n\t\t/**\r\n\t\t * This will prevent the event helper from being\r\n\t\t * reset.\r\n\t\t */\r\n\t\tif (this.events)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.events = new EventHelper();\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {array}\r\n\t *\r\n\t * @example\r\n\t * return [\r\n\t * \t// event, element, function, capture\r\n\t * \t['click', this.element, function(e){}, false]\r\n\t * ];\r\n\t */\r\n\tsetupEvents()\r\n\t{\r\n\t\treturn [\r\n\t\t\t//['action', element, function(e){}, false]\r\n\t\t];\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\taddEvents()\r\n\t{\r\n\t\tconst events = this.setupEvents();\r\n\t\tif (events.length < 1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.setEventHelper();\r\n\t\tthis.events.addEvents(events);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tremoveEvents()\r\n\t{\r\n\t\tconst events = this.events;\r\n\t\tif (events)\r\n\t\t{\r\n\t\t\tevents.reset();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepare the component to be destroyed.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tprepareDestroy()\r\n\t{\r\n\t\tthis.persistedCount = 0;\r\n\t\tthis.rendered = false;\r\n\t\tthis.beforeDestroy();\r\n\t\tthis.removeEvents();\r\n\t\tthis.removeStates();\r\n\t\tthis.removeContext();\r\n\r\n\t\t/**\r\n\t\t * Unlink data when not persisting to prevent memory leaks.\r\n\t\t * Data watchers keep references to the component and DOM.\r\n\t\t */\r\n\t\tif (this.data && this.persist !== true)\r\n\t\t{\r\n\t\t\tthis.data.unlink();\r\n\t\t}\r\n\t}\r\n}", "/**\r\n * This will store the pod shorthand method alaises.\r\n *\r\n * @constant\r\n * @type {object} SHORTHAND_METHODS\r\n */\r\nexport const SHORTHAND_METHODS =\r\n{\r\n created: 'onCreated',\r\n setStates: 'setupStates',\r\n state: 'setupStates',\r\n events: 'setupEvents',\r\n before: 'beforeSetup',\r\n render: 'render',\r\n after: 'afterSetup',\r\n destroy: 'beforeDestroy'\r\n};", "import { Component } from './component.js';\r\nimport { SHORTHAND_METHODS } from './shorthand-methods.js';\r\n\r\n/**\r\n * This will get the jot method by value. If the method is an\r\n * object, it will be nested in a function.\r\n *\r\n * @param {object|function} value\r\n * @returns {function}\r\n */\r\nconst getJotShorthandMethod = (value) =>\r\n{\r\n\treturn (typeof value === 'function')? value : () => value;\r\n};\r\n\r\n/**\r\n * This will create a jot component object that will be used\r\n * to create the jot component.\r\n *\r\n * @param {object} settings\r\n * @returns {object}\r\n */\r\nconst JotComponent = (settings) =>\r\n{\r\n\tconst component = {};\r\n\tif (!settings)\r\n\t{\r\n\t\treturn component;\r\n\t}\r\n\r\n\tObject.entries(settings).forEach(([prop, value]) =>\r\n\t{\r\n\t\tconst alias = SHORTHAND_METHODS[prop] || prop;\r\n\t\tcomponent[alias] = getJotShorthandMethod(value);\r\n\t});\r\n\r\n\treturn component;\r\n};\r\n\r\n/**\r\n * This will create a class.\r\n *\r\n * @param {typeof Component} Base\r\n * @param {object} settings\r\n * @returns {typeof Component} Child - The child class that extends the base class.\r\n */\r\nconst createClass = (Base, settings) =>\r\n{\r\n\tclass Child extends Base {}\r\n\tObject.assign(Child.prototype, settings);\r\n\treturn Child;\r\n};\r\n\r\n/**\r\n * This will create a shorthand component.\r\n *\r\n * @param {object|function} layout\r\n * @param {typeof Component} [extend=Component]\r\n * @returns {typeof Component|null} A class (constructor) or `null` if no layout is given.\r\n */\r\nexport const Jot = (layout, extend = Component) =>\r\n{\r\n\tif (!layout)\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\tlet settings;\r\n\tconst layoutType = typeof layout;\r\n\r\n\t/**\r\n\t * This will handle the layout components that are objects.\r\n\t */\r\n\tif (layoutType === 'object' && layout.render)\r\n\t{\r\n\t\tsettings = JotComponent(layout);\r\n\t\treturn createClass(extend, settings);\r\n\t}\r\n\r\n\t/**\r\n\t * This will handle non component layouts. If the layout is not\r\n\t * a function, it will be wrapped in a function to be used as\r\n\t * the render method.\r\n\t */\r\n\tconst render = (layoutType === 'function')? layout : () => layout;\r\n\tsettings = { render };\r\n\treturn createClass(extend, settings);\r\n};", "import { Component } from './component.js';\r\nimport { SHORTHAND_METHODS } from './shorthand-methods.js';\r\n\r\n/**\r\n * Pods\r\n *\r\n * Pods are components that are created using a shorthand method.\r\n *\r\n * @author Chris Durfee\r\n * @author Cayon Christiansen\r\n */\r\n\r\n/**\r\n * This will modify the methods to convert the shorthand\r\n * methods to the full methods.\r\n *\r\n * @param {object} proxy\r\n * @param {typeof Component} component\r\n * @returns {object}\r\n */\r\nconst modifyMethods = (proxy, component) =>\r\n{\r\n Object.entries(proxy).forEach(([prop, value]) =>\r\n {\r\n const alias = SHORTHAND_METHODS[prop] || prop;\r\n component.prototype[alias] = value;\r\n });\r\n\r\n return component;\r\n};\r\n\r\n/**\r\n * This will create a class.\r\n *\r\n * @param {typeof Component} Base\r\n * @returns {typeof Component}\r\n */\r\nconst extendBaseClass = (Base) =>\r\n{\r\n return class extends Base {}\r\n};\r\n\r\n/**\r\n * This will create a pod component.\r\n *\r\n * @param {function} callBack\r\n * @param {typeof Component} extend - The class to extend.\r\n * @returns {typeof Component}\r\n */\r\nexport const Pod = (callBack, extend = Component) =>\r\n{\r\n if (!callBack)\r\n {\r\n return null;\r\n }\r\n\r\n const component = extendBaseClass(extend);\r\n\r\n /**\r\n * This will call the callback function and pass the component\r\n * to set up the component.\r\n *\r\n * The result is the render method.\r\n */\r\n const proxy = {};\r\n const render = callBack(proxy);\r\n\r\n /**\r\n * This will modify the methods to convert the shorthand\r\n * methods to the full methods.\r\n */\r\n modifyMethods(proxy, component);\r\n\r\n component.prototype.render = render;\r\n return component;\r\n};", "\r\n/**\r\n * This will add date functions to the base framework.\r\n *\r\n */\r\nexport const DateTime =\r\n{\r\n\t/**\r\n\t * @member {array} monthName\r\n\t */\r\n\tmonthNames: [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],\r\n\r\n\t/**\r\n\t * @member {array} dayNames\r\n\t */\r\n\tdayNames: [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\r\n\r\n\t/**\r\n\t * This will get the day name.\r\n\t *\r\n\t * @param {number} [day]\r\n\t * @param {boolean} [shortenName=false]\r\n\t * @returns {?string}\r\n\t */\r\n\tgetDayName(day = new Date().getDay(), shortenName = false)\r\n\t{\r\n\t\tconst days = this.dayNames;\r\n\t\tif (day > days.length)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t/* we want to check to shorten name */\r\n\t\tconst dayName = days[day];\r\n\t\treturn (shortenName)? dayName.substring(0, 3) : dayName;\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert month to js.\r\n\t *\r\n\t * @param {number} month\r\n\t * @returns {string}\r\n\t */\r\n\tconvertJsMonth(month)\r\n\t{\r\n\t\treturn this.padNumber(month + 1);\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert a date.\r\n\t *\r\n\t * @param {string} dateString\r\n\t * @param {boolean} [addYear]\r\n\t * @returns {string}\r\n\t */\r\n\tconvertDate(dateString, addYear = false)\r\n\t{\r\n\t\tdateString = (dateString)? dateString.replace(/\\s/, 'T'): ''; //For safari\r\n\r\n\t\tconst date = new Date(dateString),\r\n\t\tyear = (addYear === true)? ' ' + date.getFullYear() : '';\r\n\t\treturn this.getDayName(date.getDay()) + ', ' + this.getMonthName(date.getMonth(), true) + ' ' + this.padNumber(date.getDate()) + year;\r\n\t},\r\n\r\n\t/**\r\n\t * This will add leading zero to number less than 10.\r\n\t *\r\n\t * @param {number} number\r\n\t * @returns {string}\r\n\t */\r\n\tpadNumber(number)\r\n\t{\r\n\t\treturn (number <= 9)? '0' + number : String(number);\r\n\t},\r\n\r\n\t/**\r\n\t * This will create a new date object.\r\n\t *\r\n\t * @param {string} dateString\r\n\t * @returns {Date}\r\n\t */\r\n\tcreateDate(dateString)\r\n\t{\r\n\t\tif (!dateString)\r\n\t\t{\r\n\t\t\treturn new Date();\r\n\t\t}\r\n\r\n\t\tif (typeof dateString === 'string' && dateString.indexOf('-') > -1)\r\n\t\t{\r\n\t\t\tdateString = dateString.replace(/\\s/, 'T'); //For safari\r\n\t\t\tdateString = (dateString.indexOf(':') > -1)? dateString : dateString + \"T00:00:00\";\r\n\t\t}\r\n\t\treturn new Date(dateString);\r\n\t},\r\n\r\n\t/**\r\n\t * This will format a date.\r\n\t *\r\n\t * @param {string} formatType\r\n\t * @param {string} dateString\r\n\t * @returns {string}\r\n\t */\r\n\tformat(formatType, dateString)\r\n\t{\r\n\t\tconst date = this.createDate(dateString);\r\n\t\treturn this.renderDate(date.getFullYear(), date.getMonth() + 1, date.getDate(), formatType);\r\n\t},\r\n\r\n\t/**\r\n\t * This will format time.\r\n\t *\r\n\t * @param {string} dateString\r\n\t * @param {number} format\r\n\t * @returns {string}\r\n\t */\r\n\tformatTime(dateString, format)\r\n\t{\r\n\t\tconst date = this.createDate(dateString);\r\n\t\tconst formatType = (format === 24)? 'sql' : 'standard';\r\n\r\n\t\treturn this.renderTime(date.getHours(), date.getMinutes(), date.getSeconds(), formatType);\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the meridian.\r\n\t *\r\n\t * @param {number|string} hours\r\n\t * @returns {string}\r\n\t */\r\n\tgetMeridian(hours)\r\n\t{\r\n\t\thours = Number(hours);\r\n\t\treturn (hours >= 12)? 'PM' : 'AM';\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert 24 hour time to 12 hour time.\r\n\t *\r\n\t * @param {number|string} hours\r\n\t * @returns {number}\r\n\t */\r\n\tconvert24To12(hours)\r\n\t{\r\n\t\thours = Number(hours);\r\n\t\tif (hours > 12)\r\n\t\t{\r\n\t\t\thours = hours - 12;\r\n\t\t}\r\n\t\treturn hours;\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert 12 hour time to 24 hour time.\r\n\t *\r\n\t * @param {number|string} hours\r\n\t * @param {string} meridian\r\n\t * @returns {number}\r\n\t */\r\n\tconvert12To24(hours, meridian)\r\n\t{\r\n\t\thours = Number(hours);\r\n\t\tif (meridian.toLowerCase() === 'pm')\r\n\t\t{\r\n\t\t\thours = hours + 12;\r\n\t\t}\r\n\t\treturn hours;\r\n\t},\r\n\r\n\t/**\r\n\t * This will render a date.\r\n\t *\r\n\t * @param {number} year\r\n\t * @param {number|string} month\r\n\t * @param {number|string} day\r\n\t * @param {string} [format='sql']\r\n\t * @returns {string}\r\n\t */\r\n\trenderDate(year, month, day, format = 'sql')\r\n\t{\r\n\t\tmonth = Number(month);\r\n\t\tday = Number(day);\r\n\r\n\t\tif (format === 'sql')\r\n\t\t{\r\n\t\t\treturn `${year}-${this.padNumber(month)}-${this.padNumber(day)}`;\r\n\t\t}\r\n\r\n\t\treturn `${this.padNumber(month)}/${this.padNumber(day)}/${year}`;\r\n\t},\r\n\r\n\t/**\r\n\t * This will render time.\r\n\t *\r\n\t * @param {number} hours\r\n\t * @param {number} minutes\r\n\t * @param {number} [seconds=0]\r\n\t * @param {string} [format='sql']\r\n\t * @returns {string}\r\n\t */\r\n\trenderTime(hours, minutes, seconds = 0, format = 'sql')\r\n\t{\r\n\t\tif (format === 'sql')\r\n\t\t{\r\n\t\t\treturn `${this.padNumber(hours)}:${this.padNumber(minutes)}:${this.padNumber(seconds)}`;\r\n\t\t}\r\n\r\n\t\tconst meridian = this.getMeridian(hours);\r\n\t\thours = this.convert24To12(hours);\r\n\r\n\t\treturn `${hours}:${this.padNumber(minutes)} ${meridian}`;\r\n\t},\r\n\r\n\t/**\r\n\t * This will check for leap year.\r\n\t *\r\n\t * @param {number} year\r\n\t * @returns {boolean}\r\n\t */\r\n\tleapYear(year)\r\n\t{\r\n\t\treturn ((year % 400 === 0) || (year % 100 !== 0 && year % 4 === 0));\r\n\t},\r\n\r\n\t/**\r\n\t * This will get a month name.\r\n\t *\r\n\t * @param {number} [month]\r\n\t * @param {boolean} [shortenName]\r\n\t * @returns {string}\r\n\t */\r\n\tgetMonthName(month = new Date().getMonth(), shortenName = false)\r\n\t{\r\n\t\tconst months = this.monthNames;\r\n\t\tif (month > months.length)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tconst monthName = months[month];\r\n\t\tif (!monthName)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\t\treturn (shortenName)? monthName.substring(0, 3) : monthName;\r\n\t},\r\n\r\n\t/**\r\n\t * This will return the month length.\r\n\t *\r\n\t * @param {number} [month]\r\n\t * @param {number} [year]\r\n\t * @returns {number}\r\n\t */\r\n\tgetMonthLength(month, year)\r\n\t{\r\n\t\t/* we want to check to use params or use\r\n\t\tdefault */\r\n\t\tconst date = new Date();\r\n\t\tmonth = (typeof month !== 'undefined')? month : date.getMonth();\r\n\t\tyear = (typeof year !== 'undefined')? year : date.getFullYear();\r\n\r\n\t\t/* we need to get the month lengths for\r\n\t\tthe year */\r\n\t\tconst yearMonthLengths = this.getMonthsLength(year);\r\n\r\n\t\t/* we can select the month length from\r\n\t\tthe yearMonthLengths array */\r\n\t\treturn yearMonthLengths[month];\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the length of all the months.\r\n\t *\r\n\t * @param {number} year\r\n\t * @returns {array}\r\n\t */\r\n\tgetMonthsLength(year = new Date().getFullYear())\r\n\t{\r\n\t\tconst isLeapYear = this.leapYear(year);\r\n\t\tconst days = (isLeapYear === true)?\r\n\t\t\t[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\r\n\t\t:\r\n\t\t\t[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\n\r\n\t\treturn days;\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the local date.\r\n\t *\r\n\t * @param {string} remoteData\r\n\t * @param {string} [remoteTimeZone]\r\n\t * @returns {Date}\r\n\t */\r\n\tgetLocalDate(remoteData, remoteTimeZone = 'America/Denver')\r\n\t{\r\n\t\tlet date = new Date(remoteData);\r\n\r\n\t\tif (Number.isNaN(date.getMonth()) === true)\r\n\t\t{\r\n\t\t\tconst pattern = /[- :]/,\r\n\t\t\tvalues = remoteData.split(pattern);\r\n\r\n\t\t\t// @ts-ignore\r\n\t\t\tdate = new Date(values[0], values[1] - 1, values[2], values[3], values[4], values[5]);\r\n\t\t}\r\n\r\n\t\tconst invdate = new Date(Date.parse(date.toLocaleString('en-US', {\r\n\t\t\ttimeZone: remoteTimeZone\r\n\t\t})));\r\n\r\n\t\tconst diff = date.getTime() - invdate.getTime();\r\n\t\treturn new Date(date.getTime() + diff);\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert a remote date to local time.\r\n\t *\r\n\t * @param {string} remoteData\r\n\t * @param {boolean} sqlformat\r\n\t * @param {boolean} timeOnly\r\n\t * @param {string} [remoteTimeZone]\r\n\t * @returns {string}\r\n\t */\r\n\tgetLocalTime(remoteData, sqlformat = false, timeOnly = false, remoteTimeZone = 'America/Denver')\r\n\t{\r\n\t\tif (!remoteData)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tconst date = this.getLocalDate(remoteData, remoteTimeZone);\r\n\t\tconst month = date.getMonth() + 1;\r\n\r\n\t\tconst format = (sqlformat) === true? 'sql' : 'standard';\r\n\r\n\t\tlet formated = '';\r\n\t\tif (timeOnly === false)\r\n\t\t{\r\n\t\t\tformated += this.renderDate(date.getFullYear(), month, date.getDate(), format) + ' ';\r\n\t\t}\r\n\t\treturn (formated + this.renderTime(date.getHours(), date.getMinutes(), date.getSeconds(), format));\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the difference from now.\r\n\t *\r\n\t * @param {string} date\r\n\t * @param {boolean} [setHours]\r\n\t * @returns {number}\r\n\t */\r\n\tgetDiffFromNow(date, setHours = false)\r\n\t{\r\n\t\tdate = date.replace(/\\s/, 'T'); //For safari\r\n\t\tconst diffDate = new Date(date);\r\n\r\n\t\tconst now = new Date();\r\n\t\tif (setHours === true)\r\n\t\t{\r\n\t\t\tnow.setHours(0,0,0,0);\r\n\t\t}\r\n\r\n\t\tlet timeDiff = now.getTime() - diffDate.getTime();\r\n\t\treturn timeDiff;\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the age.\r\n\t *\r\n\t * @param {string} date\r\n\t * @returns {string}\r\n\t */\r\n\tgetAge(date)\r\n\t{\r\n\t\tconst milliseconds = this.getDiffFromNow(date);\r\n\r\n\t\tlet age,\r\n\t\tdays;\r\n\t\tswitch(true)\r\n\t\t{\r\n\t\t\tcase milliseconds < 86400000:\r\n\t\t\t\tage = '1 day';\r\n\t\t\t\tbreak;\r\n\t\t\tcase milliseconds < 604800000:\r\n\t\t\t\tdays = this.toDays(milliseconds);\r\n\t\t\t\tage = (days) + ' days';\r\n\t\t\t\tbreak;\r\n\t\t\tcase milliseconds < 1209600000:\r\n\t\t\t\tage = '1 week';\r\n\t\t\t\tbreak;\r\n\t\t\tcase milliseconds < 2592000000:\r\n\t\t\t\tdays = this.toDays(milliseconds);\r\n\t\t\t\tvar weeks = Math.floor(days / 7);\r\n\t\t\t\tage = weeks + ' weeks';\r\n\t\t\t\tbreak;\r\n\t\t\tcase milliseconds < 5184000000:\r\n\t\t\t\tage = '1 month';\r\n\t\t\t\tbreak;\r\n\t\t\tcase milliseconds < 31104000000:\r\n\t\t\t\tvar months = this.toMonths(milliseconds);\r\n\t\t\t\tage = months + ' months';\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tvar years = this.toYears(milliseconds);\r\n\t\t\t\tage = years;\r\n\t\t}\r\n\r\n\t\treturn String(age);\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the time frame.\r\n\t *\r\n\t * @param {string} date\r\n\t * @returns {string}\r\n\t */\r\n\tgetTimeFrame(date)\r\n\t{\r\n\t\tconst timeDiff = this.getDiffFromNow(date);\r\n\t\treturn this.convertToEstimate(timeDiff);\r\n\t},\r\n\r\n\t/**\r\n\t *\r\n\t * @param {number} milliseconds\r\n\t * @returns {string}\r\n\t */\r\n\tconvertToEstimate(milliseconds)\r\n\t{\r\n\t\tlet timeFrame = '';\r\n\t\tlet days, weeks, years, months, hours, minutes, seconds;\r\n\r\n\t\tif (milliseconds <= 0)\r\n\t\t{\r\n\t\t\tswitch (true)\r\n\t\t\t{\r\n\t\t\t\tcase milliseconds < -63072000000:\r\n\t\t\t\t\tyears = this.toYears(Math.abs(milliseconds));\r\n\t\t\t\t\ttimeFrame = 'in ' + years + ' years';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -31536000000:\r\n\t\t\t\t\ttimeFrame = 'in a year';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -5184000000:\r\n\t\t\t\t\tmonths = this.toMonths(Math.abs(milliseconds));\r\n\t\t\t\t\ttimeFrame = 'in ' + months + ' months';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -2592000000:\r\n\t\t\t\t\ttimeFrame = 'in a month';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -1209600000:\r\n\t\t\t\t\tdays = this.toDays(Math.abs(milliseconds)),\r\n\t\t\t\t\tweeks = Math.floor(days / 7);\r\n\t\t\t\t\ttimeFrame = 'in ' + weeks + ' weeks';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -604800000:\r\n\t\t\t\t\ttimeFrame = 'in a week';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -172800000:\r\n\t\t\t\t\tdays = this.toDays(Math.abs(milliseconds));\r\n\t\t\t\t\ttimeFrame = 'in ' + (days) + ' days';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -86400000:\r\n\t\t\t\t\ttimeFrame = 'tomorrow';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -7200000:\r\n\t\t\t\t\thours = this.toHours(Math.abs(milliseconds));\r\n\t\t\t\t\ttimeFrame = 'in ' + hours + ' hours';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds <= -3600000:\r\n\t\t\t\t\ttimeFrame = 'in an hour';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -120000:\r\n\t\t\t\t\tminutes = this.toMinutes(Math.abs(milliseconds));\r\n\t\t\t\t\ttimeFrame = 'in ' + minutes + ' minutes';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -60000:\r\n\t\t\t\t\ttimeFrame = 'in a minute';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -2000:\r\n\t\t\t\t\tseconds = this.toSeconds(Math.abs(milliseconds));\r\n\t\t\t\t\ttimeFrame = 'in ' + seconds + ' seconds';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -1:\r\n\t\t\t\t\ttimeFrame = 'in 1 second';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\ttimeFrame = 'now';\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tswitch (true)\r\n\t\t\t{\r\n\t\t\t\tcase milliseconds < 1000:\r\n\t\t\t\t\ttimeFrame = '1 second ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 60000:\r\n\t\t\t\t\tseconds = this.toSeconds(milliseconds);\r\n\t\t\t\t\ttimeFrame = seconds + ' seconds ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 120000:\r\n\t\t\t\t\ttimeFrame = '1 minute ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 3600000:\r\n\t\t\t\t\tminutes = this.toMinutes(milliseconds);\r\n\t\t\t\t\ttimeFrame = minutes + ' minutes ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 7200000:\r\n\t\t\t\t\ttimeFrame = '1 hour ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 86400000:\r\n\t\t\t\t\thours = this.toHours(milliseconds);\r\n\t\t\t\t\ttimeFrame = hours + ' hours ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 172800000:\r\n\t\t\t\t\ttimeFrame = 'yesterday';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 604800000:\r\n\t\t\t\t\tdays = this.toDays(milliseconds);\r\n\t\t\t\t\ttimeFrame = (days) + ' days ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 1209600000:\r\n\t\t\t\t\ttimeFrame = 'a week ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 2592000000:\r\n\t\t\t\t\tdays = this.toDays(milliseconds),\r\n\t\t\t\t\tweeks = Math.floor(days / 7);\r\n\t\t\t\t\ttimeFrame = weeks + ' weeks ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 5184000000:\r\n\t\t\t\t\ttimeFrame = 'a month ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 31536000000:\r\n\t\t\t\t\tmonths = this.toMonths(milliseconds);\r\n\t\t\t\t\ttimeFrame = months + ' months ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 63072000000:\r\n\t\t\t\t\ttimeFrame = 'a year ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tyears = this.toYears(milliseconds);\r\n\t\t\t\t\ttimeFrame = years + ' years ago';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn timeFrame;\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert to years.\r\n\t *\r\n\t * @param {number} milliseconds\r\n\t * @returns {number}\r\n\t */\r\n\ttoYears(milliseconds)\r\n\t{\r\n\t\tif (typeof milliseconds !== 'number')\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn Math.floor(milliseconds / (1000 * 60 * 60 * 24 * 365.26));\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert to months.\r\n\t *\r\n\t * @param {number} milliseconds\r\n\t * @returns {number}\r\n\t */\r\n\ttoMonths(milliseconds)\r\n\t{\r\n\t\tif (typeof milliseconds === 'number')\r\n\t\t{\r\n\t\t\treturn Math.floor(milliseconds / (1000 * 60 * 60 * 24 * 30));\r\n\t\t}\r\n\t\treturn 0;\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert to days.\r\n\t *\r\n\t * @param {number} milliseconds\r\n\t * @returns {number}\r\n\t */\r\n\ttoDays(milliseconds)\r\n\t{\r\n\t\tif (typeof milliseconds !== 'number')\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn Math.floor(milliseconds / (60 * 60 * 1000 * 24) * 1);\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert to hours.\r\n\t *\r\n\t * @param {number} milliseconds\r\n\t * @returns {number}\r\n\t */\r\n\ttoHours(milliseconds)\r\n\t{\r\n\t\tif (typeof milliseconds !== 'number')\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn Math.floor((milliseconds % (60 * 60 * 1000 * 24)) / (60 * 60 * 1000) * 1);\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert to minutes.\r\n\t *\r\n\t * @param {number} milliseconds\r\n\t * @returns {number}\r\n\t */\r\n\ttoMinutes(milliseconds)\r\n\t{\r\n\t\tif (typeof milliseconds !== 'number')\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn Math.floor(((milliseconds % (60 * 60 * 1000 * 24)) % (60 * 60 * 1000)) / (60 * 1000) * 1);\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert to seconds.\r\n\t *\r\n\t * @param {number} milliseconds\r\n\t * @returns {number}\r\n\t */\r\n\ttoSeconds(milliseconds)\r\n\t{\r\n\t\tif (typeof milliseconds !== 'number')\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn Math.floor((((milliseconds % (60 * 60 * 1000 * 24)) % (60 * 60 * 1000)) % (60 * 1000)) / 1000 * 1);\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the difference between two dates.\r\n\t *\r\n\t * @param {string} startDate\r\n\t * @param {string} endDate\r\n\t * @returns {object}\r\n\t */\r\n\tgetDifference(startDate, endDate)\r\n\t{\r\n\t\t/* we want to convert the dates to objects */\r\n\t\tconst start = new Date(startDate),\r\n\t\tend = new Date(endDate),\r\n\r\n\t\t/* we want to subtract the start time from the end */\r\n\t\tdifference = (end.getTime() - start.getTime());\r\n\r\n\t\treturn {\r\n\t\t\tyears: this.toYears(difference),\r\n\t\t\tdays: this.toDays(difference),\r\n\t\t\thours: this.toHours(difference),\r\n\t\t\tminutes: this.toMinutes(difference),\r\n\t\t\tseconds: this.toSeconds(difference)\r\n\t\t};\r\n\t}\r\n};", "/**\r\n * This will create a directive object.\r\n *\r\n * @param {string} name\r\n * @param {function} callBack\r\n * @returns {object}\r\n */\r\nexport const Directive = (name, callBack) =>\r\n{\r\n return {\r\n name,\r\n callBack\r\n };\r\n};", "import { Directive } from './directive.js';\r\n\r\n/**\r\n * Directives\r\n *\r\n * This will hold all directives.\r\n */\r\nexport const Directives =\r\n{\r\n /**\r\n * @member {array} keys\r\n */\r\n keys: [],\r\n\r\n /**\r\n * @member {object} items\r\n */\r\n items: {},\r\n\r\n /**\r\n * This will add a directive.\r\n *\r\n * @param {string} name\r\n * @param {function} callBack\r\n * @returns {object}\r\n */\r\n add(name, callBack)\r\n {\r\n this.keys.push(name);\r\n this.items[name] = Directive(name, callBack);\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * This will get a directive.\r\n *\r\n * @param {string} name\r\n * @returns {object|null}\r\n */\r\n get(name)\r\n {\r\n return this.items[name] || null;\r\n },\r\n\r\n /**\r\n * This will get all directive names.\r\n *\r\n * @returns {array}\r\n */\r\n all()\r\n {\r\n return this.keys;\r\n }\r\n};", "/**\r\n * This will create an attribute directive object.\r\n *\r\n * @param {string} attr\r\n * @param {object} directive\r\n * @returns {object}\r\n */\r\nexport const AttributeDirective = (attr, directive) =>\r\n{\r\n\treturn {\r\n\t\tattr,\r\n\t\tdirective\r\n\t};\r\n};", "/**\r\n * This will create an attribute object.\r\n *\r\n * @param {string} key\r\n * @param {*} value\r\n * @returns {object}\r\n */\r\nexport const Attribute = (key, value) =>\r\n{\r\n return {\r\n key,\r\n value\r\n };\r\n};", "/**\r\n * This will create an element object.\r\n *\r\n * @param {string} tag\r\n * @param {array} attr\r\n * @param {array} directives\r\n * @param {array} children\r\n * @returns {object}\r\n */\r\nexport const Element = (tag, attr, directives, children) =>\r\n{\r\n return {\r\n tag,\r\n attr,\r\n directives,\r\n children,\r\n };\r\n};", "import { Objects } from '../../../shared/objects.js';\r\nimport { normalizeAttr } from '../../html/html.js';\r\nimport { Directives } from '../directives/directives.js';\r\nimport { WatcherHelper } from '../watcher-helper.js';\r\nimport { AttributeDirective } from './attribute-directive.js';\r\nimport { Attribute } from './attribute.js';\r\nimport { Element } from './element.js';\r\n\r\n/**\r\n * Parser\r\n *\r\n * This will parse JSON layouts.\r\n *\r\n * @class\r\n */\r\nexport class Parser\r\n{\r\n\t/**\r\n\t * This will get the tag name of an element.\r\n\t *\r\n\t * @static\r\n\t * @private\r\n\t * @param {object} obj\r\n\t * @returns {string}\r\n\t */\r\n\tstatic getTag(obj)\r\n\t{\r\n\t\treturn obj.tag || 'div';\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the element children.\r\n\t *\r\n\t * @static\r\n\t * @param {object} obj\r\n\t * @returns {void}\r\n\t */\r\n\tstatic setupChildren(obj)\r\n\t{\r\n\t\tif (obj.nest)\r\n\t\t{\r\n\t\t\tobj.children = obj.nest;\r\n\t\t\tdelete obj.nest;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the element content.\r\n\t *\r\n\t * @param {string} key\r\n\t * @param {*} value\r\n\t * @param {array} attr\r\n\t * @param {array} children\r\n\t * @returns {boolean}\r\n\t */\r\n\tstatic setElementContent(key, value, attr, children)\r\n\t{\r\n\t\tif (key === 'text')\r\n\t\t{\r\n\t\t\tchildren.push({\r\n\t\t\t\ttag: 'text',\r\n\t\t\t\ttextContent: value\r\n\t\t\t});\r\n\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (key === 'html' || key === 'innerHTML')\r\n\t\t{\r\n\t\t\tattr.push(Attribute('innerHTML', value));\r\n\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the text as a watcher.\r\n\t *\r\n\t * @private\r\n\t * @static\r\n\t * @param {array} directives\r\n\t * @param {string} key\r\n\t * @param {string} value\r\n\t * @returns {void}\r\n\t */\r\n\tstatic setTextAsWatcher(directives, key, value)\r\n\t{\r\n\t\tdirectives.push(\r\n\t\t\tAttributeDirective(\r\n\t\t\t\tAttribute(\r\n\t\t\t\t\tkey,\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * This will convert the watcher to a custom\r\n\t\t\t\t\t * watcher object.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * We also need to normalize the attribute name.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tWatcherHelper.getWatcherSettings(value, normalizeAttr(key))\r\n\t\t\t\t),\r\n\t\t\t\tDirectives.get('watch')\r\n\t\t\t)\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the button type.\r\n\t *\r\n\t * @static\r\n\t * @param {string} tag\r\n\t * @param {object} obj\r\n\t * @param {array} attr\r\n\t */\r\n\tstatic setButtonType(tag, obj, attr)\r\n\t{\r\n\t\tif (tag === 'button')\r\n\t\t{\r\n\t\t\tconst type = obj.type || 'button';\r\n\t\t\tattr.push(Attribute('type', type));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will parse a layout element.\r\n\t *\r\n\t * @static\r\n\t * @param {object} obj\r\n\t * @param {object} parent\r\n\t * @returns {object}\r\n\t */\r\n\tstatic parse(obj, parent)\r\n\t{\r\n\t\tconst attr = [],\r\n\t\tdirectives = [],\r\n\t\ttag = this.getTag(obj);\r\n\r\n\t\tthis.setButtonType(tag, obj, attr);\r\n\t\tthis.setupChildren(obj);\r\n\r\n\t\tlet children = [];\r\n\t\tvar value, directive;\r\n\t\tfor (var key in obj)\r\n\t\t{\r\n\t\t\tif (!Objects.hasOwnProp(obj, key) || key === 'tag')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvalue = obj[key];\r\n\t\t\tif (value === undefined || value === null)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * Handle children separately to prevent it from being\r\n\t\t\t * set as an attribute (which would fail since DOM elements\r\n\t\t\t * have a read-only children property).\r\n\t\t\t */\r\n\t\t\tif (key === 'children')\r\n\t\t\t{\r\n\t\t\t\tchildren = Array.isArray(value) ? children.concat(value) : children.concat([value]);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will set up the attribute directives.\r\n\t\t\t */\r\n\t\t\tif ((directive = Directives.get(key)) !== null)\r\n\t\t\t{\r\n\t\t\t\tdirectives.push(\r\n\t\t\t\t\tAttributeDirective(\r\n\t\t\t\t\t\tAttribute(key, value),\r\n\t\t\t\t\t\tdirective\r\n\t\t\t\t\t)\r\n\t\t\t\t);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst type = typeof value;\r\n\t\t\tif (type === 'object')\r\n\t\t\t{\r\n\t\t\t\t/**\r\n\t\t\t\t * This will check if the value is a watcher.\r\n\t\t\t\t */\r\n\t\t\t\tif (WatcherHelper.isWatching(value))\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.setTextAsWatcher(directives, key, value);\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tchildren.push(value);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will set event callbacks to bind to the element on the this keyword\r\n\t\t\t * and pass the parent element in the args.\r\n\t\t\t */\r\n\t\t\tif (type === 'function')\r\n\t\t\t{\r\n\t\t\t\tconst callback = value;\r\n\t\t\t\t/**\r\n\t\t\t\t * Store the original callback reference on the wrapper function\r\n\t\t\t\t * so it can be matched during event removal.\r\n\t\t\t\t */\r\n\t\t\t\tconst wrapper = function(e)\r\n\t\t\t\t{\r\n\t\t\t\t\tcallback.call(this, e, parent);\r\n\t\t\t\t};\r\n\t\t\t\t// @ts-ignore - Add originalCallback for event cleanup tracking\r\n\t\t\t\twrapper.originalCallback = callback;\r\n\t\t\t\tvalue = wrapper;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will check if the value is a watcher.\r\n\t\t\t */\r\n\t\t\tif (WatcherHelper.isWatching(value))\r\n\t\t\t{\r\n\t\t\t\tthis.setTextAsWatcher(directives, key, value);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will set the element text and html content.\r\n\t\t\t */\r\n\t\t\tif (this.setElementContent(key, value, attr, children))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tattr.push(Attribute(key, value));\r\n\t\t}\r\n\r\n\t\treturn Element(\r\n\t\t\ttag,\r\n\t\t\tattr,\r\n\t\t\tdirectives,\r\n\t\t\tchildren\r\n\t\t);\r\n\t}\r\n}", "\r\n/**\r\n * Render\r\n *\r\n * This will be thase class for a render.\r\n *\r\n * @class\r\n */\r\nexport class Render\r\n{\r\n\t/**\r\n\t * This will render the layout\r\n\t *\r\n\t * @param {object} obj The JSON layout.\r\n\t * @param {object} [container] The parent receiving the layout.\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @returns {*} The layout result.\r\n\t */\r\n\tbuild(obj, container, parent)\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the component.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} component\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tsetupComponent(component, container, parent)\r\n\t{\r\n\t\t/**\r\n\t\t * We want to set the parent to the component before setting\r\n\t\t * up the component.\r\n\t\t */\r\n\t\tcomponent.parent = parent;\r\n\r\n\t\t/**\r\n\t\t * We only set the persist if both the parent allows\r\n\t\t * and the child does not explicitly deny it.\r\n\t\t */\r\n\t\tif (parent && parent.persist === true && component.persist !== false)\r\n\t\t{\r\n\t\t\tcomponent.persist = true;\r\n\t\t\tcomponent.parent.addPersistedChild(component);\r\n\t\t}\r\n\r\n\t\tif (component.cache && parent)\r\n\t\t{\r\n\t\t\tparent[component.cache] = component;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will set up the component, build the layout, and\r\n\t\t * call the afterBuild method.\r\n\t\t */\r\n\t\tcomponent.setup(container);\r\n\t}\r\n\r\n\t/**\r\n\t * This will build a component.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} component\r\n\t * @returns {*}\r\n\t */\r\n\tbuildComponent(component)\r\n\t{\r\n\t\t/**\r\n\t\t * This will build the layout and return the result.\r\n\t\t */\r\n\t\tconst layout = component.prepareLayout();\r\n\t\tconst result = this.build(layout, component.container, component.getChildScope());\r\n\r\n\t\tcomponent.afterBuild();\r\n\r\n\t\t/**\r\n\t\t * This will call the onCreated method if it exists.\r\n\t\t */\r\n\t\tif (component.component && typeof component.onCreated === 'function')\r\n\t\t{\r\n\t\t\tcomponent.onCreated(component);\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a component.\r\n\t *\r\n\t * @param {object} component\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {*} the build result.\r\n\t */\r\n\tcreateComponent(component, container, parent)\r\n\t{\r\n\t\tthis.setupComponent(component, container, parent);\r\n\t\tthis.buildComponent(component);\r\n\r\n\t\treturn component;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element directives.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} directives\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tsetDirectives(ele, directives, parent)\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a node.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {void}\r\n\t */\r\n\tremoveNode(node)\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove all the children from an element.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @returns {void}\r\n\t */\r\n\tremoveAll(ele)\r\n\t{\r\n\r\n\t}\r\n}", "import { Component } from '../../component/component.js';\r\nimport { Parser } from '../element/parser.js';\r\nimport { HtmlHelper } from '../html-helper.js';\r\nimport { Render } from './render.js';\r\n\r\n/**\r\n * BrowserRender\r\n *\r\n * This will redner the layout in the browser.\r\n *\r\n * @class\r\n */\r\nexport class BrowserRender extends Render\r\n{\r\n\t/**\r\n\t * This will build a JSON layout.\r\n\t *\r\n\t * @override\r\n\t * @param {object} obj The JSON layout.\r\n\t * @param {object} [container] The parent receiving the layout.\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @returns {*} The doc Frag element.\r\n\t */\r\n\tbuild(obj, container, parent)\r\n\t{\r\n\t\tconst fragment = HtmlHelper.createDocFragment();\r\n\t\tconst elements = Array.isArray(obj) ? obj : [obj];\r\n\t\telements.forEach(element => this.buildElement(element, fragment, parent));\r\n\r\n\t\tif (container && typeof container === 'object')\r\n\t\t{\r\n\t\t\tcontainer.appendChild(fragment);\r\n\t\t}\r\n\t\treturn fragment;\r\n\t}\r\n\r\n\t/**\r\n\t * This will build an element or component.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {object} container\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @returns {void}\r\n\t */\r\n\tbuildElement(obj, container, parent)\r\n\t{\r\n\t\tif (!obj)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (obj.isUnit === true)\r\n\t\t{\r\n\t\t\tthis.createComponent(obj, container, parent);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.createElement(obj, container, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create an element.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {object} container\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @returns {void}\r\n\t */\r\n\tcreateElement(obj, container, parent)\r\n\t{\r\n\t\t/**\r\n\t\t * If there is data or state bindings, we want to\r\n\t\t * create a temporary component to handle those\r\n\t\t * bindings and nest the layout inside of it.\r\n\t\t */\r\n\t\tif (obj.data || obj.state)\r\n\t\t{\r\n\t\t\tthis.createTempComponent(obj, container, parent);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst settings = Parser.parse(obj, parent);\r\n\t\tconst ele = this.createNode(settings, container, parent);\r\n\r\n\t\tthis.cache(ele, obj.cache, parent);\r\n\r\n\t\t/* we want to recursively add the children to\r\n\t\tthe new element */\r\n\t\tsettings.children.forEach(child =>\r\n\t\t{\r\n\t\t\tif (child !== null)\r\n\t\t\t{\r\n\t\t\t\tthis.buildElement(child, ele, parent);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tconst directives = settings.directives;\r\n\t\tif (directives && directives.length)\r\n\t\t{\r\n\t\t\tthis.setDirectives(ele, directives, parent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a temporary component for data/state\r\n\t * bindings in the layout.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tcreateTempComponent(obj, container, parent)\r\n\t{\r\n\t\tconst props = {\r\n\t\t\tsetData: () => obj.data,\r\n\t\t\trender()\r\n\t\t\t{\r\n\t\t\t\treturn {...obj, data: null, state: null};\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (obj.state)\r\n\t\t{\r\n\t\t\tprops.setupStateTarget = function(id)\r\n\t\t\t{\r\n\t\t\t\tthis.state = obj.state;\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst component = new Component(props);\r\n\t\tthis.createComponent(component, container, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element directives.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} directives\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tsetDirectives(ele, directives, parent)\r\n\t{\r\n\t\tdirectives.forEach(directive =>\r\n\t\t{\r\n\t\t\tthis.handleDirective(ele, directive, parent);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will handle an attr directive.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {object} attrDirective\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\thandleDirective(ele, attrDirective, parent)\r\n\t{\r\n\t\tattrDirective.directive.callBack(ele, attrDirective.attr.value, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will cache an element to the parent.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {string} propName\r\n\t * @param {object} parent\r\n\t */\r\n\tcache(ele, propName, parent)\r\n\t{\r\n\t\tif (parent && propName)\r\n\t\t{\r\n\t\t\tparent.cacheEle(ele, propName);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a node.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {object}\r\n\t */\r\n\tcreateNode(settings, container, parent)\r\n\t{\r\n\t\tconst tag = settings.tag;\r\n\t\tif (tag === 'text')\r\n\t\t{\r\n\t\t\tconst child = settings.attr[0];\r\n\t\t\tconst text = (child)? child.value : '';\r\n\t\t\treturn HtmlHelper.createText(text, container);\r\n\t\t}\r\n\t\telse if (tag === 'comment')\r\n\t\t{\r\n\t\t\tconst child = settings.attr[0];\r\n\t\t\tconst text = (child)? child.value : '';\r\n\t\t\treturn HtmlHelper.createComment(text, container);\r\n\t\t}\r\n\r\n\t\treturn HtmlHelper.create(tag, settings.attr, container, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a node.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {void}\r\n\t */\r\n\tremoveNode(node)\r\n\t{\r\n\t\tHtmlHelper.removeElement(node);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove all the children from an element.\r\n\t *\r\n\t * @override\r\n\t * @param {object} ele\r\n\t * @returns {void}\r\n\t */\r\n\tremoveAll(ele)\r\n\t{\r\n\t\tHtmlHelper.removeAll(ele);\r\n\t}\r\n}", "import { removeEventPrefix } from '../html/html.js';\r\n\r\nconst selfClosingTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'source'];\r\n\r\n/**\r\n * HtmlToString\r\n *\r\n * This will render html to a string.\r\n *\r\n * @class\r\n */\r\n// @ts-ignore\r\nexport class HtmlToString\r\n{\r\n /**\r\n * This will create a node string.\r\n *\r\n * @param {string} tag\r\n * @param {array} attrs\r\n * @param {string} children\r\n * @returns {string}\r\n */\r\n\tstatic create(tag, attrs = [], children = '')\r\n {\r\n let innerContent = this.getInnerContent(attrs);\r\n innerContent += this.getInnerHtml(attrs);\r\n\r\n const attrString = this.createAttributes(attrs);\r\n\r\n if (selfClosingTags.includes(tag))\r\n {\r\n return `<${tag} ${attrString} />`;\r\n }\r\n\r\n return `<${tag} ${attrString}>` + innerContent + children + `</${tag}>`;\r\n }\r\n\r\n /**\r\n * This will get the inner content.\r\n *\r\n * @param {object} attrs\r\n * @returns {string}\r\n */\r\n static getInnerContent(attrs)\r\n {\r\n let content = '';\r\n attrs.forEach(({ key, value }, index) =>\r\n {\r\n if (key !== 'text' && key !== 'textContent')\r\n {\r\n return '';\r\n }\r\n\r\n attrs.splice(index, 1);\r\n content += value;\r\n });\r\n\r\n return content;\r\n }\r\n\r\n /**\r\n * This will get the inner html.\r\n *\r\n * @param {object} attrs\r\n * @returns {string}\r\n */\r\n static getInnerHtml(attrs)\r\n {\r\n let content = '';\r\n attrs.forEach(({ key, value }, index) =>\r\n {\r\n if (key !== 'html' && key !== 'innerHTML')\r\n {\r\n return '';\r\n }\r\n\r\n attrs.splice(index, 1);\r\n content += value;\r\n });\r\n\r\n return content;\r\n }\r\n\r\n /**\r\n * This will create a text node.\r\n *\r\n * @param {array} attrs\r\n * @returns {string}\r\n */\r\n static createAttributes(attrs = [])\r\n {\r\n if (!attrs || attrs.length < 1)\r\n {\r\n return '';\r\n }\r\n\r\n return attrs\r\n .map(attr => {\r\n let { key, value } = attr;\r\n\r\n if (typeof value === 'function')\r\n {\r\n key = 'on' + removeEventPrefix(key);\r\n }\r\n return `${key}=\"${value}\"`;\r\n })\r\n .join(' ');\r\n }\r\n\r\n /**\r\n * This will create a text node.\r\n *\r\n * @param {string} text\r\n * @returns {string}\r\n */\r\n static createText(text)\r\n {\r\n return text;\r\n }\r\n\r\n /**\r\n * This will create a comment node.\r\n *\r\n * @param {string} text\r\n * @returns {string}\r\n */\r\n static createComment(text)\r\n {\r\n return `<!-- ${text} -->`;\r\n }\r\n}", "import { Parser } from '../element/parser.js';\r\nimport { HtmlToString } from '../html-to-string.js';\r\nimport { Render } from './render.js';\r\n\r\n/**\r\n * ServerRender\r\n *\r\n * This will render the layout on the server.\r\n *\r\n * @class\r\n */\r\nexport class ServerRender extends Render\r\n{\r\n\t/**\r\n\t * This will render the layout\r\n\t *\r\n\t * @param {object} obj The JSON layout.\r\n\t * @param {object} [container] The parent receiving the layout.\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @returns {*} The layout result\r\n\t */\r\n\tbuild(obj, container, parent)\r\n\t{\r\n\t\tconst elements = Array.isArray(obj) ? obj : [obj];\r\n\t\treturn elements.map(element => this.buildElement(element, parent)).join('');\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a component.\r\n\t *\r\n\t * @param {object} component\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {*} the build result.\r\n\t */\r\n\tcreateComponent(component, container, parent)\r\n\t{\r\n\t\tthis.setupComponent(component, container, parent);\r\n\t\treturn this.buildComponent(component);\r\n\t}\r\n\r\n\t/**\r\n * This will build an element or component and return an HTML string.\r\n *\r\n * @protected\r\n * @param {object} obj\r\n * @param {object} [parent] The component adding the layout.\r\n * @returns {*}\r\n */\r\n\tbuildElement(obj, parent)\r\n\t{\r\n\t\tif (!obj)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tif (obj.isUnit === true)\r\n\t\t{\r\n\t\t\treturn this.createComponent(obj, parent);\r\n\t\t}\r\n\r\n\t\treturn this.createElement(obj, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create an element and return an HTML string.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @returns {string} The HTML string.\r\n\t */\r\n\tcreateElement(obj, parent)\r\n\t{\r\n\t\tconst settings = Parser.parse(obj, parent);\r\n\r\n\t\tconst childrenHtml = settings.children\r\n\t\t\t.map(child => (child !== null ? this.buildElement(child, parent) : ''))\r\n\t\t\t.join('');\r\n\r\n\t\treturn this.createNode(settings, childrenHtml);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a node.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @param {string} childrenHtml\r\n\t * @returns {object}\r\n\t */\r\n\tcreateNode(settings, childrenHtml)\r\n\t{\r\n\t\tconst tag = settings.tag;\r\n\t\tif (tag === 'text')\r\n\t\t{\r\n\t\t\tconst child = settings.attr[0];\r\n\t\t\tconst text = (child)? child.value : '';\r\n\t\t\treturn HtmlToString.createText(text);\r\n\t\t}\r\n\t\telse if (tag === 'comment')\r\n\t\t{\r\n\t\t\tconst child = settings.attr[0];\r\n\t\t\tconst text = (child)? child.value : '';\r\n\t\t\treturn HtmlToString.createComment(text);\r\n\t\t}\r\n\r\n\t\treturn HtmlToString.create(tag, settings.attr, childrenHtml);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove all the children from an element.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @returns {void}\r\n\t */\r\n\tremoveAll(ele)\r\n\t{\r\n\r\n\t}\r\n}", "import { BrowserRender } from './browser-render.js';\r\nimport { ServerRender } from './server-render.js';\r\n\r\n/**\r\n * RenderController\r\n *\r\n * This will set up the render engine.\r\n *\r\n * @class\r\n */\r\nexport class RenderController\r\n{\r\n /**\r\n * This will check if we are in the browser.\r\n *\r\n * @returns {boolean}\r\n */\r\n static browserIsSupported()\r\n {\r\n return (typeof window !== 'undefined' && typeof document === 'object');\r\n }\r\n\r\n /**\r\n * This will create a History Object based on navigation support\r\n *\r\n * @returns Render\r\n */\r\n static setup()\r\n {\r\n if (this.browserIsSupported())\r\n {\r\n return new BrowserRender();\r\n }\r\n\r\n return new ServerRender();\r\n }\r\n}", "import { base } from '../../main/base.js';\r\nimport { Jot } from \"../component/jot.js\";\r\nimport { RenderController } from './render/render-controller.js';\r\n\r\n/**\r\n * This will set up the render engine.\r\n */\r\nconst render = RenderController.setup();\r\n\r\n/**\r\n * This will check if the layout is a component.\r\n *\r\n * @param {object} layout\r\n * @returns {boolean}\r\n */\r\nconst isComponent = (layout) => (typeof layout === 'object' && layout.isUnit === true);\r\n\r\n/**\r\n * This will create a Jot component.\r\n *\r\n * @param {object} layout\r\n * @returns {object}\r\n */\r\nconst createJotComponent = (layout) =>\r\n{\r\n\tconst Component = Jot(layout);\r\n\treturn new Component();\r\n};\r\n\r\n/**\r\n * Builder\r\n *\r\n * This will build JSON layouts.\r\n *\r\n * @class\r\n */\r\nexport class Builder\r\n{\r\n\t/**\r\n\t * This will render a function/Unit/Component.\r\n\t *\r\n\t * @param {object|function} layout\r\n\t * @param {object} container\r\n\t * @param {object} [parent]\r\n\t * @returns {*} The render result.\r\n\t */\r\n\tstatic render(layout, container, parent)\r\n\t{\r\n\t\tif (!layout)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (!isComponent(layout))\r\n\t\t{\r\n\t\t\tlayout = createJotComponent(layout);\r\n\t\t}\r\n\r\n\t\treturn render.createComponent(layout, container, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will build a JSON layout.\r\n\t *\r\n\t * @param {object} obj The JSON layout.\r\n\t * @param {object} [container] The parent receiving the layout.\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @returns {*} The render result.\r\n\t */\r\n\tstatic build(obj, container, parent)\r\n\t{\r\n\t\treturn render.build(obj, container, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will rebuild a layout.\r\n\t *\r\n\t * @param {object} layout\r\n\t * @param {object} ele\r\n\t * @param {object} parent\r\n\t * @returns {object}\r\n\t */\r\n\tstatic rebuild(layout, ele, parent)\r\n\t{\r\n\t\trender.removeAll(ele);\r\n\t\treturn this.build(layout, ele, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element directives.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} directives\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tstatic setDirectives(ele, directives, parent)\r\n\t{\r\n\t\trender.setDirectives(ele, directives, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a node.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {object}\r\n\t */\r\n\tstatic createNode(settings, container, parent)\r\n\t{\r\n\t\treturn render.createNode(settings, container, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a node.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {void}\r\n\t */\r\n\tstatic removeNode(node)\r\n\t{\r\n\t\trender.removeNode(node);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove all children from an element.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @returns {void}\r\n\t */\r\n\tstatic removeAll(ele)\r\n\t{\r\n\t\trender.removeAll(ele);\r\n\t}\r\n}\r\n\r\nbase.augment(\r\n{\r\n\t/**\r\n\t * This will build a JSON layout.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {object} [container]\r\n\t * @param {object} [parent]\r\n\t * @returns {object}\r\n\t */\r\n\tbuildLayout(obj, container, parent)\r\n\t{\r\n\t\tBuilder.build(obj, container, parent);\r\n\t}\r\n});", "import { Builder } from '../layout/builder.js';\r\n\r\n/**\r\n * This will track previously loaded scripts and styles.\r\n *\r\n * @type {Array<string>}\r\n */\r\nconst loaded = [];\r\n\r\n/**\r\n * This will check if a script or style has been loaded.\r\n *\r\n * @param {string} src\r\n * @returns {boolean}\r\n */\r\nconst isLoaded = (src) => loaded.indexOf(src) !== -1;\r\n\r\n/**\r\n * This will create a script atom.\r\n *\r\n * @param {object} props\r\n * @returns {object}\r\n */\r\nconst Script = (props) => ({\r\n\ttag: 'script',\r\n\tsrc: props.src,\r\n\tasync: false,\r\n\tload(e)\r\n\t{\r\n\t\tloaded.push(props.src);\r\n\r\n\t\tconst callBack = props.load;\r\n\t\tif (callBack)\r\n\t\t{\r\n\t\t\tcallBack();\r\n\t\t}\r\n\t}\r\n});\r\n\r\n/**\r\n * This will create a style atom.\r\n *\r\n * @param {object} props\r\n * @returns {object}\r\n */\r\nconst Style = (props) => ({\r\n\ttag: 'link',\r\n\trel: 'stylesheet',\r\n\ttype: 'text/css',\r\n\thref: props.src,\r\n\tload(e)\r\n\t{\r\n\t\tloaded.push(props.src);\r\n\r\n\t\tconst callBack = props.load;\r\n\t\tif (callBack)\r\n\t\t{\r\n\t\t\tcallBack();\r\n\t\t}\r\n\t}\r\n});\r\n\r\n/**\r\n * Group\r\n *\r\n * This will setup a depends group to load all\r\n * dependencies before loaded the script.\r\n *\r\n * @class\r\n */\r\nexport class Group\r\n{\r\n\t/**\r\n\t * This will create a group.\r\n\t *\r\n\t * @param {function} callBack\r\n\t */\r\n\tconstructor(callBack)\r\n\t{\r\n\t\t/**\r\n\t\t * @member {number} percent\r\n\t\t */\r\n\t\tthis.percent = 0;\r\n\r\n\t\t/**\r\n\t\t * @member {number} loaded\r\n\t\t */\r\n\t\tthis.loaded = 0;\r\n\r\n\t\t/**\r\n\t\t * @member {number} total\r\n\t\t */\r\n\t\tthis.total = 0;\r\n\r\n\t\t/**\r\n\t\t * @member {function} callBack\r\n\t\t */\r\n\t\tthis.callBack = callBack || null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the resource to the document.\r\n\t *\r\n\t * @param {string} src\r\n\t * @returns {void}\r\n\t */\r\n\tadd(src)\r\n\t{\r\n\t\tthis.total++;\r\n\t\tlet atom;\r\n\r\n\t\tconst load = this.update.bind(this);\r\n\t\tif (src.indexOf('.css') !== -1)\r\n\t\t{\r\n\t\t\tatom = Style({\r\n\t\t\t\tload,\r\n\t\t\t\tsrc\r\n\t\t\t});\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tatom = Script({\r\n\t\t\t\tload,\r\n\t\t\t\tsrc\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tBuilder.build(atom, document.head);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the dependencies to the document.\r\n\t *\r\n\t * @param {Array<string>} files\r\n\t * @returns {void}\r\n\t */\r\n\taddFiles(files)\r\n\t{\r\n\t\tif (!files)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfiles.forEach(src =>\r\n\t\t{\r\n\t\t\tif (!isLoaded(src))\r\n\t\t\t{\r\n\t\t\t\tthis.add(src);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the progress.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tupdate()\r\n\t{\r\n\t\tconst percent = this.updateProgress();\r\n\t\tif (percent < 100)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst callBack = this.callBack;\r\n\t\tif (callBack)\r\n\t\t{\r\n\t\t\tcallBack();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the progress.\r\n\t *\r\n\t * @returns {number}\r\n\t */\r\n\tupdateProgress()\r\n\t{\r\n\t\t++this.loaded;\r\n\t\treturn (this.percent = Math.floor(this.loaded / this.total * 100));\r\n\t}\r\n}", "import { Builder } from '../layout/builder.js';\r\n\r\n/**\r\n * This will check if an object is a contructor.\r\n *\r\n * @param {object|function} object\r\n * @returns {boolean}\r\n */\r\nconst isConstructor = (object) =>\r\n{\r\n if (!object)\r\n {\r\n return false;\r\n }\r\n\r\n return (typeof object?.prototype?.constructor === 'function');\r\n};\r\n\r\n/**\r\n * LayoutManager\r\n *\r\n * This will process the layout for the component or atom.\r\n *\r\n * @class\r\n */\r\nexport class LayoutManager\r\n{\r\n\t/**\r\n\t * Processes and configures a layout from a module.\r\n\t *\r\n\t * @param {object} module\r\n\t * @param {object} config\r\n\t * @returns {object|null}\r\n\t */\r\n\tstatic process(module, config)\r\n\t{\r\n\t\tlet layout = module.default;\r\n\t\tif (!layout)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (config.callback)\r\n\t\t{\r\n\t\t\treturn config.callback(layout);\r\n\t\t}\r\n\r\n\t\tif (isConstructor(layout))\r\n\t\t{\r\n\t\t\tlayout = new layout();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tlayout = layout();\r\n\t\t}\r\n\r\n\t\tif (layout.isUnit === true)\r\n\t\t{\r\n\t\t\tlayout.route = config.route;\r\n\r\n\t\t\tif (config.persist)\r\n\t\t\t{\r\n\t\t\t\tlayout.persist = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn layout;\r\n\t}\r\n\r\n /**\r\n * This will render the layout to the DOM.\r\n *\r\n * @param {object} layout\r\n * @param {object} element\r\n * @param {object} parent\r\n * @return {object|null}\r\n */\r\n static render(layout, element, parent)\r\n\t{\r\n\t\tconst fragment = Builder.build(layout, null, parent);\r\n\t\tconst firstChild = fragment.firstChild || layout?.panel;\r\n\t\telement.after(fragment);\r\n\t\treturn firstChild;\r\n\t}\r\n}", "/**\r\n * ModuleLoader\r\n *\r\n * This will load a module from a source.\r\n *\r\n * @class\r\n */\r\nexport class ModuleLoader\r\n{\r\n\t/**\r\n\t * Loads a module from a source.\r\n\t *\r\n\t * @param {Promise} modulePromise\r\n\t * @param {function} callback\r\n\t * @returns {Promise}\r\n\t */\r\n\tstatic load(modulePromise, callback)\r\n\t{\r\n\t\treturn modulePromise.then(module =>\r\n\t\t{\r\n\t\t\tif (callback)\r\n\t\t\t{\r\n\t\t\t\tcallback(module);\r\n\t\t\t}\r\n\t\t\treturn module;\r\n\t\t})\r\n\t\t.catch(error =>\r\n\t\t{\r\n\t\t\tconsole.error('Error loading module:', error);\r\n\t\t});\r\n\t}\r\n}", "import { Component } from \"../component/component.js\";\r\nimport { Jot } from \"../component/jot.js\";\r\nimport { Builder } from '../layout/builder.js';\r\nimport { Group } from \"./group.js\";\r\nimport { LayoutManager } from \"./layout-manager.js\";\r\nimport { ModuleLoader } from \"./module-loader.js\";\r\n\r\n/**\r\n * This will create a comment.\r\n *\r\n * @param {object} props\r\n * @returns {object}\r\n */\r\nconst Comment = (props) => ({\r\n\ttag: 'comment',\r\n\ttextContent: 'import placeholder',\r\n\tonCreated: props.onCreated\r\n});\r\n\r\n/**\r\n * This will get the promise from the src.\r\n *\r\n * @param {object|string} src\r\n * @returns {Promise}\r\n */\r\nconst getPromise = (src) =>\r\n{\r\n\tconst type = typeof src\r\n\tif (type === 'string')\r\n\t{\r\n\t\treturn import(src);\r\n\t}\r\n\telse if (type === 'function')\r\n\t{\r\n\t\treturn src();\r\n\t}\r\n\treturn src;\r\n};\r\n\r\n/**\r\n * ImportWrapper\r\n *\r\n * This will create an import wrapper component that\r\n * will wrap the comment atom to pass route to the\r\n * imported layout.\r\n *\r\n * @type {typeof Component}\r\n */\r\nexport const ImportWrapper = Jot(\r\n{\r\n\t/**\r\n\t * This will declare the component props.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tdeclareProps()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {boolean}\r\n\t\t */\r\n\t\tthis.loaded = false;\r\n\r\n\t\t/**\r\n\t\t * @member {boolean}\r\n\t\t */\r\n\t\tthis.blockRender = false;\r\n\t},\r\n\r\n\t/**\r\n\t * This will render the import wrapper.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\t/**\r\n\t\t * This will create a comment atom to be replaced\r\n\t\t * by the module.\r\n\t\t */\r\n\t\treturn Comment(\r\n\t\t{\r\n\t\t\tonCreated: (ele) =>\r\n\t\t\t{\r\n\t\t\t\tconst src = this.src;\r\n\t\t\t\tif (!src)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this.layout)\r\n\t\t\t\t{\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * This will cache the layout root to be removed\r\n\t\t\t\t\t * before the module is destroyed.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tthis.layoutRoot = LayoutManager.render(this.layout, this.panel, this.parent);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * This will set up a resource group to load the\r\n\t\t\t\t * depends before the module.\r\n\t\t\t\t */\r\n\t\t\t\tif (this.depends)\r\n\t\t\t\t{\r\n\t\t\t\t\tconst group = new Group(() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis.loadAndRender(ele);\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tgroup.addFiles(this.depends);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.loadAndRender(ele);\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * This will load the module and render the layout.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @returns {void}\r\n\t */\r\n\tloadAndRender(ele)\r\n\t{\r\n\t\tthis.src = getPromise(this.src);\r\n\t\tModuleLoader.load(this.src, (module) =>\r\n\t\t{\r\n\t\t\tthis.loaded = true;\r\n\r\n\t\t\t/**\r\n\t\t\t * We don't want to render if the render has been blocked\r\n\t\t\t * by the destroy method.\r\n\t\t\t */\r\n\t\t\tif (this.blockRender === true)\r\n\t\t\t{\r\n\t\t\t\tthis.blockRender = false;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst layout = this.layout || LayoutManager.process(module,\r\n\t\t\t{\r\n\t\t\t\tcallback: this.callback,\r\n\t\t\t\troute: this.route,\r\n\t\t\t\tpersist: this.persist\r\n\t\t\t});\r\n\r\n\t\t\tthis.layout = layout;\r\n\r\n\t\t\t/**\r\n\t\t\t * This will cache the layout root to be removed\r\n\t\t\t * before the module is destroyed.\r\n\t\t\t */\r\n\t\t\tthis.layoutRoot = LayoutManager.render(layout, ele, this.parent);\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * This will check if the layout should be updated.\r\n\t *\r\n\t * @param {object} layout\r\n\t * @returns {boolean}\r\n\t */\r\n\tshouldUpdate(layout)\r\n\t{\r\n\t\tif (this.updateLayout === true)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn (this.updateLayout = (layout && layout.isUnit && typeof layout.update === 'function'));\r\n\t},\r\n\r\n\t/**\r\n\t * This will update the module layout.\r\n\t *\r\n\t * @param {object} params\r\n\t * @returns {void}\r\n\t */\r\n\tupdateModuleLayout(params)\r\n\t{\r\n\t\tconst layout = this.layout;\r\n\t\tif (this.shouldUpdate(layout) && layout)\r\n\t\t{\r\n\t\t\tlayout.update(params);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will call if the import is added to a route. This will pass\r\n\t * the update params to the imported layout.\r\n\t *\r\n\t * @param {object} params\r\n\t * @returns {void}\r\n\t */\r\n\tupdate(params)\r\n\t{\r\n\t\tif (this.loaded === true)\r\n\t\t{\r\n\t\t\tthis.updateModuleLayout(params);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove the imported layout when the\r\n\t * comment is being removed.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tdestroy()\r\n\t{\r\n\t\tif (!this.layoutRoot)\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * The layout has been requested to load and now is called\r\n\t\t\t * destroy before the module has loaded.\r\n\t\t\t *\r\n\t\t\t * We will block the render and exit now.\r\n\t\t\t */\r\n\t\t\tthis.blockRender = true;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.blockRender = false;\r\n\t\tBuilder.removeNode(this.layoutRoot);\r\n\r\n\t\t/**\r\n\t\t * Clear all references to allow garbage collection.\r\n\t\t */\r\n\t\tthis.layoutRoot = null;\r\n\t\tthis.layout = null;\r\n\t\tthis.src = null;\r\n\t\tthis.route = null;\r\n\t\tthis.callback = null;\r\n\t\tthis.depends = null;\r\n\t}\r\n});", "import { ImportWrapper } from './import-wrapper.js';\r\n\r\n/**\r\n * This will import a module.\r\n *\r\n * @param {object|string} props\r\n * @returns {object}\r\n */\r\nexport const Import = (props) =>\r\n{\r\n\tconst type = typeof props;\r\n\tif (type === 'string' || type === 'function' || props instanceof Promise)\r\n\t{\r\n\t\tprops = {\r\n\t\t\tsrc: props\r\n\t\t};\r\n\t}\r\n\r\n\treturn new ImportWrapper(props);\r\n};", "import { Dom } from \"../../../../../base.js\";\r\nimport { DataTracker } from \"../../../../../main/data-tracker/data-tracker.js\";\r\nimport { Events } from \"../../../../../main/events/events.js\";\r\n\r\n/**\r\n * This will add the aniamtion class then remove it\r\n * when the aniamtion has ended.\r\n *\r\n * @param {object} ele\r\n * @param {string} className\r\n * @param {function|null} doneCallBack\r\n * @returns {void}\r\n */\r\nconst addAnimationClass = (ele, className, doneCallBack = null) =>\r\n{\r\n\tEvents.on('animationend', ele, function animateEnd()\r\n\t{\r\n\t\tDom.removeClass(ele, className);\r\n\t\tEvents.off('animationend', ele, animateEnd);\r\n\r\n\t\tif (doneCallBack)\r\n\t\t{\r\n\t\t\tdoneCallBack();\r\n\t\t}\r\n\t});\r\n\r\n\tDom.addClass(ele, className);\r\n};\r\n\r\n/**\r\n * This will add the animation on creation.\r\n *\r\n * @param {object} ele\r\n * @param {string} animationClass\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const animateIn = (ele, animationClass, parent) =>\r\n{\r\n\taddAnimationClass(ele, animationClass);\r\n};\r\n\r\n/**\r\n * This will add the animation on deletion.\r\n *\r\n * @param {object} ele\r\n * @param {string} animationClass\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const animateOut = (ele, animationClass, parent) =>\r\n{\r\n\tconst remove = () => (ele && ele.remove());\r\n\ttrack(ele, () => addAnimationClass(ele, animationClass, remove), parent);\r\n};\r\n\r\n/**\r\n * This will register the directive with the data tracker\r\n * to call the callback when the element is destroyed.\r\n */\r\nDataTracker.addType('manual-destroy', (data) =>\r\n{\r\n\tif (!data)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\tdata.callBack(data.ele, data.parent);\r\n});\r\n\r\n/**\r\n * This will track the animation to add the animation before destroy.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nconst track = (ele, callBack, parent) =>\r\n{\r\n\tDataTracker.add(ele, 'manual-destroy',\r\n\t{\r\n\t\tele,\r\n\t\tcallBack,\r\n\t\tparent\r\n\t});\r\n};", "import { Dom } from \"../../../../shared/dom.js\";\r\nimport { dataBinder } from \"../../../data-binder/data-binder.js\";\r\nimport { getBindAttr } from \"../../../data-binder/sources/get-bind-attr.js\";\r\nimport { Html } from \"../../../html/html.js\";\r\nimport { Builder } from \"../../builder.js\";\r\n\r\n/**\r\n * This will setup a data watcher.\r\n *\r\n * @param {object} ele\r\n * @param {object} data\r\n * @param {(function|object)} settings\r\n * @param {string} parent\r\n * @returns {void}\r\n */\r\nexport const onUpdate = (ele, data, settings, parent) =>\r\n{\r\n\tif (Array.isArray(settings[0]))\r\n\t{\r\n\t\tsettings.forEach((itemSettings) =>\r\n\t\t{\r\n\t\t\tif (!itemSettings)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tonUpdate(ele, data, itemSettings, parent);\r\n\t\t});\r\n\r\n\t\treturn;\r\n\t}\r\n\r\n\tsetWatcher(ele, data, settings, parent);\r\n};\r\n\r\n/**\r\n * This will setup a data watcher.\r\n *\r\n * @param {object} ele\r\n * @param {object} data\r\n * @param {array} settings\r\n * @param {string} parent\r\n * @returns {void}\r\n */\r\nconst setWatcher = (ele, data, settings, parent) =>\r\n{\r\n\tlet prop,\r\n\tcallBack;\r\n\r\n\tif (settings.length < 3)\r\n\t{\r\n\t\t[prop, callBack] = settings;\r\n\t}\r\n\telse\r\n\t{\r\n\t\t[data, prop, callBack] = settings;\r\n\t}\r\n\r\n\tif (!data || !prop)\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst update = getUpdateMethod(ele, prop, callBack, parent);\r\n\tdataBinder.watch(ele, data, prop, update);\r\n};\r\n\r\n/**\r\n * This will get the update method.\r\n *\r\n * @param {object} ele\r\n * @param {object} prop\r\n * @param {*} callBack\r\n * @param {object} parent\r\n * @returns {function}\r\n */\r\nconst getUpdateMethod = (ele, prop, callBack, parent) =>\r\n{\r\n\tif (typeof callBack === 'object')\r\n\t{\r\n\t\treturn (value) =>\r\n\t\t{\r\n\t\t\taddClass(ele, callBack, value);\r\n\t\t};\r\n\t}\r\n\r\n\treturn (value) =>\r\n\t{\r\n\t\tupdateElement(ele, callBack, prop, value, parent);\r\n\t};\r\n};\r\n\r\n/**\r\n * This will setup a data watcher.\r\n *\r\n * @private\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {string} value\r\n * @param {object} parent\r\n */\r\nconst updateElement = (ele, callBack, prop, value, parent) =>\r\n{\r\n\tlet result = callBack(value, ele, parent);\r\n\tswitch (typeof result)\r\n\t{\r\n\t\tcase 'object':\r\n\t\t\t/**\r\n\t\t\t * This will set the previous result if needed.\r\n\t\t\t */\r\n\t\t\trebuild(result, ele, parent);\r\n\t\t\tbreak;\r\n\t\tcase 'string':\r\n\t\t\tconst attr = getBindAttr(ele);\r\n\t\t\tif (attr !== 'textContent')\r\n\t\t\t{\r\n\t\t\t\tDom.setAttr(ele, attr, result);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tHtml.addHtml(ele, result);\r\n\t\t\tbreak;\r\n\t}\r\n};\r\n\r\n/**\r\n * This will reset an element innerHTML and rebuild.\r\n *\r\n * @private\r\n * @param {object} layout\r\n * @param {object} ele\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nconst rebuild = (layout, ele, parent) =>\r\n{\r\n\tBuilder.rebuild(layout, ele, parent);\r\n};\r\n\r\n/**\r\n * This will add or remove a class from an element.\r\n *\r\n * @param {object} ele\r\n * @param {object} stateStyles\r\n * @param {*} newValue\r\n * @returns {void}\r\n */\r\nconst addClass = (ele, stateStyles, newValue) =>\r\n{\r\n\tfor (const [prop, value] of Object.entries(stateStyles))\r\n\t{\r\n\t\tif (!prop)\r\n\t\t{\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (value === newValue)\r\n\t\t{\r\n\t\t\tDom.addClass(ele, prop);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tDom.removeClass(ele, prop);\r\n\t\t}\r\n\t}\r\n};", "import { onUpdate } from '../dom-methods.js';\r\nimport { getParentData } from './get-parent-data.js';\r\n\r\n/**\r\n * This will add an onSet watcher.\r\n *\r\n * @param {object} ele\r\n * @param {array} onSet\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const onSet = (ele, onSet, parent) =>\r\n{\r\n\tconst data = getParentData(parent);\r\n\tonUpdate(ele, data, onSet, parent);\r\n};", "import { Dom } from \"../../../../../shared/dom.js\";\r\nimport { onSet } from \"../reactive/on-set.js\";\r\n\r\n/**\r\n * This will add aria attributes.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {string} role\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addRole = (ele, role, parent) =>\r\n{\r\n if (!role)\r\n {\r\n return;\r\n }\r\n\r\n if (role)\r\n {\r\n Dom.setAttr(ele, 'role', role);\r\n }\r\n};\r\n\r\n/**\r\n * This will setup the onSet callBack.\r\n *\r\n * @param {string} attr\r\n * @returns {function}\r\n */\r\nconst onSetCallBack = (attr) =>\r\n{\r\n return (val, ele) =>\r\n {\r\n const text = (val)? \"true\" : \"false\";\r\n Dom.setAttr(ele, attr, text);\r\n };\r\n};\r\n\r\n/**\r\n * This will add aria attributes.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {object} attributes\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addAria = (ele, attributes, parent) =>\r\n{\r\n if (!attributes)\r\n {\r\n return;\r\n }\r\n\r\n const role = attributes.role;\r\n if (role)\r\n {\r\n Dom.setAttr(ele, 'role', role);\r\n attributes.role = null;\r\n }\r\n\r\n Object.entries(attributes).forEach(([key, value]) =>\r\n {\r\n if (value === null)\r\n {\r\n return;\r\n }\r\n\r\n const attr = `aria-${key}`;\r\n if (Array.isArray(value))\r\n {\r\n const settings = [...value];\r\n settings.push(onSetCallBack(attr));\r\n onSet(ele, settings, parent);\r\n }\r\n else\r\n {\r\n Dom.setAttr(ele, attr, value);\r\n }\r\n });\r\n}", "import { Builder } from \"../../builder.js\";\r\nimport { Parser } from \"../../element/parser.js\";\r\nimport { HtmlHelper } from \"../../html-helper.js\";\r\n\r\n/**\r\n * This will add the attributes to the element.\r\n *\r\n * @param {object} ele\r\n * @param {object} attributes\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addAttributes = (ele, attributes, parent) =>\r\n{\r\n if (!attributes)\r\n {\r\n return;\r\n }\r\n\r\n const parsed = Parser.parse(attributes, parent);\r\n HtmlHelper.addAttributes(ele, parsed.attr, parent);\r\n Builder.setDirectives(ele, parsed.directives, parent);\r\n};", "import { DataTracker } from \"../../../../../main/data-tracker/data-tracker.js\";\r\nimport { addAttributes } from \"../attribute-helpers.js\";\r\n\r\n/**\r\n * This will track the context from an atom to remove\r\n * it when the element is removed.\r\n */\r\nDataTracker.addType('context', (data) =>\r\n{\r\n\tif (!data)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\tdata.parent.removeContextBranch(data.branch);\r\n});\r\n\r\n/**\r\n * This will get the parent context.\r\n *\r\n * @param {object|null} parent\r\n * @returns {object|null}\r\n */\r\nconst getParentContext = (parent) =>\r\n{\r\n return (!parent)? null : parent.getContext();\r\n};\r\n\r\n/**\r\n * This will set the context attributes.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {function} context\r\n * @param {object} [parent]\r\n * @returns {void}\r\n */\r\nexport const context = (ele, context, parent) =>\r\n{\r\n if (typeof context !== 'function')\r\n {\r\n return;\r\n }\r\n\r\n const parentContext = getParentContext(parent);\r\n const attributes = context(parentContext);\r\n addAttributes(ele, attributes, parent);\r\n};\r\n\r\n/**\r\n * This will use the parent context.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} [parent]\r\n * @returns {void}\r\n */\r\nexport const useContext = (ele, callBack, parent) =>\r\n{\r\n if (typeof callBack !== 'function')\r\n {\r\n return;\r\n }\r\n\r\n const parentContext = getParentContext(parent);\r\n callBack(parentContext);\r\n};\r\n\r\n/**\r\n * This will add context the parent context.\r\n *\r\n * @param {object} ele\r\n * @param {array|function} callBack\r\n * @param {object} [parent]\r\n * @returns {void}\r\n */\r\nexport const addContext = (ele, callBack, parent) =>\r\n{\r\n if (typeof callBack !== 'function' || !parent)\r\n {\r\n return;\r\n }\r\n\r\n const parentContext = getParentContext(parent);\r\n const childContext = callBack(parentContext);\r\n if (!childContext)\r\n {\r\n return;\r\n }\r\n\r\n parent.addContextBranch(childContext[0], childContext[1]);\r\n}\r\n\r\n/**\r\n * This will track the child context on the element.\r\n *\r\n * @param {object} ele\r\n * @param {string} branchName\r\n * @param {object} parent\r\n */\r\nconst trackContext = (ele, branchName, parent) =>\r\n{\r\n DataTracker.add(ele, 'context',\r\n {\r\n branch: branchName,\r\n parent: parent\r\n });\r\n};", "/**\r\n * This is called whrn the data directive is used.\r\n *\r\n * @param {object} ele\r\n * @param {*} data\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const data = (ele, data, parent) =>\r\n{\r\n\r\n};", "/**\r\n * This will add an event to the parent events.\r\n *\r\n * @param {object} ele\r\n * @param {*} data\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const debug = (ele, data, parent) =>\r\n{\r\n if (!parent)\r\n {\r\n return;\r\n }\r\n\r\n const layout = (parent._layout)? parent._layout : parent.render();\r\n console.log('Debug: ', 'ele: ', ele);\r\n console.log('Data: ', data);\r\n console.log('Layout: ', layout);\r\n console.log('parent: ', parent);\r\n};", "import { Builder } from \"../../../builder.js\";\r\n\r\n/**\r\n * This will cache the element in the parent.\r\n *\r\n * @param {object} ele\r\n * @param {string} propName\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const cache = (ele, propName, parent) =>\r\n{\r\n // if (!propName || !parent)\r\n // {\r\n // return;\r\n // }\r\n\r\n // parent[propName] = ele;\r\n};\r\n\r\n/**\r\n * This will pass the parent state to the callBack.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const useParent = (ele, callBack, parent) =>\r\n{\r\n if (!callBack || !parent)\r\n {\r\n return;\r\n }\r\n\r\n const layout = callBack(parent, ele);\r\n if (!layout)\r\n {\r\n return;\r\n }\r\n\r\n Builder.build(layout, ele, parent);\r\n};\r\n\r\n/**\r\n * This will pass the parent state to the callBack.\r\n *\r\n * @param {object} ele\r\n * @param {string} name\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const getId = (ele, name, parent) =>\r\n{\r\n if (!name || !parent)\r\n {\r\n return;\r\n }\r\n\r\n const id = parent.getId(name);\r\n ele.id = id;\r\n};\r\n\r\n/**\r\n * This will pass the parent state to the callBack.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const useData = (ele, callBack, parent) =>\r\n{\r\n if (!callBack || !parent)\r\n {\r\n return;\r\n }\r\n\r\n const layout = callBack(parent.data, ele);\r\n if (!layout)\r\n {\r\n return;\r\n }\r\n\r\n Builder.build(layout, ele, parent);\r\n};\r\n\r\n/**\r\n * This will pass the parent state to the callBack.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const useState = (ele, callBack, parent) =>\r\n{\r\n if (!callBack || !parent)\r\n {\r\n return;\r\n }\r\n\r\n const layout = callBack(parent.state, ele);\r\n if (!layout)\r\n {\r\n return;\r\n }\r\n\r\n Builder.build(layout, ele, parent);\r\n};\r\n\r\n/**\r\n * This will pass the parent state to the callBack.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addState = (ele, callBack, parent) =>\r\n{\r\n if (!callBack || !parent)\r\n {\r\n return;\r\n }\r\n\r\n const state = parent.state;\r\n const states = callBack(state);\r\n if (!parent.state)\r\n {\r\n parent.setStateHelper(states);\r\n return;\r\n }\r\n\r\n parent.addState(states);\r\n};\r\n\r\n/**\r\n * This will add an event to the parent events.\r\n *\r\n * @param {object} ele\r\n * @param {array} event - event, element, function, capture\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addEvent = (ele, event, parent) =>\r\n{\r\n if (!event || !parent)\r\n {\r\n return;\r\n }\r\n\r\n if (!parent.events)\r\n {\r\n parent.setEventHelper();\r\n }\r\n\r\n /**\r\n * This will replace the callback funciton to pass\r\n * the parent and event.\r\n */\r\n if (event[2])\r\n {\r\n const callBack = event[2];\r\n event[2] = (e) =>\r\n {\r\n callBack(e, parent);\r\n };\r\n }\r\n\r\n parent.events.on(...event);\r\n};", "import { dataBinder } from '../../../../data-binder/data-binder.js';\r\nimport { getParentData } from './get-parent-data.js';\r\n\r\n/**\r\n * This will bind an element to data.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {(string|array)} bind\r\n * @param {*} parent\r\n * @returns {void}\r\n */\r\nexport const bind = (ele, bind, parent) =>\r\n{\r\n let data, prop, filter;\r\n\r\n if (typeof bind === 'string')\r\n {\r\n data = getParentData(parent);\r\n if (!data)\r\n {\r\n return;\r\n }\r\n prop = bind;\r\n }\r\n else if (Array.isArray(bind))\r\n {\r\n if ((typeof bind[0] !== 'object'))\r\n {\r\n const dataSource = getParentData(parent);\r\n if (!dataSource)\r\n {\r\n return;\r\n }\r\n\r\n bind.unshift(dataSource);\r\n }\r\n\r\n [data, prop, filter] = bind;\r\n }\r\n\r\n dataBinder.bind(ele, data, prop, filter);\r\n};", "import { onUpdate } from '../dom-methods.js';\r\n\r\n/**\r\n * This will add an onState watcher.\r\n *\r\n * @param {object} ele\r\n * @param {array} onState\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const onState = (ele, onState, parent) =>\r\n{\r\n onUpdate(ele, parent.state, onState, parent);\r\n};", "import { Dom } from \"../../../../../shared/dom.js\";\r\nimport { onSet } from \"../reactive/on-set.js\";\r\nimport { onState } from \"./on-state.js\";\r\n\r\n/**\r\n * This will setup the onSet callBack.\r\n *\r\n * @param {array} dataValue\r\n * @returns {function}\r\n */\r\nconst onSetCallBack = (dataValue) =>\r\n{\r\n return (newValue, ele) =>\r\n {\r\n const [attr, value, addingString = 'active'] = dataValue;\r\n const text = (newValue === value)? addingString : \"\";\r\n Dom.setData(ele, attr, text);\r\n };\r\n};\r\n\r\n/**\r\n * This will add data set attibute by binding to the data prop.\r\n *\r\n * @param {object} ele\r\n * @param {array} attribute\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addDataSet = (ele, attribute, parent) =>\r\n{\r\n if (!attribute)\r\n {\r\n return;\r\n }\r\n\r\n /**\r\n * This will remove the last value from the attribute array\r\n * to use as the data value.\r\n */\r\n const settings = [...attribute];\r\n const dataValue = settings.pop();\r\n\r\n /**\r\n * This will add a callBack to to be used when the\r\n * data is set.\r\n */\r\n settings.push(onSetCallBack(dataValue));\r\n onSet(ele, settings, parent);\r\n}\r\n\r\n/**\r\n * This will add data set attibute by binding to the data prop.\r\n *\r\n * @param {object} ele\r\n * @param {array} attribute\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addDataStateSet = (ele, attribute, parent) =>\r\n{\r\n if (!attribute)\r\n {\r\n return;\r\n }\r\n\r\n /**\r\n * This will remove the last value from the attribute array\r\n * to use as the data value.\r\n */\r\n const settings = [...attribute];\r\n const dataValue = settings.pop();\r\n\r\n /**\r\n * This will add a callBack to to be used when the\r\n * data is set.\r\n */\r\n settings.push(onSetCallBack(dataValue));\r\n onState(ele, settings, parent);\r\n}", "import { dataBinder } from \"../../../../data-binder/data-binder.js\";\r\nimport { Builder } from \"../../../builder.js\";\r\nimport { getParentData } from './get-parent-data.js';\r\n\r\n/**\r\n * This will watch a data attr and update the\r\n * children to the element when the attr value is updated.\r\n *\r\n * @param {object} ele\r\n * @param {array} settings\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const forEach = (ele, settings, parent) =>\r\n{\r\n let data, prop, item, scope;\r\n\r\n if (settings.length < 3)\r\n {\r\n const parentData = getParentData(parent);\r\n if (!parentData)\r\n {\r\n return;\r\n }\r\n\r\n data = parentData;\r\n [prop, item, scope] = settings;\r\n }\r\n else\r\n {\r\n [data, prop, item, scope] = settings;\r\n }\r\n\r\n const scopeData = (scope !== false);\r\n dataBinder.watch(ele, data, prop, (items) =>\r\n {\r\n Builder.removeAll(ele);\r\n if (!items || items.length < 1)\r\n {\r\n return;\r\n }\r\n\r\n const children = [];\r\n items.forEach((row, index) =>\r\n {\r\n const scoped = (scopeData)? data.scope(`${prop}[${index}]`) : null;\r\n const layout = item(\r\n items[index],\r\n index,\r\n scoped,\r\n children\r\n );\r\n if (layout === null)\r\n {\r\n return;\r\n }\r\n\r\n children.push(layout);\r\n });\r\n\r\n return Builder.build(children, ele, parent);\r\n });\r\n}", "import { Builder } from \"../../../builder.js\";\r\n\r\n/**\r\n * This will map children to the element.\r\n *\r\n * @param {object} ele\r\n * @param {array} settings\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const map = (ele, settings, parent) =>\r\n{\r\n\tconst items = settings[0];\r\n\tif (!items || items.length < 1)\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst item = settings[1];\r\n\tconst children = [];\r\n\r\n\titems.forEach((row, i) =>\r\n\t{\r\n\t\tif (!row)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst layout = item(row, i);\r\n\t\tif (layout === null)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tchildren.push(layout);\r\n\t});\r\n\r\n\tBuilder.build(children, ele, parent);\r\n};", "/**\r\n * This will be called when an element onCreated directive is called.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const onCreated = (ele, callBack, parent) =>\r\n{\r\n\tcallBack(ele, parent);\r\n};", "import { DataTracker } from \"../../../../../main/data-tracker/data-tracker.js\";\r\n\r\n/**\r\n * This will register the directive with the data tracker\r\n * to call the callback when the element is destroyed.\r\n */\r\nDataTracker.addType('destroyed', (data) =>\r\n{\r\n\tif (!data)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\tdata.callBack(data.ele, data.parent);\r\n});\r\n\r\n/**\r\n * This will add a callback to be called when\r\n * the element is destroyed.\r\n *\r\n * @param {object} ele\r\n * @param {(object|array)} callBack\r\n * @param {object} [parent]\r\n * @returns {void}\r\n */\r\nexport const onDestroyed = (ele, callBack, parent) =>\r\n{\r\n track(ele, callBack, parent);\r\n};\r\n\r\n/**\r\n * This will track a route.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nconst track = (ele, callBack, parent) =>\r\n{\r\n DataTracker.add(ele, 'destroyed',\r\n {\r\n ele,\r\n callBack,\r\n parent\r\n });\r\n};", "import { WatcherHelper } from '../../../watcher-helper.js';\r\n\r\n/**\r\n * This will add a watcher.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {(array|object)} watcher\r\n * @param {object} [parent]\r\n * @returns {void}\r\n */\r\nexport const watch = (ele, watcher, parent) =>\r\n{\r\n if (!watcher)\r\n {\r\n return;\r\n }\r\n\r\n if (Array.isArray(watcher) && typeof watcher[0] !== 'string')\r\n {\r\n for (var i = 0, length = watcher.length; i < length; i++)\r\n {\r\n WatcherHelper.setup(ele, watcher[i], parent);\r\n }\r\n }\r\n else\r\n {\r\n WatcherHelper.setup(ele, watcher, parent);\r\n }\r\n};", "\r\nlet routerNumber = 0;\r\n\r\n/**\r\n * History\r\n *\r\n * This will setup the history controller.\r\n * @class\r\n */\r\nexport class History\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} router\r\n\t */\r\n\tconstructor(router)\r\n\t{\r\n\t\tthis.router = router;\r\n\t\tthis.locationId = 'base-app-router-' + routerNumber++;\r\n\t\tthis.callBack = this.check.bind(this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the history api is supported\r\n\t * and add events.\r\n\t *\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.addEvent();\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check to activate the router.\r\n\t *\r\n\t * @param {object} evt\r\n\t */\r\n\tcheck(evt)\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the current scroll position.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tgetScrollPosition()\r\n\t{\r\n\t\treturn {\r\n\t\t\tx: window.scrollX,\r\n\t\t\ty: window.scrollY\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will scroll to a position.\r\n\t *\r\n\t * @param {object} scrollPosition\r\n\t * @returns {void}\r\n\t */\r\n\tscrollTo(scrollPosition)\r\n\t{\r\n\t\twindow.scrollTo(scrollPosition.x, scrollPosition.y);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\taddEvent()\r\n\t{\r\n\t\treturn this;\r\n\t}\r\n}", "import { Events } from \"../../../main/events/events.js\";\r\nimport { History } from \"./history.js\";\r\n\r\n/**\r\n * BrowserHistory\r\n *\r\n * This will setup the history controller.\r\n *\r\n * @class\r\n */\r\nexport class BrowserHistory extends History\r\n{\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\taddEvent()\r\n\t{\r\n\t\tEvents.on('popstate', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t *\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\tremoveEvent()\r\n\t{\r\n\t\tEvents.off('popstate', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check to activate the router.\r\n\t *\r\n\t * @param {object} evt\r\n\t */\r\n\tcheck(evt)\r\n\t{\r\n\t\t/* we want to check if the event has a state and if the\r\n\t\tstate location is from the background */\r\n\t\tconst state = evt.state;\r\n\t\tif (!state || state.location !== this.locationId)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tevt.preventDefault();\r\n\t\tevt.stopPropagation();\r\n\r\n\t\tthis.router.checkActiveRoutes(state.uri);\r\n\r\n\t\tconst scrollPosition = state.scrollPosition;\r\n\t\tif (scrollPosition)\r\n\t\t{\r\n\t\t\tthis.scrollTo(scrollPosition);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a state object.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {*} data\r\n\t * @returns {object}\r\n\t */\r\n\tcreateState(uri, data = {})\r\n\t{\r\n\t\tconst scrollPosition = this.getScrollPosition();\r\n\r\n\t\treturn {\r\n\t\t\tlocation: this.locationId,\r\n\t\t\t...data,\r\n\t\t\tscrollPosition,\r\n\t\t\turi\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a state to the history.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {object} data\r\n\t * @param {boolean} replace\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\taddState(uri, data, replace = false)\r\n\t{\r\n\t\tconst history = window.history,\r\n\t\tlastState = history.state;\r\n\t\tif (lastState && lastState.uri === uri)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst stateObj = this.createState(uri, data);\r\n\t\tconst method = (replace === false)? 'pushState' : 'replaceState';\r\n\t\thistory[method](stateObj, null, uri);\r\n\r\n\t\treturn this;\r\n\t}\r\n}", "import { Events } from \"../../../main/events/events.js\";\r\nimport { History } from \"./history.js\";\r\n\r\n/**\r\n * HashHistory\r\n *\r\n * This will setup the history controller.\r\n *\r\n * @class\r\n */\r\nexport class HashHistory extends History\r\n{\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\taddEvent()\r\n\t{\r\n\t\tEvents.on('hashchange', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t *\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\tremoveEvent()\r\n\t{\r\n\t\tEvents.off('hashchange', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check to activate the router.\r\n\t *\r\n\t * @param {object} evt\r\n\t */\r\n\tcheck(evt)\r\n\t{\r\n\t\tthis.router.checkActiveRoutes(evt.newURL);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a state to the history.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {object} data\r\n\t * @param {boolean} replace\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\taddState(uri, data, replace)\r\n\t{\r\n\t\twindow.location.hash = uri;\r\n\r\n\t\treturn this;\r\n\t}\r\n}", "import { BrowserHistory } from './browser-history.js';\r\nimport { HashHistory } from './hash-history.js';\r\n\r\n/**\r\n * HistoryController\r\n *\r\n * This will setup the history controller.\r\n *\r\n * @class\r\n */\r\nexport class HistoryController\r\n{\r\n /**\r\n * This will check if browser based navigation is supported\r\n *\r\n * @returns {boolean}\r\n */\r\n static browserIsSupported()\r\n {\r\n return (typeof window === 'object' && 'history' in window && 'pushState' in window.history);\r\n }\r\n\r\n /**\r\n * This will create a History Object based on navigation support\r\n *\r\n * @param {object} router\r\n * @returns {object}\r\n */\r\n static setup(router)\r\n {\r\n if (this.browserIsSupported())\r\n {\r\n return new BrowserHistory(router).setup();\r\n }\r\n\r\n return new HashHistory(router).setup();\r\n }\r\n}", "import { Component } from \"./component.js\";\r\nimport { Jot } from \"./jot.js\";\r\n\r\n/**\r\n * Cloak Component\r\n *\r\n * This will create a component that can accept data from a parent component\r\n * or it will use the parent's data or context data to set a local context\r\n * to act as if it's data scope is the parent component.\r\n *\r\n * @type {typeof Component}\r\n */\r\nexport class CloakComponent extends Component\r\n{\r\n\t/**\r\n\t * This will get the child scope instance of the component.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tgetChildScope()\r\n\t{\r\n\t\treturn this.parent;\r\n\t}\r\n}\r\n\r\n/**\r\n * This will create a Cloak component.\r\n *\r\n * @param {*} props\r\n * @returns {typeof CloakComponent}\r\n */\r\nexport const Cloak = (props) => Jot(props, CloakComponent);\r\n", "import { Cloak } from \"../../component/cloak.js\";\r\nimport { Builder } from \"../../layout/builder.js\";\r\n\r\n/**\r\n * ComponentHelper\r\n *\r\n * This will create a helper to create and destroy components\r\n * that are added to a route.\r\n *\r\n * @class\r\n */\r\nexport class ComponentHelper\r\n{\r\n\t/**\r\n\t * This will create a component helper.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} routeProxy\r\n\t * @param {object} settings\r\n\t */\r\n\tconstructor(routeProxy, settings)\r\n\t{\r\n\t\tthis.route = routeProxy;\r\n\r\n\t\tthis.template = settings.component;\r\n\t\tthis.component = null;\r\n\t\tthis.hasTemplate = false;\r\n\r\n\t\tthis.setup = false;\r\n\t\tthis.container = settings.container;\r\n\t\tthis.persist = settings.persist;\r\n\t\tthis.parent = settings.parent;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the component.\r\n\t *\r\n\t * @param {object} params\r\n\t * @returns {void}\r\n\t */\r\n\tfocus(params)\r\n\t{\r\n\t\tif (this.setup === false)\r\n\t\t{\r\n\t\t\tthis.create();\r\n\t\t}\r\n\r\n\t\tthis.update(params);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the template.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetupTemplate()\r\n\t{\r\n\t\tconst template = this.template;\r\n\t\tconst type = typeof template;\r\n\t\tif (type === 'function')\r\n\t\t{\r\n\t\t\tthis.initializeComponent();\r\n\t\t}\r\n\t\telse if (type === 'object')\r\n\t\t{\r\n\t\t\tthis.initializeTemplateObject();\r\n\t\t}\r\n\r\n\t\tthis.hasTemplate = true;\r\n\t}\r\n\r\n\t/**\r\n\t * This will initialize the component by calling the function\r\n\t * that should return a new instance of a component.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tinitializeComponent()\r\n\t{\r\n\t\tconst comp = this.template();\r\n this.transferSettings(comp);\r\n }\r\n\r\n\t/**\r\n\t * This will transfer the settings to the component.\r\n\t *\r\n\t * @param {object} comp\r\n\t * @returns {void}\r\n\t */\r\n\ttransferSettings(comp)\r\n\t{\r\n\t\tthis.persist = (this.persist && comp.persist !== false);\r\n Object.assign(comp, { route: this.route, persist: this.persist });\r\n\t\tthis.component = comp;\r\n\t}\r\n\r\n\t/**\r\n\t * This will initialize the template object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tinitializeTemplateObject()\r\n\t{\r\n if (!this.template.isUnit)\r\n\t\t{\r\n this.template = new (Cloak(this.template));\r\n }\r\n\r\n const comp = this.template;\r\n this.transferSettings(comp);\r\n }\r\n\r\n\t/**\r\n\t * This will create the route component.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tcreate()\r\n\t{\r\n\t\tthis.setupTemplate();\r\n\r\n\t\tif (!this.hasTemplate)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.setup = true;\r\n\t\tconst comp = this.component;\r\n\t\tBuilder.render(comp, this.container, this.parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the component.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tremove()\r\n\t{\r\n\t\tif (this.setup !== true)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.setup = false;\r\n\r\n\t\tconst component = this.component;\r\n\t\tif (!component)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (typeof component.destroy === 'function')\r\n\t\t{\r\n\t\t\tcomponent.destroy();\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Clear component reference to allow garbage collection.\r\n\t\t * Note: We keep template, container, parent, and route\r\n\t\t * so the component can be recreated if the route is selected again.\r\n\t\t */\r\n\t\tthis.component = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will call the component update method and pass the params.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} params\r\n\t * @returns {void}\r\n\t */\r\n\tupdate(params)\r\n\t{\r\n\t\tconst component = this.component;\r\n\t\tif (!component)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (typeof component.update === 'function')\r\n\t\t{\r\n\t\t\tcomponent.update(params);\r\n\t\t}\r\n\t}\r\n}", "/**\r\n * This will get the default route params.\r\n *\r\n * @param {array} params\r\n * @returns {(object|null)}\r\n */\r\nexport const getParamDefaults = (params) =>\r\n{\r\n\tif (!params.length)\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst defaults = {};\r\n\tparams.forEach((param) =>\r\n\t{\r\n\t\tdefaults[param] = null;\r\n\t});\r\n\r\n\treturn defaults;\r\n};\r\n\r\n/**\r\n * This will get the param keys from the uri.\r\n *\r\n * @param {string} uri\r\n * @returns {array}\r\n */\r\nexport const paramPattern = (uri) =>\r\n{\r\n\tconst params = [];\r\n\tif (!uri)\r\n\t{\r\n\t\treturn params;\r\n\t}\r\n\r\n\tconst filter = /[*?]/g;\r\n\turi = uri.replace(filter, '');\r\n\r\n\tconst pattern = /:(.[^./?&($]+)\\?*/g,\r\n\tmatches = uri.match(pattern);\r\n\tif (matches === null)\r\n\t{\r\n\t\treturn params;\r\n\t}\r\n\r\n\tmatches.forEach((param) =>\r\n\t{\r\n\t\tif (param)\r\n\t\t{\r\n\t\t\tparam = param.replace(':', '');\r\n\t\t\tparams.push(param);\r\n\t\t}\r\n\t});\r\n\r\n\treturn params;\r\n};", "/**\r\n * Replaces all slashes in the URI.\r\n *\r\n * @param {string} uri - The URI to process.\r\n * @returns {string} - The processed URI.\r\n */\r\nconst replaceSlashes = (uri) => uri.replace(/\\//g, \"/\");\r\n\r\n/**\r\n * Sets up optional slashes before the optional params.\r\n *\r\n * @param {string} uriQuery - The URI query to process.\r\n * @returns {string} - The processed URI query.\r\n */\r\nconst setupOptionalSlashes = (uriQuery) =>\r\n{\r\n\treturn uriQuery.replace(/(\\/):[^/(]*?\\?/g, (str) => str.replace(/\\//g, '(?:$|/)'));\r\n};\r\n\r\n/**\r\n * Sets up optional params and params and stops at the last slash or query start.\r\n *\r\n * @param {string} uriQuery - The URI query to process.\r\n * @returns {string} - The processed URI query.\r\n */\r\nconst setupOptionalParams = (uriQuery) =>\r\n{\r\n uriQuery = uriQuery.replace(/(\\?\\/+\\*?)/g, '?/*');\r\n return uriQuery.replace(/(:[^/?&($]+)/g, (str) => (str.indexOf('.') < 0) ? '([^/|?]+)' : '([^/|?]+.*)');\r\n};\r\n\r\n/**\r\n * Sets up the wildcard and param checks to be modified to the route URI string.\r\n *\r\n * @param {string} uriQuery - The URI query to process.\r\n * @returns {string} - The processed URI query.\r\n */\r\nconst setupWildcard = (uriQuery) => uriQuery.replace(/(\\*)/g, '.*');\r\n\r\n/**\r\n * Sets the string end if the wildcard is not set.\r\n *\r\n * @param {string} uriQuery - The URI query to process.\r\n * @param {string} uri - The original URI.\r\n * @returns {string} - The processed URI query.\r\n */\r\nconst setStringEnd = (uriQuery, uri) => uriQuery += (uri[uri.length - 1] === '*') ? '' : '$';\r\n\r\n/**\r\n * Sets up a route URI pattern.\r\n *\r\n * @param {string} uri - The URI to process.\r\n * @returns {string} - The processed URI pattern.\r\n */\r\nexport const routePattern = (uri) =>\r\n{\r\n if (!uri)\r\n\t{\r\n return '';\r\n }\r\n\r\n let uriQuery = replaceSlashes(uri);\r\n uriQuery = setupOptionalSlashes(uriQuery);\r\n uriQuery = setupOptionalParams(uriQuery);\r\n uriQuery = setupWildcard(uriQuery);\r\n uriQuery = setStringEnd(uriQuery, uri);\r\n return uriQuery;\r\n};", "import { DataProxy } from '../../data/data-proxy.js';\r\nimport { BasicData } from '../../data/types/basic-data.js';\r\nimport { Import } from '../../import/import.js';\r\nimport { ComponentHelper } from './component-helper.js';\r\nimport { getParamDefaults, paramPattern } from './param-pattern.js';\r\nimport { routePattern } from './route-pattern.js';\r\n\r\n/**\r\n * This will keep track of the route count.\r\n *\r\n * @type {number}\r\n */\r\nlet routeCount = 0;\r\n\r\n/**\r\n * Route\r\n *\r\n * This will create a route.\r\n *\r\n * @class\r\n * @augments BasicData\r\n */\r\nexport class Route extends BasicData\r\n{\r\n\t/**\r\n\t * This will create a route.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} settings\r\n\t * @param {function} titleCallBack\r\n\t */\r\n\tconstructor(settings, titleCallBack)\r\n\t{\r\n\t\tconst uri = settings.baseUri;\r\n\r\n\t\tconst paramKeys = paramPattern(uri);\r\n\t\tconst params = getParamDefaults(paramKeys);\r\n\t\tconst proxy = super(params);\r\n\r\n\t\tthis.uri = uri;\r\n\t\tthis.paramKeys = paramKeys;\r\n\t\tthis.titleCallBack = titleCallBack;\r\n\r\n\t\tthis.setupRoute(settings);\r\n\t\tthis.set('active', false);\r\n\r\n\t\t// @ts-ignore\r\n\t\treturn proxy;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the data object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.stage = {};\r\n\t\tthis.id = null;\r\n\t\tthis.uri = null;\r\n\t\tthis.uriQuery = null;\r\n\t\tthis.controller = null;\r\n\t\tthis.paramKeys = null;\r\n\t\tthis.titleCallBack = null;\r\n\t\tthis.path = null;\r\n\t\tthis.referralPath = null;\r\n\t\tthis.params = null;\r\n\t\tthis.callBack = null;\r\n\t\tthis.title = null;\r\n\t\tthis.preventScroll = false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the route settings.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} settings\r\n\t * @returns {void}\r\n\t */\r\n\tsetupRoute(settings)\r\n\t{\r\n\t\tthis.id = settings.id || 'bs-rte-' + routeCount++;\r\n\r\n\t\tthis.path = null;\r\n\t\tthis.referralPath = null;\r\n\r\n\t\t/* route reg ex */\r\n\t\tlet uriMatch = routePattern(this.uri);\r\n\t\tthis.uriQuery = new RegExp('^' + uriMatch);\r\n\r\n\t\t/* params */\r\n\t\tthis.params = null;\r\n\r\n\t\t/* this will setup the template and route component\r\n\t\tif one has been set */\r\n\t\tthis.setupComponentHelper(settings);\r\n\r\n\t\tthis.callBack = settings.callBack;\r\n\t\tthis.title = settings.title;\r\n\t\tthis.preventScroll = settings.preventScroll || false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the route title.\r\n\t *\r\n\t * @param {string|function} title\r\n\t * @returns {void}\r\n\t */\r\n\tsetTitle(title)\r\n\t{\r\n\t\tthis.title = title;\r\n\t\tthis.titleCallBack(this, title);\r\n\t}\r\n\r\n\t/**\r\n\t * This will deactivate the route.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tdeactivate()\r\n\t{\r\n\t\tthis.set('active', false);\r\n\r\n\t\tconst controller = this.controller;\r\n\t\tif (controller)\r\n\t\t{\r\n\t\t\tcontroller.remove();\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Clear the path references to allow garbage collection.\r\n\t\t */\r\n\t\tthis.path = null;\r\n\t\tthis.referralPath = null;\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the route layout.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetLayout(settings)\r\n\t{\r\n\t\tif (settings.component)\r\n\t\t{\r\n\t\t\treturn settings.component;\r\n\t\t}\r\n\r\n\t\tlet imported = settings.import;\r\n\t\tif (!imported)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn Import(imported);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the route layout.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} settings\r\n\t * @returns {void}\r\n\t */\r\n\tsetupComponentHelper(settings)\r\n\t{\r\n\t\tconst component = this.getLayout(settings);\r\n\t\tif (!component)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst {container, persist, parent} = settings;\r\n\t\tconst helperSettings =\r\n\t\t{\r\n\t\t\tcomponent,\r\n\t\t\tcontainer,\r\n\t\t\tpersist,\r\n\t\t\tparent\r\n\t\t};\r\n\r\n\t\tconst proxy = DataProxy(this);\r\n\t\tthis.controller = new ComponentHelper(proxy, helperSettings);\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume the route.\r\n\t *\r\n\t * @param {object} container\r\n\t * @returns {void}\r\n\t */\r\n\tresume(container)\r\n\t{\r\n\t\tconst controller = this.controller;\r\n\t\tif (controller)\r\n\t\t{\r\n\t\t\tcontroller.container = container;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the route path.\r\n\t *\r\n\t * @param {string} path\r\n\t * @param {string} referralPath\r\n\t * @returns {void}\r\n\t */\r\n\tsetPath(path, referralPath)\r\n\t{\r\n\t\tthis.path = path;\r\n\t\tthis.referralPath = referralPath;\r\n\t}\r\n\r\n\t/**\r\n\t * This will select the route.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tselect()\r\n\t{\r\n\t\tthis.set('active', true);\r\n\r\n\t\tconst params = this.stage,\r\n\t\tcallBack = this.callBack;\r\n\t\tif (typeof callBack === 'function')\r\n\t\t{\r\n\t\t\tcallBack(params);\r\n\t\t}\r\n\r\n\t\tconst controller = this.controller;\r\n\t\tif (controller)\r\n\t\t{\r\n\t\t\tcontroller.focus(params);\r\n\t\t}\r\n\r\n\t\tconst path = this.path;\r\n\t\tif (!path)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst hash = path.split('#')[1];\r\n\t\tif (!hash)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.scrollToId(hash);\r\n\t}\r\n\r\n\t/**\r\n\t * This will scroll to the element by id.\r\n\t *\r\n\t * @param {string} hash\r\n\t * @returns {void}\r\n\t */\r\n\tscrollToId(hash)\r\n\t{\r\n\t\tif (!hash)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst ele = document.getElementById(hash);\r\n\t\tif (!ele)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tele.scrollIntoView(true);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a route matches the path.\r\n\t *\r\n\t * @param {string} path\r\n\t * @returns {object|boolean}\r\n\t */\r\n\tmatch(path)\r\n\t{\r\n\t\t/**\r\n\t\t * @type {boolean|array}\r\n\t\t */\r\n\t\tlet matched = false;\r\n\r\n\t\t/**\r\n\t\t * We want to check to use the supplied uri or get the\r\n\t\t * current uri if not setup.\r\n\t\t */\r\n\t\tconst result = path.match(this.uriQuery);\r\n\t\tif (result === null)\r\n\t\t{\r\n\t\t\tthis.resetParams();\r\n\t\t\treturn matched;\r\n\t\t}\r\n\r\n\t\tif (!Array.isArray(result))\r\n\t\t{\r\n\t\t\treturn matched;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will remove the first match from the\r\n\t\t * the params.\r\n\t\t */\r\n\t\tresult.shift();\r\n\t\tmatched = result;\r\n\r\n\t\t/**\r\n\t\t * This will get the uri params of the route\r\n\t\t * and if set will save them to the route.\r\n\t\t */\r\n\t\tthis.setParams(result);\r\n\t\treturn matched;\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset the params.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tresetParams()\r\n\t{\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the params.\r\n\t *\r\n\t * @param {object} values\r\n\t */\r\n\tsetParams(values)\r\n\t{\r\n\t\tif (!Array.isArray(values))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst keys = this.paramKeys;\r\n\t\tif (!keys)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst params = {};\r\n\t\tkeys.forEach((key, i) =>\r\n\t\t{\r\n\t\t\tif (typeof key !== 'undefined')\r\n\t\t\t{\r\n\t\t\t\tparams[key] = values[i];\r\n\t\t\t}\r\n\t\t});\r\n\t\tthis.set(params);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the params.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tgetParams()\r\n\t{\r\n\t\treturn this.stage;\r\n\t}\r\n}", "/**\r\n * This will convert a string to title case.\r\n *\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst toTitleCase = (str) =>\r\n{\r\n const pattern = /\\w\\S*/;\r\n return str.replace(pattern, (txt) =>\r\n {\r\n return txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();\r\n });\r\n};\r\n\r\n/**\r\n * This will replace any params in the string.\r\n *\r\n * @param {string} str\r\n * @param {object} route\r\n * @returns {string}\r\n */\r\nconst replaceParams = (str, route) =>\r\n{\r\n if (str.indexOf(':') === -1)\r\n {\r\n return str;\r\n }\r\n\r\n const params = route.stage;\r\n for (const [key, value] of Object.entries(params))\r\n {\r\n const pattern = new RegExp(':' + key, 'gi');\r\n str = str.replace(pattern, value);\r\n }\r\n\r\n return str;\r\n};\r\n\r\n/**\r\n * This will create a title.\r\n *\r\n * @param {object} route\r\n * @param {*} title\r\n * @returns {string}\r\n */\r\nconst createTitle = (route, title) =>\r\n{\r\n if (!title)\r\n {\r\n return title;\r\n }\r\n\r\n if (typeof title === 'function')\r\n {\r\n title = title(route.stage);\r\n }\r\n\r\n title = replaceParams(title, route);\r\n return toTitleCase(title);\r\n};\r\n\r\n/**\r\n * This will add the root title to the title.\r\n *\r\n * @param {string} title\r\n * @param {string} rootTitle\r\n * @returns {string}\r\n */\r\nconst addRootTitle = (title, rootTitle) =>\r\n{\r\n if (rootTitle !== '')\r\n {\r\n title += \" - \" + rootTitle;\r\n }\r\n return title;\r\n};\r\n\r\n/**\r\n * This will set the title.\r\n *\r\n * @param {object} route\r\n * @param {*} title\r\n * @param {string} rootTitle\r\n * @returns {string}\r\n */\r\nexport const setTitle = (route, title, rootTitle) =>\r\n{\r\n if (!title)\r\n {\r\n return title;\r\n }\r\n\r\n title = createTitle(route, title);\r\n return addRootTitle(title, rootTitle);\r\n};", "/**\r\n * Utils\r\n *\r\n * These are some helper functions for the router.\r\n *\r\n * @constant\r\n * @type {object} Utils\r\n */\r\nexport const Utils =\r\n{\r\n\t/**\r\n\t * This will remove the begining and ending slashes from a url.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @returns {string}\r\n\t */\r\n\tremoveSlashes(uri)\r\n\t{\r\n\t\tif (typeof uri !== 'string')\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Remove the first slash.\r\n\t\t */\r\n\t\tif (uri.substring(0, 1) === '/')\r\n\t\t{\r\n\t\t\turi = uri.substring(1);\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Remove the last slash.\r\n\t\t */\r\n\t\tif (uri.substring(-1) === '/')\r\n\t\t{\r\n\t\t\turi = uri.substring(0, uri.length - 1);\r\n\t\t}\r\n\r\n\t\treturn uri;\r\n\t}\r\n};", "import { Component } from '../component/component.js';\r\nimport { router } from './router.js';\r\n\r\n/**\r\n * Watcher\r\n *\r\n * This will create a watcher object.\r\n *\r\n * @param {string} attr\r\n * @param {string} value\r\n * @returns {object}\r\n */\r\nconst Watcher = (attr, value) => ({\r\n attr,\r\n value\r\n});\r\n\r\n/**\r\n * This will check if the path is active.\r\n *\r\n * @param {string} path\r\n * @param {string} url\r\n * @returns {boolean}\r\n */\r\nconst iSActive = (path, url) => new RegExp('^' + path + '($|#|/|\\\\.).*').test(url);\r\n\r\n/**\r\n * NavLink\r\n *\r\n * This will create a nav link that will add an active\r\n * class when the browser route path matches the link\r\n * href.\r\n *\r\n * @property {string} activeClass - The active class to add.\r\n * @property {string} class - The class\r\n * @property {string} exact - The exact match\r\n * @property {string|object} href - The href or watcher object\r\n * @property {string|object} text - The text or watcher object\r\n * @property {array|string} nest - The nested elements\r\n *\r\n * @class\r\n * @extends Component\r\n */\r\nexport class NavLink extends Component\r\n{\r\n /**\r\n * This will configure the link active class.\r\n *\r\n * @protected\r\n * @returns {void}\r\n */\r\n beforeSetup()\r\n {\r\n // @ts-ignore\r\n this.selectedClass = this.activeClass || 'active';\r\n }\r\n\r\n /**\r\n * This will render the component.\r\n *\r\n * @returns {object}\r\n */\r\n render()\r\n {\r\n // @ts-ignore\r\n const href = this.href,\r\n // @ts-ignore\r\n text = this.text,\r\n watchers = this.setupWatchers(href, text);\r\n\r\n return {\r\n tag: 'a',\r\n // @ts-ignore\r\n class: this.class || this.className || null,\r\n onState: ['selected', {\r\n [this.selectedClass]: true\r\n }],\r\n href: this.getString(href),\r\n text: this.getString(text),\r\n nest: this.nest || this.children,\r\n // @ts-ignore\r\n dataStateSet: this.dataSet,\r\n watch: watchers\r\n };\r\n }\r\n\r\n /**\r\n * This will get the link path.\r\n *\r\n * @returns {string|null}\r\n */\r\n getLinkPath()\r\n {\r\n // @ts-ignore\r\n return this?.panel?.pathname || null;\r\n }\r\n\r\n /**\r\n * This will get string.\r\n *\r\n * @param {string} string\r\n * @returns {(string|null)}\r\n */\r\n getString(string)\r\n {\r\n const type = typeof string;\r\n return (type !== 'object' && type !== 'undefined')? string : null;\r\n }\r\n\r\n /**\r\n * This will setup the watchers.\r\n *\r\n * @protected\r\n * @param {string} href\r\n * @param {string} text\r\n * @returns {array}\r\n */\r\n setupWatchers(href, text)\r\n {\r\n // @ts-ignore\r\n const exact = (this.exact === true),\r\n data = router.data;\r\n\r\n const watchers = [];\r\n\r\n if (href && typeof href === 'object')\r\n {\r\n watchers.push(Watcher('href', href));\r\n }\r\n\r\n if (text && typeof text === 'object')\r\n {\r\n watchers.push(Watcher('text', text));\r\n }\r\n\r\n watchers.push({\r\n value: ['[[path]]', data],\r\n callBack: (value, ele) =>\r\n {\r\n if (typeof ele.pathname === 'undefined')\r\n {\r\n return;\r\n }\r\n\r\n const path = ele.pathname + ele.hash;\r\n\t\t\t\tconst selected = exact? (value === path) : (iSActive(ele.pathname, value));\r\n this.update(selected);\r\n }\r\n });\r\n\r\n return watchers;\r\n }\r\n\r\n /**\r\n * This will setup the states.\r\n *\r\n * @protected\r\n * @returns {object}\r\n */\r\n setupStates()\r\n {\r\n return {\r\n selected: false\r\n };\r\n }\r\n\r\n /**\r\n * This will update the class on the element.\r\n *\r\n * @param {boolean} selected\r\n * @returns {void}\r\n */\r\n update(selected)\r\n {\r\n this.state.selected = selected;\r\n }\r\n}", "import { Events } from '../../main/events/events.js';\r\nimport { Dom } from '../../shared/dom.js';\r\nimport { Data } from '../data/data.js';\r\nimport { HistoryController } from './history/history-controller.js';\r\nimport { Route } from './routes/route.js';\r\nimport { setTitle } from './set-title.js';\r\nimport { Utils } from './utils.js';\r\nexport { NavLink } from './nav-link.js';\r\n\r\n/**\r\n * This will get the location.\r\n *\r\n * @returns {object}\r\n */\r\nconst getLocation = () => (typeof window !== 'undefined')? window.location : {};\r\n\r\n/**\r\n * Router\r\n *\r\n * This will create a browser router.\r\n *\r\n * @class\r\n */\r\nexport class Router\r\n{\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {string} version\r\n\t\t */\r\n\t\tthis.version = '1.0.2';\r\n\r\n\t\t/**\r\n\t\t * This is the root of the uri for the routing object\r\n\t\t * and the base title.\r\n\t\t */\r\n\t\tthis.baseURI = '/';\r\n\t\tthis.title = '';\r\n\r\n\t\tthis.lastPath = null;\r\n\t\tthis.path = null;\r\n\r\n\t\t/**\r\n\t\t * This will be used to access our history object.\r\n\t\t */\r\n\t\tthis.history = null;\r\n\t\tthis.callBackLink = null;\r\n\t\tthis.location = getLocation();\r\n\r\n\t\t/**\r\n\t\t * This will store each route added to the router.\r\n\t\t */\r\n\t\tthis.routes = [];\r\n\t\tthis.switches = new Map();\r\n\t\tthis.switchCount = 0;\r\n\r\n\t\t/**\r\n\t\t * @member {object} data\r\n\t\t */\r\n\t\tthis.data = new Data(\r\n\t\t{\r\n\t\t\tpath: ''\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup our history object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetupHistory()\r\n\t{\r\n\t\tthis.history = HistoryController.setup(this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a new route.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} settings\r\n\t * @returns {object}\r\n\t */\r\n\tcreateRoute(settings)\r\n\t{\r\n\t\tconst uri = settings.uri || '*';\r\n\t\tsettings.baseUri = this.createURI(uri);\r\n\r\n\t\treturn new Route(settings, this.updateTitle.bind(this));\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new route to the router.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @returns {object}\r\n\t */\r\n\tadd(settings)\r\n\t{\r\n\t\tif (typeof settings !== 'object')\r\n\t\t{\r\n\t\t\tconst args = arguments;\r\n\t\t\tsettings =\r\n\t\t\t{\r\n\t\t\t\turi: args[0],\r\n\t\t\t\tcomponent: args[1],\r\n\t\t\t\tcallBack: args[2],\r\n\t\t\t\ttitle: args[3],\r\n\t\t\t\tid: args[4],\r\n\t\t\t\tcontainer: args[5]\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst route = this.createRoute(settings);\r\n\t\tthis.addRoute(route);\r\n\t\treturn route;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a route.\r\n\t *\r\n\t * @param {object} route\r\n\t * @returns {void}\r\n\t */\r\n\taddRoute(route)\r\n\t{\r\n\t\tthis.routes.push(route);\r\n\t\tthis.checkRoute(route, this.getPath());\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume a route.\r\n\t *\r\n\t * @param {object} route\r\n\t * @param {object} container\r\n\t * @returns {void}\r\n\t */\r\n\tresume(route, container)\r\n\t{\r\n\t\troute.resume(container);\r\n\t\tthis.addRoute(route);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the base path.\r\n\t *\r\n\t * @protected\r\n\t * @returns {string}\r\n\t */\r\n\tgetBasePath()\r\n\t{\r\n\t\tif (!this.basePath)\r\n\t\t{\r\n\t\t\tlet pathURI = this.baseURI || '';\r\n\t\t\tif ((pathURI[pathURI.length - 1] !== '/'))\r\n\t\t\t{\r\n\t\t\t\tpathURI += '/';\r\n\t\t\t}\r\n\t\t\tthis.basePath = pathURI;\r\n\t\t}\r\n\t\treturn this.basePath;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a uri.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} uri\r\n\t * @returns {string}\r\n\t */\r\n\tcreateURI(uri)\r\n\t{\r\n\t\tconst baseUri = this.getBasePath();\r\n\t\treturn (baseUri + Utils.removeSlashes(uri));\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a route by uri.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @returns {(object|boolean)}\r\n\t */\r\n\tgetRoute(uri)\r\n\t{\r\n\t\tconst routes = this.routes,\r\n\t\tlength = routes.length;\r\n\t\tif (length > 0)\r\n\t\t{\r\n\t\t\tfor (var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar route = routes[i];\r\n\t\t\t\tif (route.uri === uri)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn route;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a route by id.\r\n\t *\r\n\t * @param {string} id\r\n\t * @returns {(object|boolean)}\r\n\t */\r\n\tgetRouteById(id)\r\n\t{\r\n\t\tconst routes = this.routes,\r\n\t\tlength = routes.length;\r\n\t\tif (length > 0)\r\n\t\t{\r\n\t\t\tfor (var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar route = routes[i];\r\n\t\t\t\tif (route.id === id)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn route;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a route.\r\n\t *\r\n\t * @param {object} route\r\n\t */\r\n\tremoveRoute(route)\r\n\t{\r\n\t\tconst routes = this.routes,\r\n\t\tindex = routes.indexOf(route);\r\n\t\tif (index > -1)\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * Deactivate the route to properly clean up\r\n\t\t\t * its component before removing.\r\n\t\t\t */\r\n\t\t\tif (route && typeof route.deactivate === 'function')\r\n\t\t\t{\r\n\t\t\t\troute.deactivate();\r\n\t\t\t}\r\n\t\t\troutes.splice(index, 1);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a switch.\r\n\t *\r\n\t * @param {array} group\r\n\t * @returns {number} the switch id.\r\n\t */\r\n\taddSwitch(group)\r\n\t{\r\n\t\tconst id = this.switchCount++;\r\n\t\tconst switchArray = this.getSwitchGroup(id);\r\n\r\n\t\tgroup.forEach((item) =>\r\n\t\t{\r\n\t\t\tif (!item)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst route = this.createRoute(item);\r\n\t\t\tswitchArray.push(route);\r\n\t\t});\r\n\r\n\t\tthis.checkGroup(switchArray, this.getPath());\r\n\t\treturn id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume a switch.\r\n\t *\r\n\t * @param {object} group\r\n\t * @param {object} container\r\n\t * @returns {number} the switch id.\r\n\t */\r\n\tresumeSwitch(group, container)\r\n\t{\r\n\t\tconst id = this.switchCount++;\r\n\t\tconst switchArray = this.getSwitchGroup(id);\r\n\r\n\t\tgroup.forEach((item) =>\r\n\t\t{\r\n\t\t\tconst route = item.component.route;\r\n\t\t\troute.resume(container);\r\n\t\t\tswitchArray.push(route);\r\n\t\t});\r\n\r\n\t\tthis.checkGroup(switchArray, this.getPath());\r\n\t\treturn id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a switch group by id.\r\n\t *\r\n\t * @param {number} id\r\n\t * @returns {array}\r\n\t */\r\n\tgetSwitchGroup(id)\r\n\t{\r\n\t\tconst switches = this.switches.get(id);\r\n\t\tif (switches)\r\n\t\t{\r\n\t\t\treturn switches;\r\n\t\t}\r\n\r\n\t\tconst group = [];\r\n\t\tthis.switches.set(id, group);\r\n\t\treturn group;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a switch by id.\r\n\t *\r\n\t * @param {string} id\r\n\t * @returns {void}\r\n\t */\r\n\tremoveSwitch(id)\r\n\t{\r\n\t\tconst group = this.switches.get(id);\r\n\t\tif (group)\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * Deactivate all routes in the group to properly\r\n\t\t\t * clean up their components before removing.\r\n\t\t\t */\r\n\t\t\tfor (const route of group)\r\n\t\t\t{\r\n\t\t\t\tif (route && typeof route.deactivate === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\troute.deactivate();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.switches.delete(id);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a route by uri.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @returns {object} a reference to the router object.\r\n\t */\r\n\tremove(uri)\r\n\t{\r\n\t\turi = this.createURI(uri);\r\n\r\n\t\tconst route = this.getRoute(uri);\r\n\t\tif (route !== false)\r\n\t\t{\r\n\t\t\tthis.removeRoute(route);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the router.\r\n\t *\r\n\t * @param {string} [baseURI]\r\n\t * @param {string} [title]\r\n\t * @returns {object} a reference to the router object.\r\n\t */\r\n\tsetup(baseURI, title)\r\n\t{\r\n\t\tthis.baseURI = baseURI || '/';\r\n\t\tthis.updateBaseTag(this.baseURI);\r\n\t\tthis.title = (typeof title !== 'undefined')? title : '';\r\n\r\n\t\tthis.setupHistory();\r\n\r\n\t\t// @ts-ignore\r\n\t\tthis.data.path = this.getPath();\r\n\r\n\t\tthis.callBackLink = this.checkLink.bind(this);\r\n\t\tEvents.on('click', document, this.callBackLink);\r\n\r\n\t\t/* this will route to the first url entered\r\n\t\twhen the router loads. this will fix the issue\r\n\t\tthat stopped the first endpoint from being\r\n\t\tadded to the history */\r\n\t\tconst endPoint = this.getEndPoint();\r\n\t\tthis.navigate(endPoint, null, true);\r\n\t\treturn this;\r\n\t}\r\n\r\n\tupdateBaseTag(url)\r\n\t{\r\n\t\t/* this will modify the base tag to ref from\r\n\t\tthe base url for all xhr */\r\n\t\tconst ele = document.getElementsByTagName('base');\r\n\t\tif (ele.length)\r\n\t\t{\r\n\t\t\tele[0].href = url;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the parent element link.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @returns {(object|boolean)}\r\n\t */\r\n\tgetParentLink(ele)\r\n\t{\r\n\t\tlet target = ele.parentNode;\r\n\t\twhile (target !== null)\r\n\t\t{\r\n\t\t\tif (target.nodeName.toLowerCase() === 'a')\r\n\t\t\t{\r\n\t\t\t\treturn target;\r\n\t\t\t}\r\n\r\n\t\t\ttarget = target.parentNode;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a link was routed.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} evt\r\n\t */\r\n\tcheckLink(evt)\r\n\t{\r\n\t\tif (evt.ctrlKey === true)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tlet target = evt.target || evt.srcElement;\r\n\t\tif (target.nodeName.toLowerCase() !== 'a')\r\n\t\t{\r\n\t\t\t/* this will check to get the parent to check\r\n\t\t\tif the child is contained in a link */\r\n\t\t\ttarget = this.getParentLink(target);\r\n\t\t\tif (target === false)\r\n\t\t\t{\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (target.target === '_blank' || Dom.data(target, 'cancel-route'))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tconst href = target.getAttribute('href');\r\n\t\tif (typeof href !== 'undefined')\r\n\t\t{\r\n\t\t\tconst baseUri = this.baseURI,\r\n\t\t\tpath = (baseUri !== '/')? href.replace(baseUri, '') : href;\r\n\r\n\t\t\tthis.navigate(path);\r\n\r\n\t\t\tevt.preventDefault();\r\n\t\t\tevt.stopPropagation();\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset the router.\r\n\t *\r\n\t * @returns {object} a reference to the router object.\r\n\t */\r\n\treset()\r\n\t{\r\n\t\t/**\r\n\t\t * Deactivate all routes to properly clean up their components\r\n\t\t * before clearing the arrays.\r\n\t\t */\r\n\t\tconst routes = this.routes;\r\n\t\tfor (let i = 0, length = routes.length; i < length; i++)\r\n\t\t{\r\n\t\t\tconst route = routes[i];\r\n\t\t\tif (route && typeof route.deactivate === 'function')\r\n\t\t\t{\r\n\t\t\t\troute.deactivate();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.routes = [];\r\n\t\tthis.switches = new Map();\r\n\t\tthis.switchCount = 0;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check the active routes.\r\n\t *\r\n\t * @returns {object} a reference to the router object.\r\n\t */\r\n\tactivate()\r\n\t{\r\n\t\tthis.checkActiveRoutes();\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will navigate the router.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {object} [data]\r\n\t * @param {boolean} [replace]\r\n\t * @returns {object} a reference to the router object.\r\n\t */\r\n\tnavigate(uri, data, replace)\r\n\t{\r\n\t\turi = this.createURI(uri);\r\n\t\tthis.history.addState(uri, data, replace);\r\n\t\tthis.activate();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the data path.\r\n\t * @protected\r\n\t */\r\n\tupdatePath()\r\n\t{\r\n\t\tconst path = this.getPath();\r\n\t\t// @ts-ignore\r\n\t\tthis.data.path = path;\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the title.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} route\r\n\t */\r\n\tupdateTitle(route)\r\n\t{\r\n\t\tif (!route || !route.title)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst title = route.title;\r\n\t\tdocument.title = setTitle(route, title, this.title);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check the routes to match the path.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} [path]\r\n\t */\r\n\tcheckActiveRoutes(path)\r\n\t{\r\n\t\tthis.lastPath = this.path;\r\n\r\n\t\tpath = path || this.getPath();\r\n\t\tthis.path = path;\r\n\r\n\t\tconst routes = this.routes,\r\n\t\tlength = routes.length;\r\n\r\n\t\tlet route;\r\n\t\tfor (var i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\troute = routes[i];\r\n\t\t\tif (typeof route === 'undefined')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tthis.checkRoute(route, path);\r\n\t\t}\r\n\r\n\t\tthis.checkSwitches(path);\r\n\t\tthis.updatePath();\r\n\t}\r\n\r\n\t/**\r\n\t * Checks all switch groups against the given path.\r\n\t * Activates the first matching route or falls back to the first route in the group if none match.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} [path]\r\n\t * @returns {void}\r\n\t */\r\n\tcheckSwitches(path)\r\n\t{\r\n\t\tconst switches = this.switches;\r\n\t\tswitches.forEach((group) =>\r\n\t\t{\r\n\t\t\tthis.checkGroup(group, path);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Checks a single group of routes against the path.\r\n\t * Selects the first matching route if any; otherwise selects the first route.\r\n\t * Deactivates previously active routes if changed.\r\n\t *\r\n\t * @protected\r\n\t * @param {object[]} group\r\n\t * @param {string} path\r\n\t * @returns {void}\r\n\t */\r\n\tcheckGroup(group, path)\r\n\t{\r\n\t\tif (!group.length)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * The last selected route should be checked first to\r\n\t\t * deactive it if it doesn't match the path.\r\n\t\t */\r\n\t\tconst lastSelected = group.find((route) => route.get('active'));\r\n\t\tif (lastSelected)\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * If the last selected route matches the path, we select it.\r\n\t\t\t * Otherwise, we deactivate it.\r\n\t\t\t */\r\n\t\t\tconst matched = lastSelected.match(path);\r\n\t\t\tif (matched === false)\r\n\t\t\t{\r\n\t\t\t\tlastSelected.deactivate();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * We will check each route in the group to see if it matches the path. If a route\r\n\t\t * matches the path, we select it. If a route has a controller, we deactivate all\r\n\t\t * subsequent routes and select the first route with a controller.\r\n\t\t */\r\n\t\tlet selected;\r\n\t\tfor (const route of group)\r\n\t\t{\r\n\t\t\tif (typeof route === 'undefined')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// If we have already found a matching route, and it has a controller,\r\n\t\t\t// we deactivate subsequent routes.\r\n\t\t\tif (selected)\r\n\t\t\t{\r\n\t\t\t\troute.deactivate();\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst matched = route.match(path);\r\n\t\t\tif (matched !== false && selected === undefined)\r\n\t\t\t{\r\n\t\t\t\tif (route.controller)\r\n\t\t\t\t{\r\n\t\t\t\t\tselected = route;\r\n\t\t\t\t\tthis.select(route);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * If no route matched the path, we select the first route in the group.\r\n\t\t */\r\n\t\tconst firstRoute = group[0];\r\n\t\tif (!selected)\r\n\t\t{\r\n\t\t\tthis.select(firstRoute);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a route matches the path.\r\n\t *\r\n\t * @param {object} route\r\n\t * @param {string} path\r\n\t * @returns {boolean}\r\n\t */\r\n\tcheckRoute(route, path)\r\n\t{\r\n\t\tconst check = this.check(route, path);\r\n\t\tif (check !== false)\r\n\t\t{\r\n\t\t\tthis.select(route);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\troute.deactivate();\r\n\t\t}\r\n\t\treturn check;\r\n\t}\r\n\r\n\t/**\r\n\t * This will select a route if the route matches the path.\r\n\t *\r\n\t * @param {object} route\r\n\t * @param {string} [path]\r\n\t * @returns {boolean}\r\n\t */\r\n\tcheck(route, path)\r\n\t{\r\n\t\t/* we want to check if the route has been\r\n\t\tdeleted from the routes */\r\n\t\tif (!route)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check to use the supplied uri or get the\r\n\t\tcurrent uri if not setup */\r\n\t\tpath = path || this.getPath();\r\n\r\n\t\t/* we want to check if the route uri matches the path uri */\r\n\t\treturn (route.match(path) !== false);\r\n\t}\r\n\r\n\t/**\r\n\t * This will select the route.\r\n\t *\r\n\t * @param {object} route\r\n\t * @returns {void}\r\n\t */\r\n\tselect(route)\r\n\t{\r\n\t\tif (!route)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\troute.setPath(this.path, this.lastPath);\r\n\t\troute.select();\r\n\t\tthis.updateTitle(route);\r\n\r\n\t\tif (route.preventScroll !== true)\r\n\t\t{\r\n\t\t\tthis.checkToScroll();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will check to scroll to the top of the page.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tcheckToScroll()\r\n\t{\r\n\t\tconst shouldScrollToTop = this.shouldScrollToTop();\r\n\t\tif (shouldScrollToTop)\r\n\t\t{\r\n window.scrollTo(0, 0);\r\n }\r\n\t}\r\n\r\n\t/**\r\n\t * This will clean the path.\r\n\t *\r\n\t * @param {string|null} path\r\n\t * @returns {string}\r\n\t */\r\n\tcleanPath(path)\r\n\t{\r\n\t\tif (!path)\r\n\t\t{\r\n\t\t\treturn '/';\r\n\t\t}\r\n\r\n\t\treturn path.split('?')[0].split('#')[0];\r\n\t}\r\n\r\n\t/**\r\n\t * This will scroll to the top of the page if the route has changed.\r\n\t *\r\n\t * @returns {boolean}\r\n\t */\r\n\tshouldScrollToTop()\r\n\t{\r\n\t\tconst path = this.cleanPath(this.getPath());\r\n\t\tconst lastPath = this.cleanPath(this.lastPath);\r\n const prevSegments = lastPath.split('/');\r\n const currentSegments = path.split('/');\r\n\r\n\t\t/**\r\n\t\t * If the path has changed, we want to scroll to the top.\r\n\t\t */\r\n\t\tif (prevSegments.length !== currentSegments.length)\r\n\t\t{\r\n\t\t\treturn true\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * We want to check if the last segment of the path has changed.\r\n\t\t * If it has, we want to scroll to the top.\r\n\t\t */\r\n\t\tconst lastSegment = prevSegments[prevSegments.length - 1];\r\n\t\tconst currentSegment = currentSegments[currentSegments.length - 1];\r\n return (lastSegment !== currentSegment);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the endpoint.\r\n\t *\r\n\t * @returns {string}\r\n\t */\r\n\tgetEndPoint()\r\n\t{\r\n\t\tconst path = this.getPath();\r\n\t\treturn (path.replace(this.baseURI, '') || '/');\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the router events.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tdestroy()\r\n\t{\r\n\t\tEvents.off('click', document, this.callBackLink);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the location pathname.\r\n\t *\r\n\t * @returns {string}\r\n\t */\r\n\tgetPath()\r\n\t{\r\n\t\t/* we want to get the window location path */\r\n\t\tlet location = this.location,\r\n\t\tpath = this.path = location.pathname;\r\n\r\n\t\tif (this.history.type === 'hash')\r\n\t\t{\r\n\t\t\treturn location.hash.replace('#', '');\r\n\t\t}\r\n\r\n\t\treturn path + location.search + location.hash;\r\n\t}\r\n}\r\n\r\n/**\r\n * This will create a new router.\r\n *\r\n * @type {Router}\r\n */\r\nexport const router = new Router();", "import { DataTracker } from \"../../../../main/data-tracker/data-tracker.js\";\r\nimport { router } from \"../../../router/router.js\";\r\n\r\n/**\r\n * This will register the route system to the data\r\n * tracker to remove routes that have been nested\r\n * in layouts.\r\n */\r\nDataTracker.addType('routes', (data) =>\r\n{\r\n if (!data)\r\n {\r\n return false;\r\n }\r\n\r\n const route = data.route;\r\n if (route)\r\n {\r\n router.removeRoute(route);\r\n }\r\n});\r\n\r\n/**\r\n * This will add a route.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {(object|array)} route\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addRoute = (ele, route, parent) =>\r\n{\r\n if (!route)\r\n {\r\n return;\r\n }\r\n\r\n if (Array.isArray(route))\r\n {\r\n route.forEach((item) =>\r\n {\r\n if (!item)\r\n {\r\n return;\r\n }\r\n\r\n setupRoute(ele, item, parent);\r\n });\r\n }\r\n else\r\n {\r\n setupRoute(ele, route, parent);\r\n }\r\n};\r\n\r\n/**\r\n * This will setup a route.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {object} route\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nconst setupRoute = (ele, route, parent) =>\r\n{\r\n // this will check to resume route\r\n // if (checkResume(route))\r\n // {\r\n // \tresumeRoute(ele, route.component.route);\r\n // \treturn;\r\n // }\r\n\r\n route.container = ele;\r\n route.parent = parent;\r\n\r\n const newRoute = router.add(route);\r\n trackRoute(ele, newRoute);\r\n};\r\n\r\n/**\r\n * This will check to resume route.\r\n *\r\n * @param {object} route\r\n */\r\n// const checkResume = (route) =>\r\n// {\r\n// return (route && route.component && route.component.route);\r\n// };\r\n\r\n/**\r\n * This will resume a route.\r\n *\r\n * @param {object} ele\r\n * @param {object} route\r\n */\r\n// const resumeRoute = (ele, route) =>\r\n// {\r\n// router.resume(route, ele);\r\n\r\n// trackRoute(ele, route);\r\n// };\r\n\r\n/**\r\n * This will track a route.\r\n *\r\n * @param {object} ele\r\n * @param {object} route\r\n * @returns {void}\r\n */\r\nconst trackRoute = (ele, route) =>\r\n{\r\n DataTracker.add(ele, 'routes',\r\n {\r\n route\r\n });\r\n};", "/**\r\n * This is called when the state directive is used.\r\n *\r\n * @param {object} ele\r\n * @param {*} data\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const state = (ele, data, parent) =>\r\n{\r\n\r\n};", "import { DataTracker } from \"../../../../main/data-tracker/data-tracker.js\";\r\nimport { router } from \"../../../router/router.js\";\r\n\r\n/**\r\n * This will register the switch system to the data\r\n * tracker to remove switches that have been nested\r\n * in layouts.\r\n */\r\nDataTracker.addType('switch', (data) =>\r\n{\r\n\tif (!data)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst id = data.id;\r\n\trouter.removeSwitch(id);\r\n});\r\n\r\n/**\r\n * This will add a switch.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {array} group\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addSwitch = (ele, group, parent) =>\r\n{\r\n\tlet route = group[0];\r\n\t// this will check to resume switch\r\n\t// if (checkResume(route))\r\n\t// {\r\n\t// \tresumeSwitch(ele, group);\r\n\t// \treturn;\r\n\t// }\r\n\r\n\tgroup.forEach((item) =>\r\n\t{\r\n\t\tif (!item)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\titem.container = ele;\r\n\t\titem.parent = parent;\r\n\t});\r\n\r\n\tconst id = router.addSwitch(group);\r\n\ttrackSwitch(ele, id);\r\n};\r\n\r\n/**\r\n * This will check to resume route.\r\n *\r\n * @param {object} route\r\n */\r\n// const checkResume = (route) =>\r\n// {\r\n// return (route && route.component && route.component.route);\r\n// };\r\n\r\n/**\r\n * This will resume a route.\r\n *\r\n * @param {object} ele\r\n * @param {object} route\r\n */\r\n// const resumeSwitch = (ele, route) =>\r\n// {\r\n// router.resume(route, ele);\r\n\r\n// trackSwitch(ele, route);\r\n// };\r\n\r\n/**\r\n * This will track a switch.\r\n *\r\n * @param {object} ele\r\n * @param {number} id\r\n * @returns {void}\r\n */\r\nconst trackSwitch = (ele, id) =>\r\n{\r\n\tDataTracker.add(ele, 'switch',\r\n\t{\r\n\t\tid\r\n\t});\r\n};", "import { Directives } from '../directives.js';\r\nimport { animateIn, animateOut } from './animate/animate.js';\r\nimport { addAria, addRole } from './aria/aria.js';\r\nimport { addContext, context, useContext } from './context/context-directives.js';\r\nimport { data } from './data.js';\r\nimport { debug } from './debug.js';\r\nimport { addEvent, addState, cache, getId, useData, useParent, useState } from './parent/parent-directives.js';\r\nimport { bind } from './reactive/bind.js';\r\nimport { addDataSet, addDataStateSet } from './reactive/data-set.js';\r\nimport { forEach } from './reactive/for-each.js';\r\nimport { map } from './reactive/map.js';\r\nimport { onCreated } from './reactive/on-created.js';\r\nimport { onDestroyed } from './reactive/on-destroyed.js';\r\nimport { onSet } from './reactive/on-set.js';\r\nimport { onState } from './reactive/on-state.js';\r\nimport { watch } from './reactive/watch.js';\r\nimport { addRoute } from './route.js';\r\nimport { state } from './state.js';\r\nimport { addSwitch } from './switch.js';\r\n\r\nDirectives\r\n\t.add('cache', cache)\r\n\t.add('onCreated', onCreated)\r\n\t.add('onDestroyed', onDestroyed)\r\n\t.add('bind', bind)\r\n\t.add('data', data)\r\n\t.add('state', state)\r\n\t.add('onSet', onSet)\r\n\t.add('onState', onState)\r\n\t.add('animateIn', animateIn)\r\n\t.add('animateOut', animateOut)\r\n\t.add('watch', watch)\r\n\t.add('useParent', useParent)\r\n\t.add('useData', useData)\r\n\t.add('useState', useState)\r\n\t.add('getId', getId)\r\n\t.add('addState', addState)\r\n\t.add('addEvent', addEvent)\r\n\t.add('map', map)\r\n\t.add('for', forEach)\r\n\t//.add('html', addHtml)\r\n\t.add('useContext', useContext)\r\n\t.add('addContext', addContext)\r\n\t.add('context', context)\r\n\t.add('role', addRole)\r\n\t.add('aria', addAria)\r\n\t.add('route', addRoute)\r\n\t.add('debug', debug)\r\n\t.add('dataSet', addDataSet)\r\n\t.add('dataStateSet', addDataStateSet)\r\n\t.add('switch', addSwitch);", "import { base } from './main/base.js';\r\nimport { DataTracker } from './main/data-tracker/data-tracker.js';\r\nimport { EventMethods } from './main/events/event-methods.js';\r\nimport { Ajax } from './modules/ajax/ajax.js';\r\nimport { Atom } from './modules/atom/atom.js';\r\nimport { Component } from './modules/component/component.js';\r\nimport { Jot } from './modules/component/jot.js';\r\nimport { Pod } from './modules/component/pod.js';\r\nimport { Unit } from './modules/component/unit.js';\r\nimport { dataBinder } from './modules/data-binder/data-binder.js';\r\nimport { Data, Model, SimpleData } from './modules/data/data.js';\r\nimport { DateTime } from \"./modules/date/date-time.js\";\r\nimport { Html } from './modules/html/html.js';\r\nimport { Import } from './modules/import/import.js';\r\nimport { Builder } from './modules/layout/builder.js';\r\nimport './modules/layout/directives/core/default-directives.js';\r\nimport { Directives } from './modules/layout/directives/directives.js';\r\nimport { NavLink, router } from './modules/router/router.js';\r\nimport { StateTracker as Store } from './modules/state/state-tracker.js';\r\nimport { State } from './modules/state/state.js';\r\nimport { Arrays } from './shared/arrays.js';\r\nimport { Dom } from './shared/dom.js';\r\nimport { Encode } from './shared/encode/encode.js';\r\nimport { Objects } from './shared/objects.js';\r\nimport { Strings } from './shared/strings.js';\r\nimport { Types } from './shared/types.js';\r\n\r\n/**\r\n * This will set the base module classes to the base object. This is\r\n * used to make the modules available to the application. This is\r\n * to support legacy code.\r\n */\r\nbase.augment(\r\n{\r\n Ajax,\r\n Html,\r\n dataBinder,\r\n Data,\r\n SimpleData,\r\n Model,\r\n State,\r\n Builder,\r\n router,\r\n Component\r\n});\r\n\r\n/**\r\n * This will export base and all the modules.\r\n */\r\nexport { Ajax, Arrays, Atom, base, Builder, Component, Data, dataBinder, DataTracker, DateTime, Directives, Dom, Encode, EventMethods as Events, Html, Import, Jot, Model, NavLink, Objects, Pod, router, SimpleData, State, Store, Strings, Types, Unit };\r\n\r\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\r\n * Arrays\r\n *\r\n * This will contain methods for working with arrays.\r\n *\r\n * @module\r\n * @name Arrays\r\n */\r\nexport class Arrays\r\n{\r\n\t/**\r\n\t * This will convert an object or collection into an array.\r\n\t *\r\n\t * @param {object} list\r\n\t * @returns {array}\r\n\t */\r\n\tstatic toArray(list)\r\n\t{\r\n\t\treturn Array.from(list);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a value is found in an array.\r\n\t *\r\n\t * @param {array} array\r\n\t * @param {string} element\r\n\t * @param {number} [fromIndex]\r\n\t * @returns {number} This will return -1 if not found.\r\n\t */\r\n\tstatic inArray(array, element, fromIndex)\r\n\t{\r\n\t\tif (!Array.isArray(array))\r\n\t\t{\r\n\t\t\treturn -1;\r\n\t\t}\r\n\r\n\t\treturn array.indexOf(element, fromIndex);\r\n\t}\r\n}\r\n", "/**\r\n * Types\r\n *\r\n * Utility class for working with variable types.\r\n *\r\n * @module\r\n * @name Types\r\n */\r\nexport class Types\r\n{\r\n\t/**\r\n\t * Gets the type of a variable.\r\n\t *\r\n\t * @param {*} data - The data whose type is to be determined.\r\n\t * @returns {string} The type of the variable ('undefined', 'object', 'function', 'array', etc.).\r\n\t */\r\n\tstatic getType(data)\r\n\t{\r\n\t\tconst type = typeof data;\r\n\t\tif (type !== \"object\")\r\n\t\t{\r\n\t\t\treturn type;\r\n\t\t}\r\n\r\n\t\treturn Array.isArray(data) ? \"array\" : \"object\"; // Directly check for array type.\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if a value is undefined.\r\n\t *\r\n\t * @param {*} data - The data to check.\r\n\t * @returns {boolean} True if the data is undefined.\r\n\t */\r\n\tstatic isUndefined(data)\r\n\t{\r\n\t\treturn typeof data === \"undefined\";\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if a value is an object (excluding arrays).\r\n\t *\r\n\t * @param {*} data - The data to check.\r\n\t * @returns {boolean} True if the data is a plain object.\r\n\t */\r\n\tstatic isObject(data)\r\n\t{\r\n\t\treturn data !== null && typeof data === \"object\" && !Array.isArray(data);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if a value is a function.\r\n\t *\r\n\t * @param {*} data - The data to check.\r\n\t * @returns {boolean} True if the data is a function.\r\n\t */\r\n\tstatic isFunction(data)\r\n\t{\r\n\t\treturn typeof data === \"function\";\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if a value is a string.\r\n\t *\r\n\t * @param {*} data - The data to check.\r\n\t * @returns {boolean} True if the data is a string.\r\n\t */\r\n\tstatic isString(data)\r\n\t{\r\n\t\treturn typeof data === \"string\";\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if a value is an array.\r\n\t *\r\n\t * @param {*} data - The data to check.\r\n\t * @returns {boolean} True if the data is an array.\r\n\t */\r\n\tstatic isArray(data)\r\n\t{\r\n\t\treturn Array.isArray(data);\r\n\t}\r\n}", "import { Types } from \"./types.js\";\r\n\r\n/**\r\n * Objects\r\n *\r\n * Contains methods for working with objects.\r\n *\r\n * @module\r\n * @name Objects\r\n */\r\nexport const Objects =\r\n{\r\n\t/**\r\n\t * Creates a new object, optionally extending from another object.\r\n\t *\r\n\t * @param {object} [prototype] - The prototype object to extend from.\r\n\t * @returns {object} The newly created object.\r\n\t */\r\n\tcreate(prototype)\r\n\t{\r\n\t\treturn Object.create(prototype || null);\r\n\t},\r\n\r\n\t/**\r\n\t * Extends properties from the source object to the target object.\r\n\t * Only copies properties that are not already defined on the target object.\r\n\t *\r\n\t * @param {object} sourceObj - The source object.\r\n\t * @param {object} targetObj - The target object to extend.\r\n\t * @returns {object|false} The extended target object or false if invalid.\r\n\t */\r\n\textendObject(sourceObj, targetObj)\r\n\t{\r\n\t\tif (!Types.isObject(sourceObj) || !Types.isObject(targetObj))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tObject.keys(sourceObj).forEach((key) =>\r\n\t\t{\r\n\t\t\tif (!this.hasOwnProp(targetObj, key))\r\n\t\t\t{\r\n\t\t\t\ttargetObj[key] = sourceObj[key];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn targetObj;\r\n\t},\r\n\r\n\t/**\r\n\t * Deep clones an object in a safe and scalable manner.\r\n\t *\r\n\t * @param {object} obj - The object to clone.\r\n\t * @returns {object} A deep clone of the object.\r\n\t */\r\n\tclone(obj)\r\n\t{\r\n\t\tif (!obj || !Types.isObject(obj))\r\n\t\t{\r\n\t\t\treturn {};\r\n\t\t}\r\n\r\n\t\treturn JSON.parse(JSON.stringify(obj));\r\n\t},\r\n\r\n\t/**\r\n\t * Retrieves the prototype of a class or object.\r\n\t *\r\n\t * @param {function|object} entity - The class or object.\r\n\t * @returns {object} The prototype of the entity.\r\n\t */\r\n\tgetClassObject(entity)\r\n\t{\r\n\t\treturn typeof entity === \"function\" ? entity.prototype : entity;\r\n\t},\r\n\r\n\t/**\r\n\t * Extends a class or object with the properties of another class or object.\r\n\t *\r\n\t * @param {function|object} sourceClass - The source class or object.\r\n\t * @param {function|object} targetClass - The target class or object.\r\n\t * @returns {object|false} The resulting extended object or false if invalid.\r\n\t */\r\n\textendClass(sourceClass, targetClass)\r\n\t{\r\n\t\tconst source = this.getClassObject(sourceClass);\r\n\t\tconst target = this.getClassObject(targetClass);\r\n\t\tif (typeof source !== 'object' || typeof target !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to create a new object and add the source\r\n\t\tprototype to the new object */\r\n\t\tconst obj = Object.create(source);\r\n\r\n\t\t/* we want to add any additional properties from the\r\n\t\ttarget class to the new object */\r\n\t\tfor (var prop in target)\r\n\t\t{\r\n\t\t\tobj[prop] = target[prop];\r\n\t\t}\r\n\r\n\t\treturn obj;\r\n\t},\r\n\r\n\t/**\r\n\t * Checks if an object has a specific property.\r\n\t *\r\n\t * @param {object} obj - The object to check.\r\n\t * @param {string} prop - The property to check for.\r\n\t * @returns {boolean} True if the object has the property.\r\n\t */\r\n\thasOwnProp(obj, prop)\r\n\t{\r\n\t\treturn Object.prototype.hasOwnProperty.call(obj, prop);\r\n\t},\r\n\r\n\t/**\r\n\t * Determines if a value is a plain object.\r\n\t *\r\n\t * @param {object} obj - The value to check.\r\n\t * @returns {boolean} True if the value is a plain object.\r\n\t */\r\n\tisPlainObject(obj)\r\n\t{\r\n\t\treturn !!obj && Object.prototype.toString.call(obj) === \"[object Object]\";\r\n\t},\r\n\r\n\t/**\r\n\t * Checks if an object is empty.\r\n\t *\r\n\t * @param {object} obj - The object to check.\r\n\t * @returns {boolean} True if the object has no own properties.\r\n\t */\r\n\tisEmpty(obj)\r\n\t{\r\n\t\tif (!Types.isObject(obj))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn Object.keys(obj).length === 0;\r\n\t}\r\n};", "/**\r\n * TrackerTypes\r\n *\r\n * This will add and remove tracker types to the data tracker.\r\n *\r\n * @type {object} TrackerTypes\r\n *\r\n */\r\nexport const TrackerTypes =\r\n{\r\n /**\r\n * @member {object} types The Type and callBack that is called\r\n * when the type is removed from the object.\r\n */\r\n types: {},\r\n\r\n /**\r\n * This will add a type.\r\n *\r\n * @param {string} type\r\n * @param {function} callBack The function to call when an object\r\n * is having the type removed.\r\n * @returns {void}\r\n */\r\n add(type, callBack)\r\n {\r\n this.types[type] = callBack;\r\n },\r\n\r\n /**\r\n * This will get a type or return false.\r\n *\r\n * @param {string} type\r\n * @returns {(Function|false)} The callBack or false.\r\n */\r\n get(type)\r\n {\r\n return this.types[type] || false;\r\n },\r\n\r\n /**\r\n * This will remove a type.\r\n *\r\n * @param {string} type\r\n * @returns {void}\r\n */\r\n remove(type)\r\n {\r\n delete this.types[type];\r\n }\r\n};", "import { TrackerTypes } from './tracker-types.js';\r\n\r\n/**\r\n * Tracker\r\n *\r\n * This will create a tracker for an object that will\r\n * store each type added and the data stored to\r\n * each type.\r\n *\r\n * @class\r\n */\r\nexport class Tracker\r\n{\r\n\t/**\r\n\t * This will create a new tracker.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {Map} types\r\n\t\t */\r\n\t\tthis.types = new Map();\r\n\t}\r\n\r\n\t/**\r\n\t * This will add data to a type.\r\n\t *\r\n\t * @public\r\n\t * @param {string} addingType The type of data.\r\n\t * @param {*} data The data to store\r\n\t * @returns {void}\r\n\t */\r\n\tadd(addingType, data)\r\n\t{\r\n\t\tif (!this.types.has(addingType))\r\n\t\t{\r\n\t\t\tthis.types.set(addingType, []);\r\n\t\t}\r\n\t\tthis.types.get(addingType).push(data);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get all the data stored to a data type.\r\n\t * @param {string} type\r\n\t * @returns {*} the data or false.\r\n\t */\r\n\tget(type)\r\n\t{\r\n\t\treturn this.types.get(type) || false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a type exists.\r\n\t * @param {*} type\r\n\t * @returns {boolean}\r\n\t */\r\n\thas(type)\r\n\t{\r\n\t\treturn this.types.has(type);\r\n\t}\r\n\r\n\t/**\r\n\t * This will call the callBack with the data.\r\n\t *\r\n\t * @private\r\n\t * @param {function} callBack\r\n\t * @param {*} data\r\n\t * @returns {void}\r\n\t */\r\n\tremoveByCallBack(callBack, data)\r\n\t{\r\n\t\tif (typeof callBack === 'function')\r\n\t\t{\r\n\t\t\tcallBack(data);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the data by type.\r\n\t *\r\n\t * @private\r\n\t * @param {string} removingType\r\n\t * @returns {void}\r\n\t */\r\n\tremoveType(removingType)\r\n\t{\r\n\t\tif (!this.types.has(removingType))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst typeData = this.types.get(removingType);\r\n\t\tif (!typeData.length)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet data,\r\n\t\tcallBack = TrackerTypes.get(removingType);\r\n\t\tif (!callBack)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (var i = 0, length = typeData.length; i < length; i++)\r\n\t\t{\r\n\t\t\tdata = typeData[i];\r\n\t\t\tif (!data)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// this will stop any circular referrences\r\n\t\t\ttypeData[i] = null;\r\n\r\n\t\t\tthis.removeByCallBack(callBack, data);\r\n\t\t}\r\n\t\tthis.types.delete(removingType);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the data by type or all if no type is\r\n\t * set.\r\n\t *\r\n\t * @public\r\n\t * @param {string} [type]\r\n\t * @returns {void}\r\n\t */\r\n\tremove(type)\r\n\t{\r\n\t\tif (type)\r\n\t\t{\r\n\t\t\tthis.removeType(type);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.types.forEach((value, typeKey) =>\r\n\t\t{\r\n\t\t\tif (!typeKey)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis.removeType(typeKey);\r\n\t\t});\r\n\r\n\t\tthis.types.clear();\r\n\t}\r\n}", "import { TrackerTypes } from './tracker-types.js';\r\nimport { Tracker } from './tracker.js';\r\n\r\n/**\r\n * DataTracker\r\n *\r\n * This will add data tracking for objects. The DataTracker is\r\n * a single point where any data can be tracked to an object\r\n * or element. Modules can register types to store their own\r\n * data that can allow the data to be removed when the element\r\n * is removed.\r\n *\r\n * @class\r\n */\r\nexport class DataTracker\r\n{\r\n\t/**\r\n\t * @private\r\n\t * @static\r\n\t * @member {Map} trackers This is an object that stores all tracker\r\n\t * objects by tracking id.\r\n\t */\r\n\tstatic trackers = new Map();\r\n\r\n\t/**\r\n\t * @private\r\n\t * @static\r\n\t * @member {number} trackingCount\r\n\t */\r\n\tstatic trackingCount = 0;\r\n\r\n\t/**\r\n\t * This will add a new type to the data tracker.\r\n\t *\r\n\t * @public\r\n\t * @param {string} type The new type.\r\n\t * @param {function} callBack The callBack to help clean\r\n\t * up data when removed.\r\n\t * @returns {void}\r\n\t */\r\n\tstatic addType(type, callBack)\r\n\t{\r\n\t\tTrackerTypes.add(type, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a type from the data tracker.\r\n\t *\r\n\t * @param {string} type\r\n\t * @returns {void}\r\n\t */\r\n\tstatic removeType(type)\r\n\t{\r\n\t\tTrackerTypes.remove(type);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the object tracking id or set it if\r\n\t * not set.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {string}\r\n\t */\r\n\tstatic getTrackingId(obj)\r\n\t{\r\n\t\tif (!obj)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\treturn obj.trackingId || (obj.trackingId = `dt${this.trackingCount++}`);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add data to an object.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} type The type name.\r\n\t * @param {*} data The data to track.\r\n\t * @returns {void}\r\n\t */\r\n\tstatic add(obj, type, data)\r\n\t{\r\n\t\tconst id = this.getTrackingId(obj),\r\n\t\ttracker = this.find(id);\r\n\t\ttracker.add(type, data);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the data from a type or the tracker object\r\n\t * if type is not set.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} [type]\r\n\t * @returns {*}\r\n\t */\r\n\tstatic get(obj, type)\r\n\t{\r\n\t\tconst id = obj.trackingId;\r\n\t\tconst tracker = this.trackers.get(id);\r\n\t\tif (!tracker)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn (type)? tracker.get(type) : tracker;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if an object has a specific type.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} type\r\n\t * @returns {boolean}\r\n\t */\r\n\tstatic has(obj, type)\r\n\t{\r\n\t\tconst id = this.getTrackingId(obj);\r\n\t\tif (!id)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst tracker = this.trackers.get(id);\r\n\t\tif (!tracker)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn (type)? tracker.has(type) : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the tracker or create a new tracker\r\n\t * if no tracker is set.\r\n\t *\r\n\t * @param {string} id\r\n\t * @returns {object} The tracker.\r\n\t */\r\n\tstatic find(id)\r\n\t{\r\n\t\tif (!this.trackers.has(id))\r\n\t\t{\r\n\t\t\tthis.trackers.set(id, new Tracker());\r\n\t\t}\r\n\t\treturn this.trackers.get(id);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if an object is empty.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {boolean}\r\n\t */\r\n\tstatic isEmpty(obj)\r\n\t{\r\n\t\tif (!obj || typeof obj !== 'object')\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn (obj.size === 0);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a type or all data for an object if\r\n\t * no type is set.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} [type]\r\n\t * @returns {void}\r\n\t */\r\n\tstatic remove(obj, type)\r\n\t{\r\n\t\tconst id = obj.trackingId;\r\n\t\tif (!id || !this.trackers.has(id))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst tracker = this.trackers.get(id);\r\n\r\n\t\t/**\r\n\t\t * if no type is set then remove the whole tracker.\r\n\t\t */\r\n\t\tif (!type)\r\n\t\t{\r\n\t\t\ttracker.remove();\r\n\t\t\tthis.trackers.delete(id);\r\n\t\t\tdelete obj.trackingId;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ttracker.remove(type);\r\n\r\n\t\t/**\r\n\t\t * if the tracker is empty then remove the tracker.\r\n\t\t */\r\n\t\tif (this.isEmpty(tracker.types))\r\n\t\t{\r\n\t\t\tthis.trackers.delete(id);\r\n\t\t\tdelete obj.trackingId;\r\n\t\t}\r\n\t}\r\n}", "import { Objects } from '../shared/objects.js';\r\n\r\n/**\r\n * This will count the properties of an object.\r\n *\r\n * @param {object} obj\r\n * @returns {number}\r\n */\r\nconst countProperty = (obj) =>\r\n{\r\n\tlet count = 0;\r\n\tfor (let [property, value] of Object.entries(obj))\r\n\t{\r\n\t\tcount++;\r\n\r\n\t\t/**\r\n\t\t * We want to do a recursive count to get\r\n\t\t * any child properties.\r\n\t\t */\r\n\t\tif (typeof obj[property] === 'object')\r\n\t\t{\r\n\t\t\tcount += countProperty(obj[property]);\r\n\t\t}\r\n\t}\r\n\treturn count;\r\n};\r\n\r\n/**\r\n * This will validate if the object properties match another object.\r\n *\r\n * @param {object} obj1\r\n * @param {object} obj2\r\n * @returns {boolean}\r\n */\r\nconst matchProperties = (obj1, obj2) =>\r\n{\r\n\tlet matched = false;\r\n\r\n\tif (typeof obj1 !== 'object' || typeof obj2 !== 'object')\r\n\t{\r\n\t\treturn matched;\r\n\t}\r\n\r\n\t/**\r\n\t * We want to check each object1 property to the\r\n\t * object 2 property.\r\n\t */\r\n\tfor (let [property, value1] of Object.entries(obj1))\r\n\t{\r\n\t\t/**\r\n\t\t * We want to check if the property is owned by the\r\n\t\t * object and that they have matching types.\r\n\t\t */\r\n\t\tif (!Objects.hasOwnProp(obj2, property))\r\n\t\t{\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tconst value2 = obj2[property];\r\n\t\tif (typeof value1 !== typeof value2)\r\n\t\t{\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\t/* we want to check if the type is an object */\r\n\t\tif (typeof value1 === 'object')\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * This will do a recursive check to the\r\n\t\t\t * child properties.\r\n\t\t\t */\r\n\t\t\tmatched = matchProperties(value1, value2);\r\n\t\t\tif (matched !== true)\r\n\t\t\t{\r\n\t\t\t\t/* if a property did not match we can stop\r\n\t\t\t\tthe comparison */\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif (value1 === value2)\r\n\t\t\t{\r\n\t\t\t\tmatched = true;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn matched;\r\n};\r\n\r\n/**\r\n * This will compare if two objects match.\r\n *\r\n * @param {object} obj1\r\n * @param {object} obj2\r\n * @returns {boolean}\r\n */\r\nconst compareObjects = (obj1, obj2) =>\r\n{\r\n\t/* we want to check if they have the same number of\r\n\tproperties */\r\n\tconst option1Count = countProperty(obj1),\r\n\toption2Count = countProperty(obj2);\r\n\tif (option1Count !== option2Count)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\treturn matchProperties(obj1, obj2);\r\n};\r\n\r\n/**\r\n * This will compare if two values match.\r\n *\r\n * @param {*} option1\r\n * @param {*} option2\r\n * @returns {boolean}\r\n */\r\nexport const equals = (option1, option2) =>\r\n{\r\n\t/* we want to check if there types match */\r\n\tconst option1Type = typeof option1,\r\n\toption2Type = typeof option2;\r\n\tif (option1Type !== option2Type)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/* we need to check if the options are objects\r\n\tbecause we will want to match all the\r\n\tproperties */\r\n\tif (option1Type === 'object')\r\n\t{\r\n\t\treturn compareObjects(option1, option2);\r\n\t}\r\n\r\n\treturn (option1 === option2);\r\n};", "import { Types } from '../../shared/types.js';\r\nimport { DataTracker } from '../data-tracker/data-tracker.js';\r\n\r\n/**\r\n * Events\r\n *\r\n * This will add event adding, tracking, and\r\n * removing to an object.\r\n */\r\nexport const Events =\r\n{\r\n\t/**\r\n\t * This will get the events on an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {array}\r\n\t */\r\n\tgetEvents(obj)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\treturn DataTracker.get(obj, 'events');\r\n\t},\r\n\r\n\t/**\r\n\t * This will create an object to use with the dataTracker.\r\n\t *\r\n\t * @param {string} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @param {boolean} [swapped]\r\n\t * @param {function} [originalFn]\r\n\t * @returns {object}\r\n\t */\r\n\tcreate(event, obj, fn, capture = false, swapped = false, originalFn = null)\r\n\t{\r\n\t\t/* we want to check if the swapped param was set */\r\n\t\tswapped = (swapped === true);\r\n\r\n\t\treturn {\r\n\t\t\tevent,\r\n\t\t\tobj,\r\n\t\t\tfn,\r\n\t\t\tcapture,\r\n\t\t\tswapped,\r\n\t\t\toriginalFn\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * This will add an event to an object.\r\n\t *\r\n\t * @param {string|array} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object} The events object.\r\n\t */\r\n\ton(event, obj, fn, capture)\r\n\t{\r\n\t\tif (Array.isArray(event))\r\n\t\t{\r\n\t\t\tevent.forEach((evt) => this.add(evt, obj, fn, capture));\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.add(event, obj, fn, capture);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove an event from an object.\r\n\t *\r\n\t * @param {string|array} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object} The events object.\r\n\t */\r\n\toff(event, obj, fn, capture)\r\n\t{\r\n\t\tif (Array.isArray(event))\r\n\t\t{\r\n\t\t\tvar evt;\r\n\t\t\tevent.forEach((evt) => this.remove(evt, obj, fn, capture));\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.remove(event, obj, fn, capture);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will add an event to an object.\r\n\t *\r\n\t * @param {string} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {object|boolean} [capture]\r\n\t * @param {boolean} [swapped]\r\n\t * @param {function} [originalFn]\r\n\t * @returns {object} The events object.\r\n\t */\r\n\tadd(event, obj, fn, capture = false, swapped = false, originalFn = null)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* we want to create an event object and add it the\r\n\t\tthe active events to track */\r\n\t\tconst data = this.create(event, obj, fn, capture, swapped, originalFn);\r\n\t\tDataTracker.add(obj, 'events', data);\r\n\r\n\t\tobj.addEventListener(event, fn, capture);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove an event from an object.\r\n\t *\r\n\t * @param {string} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {object|boolean} [capture]\r\n\t * @returns {object} a reference to the event object.\r\n\t */\r\n\tremove(event, obj, fn, capture = false)\r\n\t{\r\n\t\tconst result = this.getEvent(event, obj, fn, capture);\r\n\t\tif (result === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif (typeof result === 'object')\r\n\t\t{\r\n\t\t\t/* we want to use the remove event method and just\r\n\t\t\tpass the listener object */\r\n\t\t\tthis.removeEvent(result);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove an event listener.\r\n\t * @param {object} listener\r\n\t * @returns {object} a reference to the event object.\r\n\t */\r\n\tremoveEvent(listener)\r\n\t{\r\n\t\tif (typeof listener === 'object')\r\n\t\t{\r\n\t\t\tconst obj = listener.obj;\r\n\t\t\tobj.removeEventListener(listener.event, listener.fn, listener.capture);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will search for an event.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object|boolean}\r\n\t */\r\n\tgetEvent(event, obj, fn, capture)\r\n\t{\r\n\t\tif (typeof obj !== 'object')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst events = this.getEvents(obj);\r\n\t\tif (!events || events.length < 1)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst eventObj = this.create(event, obj, fn, capture);\r\n\t\t/* if the search returns anything but false we\r\n\t\tfound our active event */\r\n\t\treturn this.search(eventObj, events);\r\n\t},\r\n\r\n\t/**\r\n\t * This will search for an event from the object events.\r\n\t *\r\n\t * @param {object} eventObj\r\n\t * @param {array} events\r\n\t * @returns {object|boolean}\r\n\t */\r\n\tsearch(eventObj, events)\r\n\t{\r\n\t\tlet listener,\r\n\t\tswappable = this.isSwappable(eventObj.event);\r\n\t\tfor (var i = 0, maxLength = events.length; i < maxLength; i++)\r\n\t\t{\r\n\t\t\tlistener = events[i];\r\n\t\t\tif (listener.event !== eventObj.event || listener.obj !== eventObj.obj)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif (listener.fn === eventObj.fn || (swappable === true && listener.originalFn === eventObj.fn))\r\n\t\t\t{\r\n\t\t\t\treturn listener;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove all events on an object.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {object} a reference to the events object.\r\n\t */\r\n\tremoveEvents(obj)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tDataTracker.remove(obj, 'events');\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * @member {array} swap The swappable events.\r\n\t */\r\n\tswap: [\r\n\t\t'DOMMouseScroll',\r\n\t\t'wheel',\r\n\t\t'mousewheel',\r\n\t\t'mousemove',\r\n\t\t'popstate'\r\n\t],\r\n\r\n\t/**\r\n\t * This will a event type to the swappable array.\r\n\t *\r\n\t * @param {string} type\r\n\t */\r\n\taddSwapped(type)\r\n\t{\r\n\t\tthis.swap.push(type);\r\n\t},\r\n\r\n\t/**\r\n\t * This will check if an event is swappable.\r\n\t *\r\n\t * @param {string} event\r\n\t * @returns {boolean}\r\n\t */\r\n\tisSwappable(event)\r\n\t{\r\n\t\treturn this.swap.includes(event);\r\n\t}\r\n};\r\n\r\n/**\r\n * This will register the event system to the data tracker\r\n * to remove events that have been added in layouts.\r\n */\r\nDataTracker.addType('events', (data) =>\r\n{\r\n\tEvents.removeEvent(data);\r\n});", "import { Types } from '../../shared/types.js';\r\nimport { Events } from './events.js';\r\n\r\n/**\r\n * This will create an object that can be added to base to\r\n * add event methods.\r\n */\r\nexport const EventMethods =\r\n{\r\n\t/**\r\n\t * @member {Events} events\r\n\t */\r\n\tevents: Events,\r\n\r\n\t/**\r\n\t * This will add an event to an object.\r\n\t *\r\n\t * @param {string} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object}\r\n\t */\r\n\taddListener(event, obj, fn, capture)\r\n\t{\r\n\t\tthis.events.add(event, obj, fn, capture);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will add an event to an object.\r\n\t *\r\n\t * @param {string|array} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object}\r\n\t */\r\n\ton(event, obj, fn, capture)\r\n\t{\r\n\t\tconst events = this.events;\r\n\t\tif (Array.isArray(event))\r\n\t\t{\r\n\t\t\tevent.forEach((evt) =>\r\n\t\t\t{\r\n\t\t\t\tevents.add(evt, obj, fn, capture);\r\n\t\t\t});\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tevents.add(event, obj, fn, capture);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove an event from an object.\r\n\t *\r\n\t * @param {string|array} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object}\r\n\t */\r\n\toff(event, obj, fn, capture)\r\n\t{\r\n\t\tconst events = this.events;\r\n\t\tif (Array.isArray(event))\r\n\t\t{\r\n\t\t\tevent.forEach((evt) =>\r\n\t\t\t{\r\n\t\t\t\tevents.remove(evt, obj, fn, capture);\r\n\t\t\t});\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tevents.remove(event, obj, fn, capture);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove an event from an object.\r\n\t *\r\n\t * @param {string} event The event name.\r\n\t * @param {object} obj\r\n\t * @param {function} fn\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object}\r\n\t */\r\n\tremoveListener(event, obj, fn, capture)\r\n\t{\r\n\t\t/* we want to remove this from the active events */\r\n\t\tthis.events.remove(event, obj, fn, capture);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will create a custom event.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} event\r\n\t * @param {string} eventType\r\n\t * @param {object} [settings]\r\n\t * @param {object} [params]\r\n\t * @returns {object}\r\n\t */\r\n\t_createEvent(event, eventType, settings, params)\r\n\t{\r\n\t\tlet e;\r\n\t\tswitch (eventType)\r\n\t\t{\r\n\t\t\tcase 'HTMLEvents':\r\n\t\t\t\te = new Event(event, settings);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'MouseEvents':\r\n\t\t\t\te = new MouseEvent(event, settings);\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\te = new CustomEvent(event, params);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\treturn e;\r\n\t},\r\n\r\n\t/**\r\n\t * This will create a custom event. This supports html, mouse,\r\n\t * and customevents.\r\n\t *\r\n\t * @param {string} event\r\n\t * @param {object} obj\r\n\t * @param {object} [options]\r\n\t * @param {object} [params]\r\n\t * @returns {object}\r\n\t */\r\n\tcreateEvent(event, obj, options, params)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet settings =\r\n\t\t{\r\n\t\t\tpointerX: 0,\r\n\t\t\tpointerY: 0,\r\n\t\t\tbutton: 0,\r\n\t\t\tview: window,\r\n\t\t\tdetail: 1,\r\n\t\t\tscreenX: 0,\r\n\t\t\tscreenY: 0,\r\n\t\t\tclientX: 0,\r\n\t\t\tclientY: 0,\r\n\t\t\tctrlKey: false,\r\n\t\t\taltKey: false,\r\n\t\t\tshiftKey: false,\r\n\t\t\tmetaKey: false,\r\n\t\t\tbubbles: true,\r\n\t\t\tcancelable: true,\r\n\t\t\trelatedTarget: null\r\n\t\t};\r\n\r\n\t\tif (Types.isObject(options))\r\n\t\t{\r\n\t\t\tsettings = Object.assign(settings, options);\r\n\t\t}\r\n\r\n\t\tconst eventType = this._getEventType(event);\r\n\t\treturn this._createEvent(event, eventType, settings, params);\r\n\t},\r\n\r\n\t/**\r\n\t * This will get thetype of an event.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} event\r\n\t * @returns {string}\r\n\t */\r\n\t_getEventType(event)\r\n\t{\r\n\t\tconst eventTypes = {\r\n\t\t\t'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,\r\n\t\t\t'MouseEvents': /^(?:click|dblclick|mouse(?:down|up|over|move|out))$/\r\n\t\t};\r\n\r\n\t\tlet eventType = 'CustomEvent';\r\n\t\tfor (const [prop, value] of Object.entries(eventTypes))\r\n\t\t{\r\n\t\t\tif (event.match(value))\r\n\t\t\t{\r\n\t\t\t\teventType = prop;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn eventType;\r\n\t},\r\n\r\n\t/**\r\n\t * This will trigger an event.\r\n\t *\r\n\t * @param {string|object} event\r\n\t * @param {object} obj\r\n\t * @param {object} [params]\r\n\t * @returns {object}\r\n\t */\r\n\ttrigger(event, obj, params)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst e = (typeof event === 'string')? this.createEvent(event, obj, null, params) : event;\r\n\t\tobj.dispatchEvent(e);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * @member {string} mouseWheelEventType The mouse wheel event name.\r\n\t * @protected\r\n\t */\r\n\tmouseWheelEventType: null,\r\n\r\n\t/**\r\n\t * This will get the system mouse event.\r\n\t *\r\n\t * @protected\r\n\t * @returns {string}\r\n\t */\r\n\tgetWheelEventType()\r\n\t{\r\n\t\tconst getMouseWheelType = () =>\r\n\t\t{\r\n\t\t\tlet type = 'wheel';\r\n\t\t\tif ('onmousewheel' in self)\r\n\t\t\t{\r\n\t\t\t\ttype = 'mousewheel';\r\n\t\t\t}\r\n\t\t\telse if ('DOMMouseScroll' in self)\r\n\t\t\t{\r\n\t\t\t\ttype = 'DOMMouseScroll';\r\n\t\t\t}\r\n\t\t\treturn type;\r\n\t\t};\r\n\r\n\t\t/* this will get the event type or\r\n\t\tone time set the type and return the type */\r\n\t\treturn this.mouseWheelEventType || (\r\n\t\t\tthis.mouseWheelEventType = getMouseWheelType()\r\n\t\t);\r\n\t},\r\n\r\n\t/**\r\n\t * This will add a mouse event to an object.\r\n\t *\r\n\t * @param {function} callBackFn\r\n\t * @param {object} [obj]\r\n\t * @param {boolean} [cancelDefault]\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object} base object.\r\n\t */\r\n\tonMouseWheel(callBackFn, obj, cancelDefault, capture = false)\r\n\t{\r\n\t\tif (typeof obj === \"undefined\")\r\n\t\t{\r\n\t\t\tobj = window;\r\n\t\t}\r\n\r\n\t\t/* we want to return the mousewheel data\r\n\t\tto this private callback function before\r\n\t\treturning to the call back function*/\r\n\t\tconst mouseWheelResults = (e) =>\r\n\t\t{\r\n\t\t\tconst delta = Math.max(-1, Math.min(1, (-e.deltaY || e.wheelDelta || -e.detail)));\r\n\r\n\t\t\t/* we can now send the mouse wheel results to\r\n\t\t\tthe call back function */\r\n\t\t\tif (typeof callBackFn === 'function')\r\n\t\t\t{\r\n\t\t\t\tcallBackFn(delta, e);\r\n\t\t\t}\r\n\r\n\t\t\t/* we want to check to cancel default */\r\n\t\t\tif (cancelDefault === true)\r\n\t\t\t{\r\n\t\t\t\te.preventDefault();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst event = this.getWheelEventType();\r\n\t\tthis.events.add(event, obj, mouseWheelResults, capture, true, callBackFn);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove a mouse event\r\n\t *\r\n\t * @param {function} callBackFn\r\n\t * @param {object} [obj]\r\n\t * @param {boolean|object} [capture]\r\n\t * @returns {object} base object.\r\n\t */\r\n\toffMouseWheel(callBackFn, obj, capture = false)\r\n\t{\r\n\t\tif (typeof obj === \"undefined\")\r\n\t\t{\r\n\t\t\tobj = window;\r\n\t\t}\r\n\r\n\t\tconst event = this.getWheelEventType();\r\n\t\tthis.off(event, obj, callBackFn, capture);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will prevent default on an event.\r\n\t *\r\n\t * @param {object} e\r\n\t * @returns {object} base object.\r\n\t */\r\n\tpreventDefault(e)\r\n\t{\r\n\t\tif (typeof e.preventDefault === 'function')\r\n\t\t{\r\n\t\t\te.preventDefault();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\te.returnValue = false;\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * This will stop an event from propigating.\r\n\t *\r\n\t * @param {object} e\r\n\t * @returns {object} base object.\r\n\t */\r\n\tstopPropagation(e)\r\n\t{\r\n\t\tif (typeof e.stopPropagation === 'function')\r\n\t\t{\r\n\t\t\te.stopPropagation();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\te.cancelBubble = true;\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n};", "/**\r\n * Base Framework\r\n * @version 3.5.0\r\n * @author Chris Durfee\r\n * @file This is a javascript framework to allow complex\r\n * functions to work in many browsers and versions.\r\n */\r\n\r\nimport { Arrays } from '../shared/arrays.js';\r\nimport { Objects } from '../shared/objects.js';\r\nimport { Types } from '../shared/types.js';\r\nimport { DataTracker } from './data-tracker/data-tracker.js';\r\nimport { equals } from './equals.js';\r\nimport { EventMethods } from './events/event-methods.js';\r\n\r\n/**\r\n * Base\r\n *\r\n * This is the base framework.\r\n *\r\n * @class\r\n */\r\nclass Base\r\n{\r\n\t/**\r\n\t * This will create an instance of base.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {array} errors\r\n\t\t */\r\n\t\tthis.errors = [];\r\n\r\n\t\t/**\r\n\t\t * @member {object} dataTracker\r\n\t\t */\r\n\t\tthis.dataTracker = DataTracker;\r\n\t}\r\n\r\n\t/**\r\n\t * this will augement the base framework with new functionality.\r\n\t *\r\n\t * @param {object} methods The new methods to add.\r\n\t * @returns {object} An instance of base.\r\n\t */\r\n\taugment(methods)\r\n\t{\r\n\t\tif (!Types.isObject(methods))\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst prototype = this.constructor.prototype;\r\n\t\tfor (var property in methods)\r\n\t\t{\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(methods, property))\r\n\t\t\t{\r\n\t\t\t\tprototype[property] = methods[property];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will override a method function with a new function.\r\n\t *\r\n\t * @param {object} obj The object being modified.\r\n\t * @param {string} methodName the method name being overriden.\r\n\t * @param {function} overrideMethod The new function to call.\r\n\t * @param {array} args The args to pass to the first function call.\r\n\t * @returns {*} The results of the function being called.\r\n\t */\r\n\toverride(obj, methodName, overrideMethod, args)\r\n\t{\r\n\t\treturn (obj[methodName] = overrideMethod).apply(obj, Arrays.toArray(args));\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the last error.\r\n\t *\r\n\t * @returns {(object|boolean)} The last error or false.\r\n\t */\r\n\tgetLastError()\r\n\t{\r\n\t\tconst errors = this.errors;\r\n\t\treturn (errors.length)? errors.pop() : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an error.\r\n\t *\r\n\t * @param {object} err\r\n\t * @returns {void}\r\n\t */\r\n\taddError(err)\r\n\t{\r\n\t\tthis.errors.push(err);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value from a property on an object.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {*} [defaultText] A value if no value is set.\r\n\t * @returns {string}\r\n\t */\r\n\tgetProperty(obj, property, defaultText)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tconst value = obj[property];\r\n\t\tif (typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\t/* if no value was available\r\n\t\twe want to return an empty string */\r\n\t\treturn (typeof defaultText !== 'undefined')? defaultText : '';\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a callBack.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {function} method\r\n\t * @param {array} [argArray] Default args to pass.\r\n\t * @param {boolean} [addArgs] Set to add merge args from the\r\n\t * curried function.\r\n\t * @returns {function|boolean} The callBack function or false.\r\n\t */\r\n\tcreateCallBack(obj, method, argArray = [], addArgs = false)\r\n\t{\r\n\t\tif (typeof method !== 'function')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn (...args) =>\r\n\t\t{\r\n\t\t\tif (addArgs === true)\r\n\t\t\t{\r\n\t\t\t\targArray = argArray.concat(args);\r\n\t\t\t}\r\n\r\n\t\t\treturn method.apply(obj, argArray);\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind scope to a method.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {function} method\r\n\t * @returns {function}\r\n\t */\r\n\tbind(obj, method)\r\n\t{\r\n\t\treturn method.bind(obj);\r\n\t}\r\n}\r\n\r\n/**\r\n * This will return the base prototype to allow the module\r\n * to be added to base as a module.\r\n *\r\n * @returns {object} the base prototype.\r\n */\r\nBase.prototype.extend = (function()\r\n{\r\n\treturn Base.prototype;\r\n})();\r\n\r\n/**\r\n * This is the instance of base that all modules will use.\r\n *\r\n * @global\r\n */\r\nexport const base = new Base();\r\n\r\n/**\r\n * This will add the augmented methods to base.\r\n */\r\nbase.augment({\r\n\t...Objects,\r\n\t...EventMethods,\r\n\t...Types,\r\n\tequals\r\n});", "/**\r\n * This is the default xhr (ajax) settings.\r\n */\r\nexport const XhrDefaultSettings =\r\n{\r\n\t/**\r\n\t * @member {string} url This is the url of the server\r\n\t */\r\n\turl: '',\r\n\r\n\t/**\r\n\t * @member {string} params This is the responseType of the server\r\n\t */\r\n\tresponseType: 'json',\r\n\r\n\t/**\r\n\t * @member {string} method This is the method of the request\r\n\t */\r\n\tmethod: 'POST',\r\n\r\n\t/**\r\n\t * @member {object|string} params This can fix a param string\r\n\t * to be added to every ajax request.\r\n\t */\r\n\tfixedParams: '',\r\n\r\n\t/**\r\n\t * @member {object} headers This is the headers of the request\r\n\t */\r\n\theaders:\r\n\t{\r\n\t\t'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'\r\n\t},\r\n\r\n\t/**\r\n\t * @member {array} beforeSend This is an array of callbacks\r\n\t */\r\n\tbeforeSend: [],\r\n\r\n\t/**\r\n\t * @member {boolean} async This is the async of the request\r\n\t */\r\n\tasync: true,\r\n\r\n\t/**\r\n\t * @member {boolean} crossDomain This will allow cross domain requests\r\n\t */\r\n\tcrossDomain: false,\r\n\r\n\t/**\r\n\t * @member {boolean} withCredentials CORS with credentials\r\n\t */\r\n\twithCredentials: false,\r\n\r\n\t/**\r\n\t * @member {function|null} completed This is the completed callback\r\n\t */\r\n\tcompleted: null,\r\n\r\n\t/**\r\n\t * @member {function|null} failed This is the failed callback\r\n\t */\r\n\tfailed: null,\r\n\r\n\t/**\r\n\t * @member {function|null} aborted This is the aborted callback\r\n\t */\r\n\taborted: null,\r\n\r\n\t/**\r\n\t * @member {function|null} progress This is the progress callback\r\n\t */\r\n\tprogress: null\r\n};\r\n", "import { base } from '../../main/base.js';\r\nimport { Objects } from '../../shared/objects.js';\r\nimport { XhrDefaultSettings } from './xhr-default-settings.js';\r\n\r\n/**\r\n * This will add ajax settings and methods to the base class.\r\n */\r\nexport const setupBaseAjaxMethods = () =>\r\n{\r\n\t/* this will add ajax settings to the base class */\r\n\tbase.augment(\r\n\t{\r\n\t\t/**\r\n\t\t * @member {object} xhrSettings\r\n\t\t */\r\n\t\txhrSettings: XhrDefaultSettings,\r\n\r\n\t\t/**\r\n\t\t * This will add fixed params to each xhr request.\r\n\t\t *\r\n\t\t * @param {(string|object)} params\r\n\t\t */\r\n\t\taddFixedParams(params)\r\n\t\t{\r\n\t\t\tthis.xhrSettings.fixedParams = params;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * This will add a callback that will be called before\r\n\t\t * each request.\r\n\t\t *\r\n\t\t * @param {function} callBack\r\n\t\t */\r\n\t\tbeforeSend(callBack)\r\n\t\t{\r\n\t\t\tthis.xhrSettings.beforeSend.push(callBack);\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * This will update the xhr settings.\r\n\t\t *\r\n\t\t * @param {object} settingsObj\r\n\t\t */\r\n\t\tajaxSettings(settingsObj)\r\n\t\t{\r\n\t\t\tif (typeof settingsObj === 'object')\r\n\t\t\t{\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tthis.xhrSettings = Objects.extendClass(base.xhrSettings, settingsObj);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * This will reset the xhr settings.\r\n\t\t */\r\n\t\tresetAjaxSettings()\r\n\t\t{\r\n\t\t\tthis.xhrSettings = XhrDefaultSettings;\r\n\t\t}\r\n\t});\r\n};\r\n", "/**\r\n * Strings\r\n *\r\n * This will contain methods for working with strings.\r\n *\r\n * @module\r\n * @name Strings\r\n */\r\nexport class Strings\r\n{\r\n\t/**\r\n\t * This will limit the length of a string.\r\n\t *\r\n\t * @param {string} str\r\n\t * @param {number} [maxLength]\r\n\t * @returns {string}\r\n\t */\r\n\tstatic limit(str, maxLength = 1000000)\r\n\t{\r\n\t\tif (typeof str !== 'string')\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\treturn str.substring(0, maxLength);\r\n\t}\r\n\r\n\t/**\r\n\t * This will parse a query string.\r\n\t *\r\n\t * @param {string} [str] The string to parse or the global\r\n\t * location will be parsed.\r\n\t * @param {boolean} [decode]\r\n\t * @returns {object}\r\n\t */\r\n\tstatic parseQueryString(str, decode, limit = true)\r\n\t{\r\n\t\tif (typeof str !== 'string')\r\n\t\t{\r\n\t\t\tstr = window.location.search;\r\n\t\t}\r\n\r\n\t\tstr = this.limit(str);\r\n\r\n\t\tconst objURL = {},\r\n\t\tregExp = /([^?=&]+)(=([^&]*))?/g;\r\n\t\t// @ts-ignore\r\n\t\tstr.replace(regExp, function(a, b, c, d)\r\n\t\t{\r\n\t\t\t/* we want to save the key and the\r\n\t\t\tvalue to the objURL */\r\n\t\t\tobjURL[b] = (decode !== false)? decodeURIComponent(d) : d;\r\n\t\t});\r\n\r\n\t\treturn objURL;\r\n\t}\r\n\r\n\t/**\r\n\t * This will camelCase a string.\r\n\t *\r\n\t * @param {string} str\r\n\t * @returns {string} The string or false.\r\n\t */\r\n\tstatic camelCase(str)\r\n\t{\r\n\t\tstr = this.limit(str);\r\n\r\n\t\tconst regExp = /(-|\\s|_)+\\w{1}/g;\r\n\t\treturn str.replace(regExp, (match) => match[1].toUpperCase());\r\n\t}\r\n\r\n\t/**\r\n\t * This will uncamel-case a string.\r\n\t *\r\n\t * @param {string} str\r\n\t * @param {string} [delimiter]\r\n\t * @returns {string} The string.\r\n\t */\r\n\tstatic uncamelCase(str, delimiter = '-')\r\n\t{\r\n\t\tstr = this.limit(str);\r\n\r\n\t\tconst regExp = /([A-Z]{1,})/g;\r\n\t\treturn str.replace(regExp, (match) => delimiter + match.toLowerCase()).toLowerCase();\r\n\t}\r\n\r\n\t/**\r\n\t * This will title case a string.\r\n\t *\r\n\t * @param {string} str\r\n\t * @returns {string} The string.\r\n\t */\r\n\tstatic titleCase(str)\r\n\t{\r\n\t\tif (!str)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tstr = this.limit(str);\r\n\r\n\t\tconst pattern = /\\w\\S*/;\r\n\t\treturn str.replace(pattern, (txt) =>\r\n\t\t{\r\n\t\t\treturn txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();\r\n\t\t});\r\n\t}\r\n}", "import { base } from '../../main/base.js';\r\nimport { Events } from '../../main/events/events.js';\r\nimport { Objects } from '../../shared/objects.js';\r\nimport { Strings } from '../../shared/strings.js';\r\nimport { XhrDefaultSettings } from './xhr-default-settings.js';\r\n\r\n/**\r\n * XhrRequest\r\n *\r\n * This will create an xhr request object.\r\n *\r\n * @class\r\n */\r\nexport class XhrRequest\r\n{\r\n\t/**\r\n\t * This will create an xhr request object.\r\n\t *\r\n\t * @constructor\r\n\t * @param {*} args\r\n\t */\r\n\tconstructor(args)\r\n\t{\r\n\t\tthis.settings = null;\r\n\t\tthis.xhr = null;\r\n\t\tthis.setup(args);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the xhr request.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} args\r\n\t */\r\n\tsetup(args)\r\n\t{\r\n\t\tthis.getXhrSettings(args);\r\n\r\n\t\tconst xhr = this.xhr = this.createXHR();\r\n\t\tconst {method, url, async} = this.settings;\r\n\t\txhr.open(method, url, async);\r\n\r\n\t\tthis.setupHeaders();\r\n\t\tthis.addXhrEvents();\r\n\t\tthis.beforeSend();\r\n\r\n\t\t/* this will setup the params and send the\r\n\t\txhr request */\r\n\t\txhr.send(this.getParams());\r\n\t}\r\n\r\n\t/**\r\n\t * This will call all before send callbacks.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tbeforeSend()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst items = XhrDefaultSettings.beforeSend;\r\n\t\tif (items.length < 1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst xhr = this.xhr;\r\n\t\tconst settings = this.settings;\r\n\t\tfor (var i = 0, length = items.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar callBack = items[i];\r\n\t\t\tif (callBack)\r\n\t\t\t{\r\n\t\t\t\tcallBack(xhr, settings);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will convert an object to a string.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} object\r\n\t * @returns {string}\r\n\t */\r\n\tobjectToString(object)\r\n\t{\r\n\t\tconst params = [];\r\n\t\tfor (var prop in object)\r\n\t\t{\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(object, prop))\r\n\t\t\t{\r\n\t\t\t\tparams.push(prop + '=' + encodeURIComponent(object[prop]));\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn params.join('&');\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the base params to the request params.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} params\r\n\t * @param {*} addingParams\r\n\t * @returns {*}\r\n\t */\r\n\tsetupParams(params, addingParams)\r\n\t{\r\n\t\tconst paramsType = typeof params;\r\n\t\tif (!addingParams)\r\n\t\t{\r\n\t\t\tif ((params instanceof FormData) === false && paramsType === 'object')\r\n\t\t\t{\r\n\t\t\t\tparams = this.objectToString(params);\r\n\t\t\t}\r\n\t\t\treturn params;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will convert the adding params to match\r\n\t\t * the params type.\r\n\t\t */\r\n\t\tconst addingType = typeof addingParams;\r\n\t\tif (paramsType === 'string')\r\n\t\t{\r\n\t\t\tif (addingType !== 'string')\r\n\t\t\t{\r\n\t\t\t\taddingParams = this.objectToString(addingParams);\r\n\t\t\t}\r\n\r\n\t\t\tconst char = (params === '')? '?' : '&';\r\n\t\t\tparams += char + addingParams;\r\n\t\t\treturn params;\r\n\t\t}\r\n\r\n\t\tif (addingType === 'string')\r\n\t\t{\r\n\t\t\taddingParams = Strings.parseQueryString(addingParams, false);\r\n\t\t}\r\n\r\n\t\tif (params instanceof FormData)\r\n\t\t{\r\n\t\t\tfor (var key in addingParams)\r\n\t\t\t{\r\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(addingParams, key))\r\n\t\t\t\t{\r\n\t\t\t\t\tparams.append(key, addingParams[key]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (paramsType === 'object')\r\n\t\t{\r\n\t\t\t/* we don't want to modify the original object\r\n\t\t\tso we need to clone the object before extending */\r\n\t\t\tparams = Objects.clone(params);\r\n\r\n\t\t\tparams = Object.assign(addingParams, params);\r\n\t\t\tparams = this.objectToString(params);\r\n\t\t}\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the params.\r\n\t *\r\n\t * @protected\r\n\t * @returns {*}\r\n\t */\r\n\tgetParams()\r\n\t{\r\n\t\tconst settings = this.settings;\r\n\t\tconst fixedParams = settings.fixedParams;\r\n\t\tlet params = settings.params;\r\n\t\tif (params)\r\n\t\t{\r\n\t\t\tparams = this.setupParams(params, fixedParams);\r\n\t\t}\r\n\t\telse if(fixedParams)\r\n\t\t{\r\n\t\t\tparams = this.setupParams(fixedParams);\r\n\t\t}\r\n\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the settings from the args.\r\n\t *\r\n\t * @protected\r\n\t * @param {array} args\r\n\t * @returns {void}\r\n\t */\r\n\tgetXhrSettings(args)\r\n\t{\r\n\t\t/* we want to create a clone of the default\r\n\t\tsettings before adding the new settings */\r\n\t\t// @ts-ignore\r\n\t\tlet settings = this.settings = {...base.xhrSettings};\r\n\r\n\t\t/* we want to check if we are adding the ajax settings by\r\n\t\tindividual args or by a settings object */\r\n\t\tif (args.length >= 2 && typeof args[0] !== 'object')\r\n\t\t{\r\n\t\t\tfor (var i = 0, maxLength = args.length; i < maxLength; i++)\r\n\t\t\t{\r\n\t\t\t\tvar arg = args[i];\r\n\r\n\t\t\t\tswitch (i)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase 0:\r\n\t\t\t\t\t\tsettings.url = arg;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\tsettings.params = arg;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 2:\r\n\t\t\t\t\t\tsettings.completed = arg;\r\n\t\t\t\t\t\tsettings.failed = arg;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 3:\r\n\t\t\t\t\t\tsettings.responseType = arg || 'json';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 4:\r\n\t\t\t\t\t\tsettings.method = (arg)? arg.toUpperCase() : 'POST';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 5:\r\n\t\t\t\t\t\tsettings.async = (typeof arg !== 'undefined')? arg : true;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t/* override the default settings with the args\r\n\t\t\tsettings object */\r\n\t\t\tsettings = this.settings = Objects.extendClass(this.settings, args[0]);\r\n\r\n\t\t\t/* we want to check to add the completed callback\r\n\t\t\tas the error and aborted if not set */\r\n\t\t\tif (typeof settings.completed === 'function')\r\n\t\t\t{\r\n\t\t\t\tif (typeof settings.failed !== 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.failed = settings.completed;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (typeof settings.aborted !== 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.aborted = settings.failed;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the xhr object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\tcreateXHR()\r\n\t{\r\n\t\tconst settings = this.settings,\r\n\t\txhr = new XMLHttpRequest();\r\n\t\txhr.responseType = settings.responseType;\r\n\r\n\t\tif (settings.withCredentials === true)\r\n\t\t{\r\n\t\t\txhr.withCredentials = true;\r\n\t\t}\r\n\r\n\t\treturn xhr;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the request headers.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetupHeaders()\r\n\t{\r\n\t\tconst settings = this.settings;\r\n\t\tif (!settings || typeof settings.headers !== 'object')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* we want to add a header for each\r\n\t\tproperty in the object */\r\n\t\tlet headers = settings.headers;\r\n\t\tfor (var header in headers)\r\n\t\t{\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(headers, header))\r\n\t\t\t{\r\n\t\t\t\tthis.xhr.setRequestHeader(header, headers[header]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the request status.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} e\r\n\t * @param {string} [overrideType]\r\n\t */\r\n\tupdate(e, overrideType)\r\n\t{\r\n\t\tconst xhr = this.xhr;\r\n\r\n\t\t/* this will remove the xhr events from the active events\r\n\t\tafter the events are completed, aborted, or errored */\r\n\t\tconst removeEvents = () =>\r\n\t\t{\r\n\t\t\tEvents.removeEvents(xhr.upload);\r\n\t\t\tEvents.removeEvents(xhr);\r\n\t\t};\r\n\r\n\t\tconst settings = this.settings;\r\n\t\tif (!settings)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst type = overrideType || e.type;\r\n\t\tswitch (type)\r\n\t\t{\r\n\t\t\tcase 'load':\r\n\t\t\t\tif (typeof settings.completed === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tlet response = this.getResponseData();\r\n\t\t\t\t\tsettings.completed(response, this.xhr);\r\n\t\t\t\t}\r\n\t\t\t\tremoveEvents();\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'error':\r\n\t\t\t\tif (typeof settings.failed === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.failed(false, this.xhr);\r\n\t\t\t\t}\r\n\t\t\t\tremoveEvents();\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'progress':\r\n\t\t\t\tif (typeof settings.progress === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.progress(e);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'abort':\r\n\t\t\t\tif (typeof settings.aborted === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\tsettings.aborted(false, this.xhr);\r\n\t\t\t\t}\r\n\t\t\t\tremoveEvents();\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the response data.\r\n\t *\r\n\t * @protected\r\n\t * @returns {*}\r\n\t */\r\n\tgetResponseData()\r\n\t{\r\n\t\tconst xhr = this.xhr;\r\n\t\tconst responseType = xhr.responseType;\r\n\t\tif (!responseType || responseType === 'text')\r\n\t\t{\r\n\t\t\treturn xhr.responseText;\r\n\t\t}\r\n\r\n\t\treturn xhr.response;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the xhr events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\taddXhrEvents()\r\n\t{\r\n\t\tconst settings = this.settings;\r\n\t\tif (!settings)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst xhr = this.xhr,\r\n\t\tcallBack = this.update.bind(this);\r\n\t\tEvents.on(['load', 'error', 'abort'], xhr, callBack);\r\n\t\tEvents.on('progress', xhr.upload, callBack);\r\n\t}\r\n}\r\n", "import { setupBaseAjaxMethods } from './base-ajax-methods.js';\r\nimport { XhrRequest } from './xhr-request.js';\r\n\r\n/* Setup base ajax methods */\r\nsetupBaseAjaxMethods();\r\n\r\n/**\r\n * This will make an xhr (ajax) request.\r\n *\r\n * @overload\r\n * @param {string} url\r\n * @param {string} [params]\r\n * @param {function} [callBackFn]\r\n * @param {string} [responseType]\r\n * @param {string} [method=POST]\r\n * @param {boolean} [async]\r\n *\r\n * @overload\r\n * @param {object} settings\r\n * @example\r\n * {\r\n * \turl: '',\r\n * \tparams: '',\r\n * \tcompleted(response)\r\n * \t{\r\n *\r\n * \t}\r\n * }\r\n *\r\n * @returns {XMLHttpRequest} xhr object.\r\n */\r\nexport const Ajax = (...args) =>\r\n{\r\n\t/* we want to save the args so we can check\r\n\twhich way we are adding the ajax settings */\r\n\tconst ajax = new XhrRequest(args);\r\n\treturn ajax.xhr;\r\n};\r\n\r\n/* Re-export XhrRequest for backwards compatibility */\r\nexport { XhrRequest };\r\n\r\n", "/**\r\n * This will prepare the children.\r\n *\r\n * @param {*} value\r\n * @returns {*}\r\n */\r\nconst prepareChildren = (value) =>\r\n{\r\n\tif (typeof value !== 'string')\r\n\t{\r\n\t\treturn value;\r\n\t}\r\n\r\n\treturn setChildString(value);\r\n};\r\n\r\n/**\r\n * This will set the child string.\r\n *\r\n * @param {string} value\r\n * @returns {Array<object>}\r\n */\r\nconst setChildString = (value) =>\r\n{\r\n\treturn [{\r\n\t\ttag: 'text',\r\n\t\ttextContent: value\r\n\t}];\r\n};\r\n\r\n/**\r\n * This will set the default props.\r\n *\r\n * @returns {object}\r\n */\r\nexport const DefaultProps = () => ({\r\n props: {},\r\n children: []\r\n});\r\n\r\n/**\r\n * This will set the string prop.\r\n *\r\n * @param {string} value\r\n * @returns {object}\r\n */\r\nexport const StringProp = (value) => ({\r\n props: {},\r\n children: setChildString(value)\r\n});\r\n\r\n/**\r\n * This will set the array prop.\r\n *\r\n * @param {array} value\r\n * @returns {object}\r\n */\r\nexport const ArrayProp = (value) => ({\r\n props: {},\r\n children: value\r\n});\r\n\r\n/**\r\n * This will set the object prop.\r\n *\r\n * @param {array} args\r\n * @returns {object}\r\n */\r\nexport const ObjectProp = (args) => ({\r\n props: args[0] || {}, // this will set an empty object if no props are passed.\r\n children: prepareChildren(args[1])\r\n});", "\r\n/**\r\n * ConnectionTracker\r\n *\r\n * Tracks active connections in the data binder. Supports multiple\r\n * connections per element+attribute pair.\r\n *\r\n * @class\r\n */\r\nexport class ConnectionTracker\r\n{\r\n\t/**\r\n\t * Creates a connection tracker.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {Map<string, Map<string, object|object[]>>} connections\r\n\t\t */\r\n\t\tthis.connections = new Map();\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a connection to be tracked.\r\n\t *\r\n\t * @param {string} id\r\n\t * @param {string} attr\r\n\t * @param {object} connection\r\n\t * @returns {object}\r\n\t */\r\n\tadd(id, attr, connection)\r\n\t{\r\n\t\tconst attrMap = this.getOrCreate(id);\r\n\t\tconst existing = attrMap.get(attr);\r\n\t\tif (!existing)\r\n\t\t{\r\n\t\t\tattrMap.set(attr, connection);\r\n\t\t}\r\n\t\telse if (Array.isArray(existing))\r\n\t\t{\r\n\t\t\texisting.push(connection);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tattrMap.set(attr, [existing, connection]);\r\n\t\t}\r\n\r\n\t\treturn connection;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the most recent connection for an element+attribute.\r\n\t *\r\n\t * @param {string} id\r\n\t * @param {string} attr\r\n\t * @returns {object|false}\r\n\t */\r\n\tget(id, attr)\r\n\t{\r\n\t\tconst value = this.connections.get(id)?.get(attr);\r\n\t\tif (!value)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn Array.isArray(value) ? (value[value.length - 1] || false) : value;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets or creates the attribute map for an element.\r\n\t *\r\n\t * @param {string} id\r\n\t * @returns {Map<string, object|object[]>}\r\n\t */\r\n\tgetOrCreate(id)\r\n\t{\r\n\t\tlet attrMap = this.connections.get(id);\r\n\t\tif (!attrMap)\r\n\t\t{\r\n\t\t\tattrMap = new Map();\r\n\t\t\tthis.connections.set(id, attrMap);\r\n\t\t}\r\n\t\treturn attrMap;\r\n\t}\r\n\r\n\t/**\r\n\t * Removes connections by id, or by id+attr.\r\n\t *\r\n\t * @param {string} id\r\n\t * @param {string} [attr]\r\n\t * @returns {void}\r\n\t */\r\n\tremove(id, attr)\r\n\t{\r\n\t\tconst attrMap = this.connections.get(id);\r\n\t\tif (!attrMap)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (attr)\r\n\t\t{\r\n\t\t\tthis.unsubscribe(attrMap.get(attr));\r\n\t\t\tattrMap.delete(attr);\r\n\r\n\t\t\tif (attrMap.size === 0)\r\n\t\t\t{\r\n\t\t\t\tthis.connections.delete(id);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tfor (const connection of attrMap.values())\r\n\t\t\t{\r\n\t\t\t\tthis.unsubscribe(connection);\r\n\t\t\t}\r\n\t\t\tthis.connections.delete(id);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Unsubscribes a connection or array of connections.\r\n\t *\r\n\t * @private\r\n\t * @param {object|object[]|undefined} connection\r\n\t * @returns {void}\r\n\t */\r\n\tunsubscribe(connection)\r\n\t{\r\n\t\tif (!connection)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (Array.isArray(connection))\r\n\t\t{\r\n\t\t\tfor (let i = 0, len = connection.length; i < len; i++)\r\n\t\t\t{\r\n\t\t\t\tconnection[i]?.unsubscribe();\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tconnection.unsubscribe();\r\n\t\t}\r\n\t}\r\n}", "/**\r\n * Source\r\n *\r\n * This will create a new source to use with\r\n * a connection.\r\n *\r\n * @class\r\n */\r\nexport class Source\r\n{\r\n\t/**\r\n\t * This will create a new source.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {string} msg\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.msg = null;\r\n\r\n\t\t/**\r\n\t\t * @member {string} token\r\n\t\t */\r\n\t\tthis.token = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the token.\r\n\t *\r\n\t * @param {string} token\r\n\t * @returns {void}\r\n\t */\r\n\tsetToken(token)\r\n\t{\r\n\t\tthis.token = token;\r\n\t}\r\n}", "import { Source } from './source.js';\r\n\r\n/**\r\n * OneWaySource\r\n *\r\n * This will create a one way source to use with\r\n * a connection.\r\n *\r\n * @class\r\n * @augments Source\r\n */\r\nexport class OneWaySource extends Source\r\n{\r\n\t/**\r\n\t * This will setup the data source.\r\n\t *\r\n\t * @param {object} data\r\n\t */\r\n\tconstructor(data)\r\n\t{\r\n\t\tsuper();\r\n\t\tthis.data = data;\r\n\t}\r\n\r\n\t/**\r\n\t * This will subscribe to a message.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {function} callBack\r\n\t * @returns {void}\r\n\t */\r\n\tsubscribe(msg, callBack)\r\n\t{\r\n\t\tthis.msg = msg;\r\n\t\tthis.token = this.data.on(msg, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will unsubscribe from the message.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tif (this.data && this.msg && this.token)\r\n\t\t{\r\n\t\t\tthis.data.off(this.msg, this.token);\r\n\t\t}\r\n\t\tthis.data = null;\r\n\t\tthis.msg = null;\r\n\t\tthis.token = null;\r\n\t}\r\n}", "/**\r\n * Connection\r\n *\r\n * This will create a connection.\r\n *\r\n * @class\r\n */\r\nexport class Connection\r\n{\r\n\t/**\r\n\t * This will be used to unsubscribe.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\r\n\t}\r\n}", "import { OneWaySource } from '../../sources/one-way-source.js';\r\nimport { Connection } from './connection.js';\r\n\r\n/**\r\n * OneWayConnection\r\n *\r\n * This will create a one way connection.\r\n *\r\n * @class\r\n * @augments Connection\r\n */\r\nexport class OneWayConnection extends Connection\r\n{\r\n\t/**\r\n\t * This will create a one way connection.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\tsuper();\r\n\r\n\t\t/**\r\n\t\t * @member {object|null} source\r\n\t\t */\r\n\t\tthis.source = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the connection source.\r\n\t *\r\n\t * @param {object} data\r\n\t * @returns {object}\r\n\t */\r\n\taddSource(data)\r\n\t{\r\n\t\treturn (this.source = new OneWaySource(data));\r\n\t}\r\n\r\n\t/**\r\n\t * This will be used to unsubscribe.\r\n\t *\r\n\t * @override\r\n\t * @returns {void}\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tthis.source.unsubscribe();\r\n\t\tthis.source = null;\r\n\t}\r\n}", "import { Source } from './source.js';\r\n\r\n/**\r\n * TwoWaySource\r\n *\r\n * This will create a two way source to use with\r\n * a connection.\r\n *\r\n * @class\r\n * @augments Source\r\n */\r\nexport class TwoWaySource extends Source\r\n{\r\n\t/**\r\n\t * This will create a new source.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} pubSub\r\n\t */\r\n\tconstructor(pubSub)\r\n\t{\r\n\t\tsuper();\r\n\r\n\t\t/**\r\n\t\t * @member {object} pubSub\r\n\t\t */\r\n\t\tthis.pubSub = pubSub;\r\n\t}\r\n\r\n\t/**\r\n\t * This will subscribe to a message.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @returns {void}\r\n\t */\r\n\tsubscribe(msg)\r\n\t{\r\n\t\tthis.msg = msg;\r\n\r\n\t\tconst callBack = this.callBack.bind(this);\r\n\t\tthis.token = this.pubSub.on(msg, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will unsubscribe from a message.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tif (this.pubSub && this.msg && this.token)\r\n\t\t{\r\n\t\t\tthis.pubSub.off(this.msg, this.token);\r\n\t\t}\r\n\t\tthis.pubSub = null;\r\n\t\tthis.msg = null;\r\n\t\tthis.token = null;\r\n\t}\r\n\r\n\t/**\r\n\t * Override this to setup cource callBack.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tcallBack()\r\n\t{\r\n\r\n\t}\r\n}", "import { TwoWaySource } from './two-way-source.js';\r\n\r\n/**\r\n * DataSource\r\n *\r\n * This will create a data source to use with\r\n * a connection.\r\n *\r\n * @class\r\n * @augments TwoWaySource\r\n */\r\nexport class DataSource extends TwoWaySource\r\n{\r\n\t/**\r\n\t * This will create a new data source.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {object} pubSub\r\n\t */\r\n\tconstructor(data, prop, pubSub)\r\n\t{\r\n\t\tsuper(pubSub);\r\n\r\n\t\t/**\r\n\t\t * @member {object} data\r\n\t\t */\r\n\t\tthis.data = data;\r\n\r\n\t\t/**\r\n\t\t * @member {string} prop\r\n\t\t */\r\n\t\tthis.prop = prop;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the data value.\r\n\t *\r\n\t * @param {*} value\r\n\t * @returns {void}\r\n\t */\r\n\tset(value)\r\n\t{\r\n\t\tthis.data.set(this.prop, value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the data value.\r\n\t *\r\n\t * @returns {*}\r\n\t */\r\n\tget()\r\n\t{\r\n\t\treturn this.data.get(this.prop);\r\n\t}\r\n\r\n\t/**\r\n\t * The callBack when updated.\r\n\t *\r\n\t * @overload\r\n\t * @param {*} value\r\n\t * @param {object} committer\r\n\t * @returns {void}\r\n\t */\r\n\t// @ts-ignore\r\n\tcallBack(value, committer)\r\n\t{\r\n\t\tif (this.data !== committer)\r\n\t\t{\r\n\t\t\tthis.data.set(this.prop, value, committer);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will clean up the data source.\r\n\t *\r\n\t * @override\r\n\t * @returns {void}\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tsuper.unsubscribe();\r\n\t\tthis.data = null;\r\n\t\tthis.prop = null;\r\n\t}\r\n}", "import { Arrays } from './arrays.js';\r\nimport { Strings } from './strings.js';\r\nimport { Types } from './types.js';\r\n\r\n/**\r\n * Dom\r\n *\r\n * This will contain methods for working with the dom.\r\n *\r\n * @module\r\n * @name Dom\r\n */\r\nexport class Dom\r\n{\r\n\t/**\r\n\t * This will select an element by id.\r\n\t *\r\n\t * @param {string} id\r\n\t * @returns {object|boolean} The element object or false.\r\n\t */\r\n\tstatic getById(id)\r\n\t{\r\n\t\tif (typeof id !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst obj = document.getElementById(id);\r\n\t\treturn (obj || false);\r\n\t}\r\n\r\n\t/**\r\n\t * This will select elements by name.\r\n\t *\r\n\t * @param {string} name\r\n\t * @returns {object|boolean} The elements array or false.\r\n\t */\r\n\tstatic getByName(name)\r\n\t{\r\n\t\tif (typeof name !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst obj = document.getElementsByName(name);\r\n\t\treturn (obj)? Arrays.toArray(obj) : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will select by css selector.\r\n\t *\r\n\t * @param {string} selector\r\n\t * @param {boolean} single Set to true if you only want one result.\r\n\t * @returns {*}\r\n\t */\r\n\tstatic getBySelector(selector, single)\r\n\t{\r\n\t\tif (typeof selector !== 'string')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we are only selecting\r\n\t\tthe first element or all elements */\r\n\t\tsingle = single || false;\r\n\t\tif (single === true)\r\n\t\t{\r\n\t\t\tconst obj = document.querySelector(selector);\r\n\t\t\treturn (obj || false);\r\n\t\t}\r\n\r\n\t\tconst elements = document.querySelectorAll(selector);\r\n\t\tif (!elements)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* if there is only one result just return the\r\n\t\tfirst element in the node list */\r\n\t\treturn (elements.length === 1)? elements[0] : Arrays.toArray(elements);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set the innerHTML or an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} [html] If the html is not set, the html of the\r\n\t * element will be returned.\r\n\t *\r\n\t * @returns {*}\r\n\t */\r\n\tstatic html(obj, html)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we are getting the\r\n\t\thtml or adding the html */\r\n\t\tif (Types.isUndefined(html) === false)\r\n\t\t{\r\n\t\t\tobj.innerHTML = html;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn obj.innerHTML;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the css property of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} value\r\n\t * @returns {object} an instance of base.\r\n\t */\r\n\tstatic setCss(obj, property, value)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false || Types.isUndefined(property))\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tproperty = Strings.uncamelCase(property);\r\n\t\tobj.style[property] = value;\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the css property of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @returns {*}\r\n\t */\r\n\tstatic getCss(obj, property)\r\n\t{\r\n\t\tif (!obj || typeof property === 'undefined')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tproperty = Strings.uncamelCase(property);\r\n\t\tlet css = obj.style[property];\r\n\t\tif (css !== '')\r\n\t\t{\r\n\t\t\treturn css;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we have an inherited\r\n\t\tvalue */\r\n\t\tlet currentValue = null;\r\n\t\tconst currentStyle = obj.currentStyle;\r\n\t\tif (currentStyle && (currentValue = currentStyle[property]))\r\n\t\t{\r\n\t\t\treturn currentValue;\r\n\t\t}\r\n\r\n\t\tconst inheritedStyle = window.getComputedStyle(obj, null);\r\n\t\tif (inheritedStyle)\r\n\t\t{\r\n\t\t\treturn inheritedStyle[property];\r\n\t\t}\r\n\r\n\t\treturn css;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set the css propety or an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} [value]\r\n\t * @returns {*}\r\n\t */\r\n\tstatic css(obj, property, value)\r\n\t{\r\n\t\t/* we want to check if we are getting the\r\n\t\tvalue or setting the value */\r\n\t\tif (typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\tthis.setCss(obj, property, value);\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn this.getCss(obj, property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an attribute from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @returns {object} an instance of base.\r\n\t */\r\n\tstatic removeAttr(obj, property)\r\n\t{\r\n\t\tif (Types.isObject(obj))\r\n\t\t{\r\n\t\t\tobj.removeAttribute(property);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set an attribute of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} value\r\n\t * @returns {void}\r\n\t */\r\n\tstatic setAttr(obj, property, value)\r\n\t{\r\n\t\tobj.setAttribute(property, value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get an attribute of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @returns {string}\r\n\t */\r\n\tstatic getAttr(obj, property)\r\n\t{\r\n\t\treturn obj.getAttribute(property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set an attribute from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} [value]\r\n\t * @returns {*}\r\n\t */\r\n\tstatic attr(obj, property, value)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check if we are getting the\r\n\t\tvalue or setting the value */\r\n\t\tif (typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\t/* we want to check to set the value */\r\n\t\t\tthis.setAttr(obj, property, value);\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn this.getAttr(obj, property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will prefix a string with \"data-\" if not set.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} prop\r\n\t * @returns {string}\r\n\t */\r\n\tstatic _checkDataPrefix(prop)\r\n\t{\r\n\t\tif (typeof prop !== 'string')\r\n\t\t{\r\n\t\t\treturn prop;\r\n\t\t}\r\n\r\n\t\t/* we want to de camelcase if set */\r\n\t\tprop = Strings.uncamelCase(prop);\r\n\t\tif (prop.substring(0, 5) !== 'data-')\r\n\t\t{\r\n\t\t\tprop = 'data-' + prop;\r\n\t\t}\r\n\r\n\t\treturn prop;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove \"data-\" from a string.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} prop\r\n\t * @returns {string}\r\n\t */\r\n\tstatic removeDataPrefix(prop)\r\n\t{\r\n\t\tif (typeof prop === 'string' && prop.substring(0, 5) === 'data-')\r\n\t\t{\r\n\t\t\tprop = prop.substring(5);\r\n\t\t}\r\n\t\treturn prop;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set data to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} value\r\n\t */\r\n\tstatic setData(obj, property, value)\r\n\t{\r\n\t\t/* this will return the property without the data prefix */\r\n\t\tproperty = this.removeDataPrefix(property);\r\n\t\tproperty = Strings.camelCase(property);\r\n\r\n\t\tobj.dataset[property] = value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get data from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @returns {string}\r\n\t */\r\n\tstatic getData(obj, property)\r\n\t{\r\n\t\tproperty = Strings.camelCase(this.removeDataPrefix(property));\r\n\t\treturn obj.dataset[property];\r\n\t}\r\n\r\n\t/**\r\n\t * This will get or set data to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} property\r\n\t * @param {string} [value]\r\n\t * @returns {*}\r\n\t */\r\n\tstatic data(obj, property, value)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\tthis.setData(obj, property, value);\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn this.getData(obj, property);\r\n\t}\r\n\r\n\t/**\r\n\t * This will find elements in an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} queryString\r\n\t * @returns {array}\r\n\t */\r\n\tstatic find(obj, queryString)\r\n\t{\r\n\t\tif (!obj || typeof queryString !== 'string')\r\n\t\t{\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\treturn obj.querySelectorAll(queryString);\r\n\t}\r\n\r\n\t/**\r\n\t * This will display an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {object} An instance of base.\r\n\t */\r\n\tstatic show(obj)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* we want to get the previous display style\r\n\t\tfrom the data-style-display attr */\r\n\t\tconst previous = this.data(obj, 'style-display'),\r\n\t\tvalue = (typeof previous === 'string')? previous : '';\r\n\r\n\t\tthis.css(obj, 'display', value);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will hide an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {object} An instance of base.\r\n\t */\r\n\tstatic hide(obj)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* we want to set the previous display style\r\n\t\ton the element as a data attr */\r\n\t\tconst previous = this.css(obj, 'display');\r\n\t\tif (previous !== 'none' && previous)\r\n\t\t{\r\n\t\t\tthis.data(obj, 'style-display', previous);\r\n\t\t}\r\n\r\n\t\tthis.css(obj, 'display', 'none');\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will toggle the display an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {object} An instance of base.\r\n\t */\r\n\tstatic toggle(obj)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst mode = this.css(obj, 'display');\r\n\t\tif (mode !== 'none')\r\n\t\t{\r\n\t\t\tthis.hide(obj);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.show(obj);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the size of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {object|boolean} A size object or false.\r\n\t */\r\n\tstatic getSize(obj)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\twidth: this.getWidth(obj),\r\n\t\t\theight: this.getHeight(obj)\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the width of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {number|boolean} A width or false.\r\n\t */\r\n\tstatic getWidth(obj)\r\n\t{\r\n\t\t/* we want to check if the object is not supplied */\r\n\t\treturn (Types.isObject(obj))? obj.offsetWidth : false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the height of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {number|boolean} A height or false.\r\n\t */\r\n\tstatic getHeight(obj)\r\n\t{\r\n\t\t/* we want to check if the object is not supplied */\r\n\t\treturn (Types.isObject(obj))? obj.offsetHeight : false;\r\n\t}\r\n\r\n\t/**\r\n\t* This will get the scroll position.\r\n\t*\r\n\t* @param {object} [obj] The element or document element if not set.\r\n\t* @returns {object}\r\n\t*/\r\n\tstatic getScrollPosition(obj)\r\n\t{\r\n\t\tlet left = 0, top = 0;\r\n\t\tswitch (typeof obj)\r\n\t\t{\r\n\t\t\tcase 'undefined':\r\n\t\t\t\tobj = document.documentElement;\r\n\t\t\t\tleft = obj.scrollLeft;\r\n\t\t\t\ttop = obj.scrollTop;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'object':\r\n\t\t\t\tleft = obj.scrollLeft;\r\n\t\t\t\ttop = obj.scrollTop;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tleft: left - (obj.clientLeft || 0),\r\n\t\t\ttop: top - (obj.clientTop || 0)\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the scroll top position.\r\n\t *\r\n\t * @param {object} [obj] The element or document element if not set.\r\n\t * @returns {number|null}\r\n\t */\r\n\tstatic getScrollTop(obj)\r\n\t{\r\n\t\tconst position = this.getScrollPosition(obj);\r\n\t\treturn position.top;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the scroll left position.\r\n\t *\r\n\t * @param {object} [obj] The element or document element if not set.\r\n\t * @returns {number|null}\r\n\t */\r\n\tstatic getScrollLeft(obj)\r\n\t{\r\n\t\tconst position = this.getScrollPosition(obj);\r\n\t\treturn position.left;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the window size.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tstatic getWindowSize()\r\n\t{\r\n\t\tconst w = window,\r\n\t\tdoc = document,\r\n\t\tde = doc.documentElement,\r\n\t\tb = doc.getElementsByTagName('body')[0],\r\n\t\twidth = w.innerWidth || de.clientWidth || b.clientWidth,\r\n\t\theight = w.innerHeight || de.clientHeight || b.clientHeight;\r\n\r\n\t\treturn {\r\n\t\t\twidth,\r\n\t\t\theight\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the document size.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tstatic getDocumentSize()\r\n\t{\r\n\t\tconst doc = document,\r\n\t\tbody = doc.body,\r\n\t\thtml = doc.documentElement,\r\n\r\n\t\theight = Math.max(\r\n\t\t\tbody.scrollHeight,\r\n\t\t\tbody.offsetHeight,\r\n\t\t\thtml.clientHeight,\r\n\t\t\thtml.scrollHeight,\r\n\t\t\thtml.offsetHeight\r\n\t\t),\r\n\r\n\t\twidth = Math.max(\r\n\t\t\tbody.scrollWidth,\r\n\t\t\tbody.offsetWidth,\r\n\t\t\thtml.clientWidth,\r\n\t\t\thtml.scrollWidth,\r\n\t\t\thtml.offsetWidth\r\n\t\t);\r\n\r\n\t\treturn {\r\n\t\t\twidth,\r\n\t\t\theight\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the document height.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tstatic getDocumentHeight()\r\n\t{\r\n\t\treturn this.getDocumentSize().height;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the position of an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {number} [depth] The number of levels, default is 1, 0 is to the root.\r\n\t * @returns {object}\r\n\t */\r\n\tstatic position(obj, depth = 1)\r\n\t{\r\n\t\tconst position = {x: 0, y: 0};\r\n\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn position;\r\n\t\t}\r\n\r\n\t\t/* if the depth is 0 we will travel to the\r\n\t\ttop element */\r\n\t\tlet count = 0;\r\n\t\twhile (obj && (depth === 0 || count < depth))\r\n\t\t{\r\n\t\t\tcount++;\r\n\t\t\tposition.x += (obj.offsetLeft + obj.clientLeft);\r\n\t\t\tposition.y += (obj.offsetTop + obj.clientTop);\r\n\t\t\tobj = obj.offsetParent;\r\n\t\t}\r\n\r\n\t\treturn position;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a class to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} tmpClassName\r\n\t * @returns {object}\r\n\t */\r\n\tstatic addClass(obj, tmpClassName)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false || tmpClassName === '')\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif (typeof tmpClassName === 'string')\r\n\t\t{\r\n\t\t\t/* we want to divide the string by spaces and\r\n\t\t\tadd any class listed */\r\n\t\t\tconst adding = tmpClassName.split(' ');\r\n\t\t\tfor (var i = 0, maxLength = adding.length; i < maxLength; i++)\r\n\t\t\t{\r\n\t\t\t\tobj.classList.add(tmpClassName);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a class or classes from an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} [tmpClassName]\r\n\t * @returns {object}\r\n\t */\r\n\tstatic removeClass(obj, tmpClassName)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false || tmpClassName === '')\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* if no className was specified we will remove all classes from object */\r\n\t\tif (typeof tmpClassName === 'undefined')\r\n\t\t{\r\n\t\t\tobj.className = '';\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tobj.classList.remove(tmpClassName);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if an element has a class.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} tmpClassName\r\n\t * @returns {boolean}\r\n\t */\r\n\tstatic hasClass(obj, tmpClassName)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false || tmpClassName === '')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn obj.classList.contains(tmpClassName);\r\n\t}\r\n\r\n\t/**\r\n\t * This will toggle a class on an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} tmpClassName\r\n\t * @returns {object}\r\n\t */\r\n\tstatic toggleClass(obj, tmpClassName)\r\n\t{\r\n\t\tif (Types.isObject(obj) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tobj.classList.toggle(tmpClassName);\r\n\t\treturn this;\r\n\t}\r\n}", "/**\r\n * Get the binding attribute for an element.\r\n *\r\n * @param {object|null} element\r\n * @returns {string}\r\n */\r\nexport const getBindAttr = (element) =>\r\n{\r\n /**\r\n * If no custom attr has been requested we will get the\r\n * default attr of the element.\r\n */\r\n let attr = 'textContent';\r\n if (!element || typeof element !== 'object')\r\n {\r\n return attr;\r\n }\r\n\r\n /**\r\n * This will get the default attr by the element type.\r\n */\r\n const tagName = element.tagName.toLowerCase();\r\n if (tagName === \"input\" || tagName === \"textarea\" || tagName === \"select\")\r\n {\r\n const type = element.type;\r\n if (!type)\r\n {\r\n attr = 'value';\r\n return attr;\r\n }\r\n\r\n switch (type)\r\n {\r\n case 'checkbox':\r\n attr = 'checked';\r\n break;\r\n case 'file':\r\n attr = 'files';\r\n break;\r\n default:\r\n attr = 'value';\r\n }\r\n }\r\n return attr;\r\n};", "import { Dom } from '../../../shared/dom.js';\r\nimport { getBindAttr } from './get-bind-attr.js';\r\nimport { TwoWaySource } from './two-way-source.js';\r\n\r\n/**\r\n * This will set an element attr by the setAttribute method.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\nconst SetAttr = (element, attr, value) =>\r\n{\r\n\tDom.setAttr(element, attr, value);\r\n};\r\n\r\n/**\r\n * This will update a radio element attr.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\nconst UpdateRadioAttr = (element, attr, value) =>\r\n{\r\n\telement.checked = (element.value == value);\r\n};\r\n\r\n/**\r\n * This will update a checkbox element attr.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\nconst UpdateCheckboxAttr = (element, attr, value) =>\r\n{\r\n\tvalue = (value == 1);\r\n\tUpdateAttr(element, attr, value);\r\n};\r\n\r\n/**\r\n * This will update an element attr by the bracket notation.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\nconst UpdateAttr = (element, attr, value) =>\r\n{\r\n\telement[attr] = value;\r\n};\r\n\r\n/**\r\n * This will get an element attr by the getAttribute method.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @returns {*}\r\n */\r\nconst GetAttr = (element, attr) =>\r\n{\r\n\treturn Dom.getAttr(element, attr);\r\n};\r\n\r\n/**\r\n * This will get an element attr by the bracket notation.\r\n *\r\n * @param {object} element\r\n * @param {string} attr\r\n * @returns {*}\r\n */\r\nconst GetAttribute = (element, attr) =>\r\n{\r\n\treturn element[attr];\r\n};\r\n\r\n/**\r\n * ElementSource\r\n *\r\n * This will create an element source to use with\r\n * a connection.\r\n *\r\n * @class\r\n * @augments TwoWaySource\r\n */\r\nexport class ElementSource extends TwoWaySource\r\n{\r\n\t/**\r\n\t * This will create a new element source.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} element\r\n\t * @param {string} attr\r\n\t * @param {string|function} filter\r\n\t * @param {object} pubSub\r\n\t */\r\n\tconstructor(element, attr, filter, pubSub)\r\n\t{\r\n\t\tsuper(pubSub);\r\n\r\n\t\t/**\r\n\t\t * @member {object} element\r\n\t\t */\r\n\t\tthis.element = element;\r\n\r\n\t\t/**\r\n\t\t * @member {string} attr\r\n\t\t */\r\n\t\tthis.attr = this.getAttrBind(attr);\r\n\t\tthis.addSetMethod(element, this.attr);\r\n\r\n\t\t/**\r\n\t\t * @member {function} filter\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis.filter = (typeof filter === 'string')? this.setupFilter(filter) : filter;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the set and get methods.\r\n\t *\r\n\t * @private\r\n\t * @param {object} element\r\n\t * @param {string} attr\r\n\t * @returns {object}\r\n\t */\r\n\taddSetMethod(element, attr)\r\n\t{\r\n\t\tif (attr.substring(4, 1) === '-')\r\n\t\t{\r\n\t\t\tthis.setValue = SetAttr;\r\n\t\t\tthis.getValue = GetAttr;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tthis.getValue = GetAttribute;\r\n\r\n\t\tconst type = element.type;\r\n\t\tif (type)\r\n\t\t{\r\n\t\t\tswitch (type)\r\n\t\t\t{\r\n\t\t\t\tcase 'checkbox':\r\n\t\t\t\t\tthis.setValue = UpdateCheckboxAttr;\r\n\t\t\t\t\treturn;\r\n\t\t\t\tcase 'radio':\r\n\t\t\t\t\tthis.setValue = UpdateRadioAttr;\r\n\t\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.setValue = UpdateAttr;\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the bind attribute.\r\n\t *\r\n\t * @private\r\n\t * @param {string} [customAttr]\r\n\t * @returns {string}\r\n\t */\r\n\tgetAttrBind(customAttr)\r\n\t{\r\n\t\t/**\r\n\t\t * This will setup the custom attr if the prop\r\n\t\t * has specified one.\r\n\t\t */\r\n\t\tif (customAttr)\r\n\t\t{\r\n\t\t\treturn customAttr;\r\n\t\t}\r\n\r\n\t\treturn getBindAttr(this.element);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a filter callBack.\r\n\t *\r\n\t * @private\r\n\t * @param {string} filter\r\n\t * @returns {function}\r\n\t */\r\n\tsetupFilter(filter)\r\n\t{\r\n\t\tconst pattern = /(\\[\\[[^\\]]+\\]\\])/;\r\n\t\treturn (value) =>\r\n\t\t{\r\n\t\t\treturn filter.replace(pattern, value);\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will set a value on an element.\r\n\t *\r\n\t * @param {*} value\r\n\t * @returns {object}\r\n\t */\r\n\tset(value)\r\n\t{\r\n\t\tconst element = this.element;\r\n\t\tif (!element || typeof element !== 'object')\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* this will check to apply the option filter before\r\n\t\tsetting the value */\r\n\t\tif (this.filter)\r\n\t\t{\r\n\t\t\tvalue = this.filter(value);\r\n\t\t}\r\n\r\n\t\tthis.setValue(element, this.attr, value);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value from an element.\r\n\t *\r\n\t * @returns {*}\r\n\t */\r\n\tget()\r\n\t{\r\n\t\tconst element = this.element;\r\n\t\tif (!element || typeof element !== 'object')\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\treturn this.getValue(element, this.attr);\r\n\t}\r\n\r\n\t/**\r\n\t * The callBack when updated.\r\n\t *\r\n\t * @overload\r\n\t * @param {*} value\r\n\t * @param {object} committer\r\n\t * @returns {object}\r\n\t */\r\n\t// @ts-ignore\r\n\tcallBack(value, committer)\r\n\t{\r\n\t\tif (committer !== this.element)\r\n\t\t{\r\n\t\t\tthis.set(value);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will clean up the element source.\r\n\t *\r\n\t * @override\r\n\t * @returns {void}\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tsuper.unsubscribe();\r\n\t\tthis.element = null;\r\n\t\tthis.attr = null;\r\n\t\tthis.filter = null;\r\n\t\tthis.setValue = null;\r\n\t\tthis.getValue = null;\r\n\t}\r\n}", "import { DataSource } from '../../sources/data-source.js';\r\nimport { ElementSource } from '../../sources/element-source.js';\r\nimport { Connection } from './connection.js';\r\n\r\n/**\r\n * TwoWayConnection\r\n *\r\n * This will setup a two way connection.\r\n *\r\n * @class\r\n * @augments Connection\r\n */\r\nexport class TwoWayConnection extends Connection\r\n{\r\n\t/**\r\n\t * This will create a two way connection.\r\n\t *\r\n\t * @param {object} pubSub\r\n\t * @constructor\r\n\t */\r\n\tconstructor(pubSub)\r\n\t{\r\n\t\tsuper();\r\n\r\n\t\t/**\r\n\t\t * @member {object|null} element\r\n\t\t */\r\n\t\tthis.element = null;\r\n\r\n\t\t/**\r\n\t\t * @member {object|null} data\r\n\t\t */\r\n\t\tthis.data = null;\r\n\r\n\t\t/**\r\n\t\t * @member {object} pubSub\r\n\t\t */\r\n\t\tthis.pubSub = pubSub;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element source.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {string} attr\r\n\t * @param {(string|function)} filter\r\n\t * @returns {object}\r\n\t */\r\n\taddElement(element, attr, filter)\r\n\t{\r\n\t\treturn (this.element = new ElementSource(element, attr, filter, this.pubSub));\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the data source.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @returns {object}\r\n\t */\r\n\taddData(data, prop)\r\n\t{\r\n\t\treturn (this.data = new DataSource(data, prop, this.pubSub));\r\n\t}\r\n\r\n\t/**\r\n\t * This will unsubscribe from a source.\r\n\t *\r\n\t * @param {object} source\r\n\t * @returns {object}\r\n\t */\r\n\tunsubscribeSource(source)\r\n\t{\r\n\t\tif (source)\r\n\t\t{\r\n\t\t\tsource.unsubscribe();\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will be used to unsubscribe.\r\n\t *\r\n\t * @override\r\n\t * @returns {object}\r\n\t */\r\n\tunsubscribe()\r\n\t{\r\n\t\tthis.unsubscribeSource(this.element);\r\n\t\tthis.unsubscribeSource(this.data);\r\n\r\n\t\tthis.element = null;\r\n\t\tthis.data = null;\r\n\t\treturn this;\r\n\t}\r\n}", "let lastToken = -1;\r\n\r\n/**\r\n * DataPubSub\r\n *\r\n * This is a pub sub class to allow subscribers to\r\n * listen for updates when published by publishers.\r\n *\r\n * @class\r\n */\r\nexport class DataPubSub\r\n{\r\n\t/**\r\n\t * This will create a data pub sub.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {Map} callBacks\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.callBacks = new Map();\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a subscriber array.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @returns {Map}\r\n\t */\r\n\tget(msg)\r\n\t{\r\n\t\tif (!this.callBacks.has(msg))\r\n\t\t{\r\n this.callBacks.set(msg, new Map());\r\n }\r\n return this.callBacks.get(msg);\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset pub sub.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\treset()\r\n\t{\r\n\t\tthis.callBacks.clear();\r\n\t\tlastToken = -1;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a subscriber.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {function} callBack\r\n\t * @returns {string} The subscriber token.\r\n\t */\r\n\ton(msg, callBack)\r\n\t{\r\n\t\tconst token = (++lastToken).toString();\r\n\t\tthis.get(msg).set(token, callBack);\r\n\r\n\t\treturn token;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a subscriber.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {string} token\r\n\t * @returns {void}\r\n\t */\r\n\toff(msg, token)\r\n\t{\r\n\t\tconst subscribers = this.callBacks.get(msg);\r\n if (subscribers)\r\n\t\t{\r\n\t\t\ttoken = String(token);\r\n subscribers.delete(token);\r\n if (subscribers.size === 0)\r\n\t\t\t{\r\n this.callBacks.delete(msg);\r\n }\r\n }\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete a message.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @returns {void}\r\n\t */\r\n\tremove(msg)\r\n\t{\r\n\t\tthis.callBacks.delete(msg);\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish a message.\r\n\t *\r\n\t * @overload\r\n\t * @param {string} msg\r\n\t * @param {string} value\r\n\t * @param {object} [committer]\r\n\t * @returns {void}\r\n\t */\r\n\tpublish(msg, ...args)\r\n\t{\r\n\t\tconst subscribers = this.callBacks.get(msg);\r\n if (!subscribers)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n for (const callBack of subscribers.values())\r\n\t\t{\r\n if (callBack)\r\n\t\t\t{\r\n callBack.apply(this, args);\r\n }\r\n }\r\n\r\n\t}\r\n}", "import { Events } from '../../main/events/events.js';\r\nimport { Types } from '../../shared/types.js';\r\nimport { ConnectionTracker } from './connection-tracker/connection-tracker.js';\r\nimport { OneWayConnection } from './connection-tracker/connections/one-way-connection.js';\r\nimport { TwoWayConnection } from './connection-tracker/connections/two-way-connection.js';\r\nimport { DataPubSub } from './data-pub-sub.js';\r\n\r\n/**\r\n * DataBinder\r\n *\r\n * This will create a data binder object that can\r\n * create one way and two way data bindings.\r\n *\r\n * @class\r\n */\r\nexport class DataBinder\r\n{\r\n\t/**\r\n\t * This will create a data binder.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {string} version\r\n\t\t */\r\n\t\tthis.version = \"1.0.1\";\r\n\r\n\t\t/**\r\n\t\t * @member {string} attr\r\n\t\t */\r\n\t\tthis.attr = 'bindId';\r\n\r\n\t\t/**\r\n\t\t * @member {array} blockedKeys\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.blockedKeys = [\r\n\t\t\t20, //caps lock\r\n\t\t\t37, //arrows\r\n\t\t\t38,\r\n\t\t\t39,\r\n\t\t\t40\r\n\t\t];\r\n\r\n\t\t/**\r\n\t\t * @member {object} connections\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.connections = new ConnectionTracker();\r\n\r\n\t\t/**\r\n\t\t * @member {object} pubSub\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.pubSub = new DataPubSub();\r\n\r\n\t\t/**\r\n\t\t * @member {number} idCount\r\n\t\t */\r\n\t\tthis.idCount = 0;\r\n\t\tthis.setup();\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.setupEvents();\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind an element to a data property.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {(string|function)} [filter]\r\n\t * @returns {object} an instance of the databinder.\r\n\t */\r\n\tbind(element, data, prop, filter)\r\n\t{\r\n\t\tlet bindProp = prop,\r\n\t\tbindAttr = null;\r\n\r\n\t\tif (prop.indexOf(':') !== -1)\r\n\t\t{\r\n\t\t\t/* this will setup the custom attr if the prop\r\n\t\t\thas specified one. */\r\n\t\t\tconst parts = prop.split(':');\r\n\t\t\tif (parts.length > 1)\r\n\t\t\t{\r\n\t\t\t\tbindProp = parts[1];\r\n\t\t\t\tbindAttr = parts[0];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will setup the model bind attr to the element\r\n\t\t * and assign a bind id attr to support two way\r\n\t\t * binding.\r\n\t\t */\r\n\t\tconst connection = this.setupConnection(element, data, bindProp, bindAttr, filter);\r\n\r\n\t\t/**\r\n\t\t * We want to get the starting value of the data and\r\n\t\t * et it on our element.\r\n\t\t */\r\n\t\tconst connectionElement = connection.element;\r\n\t\tlet value = data.get(bindProp);\r\n\t\tif (typeof value !== 'undefined')\r\n\t\t{\r\n\t\t\tconnectionElement.set(value);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * This will set the element value as the\r\n\t\t\t * prop value.\r\n\t\t\t */\r\n\t\t\tvalue = connectionElement.get();\r\n\t\t\tif (value !== '')\r\n\t\t\t{\r\n\t\t\t\tconnection.data.set(value);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will bind an element to a data property.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {string} customAttr\r\n\t * @param {(string|function)} [filter]\r\n\t * @returns {object} The new connection.\r\n\t */\r\n\tsetupConnection(element, data, prop, customAttr, filter)\r\n\t{\r\n\t\tconst id = this.getBindId(element),\r\n\t\tconnection = new TwoWayConnection(this.pubSub),\r\n\r\n\t\t/**\r\n\t\t * This will create the data source and\r\n\t\t * subscribe the element to the data.\r\n\t\t */\r\n\t\tdataSource = connection.addData(data, prop);\r\n\t\tdataSource.subscribe(id);\r\n\r\n\t\t/**\r\n\t\t * This will add the data binding attr to our\r\n\t\t * element so it will subscribe to the two\r\n\t\t * data changes.\r\n\t\t */\r\n\t\tconst dataId = data.getDataId();\r\n\t\tconst msg = `${dataId}:${prop}`;\r\n\r\n\t\t/**\r\n\t\t * This will create the element source and subscribe\r\n\t\t * the data to the element.\r\n\t\t */\r\n\t\tconst elementSource = connection.addElement(element, customAttr, filter);\r\n\t\telementSource.subscribe(msg);\r\n\r\n\t\tthis.addConnection(id, 'bind', connection);\r\n\r\n\t\treturn connection;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new connection to the\r\n\t * connection tracker.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} id\r\n\t * @param {string} attr\r\n\t * @param {object} connection\r\n\t * @returns {object}\r\n\t */\r\n\taddConnection(id, attr, connection)\r\n\t{\r\n\t\tthis.connections.add(id, attr, connection);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the bind id.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} element\r\n\t * @returns {string}\r\n\t */\r\n\tsetBindId(element)\r\n\t{\r\n\t\tconst id = 'db-' + this.idCount++;\r\n\r\n\t\tif (element.dataset)\r\n\t\t{\r\n\t\t\telement.dataset[this.attr] = id;\r\n\t\t}\r\n\t\telement[this.attr] = id;\r\n\t\treturn id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the bind id.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} element\r\n\t * @returns {string}\r\n\t */\r\n\tgetBindId(element)\r\n\t{\r\n\t\treturn element[this.attr] || this.setBindId(element);\r\n\t}\r\n\r\n\t/**\r\n\t * This will unbind the element.\r\n\t *\r\n\t * @param {object} element\r\n\t * @returns {object} an instance of the data binder.\r\n\t */\r\n\tunbind(element)\r\n\t{\r\n\t\tconst id = element[this.attr];\r\n\t\tif (id)\r\n\t\t{\r\n\t\t\tthis.connections.remove(id);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a watcher for an element.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {function} callBack\r\n\t * @returns {object}\r\n\t */\r\n\twatch(element, data, prop, callBack)\r\n\t{\r\n\t\tif (Types.isObject(element) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst connection = new OneWayConnection();\r\n\r\n\t\t/**\r\n\t\t * This will setup the data source and subscribe\r\n\t\t * the element to the data.\r\n\t\t */\r\n\t\tconst source = connection.addSource(data);\r\n\t\tsource.subscribe(prop, callBack);\r\n\r\n\t\t// this will add the new connection to the connection tracker\r\n\t\tconst id = this.getBindId(element),\r\n\t\tattr = data.getDataId() + ':' + prop;\r\n\t\tthis.addConnection(id, attr, connection);\r\n\r\n\t\t/**\r\n\t\t * This will get the starting value of the data and\r\n\t\t * call the callback if the value is defined.\r\n\t\t */\r\n\t\tconst value = data.get(prop);\r\n\t\tcallBack(value);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a watcher from an element.\r\n\t *\r\n\t * @param {object} element\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @returns {object}\r\n\t */\r\n\tunwatch(element, data, prop)\r\n\t{\r\n\t\tif (Types.isObject(element) === false)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst id = element[this.attr];\r\n\t\tif (id)\r\n\t\t{\r\n\t\t\tconst attr = data.getDataId() + ':' + prop;\r\n\t\t\tthis.connections.remove(id, attr);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish to the pub sub.\r\n\t *\r\n\t * @param {string} msg\r\n\t * @param {*} value\r\n\t * @param {object} committer\r\n\t * @returns {object} an instance of the data binder.\r\n\t */\r\n\tpublish(msg, value, committer)\r\n\t{\r\n\t\tthis.pubSub.publish(msg, value, committer);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if an element is bound.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} element\r\n\t * @returns {?string}\r\n\t */\r\n\tisDataBound(element)\r\n\t{\r\n\t\tif (!element)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst id = element[this.attr];\r\n\t\treturn (id) ? id : null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the key is blocked.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} evt\r\n\t * @returns {boolean}\r\n\t */\r\n\tisBlocked(evt)\r\n\t{\r\n\t\tif (evt.type !== 'keyup')\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* this will check to block ctrl, shift or alt +\r\n\t\tbuttons */\r\n\t\treturn (this.blockedKeys.indexOf(evt.keyCode) !== -1);\r\n\t}\r\n\r\n\t/**\r\n\t * This is the callBack for the chnage event.\r\n\t *\r\n\t * @param {object} evt\r\n\t */\r\n\tbindHandler(evt)\r\n\t{\r\n\t\tif (this.isBlocked(evt))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tconst target = evt.target || evt.srcElement,\r\n\t\tid = this.isDataBound(target);\r\n\t\tif (id !== null)\r\n\t\t{\r\n\t\t\tconst connection = this.connections.get(id, 'bind');\r\n\t\t\tif (connection)\r\n\t\t\t{\r\n\t\t\t\tconst value = connection.element.get();\r\n\t\t\t\t/* this will publish to the ui and to the\r\n\t\t\t\tmodel that subscribes to the element */\r\n\t\t\t\tthis.pubSub.publish(id, value, target);\r\n\t\t\t}\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\t/**\r\n\t * This wil setup the events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetupEvents()\r\n\t{\r\n\t\tthis.changeHandler = this.bindHandler.bind(this);\r\n\t\tthis.addEvents();\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\taddEvents()\r\n\t{\r\n\t\tif (typeof document !== 'undefined')\r\n\t\t{\r\n\t\t\tEvents.on([\"change\", \"paste\", \"input\"], document, this.changeHandler, false);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tremoveEvents()\r\n\t{\r\n\t\tif (typeof document !== 'undefined')\r\n\t\t{\r\n\t\t\tEvents.off([\"change\", \"paste\", \"input\"], document, this.changeHandler, false);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport const dataBinder = new DataBinder();", "/**\r\n * This will get the parent set data.\r\n *\r\n * @param {object} parent\r\n * @returns {object|null}\r\n */\r\nexport const getParentData = (parent) =>\r\n{\r\n\tif (parent.data)\r\n\t{\r\n\t\treturn parent.data;\r\n\t}\r\n\r\n\tif (parent.context && parent.context.data)\r\n\t{\r\n\t\treturn parent.context.data;\r\n\t}\r\n\r\n\tif (parent.state)\r\n\t{\r\n\t\treturn parent.state;\r\n\t}\r\n\r\n\treturn null;\r\n};", "import { DataTracker } from '../../main/data-tracker/data-tracker.js';\r\nimport { Events } from '../../main/events/events.js';\r\nimport { Dom } from '../../shared/dom.js';\r\nimport { Types } from '../../shared/types.js';\r\nimport { dataBinder } from '../data-binder/data-binder.js';\r\n\r\n/**\r\n * This is a look up object to normalize the attribute names.\r\n *\r\n * @type {object} NORMALIZED_NAMES\r\n */\r\nconst NORMALIZED_NAMES =\r\n{\r\n\tclass: 'className',\r\n\ttext: 'textContent',\r\n\tfor: 'htmlFor',\r\n\treadonly: 'readOnly',\r\n\tmaxlength: 'maxLength',\r\n\tcellspacing: 'cellSpacing',\r\n\trowspan: 'rowSpan',\r\n\tcolspan: 'colSpan',\r\n\ttabindex: 'tabIndex',\r\n\tcelpadding: 'cellPadding',\r\n\tuseMap: 'useMap',\r\n\tframeborder: 'frameBorder',\r\n\tcontenteditable: 'contentEditable'\r\n};\r\n\r\n/**\r\n * This will get the javascript property name.\r\n *\r\n * @param {string} prop\r\n * @returns {string}\r\n */\r\nexport const normalizeAttr = (prop) =>\r\n{\r\n\treturn NORMALIZED_NAMES[prop] || prop;\r\n};\r\n\r\n/**\r\n * This will remove on from a property.\r\n *\r\n * @param {string} prop\r\n * @returns {string}\r\n */\r\nexport const removeEventPrefix = (prop) =>\r\n{\r\n\tif (typeof prop === 'string' && prop.substring(0, 2) === 'on')\r\n\t{\r\n\t\treturn prop.substring(2);\r\n\t}\r\n\treturn prop;\r\n};\r\n\r\n/**\r\n * Html\r\n *\r\n * This will create html elements.\r\n *\r\n * @class\r\n */\r\nexport class Html\r\n{\r\n\t/**\r\n\t * This will create a new element.\r\n\t *\r\n\t * @param {string} node The node name.\r\n\t * @param {object} attrs The node attributes.\r\n\t * @param {object} container The node container.\r\n\t * @param {boolean} [prepend=false] Add to the begining of the container.\r\n\t * @returns {object} The new element.\r\n\t */\r\n\tstatic create(node, attrs, container, prepend)\r\n\t{\r\n\t\tconst obj = document.createElement(node);\r\n\t\tthis.addAttributes(obj, attrs);\r\n\r\n\t\t/* we want to check if the new element should be\r\n\t\tadded to the begining or end */\r\n\t\tif (prepend === true)\r\n\t\t{\r\n\t\t\tthis.prepend(container, obj);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.append(container, obj);\r\n\t\t}\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element attributes.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {object} attrs\r\n\t * @returns {void}\r\n\t */\r\n\tstatic addAttributes(obj, attrs)\r\n\t{\r\n\t\t/* we want to check if we have attrributes to add */\r\n\t\tif (!attrs || typeof attrs !== 'object')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* we need to add the type if set to stop ie\r\n\t\tfrom removing the value if set after the value is\r\n\t\tadded */\r\n\t\tconst type = attrs.type;\r\n\t\tif (typeof type !== 'undefined')\r\n\t\t{\r\n\t\t\tDom.setAttr(obj, 'type', type);\r\n\t\t}\r\n\r\n\t\t/* we want to add each attr to the obj */\r\n\t\tfor (const [prop, value] of Object.entries(attrs))\r\n\t\t{\r\n\t\t\t/* we want to check to add the attr settings\r\n\t\t\t by property name */\r\n\t\t\tif (prop === 'innerHTML')\r\n\t\t\t{\r\n\t\t\t\tobj.innerHTML = value;\r\n\t\t\t}\r\n\t\t\telse if (prop.indexOf('-') !== -1)\r\n\t\t\t{\r\n\t\t\t\t// this will handle data and aria attributes\r\n\t\t\t\tDom.setAttr(obj, prop, value);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.addAttr(obj, prop, value);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add html to an element.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} content\r\n\t * @returns {object}\r\n\t */\r\n\tstatic addHtml(obj, content)\r\n\t{\r\n\t\tif (typeof content === 'undefined' || content === '')\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/* we need to check if we are adding inner\r\n\t\thtml content or just a string */\r\n\t\tconst pattern = /(?:<[a-z][\\s\\S]*>)/i;\r\n\t\tif (pattern.test(content))\r\n\t\t{\r\n\t\t\t/* html */\r\n\t\t\tobj.innerHTML = content;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t/* string */\r\n\t\t\tobj.textContent = content;\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an element attribute.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @param {*} value\r\n\t * @returns {void}\r\n\t */\r\n\tstatic addAttr(obj, attr, value)\r\n\t{\r\n\t\tif (value === '' || !attr)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* we want to check to add a value or an event listener */\r\n\t\tconst type = typeof value;\r\n\t\tif (type === 'function')\r\n\t\t{\r\n\t\t\t/* this will add the event using the events\r\n\t\t\tso the event is tracked */\r\n\t\t\tattr = removeEventPrefix(attr);\r\n\r\n\t\t\t/**\r\n\t\t\t * If the function has an originalCallback reference (added by Parser),\r\n\t\t\t * pass it to Events.add so it can be properly tracked and removed.\r\n\t\t\t */\r\n\t\t\tif (value.originalCallback)\r\n\t\t\t{\r\n\t\t\t\tEvents.add(attr, obj, value, false, false, value.originalCallback);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tEvents.add(attr, obj, value);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tconst attrName = normalizeAttr(attr);\r\n\t\t\tobj[attrName] = value;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a doc fragment.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tstatic createDocFragment()\r\n\t{\r\n\t\treturn document.createDocumentFragment();\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a text node.\r\n\t *\r\n\t * @param {string} text\r\n\t * @param {object} container\r\n\t * @returns {object}\r\n\t */\r\n\tstatic createText(text, container)\r\n\t{\r\n\t\tconst obj = document.createTextNode(text);\r\n\r\n\t\tif (container)\r\n\t\t{\r\n\t\t\tthis.append(container, obj);\r\n\t\t}\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a text node.\r\n\t *\r\n\t * @param {string} text\r\n\t * @param {object} container\r\n\t * @returns {object}\r\n\t */\r\n\tstatic createComment(text, container)\r\n\t{\r\n\t\tconst obj = document.createComment(text);\r\n\r\n\t\tif (container)\r\n\t\t{\r\n\t\t\tthis.append(container, obj);\r\n\t\t}\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the options on a select.\r\n\t *\r\n\t * @param {object} selectElem\r\n\t * @param {array} optionArray\r\n\t * @param {string} [defaultValue]\r\n\t */\r\n\tstatic setupSelectOptions(selectElem, optionArray, defaultValue)\r\n\t{\r\n\t\tif (!Types.isObject(selectElem))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!Types.isArray(optionArray))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\toptionArray.forEach((settings) =>\r\n\t\t{\r\n\t\t\tconst option = new Option(settings.label, settings.value);\r\n\t\t\tselectElem.options.add(option);\r\n\r\n\t\t\t/* we can select an option if a default value\r\n\t\t\thas been sumbitted */\r\n\t\t\tif (defaultValue !== null && option.value == defaultValue)\r\n\t\t\t{\r\n\t\t\t\toption.selected = true;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an elements data.\r\n\t *\r\n\t * @param {object} ele\r\n\t */\r\n\tstatic removeElementData(ele)\r\n\t{\r\n\t\tDataTracker.remove(ele);\r\n\r\n\t\t/* we want to do a recursive remove child\r\n\t\tremoval */\r\n\t\tconst children = ele.childNodes;\r\n\t\tif (children)\r\n\t\t{\r\n\t\t\tconst length = children.length - 1;\r\n\t\t\tfor (var i = length; i >= 0; i--)\r\n\t\t\t{\r\n\t\t\t\tvar child = children[i];\r\n\t\t\t\tif (!child)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/* this will remove the child element data\r\n\t\t\t\tbefore the parent is removed */\r\n\t\t\t\tthis.removeElementData(child);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst bound = ele.bindId;\r\n\t\tif (bound)\r\n\t\t{\r\n\t\t\t/* this will check to remove any data bindings\r\n\t\t\tto the element */\r\n\t\t\tdataBinder.unbind(ele);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an element and its data.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @returns {object} this\r\n\t */\r\n\tstatic removeElement(obj)\r\n\t{\r\n\t\tif (!obj)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will check if the element has a manual destroy tracker.\r\n\t\t */\r\n\t\tconst manualDestroy = DataTracker.has(obj, 'manual-destroy');\r\n\r\n\t\t/* this will remove all element data and binding\r\n\t\tand remove from the parent container */\r\n\t\tthis.removeElementData(obj);\r\n\r\n\t\t/**\r\n\t\t * This will only remove the element if it does not have a\r\n\t\t * manual destroy tracker.\r\n\t\t */\r\n\t\tif (manualDestroy === false)\r\n\t\t{\r\n\t\t\tobj.remove();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an element.\r\n\t *\r\n\t * @param {object} child\r\n\t * @returns {object} this\r\n\t */\r\n\tstatic removeChild(child)\r\n\t{\r\n\t\tthis.removeElement(child);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove all elements from the container.\r\n\t *\r\n\t * @param {object} container\r\n\t * @returns {object} this\r\n\t */\r\n\tstatic removeAll(container)\r\n\t{\r\n\t\tif (!Types.isObject(container))\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst children = container.childNodes;\r\n\t\tfor (var child in children)\r\n\t\t{\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(children, child))\r\n\t\t\t{\r\n\t\t\t\tthis.removeElementData(children[child]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tcontainer.innerHTML = '';\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This change the parent of an element.\r\n\t *\r\n\t * @param {object} child\r\n\t * @param {object} newParent\r\n\t * @returns {object} this\r\n\t */\r\n\tstatic changeParent(child, newParent)\r\n\t{\r\n\t\tnewParent.appendChild(child);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will append a child element.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @param {object} child\r\n\t * @returns {object} this\r\n\t */\r\n\tstatic append(parent, child)\r\n\t{\r\n\t\tparent.appendChild(child);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepend a child element.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @param {object} child\r\n\t * @param {object} [optionalNode]\r\n\t * @returns {object}\r\n\t */\r\n\tstatic prepend(parent, child, optionalNode)\r\n\t{\r\n\t\tconst node = optionalNode || parent.firstChild;\r\n\t\tparent.insertBefore(child, node);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will clone an element.\r\n\t *\r\n\t * @param {object} node\r\n\t * @param {boolean} [deepCopy=false]\r\n\t * @returns {object}\r\n\t */\r\n\tstatic clone(node, deepCopy = false)\r\n\t{\r\n\t\tif (!Types.isObject(node))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn node.cloneNode(deepCopy);\r\n\t}\r\n}", "import { Events } from \"../../main/events/events.js\";\r\nimport { Dom } from '../../shared/dom.js';\r\nimport { Html, normalizeAttr, removeEventPrefix } from '../html/html.js';\r\n\r\n/**\r\n * HtmlHelper\r\n *\r\n * This will build JSON layouts.\r\n *\r\n * @class\r\n * @extends Html\r\n */\r\n// @ts-ignore\r\nexport class HtmlHelper extends Html\r\n{\r\n\t/**\r\n\t * This will create a new element.\r\n\t *\r\n\t * @override\r\n\t * @param {string} nodeName The node name.\r\n\t * @param {array} attrs The node attributes.\r\n\t * @param {object} container The node container.\r\n\t * @param {object} parent\r\n\t * @returns {object} The new element.\r\n\t */\r\n\tstatic create(nodeName, attrs, container, parent)\r\n\t{\r\n\t\tconst ele = document.createElement(nodeName);\r\n this.addAttributes(ele, attrs, parent);\r\n\r\n\t\tcontainer.appendChild(ele);\r\n\t\treturn ele;\r\n }\r\n\r\n\t/**\r\n\t * This will add the element attributes.\r\n\t *\r\n\t * @overload\r\n\t * @param {object} ele\r\n\t * @param {array} attrs\r\n\t * @param {object} parent\r\n * @returns {void}\r\n\t */\r\n\tstatic addAttributes(ele, attrs, parent)\r\n\t{\r\n if (!attrs || attrs.length < 1)\r\n {\r\n return;\r\n }\r\n\r\n attrs.forEach(item =>\r\n\t\t{\r\n const { key: prop, value } = item;\r\n\t\t\tthis.addAttr(ele, prop, value, parent);\r\n });\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an element attribute.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {string} attr\r\n\t * @param {*} value\r\n * @returns {void}\r\n\t */\r\n\tstatic addAttr(ele, attr, value, parent)\r\n\t{\r\n\t\tif (value === '' || !attr)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Prevent setting reserved DOM properties that have read-only getters.\r\n\t\t * 'children' is a read-only property on all DOM elements.\r\n\t\t */\r\n\t\tif (attr === 'children')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (attr === 'innerHTML')\r\n\t\t{\r\n\t\t\tele.innerHTML = value;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* we want to check to add a value or an event listener */\r\n\t\tconst type = typeof value;\r\n\t\tif (type === 'function')\r\n\t\t{\r\n\t\t\t/* this will add the event using the base events\r\n\t\t\tso the event is tracked */\r\n\t\t\tattr = removeEventPrefix(attr);\r\n\t\t\tEvents.add(attr, ele, function(e)\r\n\t\t\t{\r\n\t\t\t\tvalue.call(this, e, parent);\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (attr.substr(4, 1) === '-')\r\n\t\t{\r\n\t\t\t// this will handle data and aria attributes\r\n\t\t\tDom.setAttr(ele, attr, value);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst attrName = normalizeAttr(attr);\r\n\t\tele[attrName] = value;\r\n\t}\r\n\r\n\t/**\r\n * This will add content to an element.\r\n *\r\n * @param {object} ele\r\n * @param {object|null} content\r\n */\r\n static addContent(ele, content)\r\n {\r\n if (!content)\r\n {\r\n return;\r\n }\r\n\r\n if (content.textContent !== null)\r\n {\r\n ele.textContent = content.textContent;\r\n }\r\n else if (content.innerHTML)\r\n {\r\n ele.innerHTML = content.innerHTML;\r\n }\r\n }\r\n\r\n\t/**\r\n\t * This will append a child element to a parent.\r\n\t *\r\n\t * @override\r\n\t * @param {object} parent\r\n\t * @param {object} child\r\n * @returns {void}\r\n\t */\r\n\tstatic append(parent, child)\r\n\t{\r\n\t\tparent.appendChild(child);\r\n\t}\r\n}", "import { Types } from '../../shared/types.js';\r\nimport { dataBinder } from '../data-binder/data-binder.js';\r\nimport { getParentData } from './directives/core/reactive/get-parent-data.js';\r\nimport { HtmlHelper } from './html-helper.js';\r\n\r\n/**\r\n * WATCHER_PATTERN\r\n *\r\n * This is the pattern used to match watcher strings.\r\n *\r\n * @type {RegExp} WATCHER_PATTERN\r\n */\r\nconst WATCHER_PATTERN = /(\\[\\[(.*?(?:\\[\\d+\\])?)\\]\\])/g;\r\n\r\n/**\r\n * WatcherHelper\r\n *\r\n * This helper creates watcher callBacks, parses watcher strings\r\n * and sets up watchers.\r\n *\r\n * @type {object} WatcherHelper\r\n */\r\nexport const WatcherHelper =\r\n{\r\n\t/**\r\n\t * This will check if the value is a watcher.\r\n\t *\r\n\t * @param {*} value\r\n\t * @returns {boolean}\r\n\t * @static\r\n\t * @private\r\n\t */\r\n\tisWatching(value)\r\n\t{\r\n\t\t/**\r\n\t\t * This will check if we are watching using an array.\r\n\t\t */\r\n\t\tif (Array.isArray(value))\r\n\t\t{\r\n\t\t\treturn typeof value[0] === 'string' && this.hasParams(value[0]);\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will check if we are watching using a string.\r\n\t\t */\r\n\t\treturn this.hasParams(value);\r\n\t},\r\n\r\n\t/**\r\n\t * This will check if a string has params.\r\n\t *\r\n\t * @param {string} string\r\n\t * @returns {boolean}\r\n\t */\r\n\thasParams(string)\r\n\t{\r\n\t\treturn Types.isString(string) && string.includes('[[');\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the property names to be watched.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} string\r\n\t * @returns {(array|null)}\r\n\t */\r\n\t_getWatcherProps(string)\r\n\t{\r\n\t\tconst matches = string.match(WATCHER_PATTERN);\r\n\t\tif (!matches)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t};\r\n\r\n\t\treturn matches.map(match => match.slice(2, -2)); // Trim `[[` and `]]`\r\n\t},\r\n\r\n\t/**\r\n\t * This will update an element attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {string} attr\r\n\t * @param {string} value\r\n\t * @returns {void}\r\n\t */\r\n\tupdateAttr(ele, attr, value)\r\n\t{\r\n\t\tswitch (attr) {\r\n\t\t\tcase 'text':\r\n\t\t\tcase 'textContent':\r\n\t\t\t\tele.textContent = value;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'disabled':\r\n\t\t\t\tele.disabled = (!value);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'checked':\r\n\t\t\t\tele.checked = (Boolean(value) !== false);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'required':\r\n\t\t\t\tele.required = (Boolean(value) !== false);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'src':\r\n\t\t\t\tif (ele.tagName.toLowerCase() === 'img')\r\n\t\t\t\t{\r\n\t\t\t\t\tele.src = (value && (value.indexOf('.') !== -1 || value.indexOf('blob:') !== -1))? value : '';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tele.src = value;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tHtmlHelper.addAttr(ele, attr, value);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will replace the params in a string with the data values.\r\n\t *\r\n\t * @param {string} string\r\n\t * @param {object} data\r\n\t * @param {boolean} isArray\r\n\t * @returns {string}\r\n\t */\r\n\treplaceParams(string, data, isArray = false)\r\n\t{\r\n\t\tlet count = 0;\r\n\t\treturn string.replace(WATCHER_PATTERN, function()\r\n\t\t{\r\n\t\t\tconst watcherData = (isArray)? data[count] : data;\r\n\t\t\tcount++;\r\n\r\n\t\t\tconst result = watcherData.get(arguments[2]);\r\n\t\t\treturn ((typeof result !== 'undefined' && result !== null)? result : '');\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * This will get a watcher callBack.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {(string|array)} data\r\n\t * @param {string} string\r\n\t * @param {string} attr\r\n\t * @param {boolean} isArray\r\n\t * @returns {function}\r\n\t */\r\n\t_getWatcherCallBack(ele, data, string, attr, isArray)\r\n\t{\r\n\t\treturn () =>\r\n\t\t{\r\n\t\t\tlet value = this.replaceParams(string, data, isArray);\r\n\t\t\tthis.updateAttr(ele, attr, value);\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * This will get a watcher value.\r\n\t *\r\n\t * @private\r\n\t * @param {(string|object)} settings\r\n\t * @param {object} parent\r\n\t * @returns {array}\r\n\t */\r\n\tgetValue(settings, parent)\r\n\t{\r\n\t\tconst value = settings.value;\r\n\t\tif (Array.isArray(value) === false)\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * This will setup an array watcher based on a string.\r\n\t\t\t */\r\n\t\t\treturn [value, getParentData(parent)];\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will check to add the default data.\r\n\t\t */\r\n\t\tif (value.length < 2)\r\n\t\t{\r\n\t\t\tvalue.push(getParentData(parent));\r\n\t\t}\r\n\t\treturn value;\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the prop values.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {array} props\r\n\t * @param {boolean} isArray\r\n\t * @returns {array}\r\n\t */\r\n\tgetPropValues(data, props, isArray)\r\n\t{\r\n\t\tconst values = [];\r\n\r\n\t\tfor (var i = 0, length = props.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar watcherData = (isArray)? data[i] : data;\r\n\t\t\tvar value = watcherData.get(props[i]);\r\n\t\t\tvalue = (typeof value !== 'undefined'? value : '');\r\n\t\t\tvalues.push(value);\r\n\t\t}\r\n\r\n\t\treturn values;\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the watcher callBack.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @param {object} ele\r\n\t * @param {object} data\r\n\t * @param {string} string\r\n\t * @param {boolean} isDataArray\r\n\t * @returns {function}\r\n\t */\r\n\tgetCallBack(settings, ele, data, string, isDataArray)\r\n\t{\r\n\t\t/**\r\n\t\t * This will get the attribute to update.\r\n\t\t * If no attribute is set, we will default to textContent.\r\n\t\t */\r\n\t\tconst attr = settings.attr || 'textContent';\r\n\r\n\t\t/**\r\n\t\t * This will check if we have an override callBack that\r\n\t\t * will be used instead of the default callBack.\r\n\t\t */\r\n\t\tconst overrideCallBack = settings.callBack;\r\n\t\tif (typeof overrideCallBack === 'function')\r\n\t\t{\r\n\t\t\tconst props = string.match(WATCHER_PATTERN) || [];\r\n\t\t\tconst isMultiProp = (props && props.length > 1);\r\n\r\n\t\t\treturn (value, committer) =>\r\n\t\t\t{\r\n\t\t\t\t/**\r\n\t\t\t\t * This will get the watcher values to pass to the callBack.\r\n\t\t\t\t */\r\n\t\t\t\tvalue = (isMultiProp !== true)? value : this.getPropValues(data, props, isDataArray);\r\n\t\t\t\tconst result = overrideCallBack(value, ele, committer);\r\n\t\t\t\tif (typeof result !== 'undefined')\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.updateAttr(ele, attr, result);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn this._getWatcherCallBack(ele, data, string, attr, isDataArray);\r\n\t},\r\n\r\n\t/**\r\n\t * This will add a data watcher.\r\n\t *\r\n\t * @private\r\n\t * @param {object} ele\r\n\t * @param {(string|object)} settings\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\taddDataWatcher(ele, settings, parent)\r\n\t{\r\n\t\tconst value = this.getValue(settings, parent),\r\n\r\n\t\t/**\r\n\t\t * This will check if the data is set in the watcher value array.\r\n\t\t * If not, we will use the parent data.\r\n\t\t */\r\n\t\tdata = value[1] ?? parent?.data ?? parent?.context?.data ?? parent?.state ?? null;\r\n\t\tif (!data)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst string = value[0],\r\n\r\n\t\t/**\r\n\t\t * This will check if we are watching multiple data objects.\r\n\t\t */\r\n\t\tisDataArray = Array.isArray(data);\r\n\r\n\t\t/**\r\n\t\t * This will set up the watcher callBack.\r\n\t\t *\r\n\t\t * @type {function} callBack\r\n\t\t */\r\n\t\tconst callBack = this.getCallBack(settings, ele, data, string, isDataArray),\r\n\r\n\t\t/**\r\n\t\t * This will get the props to watch.\r\n\t\t *\r\n\t\t * @type {array} props\r\n\t\t */\r\n\t\tprops = this._getWatcherProps(string);\r\n\r\n\t\t/**\r\n\t\t * This will add the watcher for each prop.\r\n\t\t */\r\n\t\tfor (var i = 0, length = props.length; i < length; i++)\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * This will set the coreect data object for the watcher\r\n\t\t\t * based on the isDataArray flag.\r\n\t\t\t */\r\n\t\t\tvar watcherData = (isDataArray)? data[i] : data;\r\n\t\t\tthis.addWatcher(ele, watcherData, props[i], callBack);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the watcher array settings.\r\n\t *\r\n\t * @param {string|object|array} settings\r\n\t * @param {string} [attribute=null]\r\n\t * @returns {object}\r\n\t */\r\n\tgetWatcherSettings(settings, attribute = null)\r\n\t{\r\n\t\t/**\r\n\t\t * Handle case where `watch` is a string (multi-property string updating).\r\n\t\t */\r\n\t\tif (typeof settings === \"string\")\r\n\t\t{\r\n\t\t\treturn { attr: attribute, value: settings };\r\n\t\t}\r\n\r\n\t\tif (Array.isArray(settings))\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * Handle shorthand syntax (array).\r\n\t\t\t */\r\n\t\t\tlet lastItem = settings[settings.length - 1];\r\n\t\t\tif (lastItem && typeof lastItem === \"object\")\r\n\t\t\t{\r\n\t\t\t\tlastItem = (attribute !== null) ? attribute : null;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will set up the value based on length to support\r\n\t\t\t * optional data and callback parameters.\r\n\t\t\t */\r\n\t\t\tconst value = (settings[1] && typeof settings[1] === 'object')\r\n\t\t\t\t? [settings[0], settings[1]] // `['[[id]]', data]`\r\n\t\t\t\t: [settings[0]]; // `['[[id]]'`\r\n\r\n\t\t\treturn ((typeof lastItem === \"function\")\r\n\t\t\t\t? { attr: attribute, value, callBack: lastItem } // Callback format\r\n\t\t\t\t: { attr: lastItem || \"textContent\", value }); // Attribute format\r\n\t\t}\r\n\r\n\t\treturn settings;\r\n\t},\r\n\r\n\t/**\r\n\t * This will setup a data watcher.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {(string|object)} settings\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tsetup(ele, settings, parent)\r\n\t{\r\n\t\tif (!settings)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.addDataWatcher(\r\n\t\t\tele,\r\n\t\t\tthis.getWatcherSettings(settings),\r\n\t\t\tparent\r\n\t\t);\r\n\t},\r\n\r\n\t/**\r\n\t * This will add a watcher.\r\n\t *\r\n\t * @private\r\n\t * @param {object} ele\r\n\t * @param {object} data\r\n\t * @param {string} prop\r\n\t * @param {function} callBack\r\n\t * @returns {void}\r\n\t */\r\n\taddWatcher(ele, data, prop, callBack)\r\n\t{\r\n\t\tdataBinder.watch(ele, data, prop, callBack);\r\n\t}\r\n};", "import { ArrayProp, DefaultProps, ObjectProp, StringProp } from \"../component/prop-utils.js\";\r\nimport { WatcherHelper } from \"../layout/watcher-helper.js\";\r\n\r\n/**\r\n * This will create a watcher prop.\r\n *\r\n * @param {array} watch\r\n * @returns {object}\r\n */\r\nconst WatcherProp = (watch) => ({\r\n\tprops: {\r\n\t\twatch\r\n\t},\r\n\tchildren: []\r\n});\r\n\r\n/**\r\n * This will parse the arguments passed to the atom.\r\n *\r\n * @param {array} args\r\n * @returns {object}\r\n */\r\nconst parseArgs = (args) =>\r\n{\r\n\tif (!args)\r\n\t{\r\n\t\treturn DefaultProps();\r\n\t}\r\n\r\n\t/**\r\n\t * This will handle string children and allow them\r\n\t * to have watcher props.\r\n\t */\r\n\tconst first = args[0];\r\n\tconst firstType = typeof first;\r\n\tif (firstType === 'string' || firstType === 'number')\r\n\t{\r\n\t\treturn StringProp(first);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if we have a child array or\r\n\t * a watcher array.\r\n\t */\r\n\tif (Array.isArray(first))\r\n\t{\r\n\t\t/**\r\n\t\t * This will handle the child array.\r\n\t\t */\r\n\t\tif (WatcherHelper.isWatching(first) === false)\r\n\t\t{\r\n\t\t\treturn ArrayProp(first);\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will handle the watcher array.\r\n\t\t */\r\n\t\treturn WatcherProp(first);\r\n\t}\r\n\r\n\t// @ts-ignore\r\n\tconst children = args[1] ?? args[0] ?? [];\r\n\tif (children && Array.isArray(children))\r\n\t{\r\n\t\t/**\r\n\t\t * This will check if the first child is a watcher array\r\n\t\t * and set it as a watcher prop.\r\n\t\t */\r\n\t\tif (WatcherHelper.isWatching(children) === true)\r\n\t\t{\r\n\t\t\targs[0] = (!Array.isArray(args[0]))? args[0] : {};\r\n\t\t\t// @ts-ignore\r\n\t\t\targs[0].watch = children;\r\n\t\t\targs[1] = [];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will handle default props and children.\r\n\t */\r\n\treturn ObjectProp(args);\r\n};\r\n\r\n/**\r\n * This will create an atom.\r\n *\r\n * @param {function} callBack\r\n * @returns {function}\r\n */\r\nexport const Atom = (callBack) =>\r\n{\r\n\t/**\r\n\t * This will create a closure that will\r\n\t * parse the arguments and then call the\r\n\t * callback.\r\n\t */\r\n\treturn (...args) =>\r\n\t{\r\n\t\t/**\r\n\t\t * This will allow the atom to access optional args.\r\n\t\t */\r\n\t\tconst {props, children} = parseArgs(args);\r\n\t\treturn callBack(props, children);\r\n\t};\r\n};", "import { Objects } from \"../../shared/objects.js\";\r\n\r\n/**\r\n * This will get hte path of the prop.\r\n *\r\n * @param {string} path\r\n * @param {string} prop\r\n * @returns {string}\r\n */\r\nfunction getNewPath(path, prop)\r\n{\r\n const isNan = isNaN(Number(prop));\r\n const propPath = isNan ? prop : `[${prop}]`;\r\n if (path === '')\r\n {\r\n return propPath;\r\n }\r\n\r\n return isNan ?`${path}.${propPath}` : `${path}${propPath}`;\r\n}\r\n\r\n/**\r\n * This will create a handler for the proxy.\r\n *\r\n * @param {object} data\r\n * @param {string} path\r\n * @param {string} dataRoot\r\n * @returns {Proxy}\r\n */\r\nfunction createHandler(data, path = '', dataRoot = '')\r\n{\r\n return {\r\n\r\n /**\r\n * This will get the value of the prop.\r\n *\r\n * @param {object} target\r\n * @param {string} prop\r\n * @param {object} receiver\r\n * @returns {*}\r\n */\r\n // @ts-ignore\r\n get(target, prop, receiver)\r\n {\r\n let value = target[prop];\r\n // Directly return the property if it's on the root level and we're at the root path\r\n if (path === '' && prop in target)\r\n {\r\n if (typeof value === 'function')\r\n {\r\n return value.bind(target);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n // Access the property within the dataRoot\r\n const dataTarget = target[dataRoot] || target;\r\n value = Reflect.get(dataTarget, prop, receiver);\r\n\r\n // Return the value directly if it's not an object\r\n if (Objects.isPlainObject(value) || Array.isArray(value))\r\n {\r\n // Create a new handler for nested properties\r\n const newPath = getNewPath(path, prop);\r\n // @ts-ignore\r\n return new Proxy(value, createHandler(data, newPath, dataRoot));\r\n }\r\n\r\n return value;\r\n },\r\n\r\n /**\r\n * This will set the value of the prop.\r\n *\r\n * @param {object} target\r\n * @param {string} prop\r\n * @param {*} value\r\n * @param {object} receiver\r\n * @returns {*}\r\n */\r\n set(target, prop, value, receiver)\r\n {\r\n // Set the property at the root level if we're at the root path\r\n if (path === '' && prop in target)\r\n {\r\n target[prop] = value;\r\n return true;\r\n }\r\n\r\n const newPath = getNewPath(path, prop);\r\n data.set(newPath, value);\r\n\r\n return true;\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * This will create a data proxy.\r\n *\r\n * @param {object} data\r\n * @returns {Proxy}\r\n */\r\n// @ts-ignore\r\nexport const DataProxy = (data, root = 'stage') => new Proxy(data, createHandler(data, '', root));", "/**\r\n * LocalData\r\n *\r\n * This will help manage the local data.\r\n *\r\n * @class\r\n */\r\nexport class LocalData\r\n{\r\n\t/**\r\n\t * This will restore the data from local storage.\r\n\t *\r\n * @static\r\n * @param {string} key\r\n\t * @param {*} defaultValue\r\n\t * @returns {*}\r\n\t */\r\n\tstatic resume(key, defaultValue)\r\n\t{\r\n\t\tif (!key)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tlet data;\r\n\t\tconst value = localStorage.getItem(key);\r\n\t\tif (value === null)\r\n\t\t{\r\n\t\t\tif (defaultValue)\r\n\t\t\t{\r\n\t\t\t\tdata = defaultValue;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdata = JSON.parse(value);\r\n\t\t}\r\n\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/**\r\n\t * This will store the data to the local stoage under\r\n\t * the storage key.\r\n\t *\r\n * @static\r\n * @param {string} key\r\n * @param {*} data\r\n\t * @returns {boolean}\r\n\t */\r\n\tstatic store(key, data)\r\n\t{\r\n\t\tif (!key)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!data)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst value = JSON.stringify(data);\r\n\t\tlocalStorage.setItem(key, value);\r\n\t\treturn true;\r\n\t}\r\n\r\n /**\r\n * This will remove the data from the local storage.\r\n *\r\n * @static\r\n * @param {string} key\r\n * @returns {boolean}\r\n */\r\n static remove(key)\r\n {\r\n if (!key)\r\n {\r\n return false;\r\n }\r\n\r\n localStorage.removeItem(key);\r\n return true;\r\n }\r\n}", "import { Objects } from \"../../../../shared/objects.js\";\r\nimport { Types } from \"../../../../shared/types.js\";\r\n\r\n/**\r\n * This will get the data attribute settings.\r\n *\r\n * @param {object} [settings={}]\r\n * @returns {object}\r\n */\r\nexport const setupAttrSettings = (settings = {}) =>\r\n{\r\n\tconst attributes = {};\r\n\tif (!Types.isObject(settings))\r\n\t{\r\n\t\treturn attributes;\r\n\t}\r\n\r\n\tconst clonedSettings = Objects.clone(settings);\r\n\tObject.keys(clonedSettings).forEach(prop =>\r\n\t{\r\n\t\tconst settingValue = clonedSettings[prop];\r\n if (typeof settingValue !== 'function')\r\n\t\t{\r\n attributes[prop] = settingValue;\r\n }\r\n\t});\r\n\treturn attributes;\r\n};", "import { Objects } from '../../../shared/objects.js';\r\nimport { dataBinder } from '../../data-binder/data-binder.js';\r\nimport { DataPubSub } from '../../data-binder/data-pub-sub.js';\r\nimport { DataProxy } from '../data-proxy.js';\r\nimport { LocalData } from '../local-data.js';\r\nimport { setupAttrSettings } from './model/attrs.js';\r\n\r\nlet dataNumber = 0;\r\n\r\n/**\r\n * EVENT\r\n *\r\n * This will hold the event strings for the data object.\r\n *\r\n * @type {object} EVENT\r\n * @property {string} CHANGE\r\n * @property {string} DELETE\r\n * @readonly\r\n * @enum {string} EVENT - The event strings for the data object.\r\n * @const\r\n */\r\nexport const EVENT =\r\n{\r\n\tCHANGE: 'change',\r\n\tDELETE: 'delete'\r\n};\r\n\r\n/**\r\n * createEventMessage\r\n *\r\n * This will create an event message.\r\n *\r\n * @param {string} attr\r\n * @param {string} event\r\n * @returns {string} The event message.\r\n */\r\nexport const createEventMessage = (attr, event) =>\r\n{\r\n\treturn `${attr}:${event}`;\r\n};\r\n\r\n/**\r\n * BasicData\r\n *\r\n * This will create a bindable base class. This will\r\n * allow shallow one level deep data to be created\r\n * and watched.\r\n *\r\n * @class\r\n */\r\nexport class BasicData\r\n{\r\n\t/**\r\n\t * This will create a basic data object.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} [settings]\r\n\t */\r\n\tconstructor(settings = {})\r\n\t{\r\n\t\t/**\r\n\t\t * @member {boolean} dirty\r\n\t\t * @default false\r\n\t\t */\r\n\t\tthis.dirty = false;\r\n\r\n\t\t/**\r\n\t\t * @member {object} links\r\n\t\t * @default {}\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis.links = new Map();\r\n\r\n\t\tthis._init();\r\n\t\tthis.setup();\r\n\r\n\t\t/**\r\n\t\t * @member {string} dataTypeId\r\n\t\t */\r\n\t\tthis.dataTypeId = 'bd';\r\n\r\n\t\t/* this will setup the event sub for\r\n\t\tone way binding */\r\n\t\tthis.eventSub = new DataPubSub();\r\n\r\n\t\t/* this will set the construct attributes */\r\n\t\tconst attributes = setupAttrSettings(settings);\r\n\t\tthis.set(attributes);\r\n\r\n\t\t// @ts-ignore\r\n\t\treturn DataProxy(this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the data object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {object} stage\r\n\t\t */\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the number and unique id of the data object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\t_init()\r\n\t{\r\n\t\tconst id = (++dataNumber);\r\n\t\tthis._dataNumber = id;\r\n\r\n\t\tthis._id = `dt-${id}`;\r\n\t\tthis._dataId = `${this._id}:`;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the data id.\r\n\t *\r\n\t * @returns {string}\r\n\t */\r\n\tgetDataId()\r\n\t{\r\n\t\treturn this._id;\r\n\t}\r\n\r\n\t/**\r\n\t * This is a placeholder.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tremove()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a one way bind.\r\n\t *\r\n\t * @param {string} attrName\r\n\t * @param {function} callBack\r\n\t * @returns {string} The subscription token.\r\n\t */\r\n\ton(attrName, callBack)\r\n\t{\r\n\t\tconst message = createEventMessage(attrName, EVENT.CHANGE);\r\n\t\tconst token = this.eventSub.on(message, callBack);\r\n\t\treturn token;\r\n\t}\r\n\r\n\t/**\r\n\t * This will unbind from a one way bind.\r\n\t *\r\n\t * @param {string} attrName\r\n\t * @param {string} token\r\n\t * @returns {void}\r\n\t */\r\n\toff(attrName, token)\r\n\t{\r\n\t\tconst message = createEventMessage(attrName, EVENT.CHANGE);\r\n\t\tthis.eventSub.off(message, token);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the attribute value.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {object} committer\r\n\t * @param {boolean} stopMerge\r\n\t * @returns {void}\r\n\t */\r\n\t_setAttr(attr, val, committer = this, stopMerge = false)\r\n\t{\r\n\t\tconst prevValue = this.stage[attr];\r\n\t\tif (val === prevValue)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.stage[attr] = val;\r\n\r\n\t\t/* this will publish the data to the data binder\r\n\t\tto update any ui elements that are subscribed */\r\n\t\tthis._publish(attr, val, committer, EVENT.CHANGE);\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish a local event.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {object|null} committer\r\n\t * @param {string} event\r\n\t * @returns {void}\r\n\t */\r\n\tpublishLocalEvent(attr, val, committer, event)\r\n\t{\r\n\t\t/**\r\n\t\t * This will publish the event to the event sub.\r\n\t\t */\r\n\t\tconst message = createEventMessage(attr, event);\r\n\t\tthis.eventSub.publish(message, val, committer);\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish an update to the data binder.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {*} committer\r\n\t * @param {string} event\r\n\t * @returns {void}\r\n\t */\r\n\t_publish(attr, val, committer, event)\r\n\t{\r\n\t\t/**\r\n\t\t * This will publish the event to the event sub.\r\n\t\t */\r\n\t\tthis.publishLocalEvent(attr, val, committer, event);\r\n\r\n\t\t/**\r\n\t\t * This will set the committer to the current object if it is not set.\r\n\t\t * This is deferred until the local event is published.\r\n\t\t *\r\n\t\t * This will publish the event to the data binder.\r\n\t\t */\r\n\t\tcommitter = committer || this;\r\n\t\tdataBinder.publish(this._dataId + attr, val, committer);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the data value of an attribute or attributes.\r\n\t *\r\n\t * @overload\r\n\t * @param {string} key\r\n\t * @param {*} value\r\n\t * @param {object} [committer]\r\n\t *\r\n\t * @overload\r\n\t * @param {object} data\r\n\t * @returns {object} this\r\n\t */\r\n\tset(...args)\r\n\t{\r\n\t\tif (typeof args[0] !== 'object')\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis._setAttr(...args);\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst [items, committer, stopMerge] = args;\r\n\t\tObject.entries(items).forEach(([attr, value]) =>\r\n\t\t{\r\n\t\t\tif (typeof value === 'function')\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tthis._setAttr(attr, value, committer, stopMerge);\r\n\t\t});\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the model data.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object}\r\n\t */\r\n\tgetModelData()\r\n\t{\r\n\t\treturn this.stage;\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete an attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @param {object} [committer]\r\n\t * @returns {void}\r\n\t */\r\n\t_deleteAttr(obj, attr, committer = this)\r\n\t{\r\n\t\tdelete obj[attr];\r\n\r\n\t\t/**\r\n\t\t * This will pulish the delete event to the event sub only. This will\r\n\t\t * not publish the delete event to the data binder.\r\n\t\t */\r\n\t\tthis.publishLocalEvent(attr, null, committer, EVENT.DELETE);\r\n\t}\r\n\r\n\t/**\r\n\t * This will toggle a bool attribute.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @returns {object} this\r\n\t */\r\n\ttoggle(attr)\r\n\t{\r\n\t\tif (typeof attr === 'undefined')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.set(attr, !this.get(attr));\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will increment an attribute.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {number|null} value\r\n\t * @returns {object} this\r\n\t */\r\n\tincrement(attr, value = null)\r\n\t{\r\n\t\tif (typeof attr === 'undefined')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// this will ensure we have a number value\r\n\t\tvalue = (value !== null && typeof value === 'number' ? value : 1);\r\n\r\n\t\tlet val = this.get(attr);\r\n\t\tthis.set(attr, val + value);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will decrement an attribute.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {number|null} value\r\n\t * @returns {object} this\r\n\t */\r\n\tdecrement(attr, value = null)\r\n\t{\r\n\t\tif (typeof attr === 'undefined')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// this will ensure we have a number value\r\n\t\tvalue = (value !== null && typeof value === 'number' ? value : 1);\r\n\r\n\t\tlet val = this.get(attr);\r\n\t\tthis.set(attr, val - value);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will concat an attribute.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @returns {object} this\r\n\t */\r\n\tconcat(attr, value)\r\n\t{\r\n\t\tif (typeof attr === 'undefined')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst currentValue = this.get(attr);\r\n\t\tthis.set(attr, currentValue + value);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the key value if it is null.\r\n\t *\r\n\t * @param {string} key\r\n\t * @param {*} value\r\n\t * @returns {object} this\r\n\t */\r\n\tifNull(key, value)\r\n\t{\r\n\t\tif (this.get(key) === null)\r\n\t\t{\r\n\t\t\tthis.set(key, value);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the data local storage key.\r\n\t *\r\n\t * @param {string} key\r\n\t * @returns {object} this\r\n\t */\r\n\tsetKey(key)\r\n\t{\r\n\t\tthis.key = key;\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will restore the data from local storage.\r\n\t *\r\n\t * @param {*} defaultValue\r\n\t * @returns {object} this\r\n\t */\r\n\tresume(defaultValue)\r\n\t{\r\n\t\tconst data = LocalData.resume(this.key, defaultValue);\r\n\t\tif (!data)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tthis.set(data);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will store the data to the local stoage under\r\n\t * the storage key.\r\n\t *\r\n\t * @returns {boolean}\r\n\t */\r\n\tstore()\r\n\t{\r\n\t\tconst data = this.get();\r\n\t\treturn LocalData.store(this.key, data);\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete a property value or the model data.\r\n\t *\r\n\t * @param {object|string|null} [attrName]\r\n\t * @returns {object} this\r\n\t */\r\n\tdelete(attrName)\r\n\t{\r\n\t\tif (typeof attrName === 'string')\r\n\t\t{\r\n\t\t\tthis._deleteAttr(this.stage, attrName);\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t// this will clear the stage and attributes\r\n\t\tthis.setup();\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value of an attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @returns {*}\r\n\t */\r\n\t_getAttr(obj, attr)\r\n\t{\r\n\t\treturn obj[attr];\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a property value or the model data.\r\n\t *\r\n\t * @param {string} [attrName]\r\n\t * @returns {*}\r\n\t */\r\n\tget(attrName)\r\n\t{\r\n\t\tif (typeof attrName !== 'undefined')\r\n\t\t{\r\n\t\t\treturn this._getAttr(this.stage, attrName);\r\n\t\t}\r\n\r\n\t\treturn this.getModelData();\r\n\t}\r\n\r\n\t/**\r\n\t * This will link a data source property to another data source.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string|object} attr\r\n\t * @param {string} alias\r\n\t * @returns {string|array}\r\n\t */\r\n\tlink(data, attr, alias)\r\n\t{\r\n\t\t// this will get the data source attrs if sending a whole data object\r\n\t\tif (arguments.length === 1 && data.isData === true)\r\n\t\t{\r\n\t\t\tattr = data.get();\r\n\t\t}\r\n\r\n\t\tif (typeof attr !== 'object')\r\n\t\t{\r\n\t\t\treturn this.remoteLink(data, attr, alias);\r\n\t\t}\r\n\r\n\t\tconst tokens = [];\r\n\t\tObject.entries(attr).forEach(([prop]) =>\r\n\t\t{\r\n\t\t\ttokens.push(this.remoteLink(data, prop));\r\n\t\t});\r\n\r\n\t\treturn tokens;\r\n\t}\r\n\r\n\t/**\r\n\t * This will link a remote data source by property.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string} attr\r\n\t * @param {string} [alias]\r\n\t * @returns {string}\r\n\t */\r\n\tremoteLink(data, attr, alias)\r\n\t{\r\n\t\tconst childAttr = alias || attr;\r\n\t\tconst value = data.get(attr);\r\n\t\tif (typeof value !== 'undefined' && this.get(attr) !== value)\r\n\t\t{\r\n\t\t\tthis.set(attr, value);\r\n\t\t}\r\n\r\n\t\tconst token = data.on(attr, (propValue, committer) =>\r\n\t\t{\r\n\t\t\tif(committer === this)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tthis.set(childAttr, propValue, data);\r\n\t\t});\r\n\r\n\t\tthis.addLink(token, data);\r\n\r\n\t\tconst remoteToken = this.on(childAttr, (propValue, committer) =>\r\n\t\t{\r\n\t\t\tif (committer === data)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tdata.set(attr, propValue, this);\r\n\t\t});\r\n\r\n\t\tdata.addLink(remoteToken, this);\r\n\t\treturn token;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a link token to the links array.\r\n\t *\r\n\t * @param {string} token\r\n\t * @param {object} data\r\n\t * @returns {void}\r\n\t */\r\n\taddLink(token, data)\r\n\t{\r\n\t\tthis.links.set(token, data);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a link or all links if no token is provided.\r\n\t *\r\n\t * @param {string|null} [token=null]\r\n\t * @returns {void}\r\n\t */\r\n\tunlink(token)\r\n\t{\r\n\t\tif (token)\r\n\t\t{\r\n\t\t\tthis.removeLink(token);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst links = this.links;\r\n\t\tif (Objects.isEmpty(links))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlinks.forEach((data, token) =>\r\n\t\t{\r\n\t\t\tthis.removeLink(token, false);\r\n\t\t});\r\n\t\tthis.links = new Map();\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the linked subscription.\r\n\t *\r\n\t * @param {string} token\r\n\t * @param {boolean} [removeFromLinks=true]\r\n\t * @returns {void}\r\n\t */\r\n\tremoveLink(token, removeFromLinks = true)\r\n\t{\r\n\t\tconst data = this.links.get(token);\r\n\t\tif (data)\r\n\t\t{\r\n\t\t\tdata.off(token);\r\n\t\t}\r\n\r\n\t\tif (removeFromLinks === false)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.links.delete(token);\r\n\t}\r\n}\r\n\r\nBasicData.prototype.isData = true;", "/**\r\n * This is a utility class for data.\r\n */\r\nexport const DataUtils =\r\n{\r\n /**\r\n * @member {RexExp} deepDataPattern\r\n */\r\n\tdeepDataPattern: /(\\w+)|(?:\\[(\\d)\\))/g,\r\n\r\n\t/**\r\n\t * This will check if a string has deep data.\r\n\t *\r\n\t * @param {string} str\r\n\t * @returns {boolean}\r\n\t */\r\n\thasDeepData(str)\r\n\t{\r\n\t\treturn (str.indexOf('.') !== -1 || str.indexOf('[') !== -1);\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the deep data segments.\r\n\t *\r\n\t * @param {string} str\r\n\t * @returns {array}\r\n\t */\r\n\tgetSegments(str)\r\n\t{\r\n\t\tconst pattern = this.deepDataPattern;\r\n\t\treturn str.match(pattern);\r\n\t}\r\n};", "import { DataUtils as utils } from './data-utils.js';\r\n\r\n/**\r\n * PropertyHelper\r\n *\r\n * This will help get, set, and delete properties from a data object.\r\n *\r\n * @class\r\n */\r\nexport class PropertyHelper\r\n{\r\n\t/**\r\n\t * This will set the attribute value.\r\n\t *\r\n\t * @static\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @returns {void}\r\n\t */\r\n\tstatic set(obj, attr, val)\r\n\t{\r\n\t\t/* this will check if we need to update\r\n\t\tdeep nested data */\r\n\t\tif (!utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\tobj[attr] = val;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet prop,\r\n\t\tprops = utils.getSegments(attr),\r\n\t\tlength = props.length,\r\n\t\tend = length - 1;\r\n\r\n\t\tfor (var i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\tprop = props[i];\r\n\r\n\t\t\t/* this will add the value to the last prop */\r\n\t\t\tif (i === end)\r\n\t\t\t{\r\n\t\t\t\tobj[prop] = val;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tif (obj[prop] === undefined)\r\n\t\t\t{\r\n\t\t\t\t/* this will check to setup a new object\r\n\t\t\t\tor an array if the prop is a number */\r\n\t\t\t\tobj[prop] = isNaN(prop)? {} : [];\r\n\t\t\t}\r\n\t\t\tobj = obj[prop];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete an attribute.\r\n\t *\r\n\t * @static\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @returns {void}\r\n\t */\r\n\tstatic delete(obj, attr)\r\n\t{\r\n\t\tif (!utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\tdelete obj[attr];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst props = utils.getSegments(attr),\r\n\t\tlength = props.length,\r\n\t\tend = length - 1;\r\n\r\n\t\tfor (var i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\tvar prop = props[i];\r\n\t\t\tvar propValue = obj[prop];\r\n\t\t\tif (propValue === undefined)\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tif (i === end)\r\n\t\t\t{\r\n\t\t\t\tif (Array.isArray(obj))\r\n\t\t\t\t{\r\n\t\t\t\t\tobj.splice(Number(prop), 1);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdelete obj[prop];\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tobj = propValue;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value of an attribute.\r\n\t *\r\n\t * @static\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @returns {*}\r\n\t */\r\n\tstatic get(obj, attr)\r\n\t{\r\n\t\tif (!utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\treturn obj[attr] ?? undefined;\r\n\t\t}\r\n\r\n\t\tconst props = utils.getSegments(attr),\r\n\t\tlength = props.length,\r\n\t\tend = length - 1;\r\n\r\n\t\tfor (var i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\tvar prop = props[i];\r\n\t\t\tvar propValue = obj[prop] ?? undefined;\r\n\t\t\tif (propValue === undefined)\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tobj = propValue;\r\n\r\n\t\t\tif (i === end)\r\n\t\t\t{\r\n\t\t\t\treturn obj;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t}\r\n}", "import { DataUtils as utils } from './data-utils.js';\r\n\r\n/**\r\n * Publisher\r\n *\r\n * This will contain methods for publishing data.\r\n *\r\n * @class\r\n */\r\nexport class Publisher\r\n{\r\n\t/**\r\n\t * This will publish deep data.\r\n\t *\r\n * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n * @param {function} callBack\r\n\t * @returns {void}\r\n\t */\r\n\tstatic publishDeep(obj, attr, val, callBack)\r\n\t{\r\n\t\tif (!utils.hasDeepData(attr))\r\n\t\t{\r\n\t\t\tthis.publish(attr, val, callBack);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet prop,\r\n\t\tprops = utils.getSegments(attr),\r\n\t\tlength = props.length,\r\n\t\tend = length - 1;\r\n\r\n\t\t/* the path is a string equivalent of the javascript dot notation path\r\n\t\tof the object being published. */\r\n\t\tlet path = '';\r\n\t\tfor (var i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\tprop = props[i];\r\n\r\n\t\t\t/* we need to setup the object to go to the next level\r\n\t\t\tof the data object before calling the next property. */\r\n\t\t\tobj = obj[prop];\r\n\r\n\t\t\tif (i > 0)\r\n\t\t\t{\r\n\t\t\t\t/* this will add the property to the path based on if its an\r\n\t\t\t\tobject property or an array. */\r\n\t\t\t\tif (isNaN(prop))\r\n\t\t\t\t{\r\n\t\t\t\t\tpath += '.' + prop;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tpath = prop;\r\n\t\t\t}\r\n\r\n\t\t\tvar publish;\r\n\t\t\tif (i === end)\r\n\t\t\t{\r\n\t\t\t\t/* if the loop is on the last pass it only needs to publish\r\n\t\t\t\tthe val. */\r\n\t\t\t\tpublish = val;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t/* we only want to publish the modified branches. we need to\r\n\t\t\t\tget the next property in the props array and create a publish\r\n\t\t\t\tobject or array with the next property value. */\r\n\t\t\t\tvar nextProp = props[i + 1];\r\n\t\t\t\tif (isNaN(nextProp) === false)\r\n\t\t\t\t{\r\n\t\t\t\t\tpath += '[' + nextProp + ']';\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar nextAttr = {};\r\n\t\t\t\tnextAttr[nextProp] = obj[nextProp];\r\n\t\t\t\tpublish = nextAttr;\r\n\t\t\t}\r\n\r\n\t\t\tthis.publish(path, publish, callBack);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish an update to the data binder.\r\n\t *\r\n\t * @param {string} pathString\r\n\t * @param {*} obj\r\n * @param {function} callBack\r\n\t * @returns {void}\r\n\t */\r\n\tstatic publish(pathString, obj, callBack)\r\n\t{\r\n /**\r\n * This will publish the data path to get the\r\n * root attr before publishing deeper.\r\n */\r\n\t\tpathString = pathString || \"\";\r\n\t\tcallBack(pathString, obj);\r\n\r\n\t\tif (!obj || typeof obj !== 'object')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (Array.isArray(obj))\r\n\t\t{\r\n\t\t\tthis.publishArray(pathString, obj, callBack);\r\n return;\r\n\t\t}\r\n\r\n this.publishObject(pathString, obj, callBack);\r\n\t}\r\n\r\n /**\r\n * This will publish an array to the data binder.\r\n *\r\n * @protected\r\n * @param {string} pathString\r\n * @param {array} obj\r\n * @param {function} callBack\r\n * @returns {void}\r\n */\r\n static publishArray(pathString, obj, callBack)\r\n {\r\n let subPath, value;\r\n const length = obj.length;\r\n for (var i = 0; i < length; i++)\r\n {\r\n value = obj[i];\r\n subPath = pathString + '[' + i + ']';\r\n this._checkPublish(subPath, value, callBack);\r\n }\r\n }\r\n\r\n /**\r\n * This will publish an object to the data binder.\r\n *\r\n * @protected\r\n * @param {string} pathString\r\n * @param {object} obj\r\n * @param {function} callBack\r\n * @returns {void}\r\n */\r\n static publishObject(pathString, obj, callBack)\r\n {\r\n let subPath, value;\r\n for (var prop in obj)\r\n {\r\n if (!Object.prototype.hasOwnProperty.call(obj, prop))\r\n {\r\n continue;\r\n }\r\n\r\n value = obj[prop];\r\n subPath = pathString + '.' + prop;\r\n this._checkPublish(subPath, value, callBack);\r\n }\r\n }\r\n\r\n\t/**\r\n\t * This will check if the value is an object and publish\r\n\t * the value or the object.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} subPath\r\n\t * @param {*} val\r\n * @param {function} callBack\r\n\t * @returns {void}\r\n\t */\r\n\tstatic _checkPublish(subPath, val, callBack)\r\n\t{\r\n\t\tif (!val || typeof val !== 'object')\r\n\t\t{\r\n\t\t\tcallBack(subPath, val);\r\n return;\r\n\t\t}\r\n\r\n this.publish(subPath, val, callBack);\r\n\t}\r\n}", "import { Objects } from '../../../../shared/objects.js';\r\nimport { dataBinder } from '../../../data-binder/data-binder.js';\r\nimport { BasicData, EVENT } from '../basic-data.js';\r\nimport { PropertyHelper } from './property-helper.js';\r\nimport { Publisher } from './publisher.js';\r\n\r\n/**\r\n * Data\r\n *\r\n * This will create a new data object that can be used to\r\n * bind elements to values.\r\n *\r\n * @class\r\n * @augments BasicData\r\n */\r\nexport class Data extends BasicData\r\n{\r\n\t/**\r\n\t * This will setup the stage and attributes object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.attributes = {};\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the attribute value.\r\n\t *\r\n\t * @override\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {object} committer\r\n\t * @param {boolean} stopMerge\r\n\t * @returns {void}\r\n\t */\r\n\t_setAttr(attr, val, committer, stopMerge)\r\n\t{\r\n\t\tif (typeof val !== 'object' && val === this.get(attr))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* this will check to update the model based on who\r\n\t\tupdated it. if the data binder updated the data only\r\n\t\tthe stage data is updated */\r\n\t\tif (!committer && stopMerge !== true)\r\n\t\t{\r\n\t\t\t/* this will update the attribute data because\r\n\t\t\tit was updated outside the data binder */\r\n\t\t\tPropertyHelper.set(this.attributes, attr, val);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif (this.dirty === false)\r\n\t\t\t{\r\n\t\t\t\tthis.dirty = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tPropertyHelper.set(this.stage, attr, val);\r\n\r\n\t\t/* this will publish the data to the data binder\r\n\t\tto update any ui elements that are subscribed */\r\n\t\tcommitter = committer || this;\r\n\t\tthis._publish(attr, val, committer, EVENT.CHANGE);\r\n\t}\r\n\r\n\t/**\r\n\t * This will link a data attr object to another data object.\r\n\t *\r\n\t * @param {object} data\r\n\t * @param {string} attr\r\n\t * @returns {void}\r\n\t */\r\n\tlinkAttr(data, attr)\r\n\t{\r\n\t\tconst value = data.get(attr);\r\n\t\tif (!value)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (var prop in value)\r\n\t\t{\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(value, prop))\r\n\t\t\t{\r\n\t\t\t\tthis.link(data, attr + '.' + prop, prop);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a new data source by scoping the parent\r\n\t * data attr and linking the two sources.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {object} [constructor]\r\n\t * @returns {object}\r\n\t */\r\n\tscope(attr, constructor)\r\n\t{\r\n\t\tconst value = this.get(attr);\r\n\t\tif (!value)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconstructor = constructor || this.constructor;\r\n\t\tconst data = new constructor(value);\r\n\r\n\t\t/* this will link the new data to the parent attr */\r\n\t\tdata.linkAttr(this, attr);\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/**\r\n\t * This will splice a value from an array and set\r\n\t * the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {number} index\r\n\t * @returns {object} this\r\n\t */\r\n\tsplice(attr, index)\r\n\t{\r\n\t\tthis.delete(attr + '[' + index + ']');\r\n\t\tthis.refresh(attr);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a value to an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {*} value\r\n\t * @returns {object} this\r\n\t */\r\n\tpush(attr, value)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif (Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\tcurrentValue = [];\r\n\t\t}\r\n\r\n\t\tcurrentValue.push(value);\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will concatenate values to an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {array} values\r\n\t * @returns {object} this\r\n\t */\r\n\tconcat(attr, values)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif (Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\tcurrentValue = [];\r\n\t\t}\r\n\r\n\t\tcurrentValue = currentValue.concat(values);\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a value to an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {*} value\r\n\t * @returns {object} this\r\n\t */\r\n\tunshift(attr, value)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif (Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\tcurrentValue = [];\r\n\t\t}\r\n\r\n\t\tcurrentValue.unshift(value);\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a value to an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @returns {*}\r\n\t */\r\n\tshift(attr)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif (Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst value = currentValue.shift();\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the index of the value in the array.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @param {*} key\r\n\t * @param {*} value\r\n\t * @returns {number}\r\n\t */\r\n\tgetIndex(attr, key, value)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif (Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\treturn -1;\r\n\t\t}\r\n\r\n\t\tconst firstItem = currentValue[0];\r\n\t\tif (typeof firstItem !== 'object')\r\n\t\t{\r\n\t\t\treturn currentValue.indexOf(key);\r\n\t\t}\r\n\r\n\t\treturn currentValue.findIndex((item) => item[key] === value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will pop the last value from an array and set the result.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @returns {*}\r\n\t */\r\n\tpop(attr)\r\n\t{\r\n\t\tlet currentValue = this.get(attr);\r\n\t\tif (Array.isArray(currentValue) === false)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst value = currentValue.pop();\r\n\t\tthis.set(attr, currentValue);\r\n\t\treturn value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will refresh the value.\r\n\t *\r\n\t * @param {string} attr\r\n\t * @returns {object} this\r\n\t */\r\n\trefresh(attr)\r\n\t{\r\n\t\tthis.set(attr, this.get(attr));\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish an update to the data binder.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} attr\r\n\t * @param {*} val\r\n\t * @param {*} committer\r\n\t * @param {string} event\r\n\t * @returns {void}\r\n\t */\r\n\t_publish(attr, val, committer, event)\r\n\t{\r\n\t\tconst callBack = (path, obj) => this._publishAttr(path, obj, committer, event);\r\n\t\tPublisher.publish(attr, val, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will publish an update on an attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} subPath\r\n\t * @param {*} val\r\n\t * @param {object} committer\r\n\t * @param {string} event\r\n\t * @returns {void}\r\n\t */\r\n\t_publishAttr(subPath, val, committer, event)\r\n\t{\r\n\t\t/**\r\n\t\t * This will publish the data to the data binder\r\n\t\t * to update any subscribers.\r\n\t\t */\r\n\t\tconst path = this._dataId + subPath;\r\n\t\tdataBinder.publish(path, val, committer);\r\n\r\n\t\t/**\r\n\t\t * This will publish to the local subscribers.\r\n\t\t */\r\n\t\tthis.publishLocalEvent(subPath, val, committer, event);\r\n\t}\r\n\r\n\t/**\r\n\t * This will merge the attribute with the stage.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tmergeStage()\r\n\t{\r\n\t\t/* this will clone the stage object to the\r\n\t\tattribute object */\r\n\t\tthis.attributes = Objects.clone(this.stage);\r\n\t\tthis.dirty = false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the model data.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tgetModelData()\r\n\t{\r\n\t\tthis.mergeStage();\r\n\t\treturn this.attributes;\r\n\t}\r\n\r\n\t/**\r\n\t * This will revert the stage back to the previous attributes.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\trevert()\r\n\t{\r\n\t\t/* this will reset the stage to the previous\r\n\t\tattributes */\r\n\t\tthis.set(this.attributes);\r\n\t\tthis.dirty = false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete an attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {object|string} obj\r\n\t * @param {string} attr\r\n\t * @param {object} committer\r\n\t * @returns {void}\r\n\t */\r\n\t_deleteAttr(obj, attr, committer = this)\r\n\t{\r\n\t\tPropertyHelper.delete(obj, attr);\r\n\r\n\t\t/**\r\n\t\t * This will only publish the delete event to the\r\n\t\t * local subscribers.\r\n\t\t */\r\n\t\tconst callBack = (path, obj) => this.publishLocalEvent(path, obj, committer, EVENT.DELETE);\r\n\t\tPublisher.publish(attr, attr, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value of an attribute.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {string} attr\r\n\t * @returns {*}\r\n\t */\r\n\t_getAttr(obj, attr)\r\n\t{\r\n\t\treturn PropertyHelper.get(obj, attr);\r\n\t}\r\n}", "/**\r\n * This will store the replacements.\r\n *\r\n * @type {object} replacements\r\n */\r\nconst replacements = { '\\n': '\\\\n', '\\r': '\\\\n', '\\t': '\\\\t' };\r\n\r\n/**\r\n * This will escape chars.\r\n *\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst escapeChars = (str, removeNewLines) =>\r\n{\r\n\tif (typeof str !== 'string')\r\n\t{\r\n\t\tstr = String(str);\r\n\t}\r\n\r\n\tconst pattern = removeNewLines ? /[\\n\\r\\t]/g : /\\t/g;\r\n\treturn str.replace(pattern, match => replacements[match]);\r\n};\r\n\r\n/**\r\n * This will sanitize the text.\r\n *\r\n * @param {string} text\r\n * @param {boolean} [removeNewLines]\r\n * @returns {string}\r\n */\r\nconst sanitize = (text, removeNewLines) =>\r\n{\r\n\tif (typeof text !== 'string')\r\n\t{\r\n\t\treturn text;\r\n\t}\r\n\r\n\t/* we need to escape chars and encode the uri\r\n\tcomponents */\r\n\ttext = escapeChars(text, removeNewLines);\r\n\ttext = encodeURIComponent(text);\r\n\r\n\t/* we want to re-encode the double quotes so they\r\n\twill be escaped by the json encoder */\r\n\tconst pattern = /%22/g;\r\n\treturn text.replace(pattern, '\"');\r\n};\r\n\r\n/**\r\n * This will prepare the url.\r\n *\r\n * @param {*} data\r\n * @param {boolean} [removeNewLines]\r\n * @returns {string}\r\n */\r\nexport const prepareUrl = (data, removeNewLines) =>\r\n{\r\n\tconst type = typeof data;\r\n\tif (type === \"undefined\")\r\n\t{\r\n\t\treturn data;\r\n\t}\r\n\r\n\tif (type !== 'object')\r\n\t{\r\n\t\tdata = sanitize(data);\r\n\t\treturn data;\r\n\t}\r\n\r\n\tObject.entries(data).forEach(([prop, value]) =>\r\n\t{\r\n\t\tif (value === null)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdata[prop] = (typeof value === 'string') ? prepareUrl(value, removeNewLines) : sanitize(value, removeNewLines);\r\n\t});\r\n\treturn data;\r\n};\r\n\r\n/**\r\n * This will parse JSON data.\r\n *\r\n * @param {string} data\r\n * @returns {*}\r\n */\r\nexport function decode(data)\r\n{\r\n\treturn (typeof data !== \"undefined\" && data.length > 0)? JSON.parse(data) : false;\r\n}\r\n\r\n/**\r\n * This will encode JSON data.\r\n *\r\n * @param {*} data\r\n * @returns {?string}\r\n */\r\nexport function encode(data)\r\n{\r\n\treturn (typeof data !== \"undefined\")? JSON.stringify(data) : null;\r\n}", "import { Objects } from \"../objects.js\";\r\nimport { decode, encode, prepareUrl } from \"./json.js\";\r\n\r\n/**\r\n * Encode\r\n *\r\n * This will contain methods for working with encoding.\r\n *\r\n * @module\r\n * @name Encode\r\n */\r\nexport class Encode\r\n{\r\n /**\r\n\t * This will prepare a json object to be used in an\r\n\t * xhr request. This will sanitize the object values\r\n\t * by encoding them to not break the param string.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {boolean} [removeNewLines]\r\n\t * @returns {string}\r\n\t */\r\n\tstatic prepareJsonUrl(obj, removeNewLines = false)\r\n\t{\r\n\t\t/* we want to check to clone object so we won't modify the\r\n\t\toriginal object */\r\n\t\tconst before = (typeof obj === 'object')? Objects.clone(obj) : obj,\r\n\t\tafter = prepareUrl(before, removeNewLines);\r\n\t\treturn encode(after);\r\n\t}\r\n\r\n\t/**\r\n\t * This will encode and decode json data.\r\n\t *\r\n\t * @member {object} json\r\n\t */\r\n\tstatic json = {\r\n\t\tencode,\r\n\t\tdecode,\r\n\t};\r\n\r\n\t/**\r\n\t * This will parse xml data.\r\n\t *\r\n\t * @param {string} data\r\n\t * @returns {object}\r\n\t */\r\n\tstatic xmlParse(data)\r\n\t{\r\n\t\tif (typeof data === \"undefined\")\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst parser = new DOMParser();\r\n\t\treturn parser.parseFromString(data, \"text/xml\");\r\n\t}\r\n}", "import { Encode } from '../../../../shared/encode/encode.js';\r\nimport { Strings } from '../../../../shared/strings.js';\r\nimport { Ajax } from '../../../ajax/ajax.js';\r\nimport { WatcherHelper } from '../../../layout/watcher-helper.js';\r\n\r\n/**\r\n * ModelService\r\n *\r\n * This will create a new model service.\r\n *\r\n * @class\r\n */\r\nexport class ModelService\r\n{\r\n\t/**\r\n\t * This will create a model service.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} model\r\n\t */\r\n\tconstructor(model)\r\n\t{\r\n\t\t/**\r\n\t\t * @member {Model} model\r\n\t\t */\r\n\t\tthis.model = model;\r\n\r\n\t\t/**\r\n\t\t * @member {string} objectType The return type.\r\n\t\t */\r\n\t\tthis.objectType = this.objectType || 'item';\r\n\r\n\t\t/**\r\n\t\t * @member {string} url\r\n\t\t */\r\n\t\tthis.url = '';\r\n\r\n\t\t/**\r\n\t\t * @member {function} validateCallBack\r\n\t\t */\r\n\t\tthis.validateCallBack = null;\r\n\t\tthis.init();\r\n\t}\r\n\r\n\t/**\r\n\t * This will initialize the model service.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tinit()\r\n\t{\r\n\t\tconst model = this.model;\r\n\t\tif (model && model.url)\r\n\t\t{\r\n\t\t\tthis.url = model.url;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the model is valid.\r\n\t *\r\n\t * @returns {boolean}\r\n\t */\r\n\tisValid()\r\n\t{\r\n\t\tconst result = this.validate();\r\n\t\tif (result !== false)\r\n\t\t{\r\n\t\t\tconst callBack = this.validateCallBack;\r\n\t\t\tif (typeof callBack === 'function')\r\n\t\t\t{\r\n\t\t\t\tcallBack(result);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\r\n\t/**\r\n\t * This should be overriden to validate the model\r\n\t * before submitting.\r\n\t *\r\n\t * @returns {boolean}\r\n\t */\r\n\tvalidate()\r\n\t{\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * This can be overriden to add default params\r\n\t * with each request.\r\n\t *\r\n\t * @protected\r\n\t * @returns {string}\r\n\t */\r\n\tgetDefaultParams()\r\n\t{\r\n\t\treturn '';\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the request params.\r\n\t *\r\n\t * @protected\r\n\t * @param {(string|object)} params\r\n\t * @returns {(string|object)}\r\n\t */\r\n\tsetupParams(params)\r\n\t{\r\n\t\tconst defaults = this.getDefaultParams();\r\n\t\tparams = this.addParams(params, defaults);\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will convert an object to a string.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} object\r\n\t * @returns {string}\r\n\t */\r\n\tobjectToString(object)\r\n\t{\r\n\t\tconst params = [];\r\n\t\tfor (var prop in object)\r\n\t\t{\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(object, prop))\r\n\t\t\t{\r\n\t\t\t\tparams.push(prop + '=' + object[prop]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn params.join('&');\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the params.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} params\r\n\t * @param {*} addingParams\r\n\t * @returns {string|object}\r\n\t */\r\n\taddParams(params, addingParams)\r\n\t{\r\n\t\tparams = params || {};\r\n\t\tif (typeof params === 'string')\r\n\t\t{\r\n\t\t\tparams = Strings.parseQueryString(params, false);\r\n\t\t}\r\n\r\n\t\tif (!addingParams)\r\n\t\t{\r\n\t\t\treturn (!this._isFormData(params))? this.objectToString(params) : params;\r\n\t\t}\r\n\r\n\t\tif (typeof addingParams === 'string')\r\n\t\t{\r\n\t\t\taddingParams = Strings.parseQueryString(addingParams, false);\r\n\t\t}\r\n\r\n\t\tif (this._isFormData(params))\r\n\t\t{\r\n\t\t\tfor (var key in addingParams)\r\n\t\t\t{\r\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(addingParams, key))\r\n\t\t\t\t{\r\n\t\t\t\t\tparams.append(key, addingParams[key]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tparams = Object.assign(params, addingParams);\r\n\t\t\tparams = this.objectToString(params);\r\n\t\t}\r\n\r\n\t\treturn params;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the model by id.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\tget(instanceParams, callBack)\r\n\t{\r\n\t\tconst id = this.model.get('id'),\r\n\t\tparams = 'id=' + id;\r\n\r\n\t\tconst model = this.model;\r\n\t\treturn this._get(`/${id}`, params, instanceParams, callBack, (response) =>\r\n\t\t{\r\n\t\t\tif (response)\r\n\t\t\t{\r\n\t\t\t\t/* this will update the model with the get request\r\n\t\t\t\tresponse */\r\n\t\t\t\tconst object = this.getObject(response);\r\n\t\t\t\tif (object)\r\n\t\t\t\t{\r\n\t\t\t\t\tmodel.set(object);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the object from the response.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} response\r\n\t * @returns {object}\r\n\t */\r\n\tgetObject(response)\r\n\t{\r\n\t\t/* this will update the model with the get request\r\n\t\tresponse */\r\n\t\tconst object = response[this.objectType] || response;\r\n\t\treturn object || false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will return a string with the model data json encoded.\r\n\t *\r\n\t * @protected\r\n\t * @returns {string}\r\n\t */\r\n\tsetupObjectData()\r\n\t{\r\n\t\tconst item = this.model.get();\r\n\t\treturn this.objectType + '=' + Encode.prepareJsonUrl(item);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add or update the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @returns {XMLHttpRequest|void}\r\n\t */\r\n\tsetup(instanceParams, callBack)\r\n\t{\r\n\t\tif (!this.isValid())\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet params = this.setupObjectData();\r\n\t\tconst id = this.model.id;\r\n\t\tconst url = (typeof id === 'undefined')? '' : `/${id}`;\r\n\r\n\t\treturn this._put(url, params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @returns {XMLHttpRequest|void}\r\n\t */\r\n\tadd(instanceParams, callBack)\r\n\t{\r\n\t\tif (!this.isValid())\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet params = this.setupObjectData();\r\n\t\tconst id = this.model.id;\r\n\t\tconst url = (typeof id === 'undefined')? '' : `/${id}`;\r\n\r\n\t\treturn this._post(url, params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @returns {XMLHttpRequest|void}\r\n\t */\r\n\tupdate(instanceParams, callBack)\r\n\t{\r\n\t\tif (!this.isValid())\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet params = this.setupObjectData();\r\n\t\tconst id = this.model.id;\r\n\t\tconst url = (typeof id === 'undefined')? '' : `/${id}`;\r\n\r\n\t\treturn this._patch(url, params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will delete the model.\r\n\t *\r\n\t * @param {string} [instanceParams]\r\n\t * @param {function} [callBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\tdelete(instanceParams, callBack)\r\n\t{\r\n\t\tconst id = this.model.get('id');\r\n\t\tconst params = (typeof id !== 'undefined')? 'id=' + id : this.setupObjectData();\r\n\t\tconst url = (typeof id === 'undefined')? '' : `/${id}`;\r\n\r\n\t\treturn this._delete(url, params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will list rows of the model.\r\n\t *\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {number} offset\r\n\t * @param {number} limit\r\n\t * @param {*} lastCursor\r\n\t * @param {*} since\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\tall(instanceParams, callBack, offset, limit, lastCursor = null, since = null)\r\n\t{\r\n\t\tconst data = this.model.get();\r\n\t\toffset = !isNaN(offset)? offset : 0;\r\n\t\tlimit = !isNaN(limit)? limit : 50;\r\n\t\tconst search = data.search || '';\r\n\r\n\t\tlet filter = data.filter || '';\r\n\t\tif (typeof filter === 'object')\r\n\t\t{\r\n\t\t\tfilter = JSON.stringify(filter);\r\n\t\t}\r\n\r\n\t\tlet dates = data.dates || '';\r\n\t\tif (typeof dates === 'object')\r\n\t\t{\r\n\t\t\tdates = JSON.stringify(dates);\r\n\t\t}\r\n\r\n\t\tlet orderBy = data.orderBy || '';\r\n\t\tif (typeof orderBy === 'object')\r\n\t\t{\r\n\t\t\torderBy = JSON.stringify(orderBy);\r\n\t\t}\r\n\r\n\t\tlet groupBy = data.groupBy || '';\r\n\t\tif (Array.isArray(groupBy))\r\n\t\t{\r\n\t\t\tgroupBy = JSON.stringify(groupBy);\r\n\t\t}\r\n\r\n\t\tlet params = '&filter=' + filter +\r\n\t\t\t'&offset=' + offset +\r\n\t\t\t'&limit=' + limit +\r\n\t\t\t'&dates=' + dates +\r\n\t\t\t'&orderBy=' + orderBy +\r\n\t\t\t'&groupBy=' + groupBy +\r\n\t\t\t'&search=' + search +\r\n\t\t\t'&lastCursor=' + ((typeof lastCursor !== 'undefined' && lastCursor !== null) ? lastCursor : '') +\r\n\t\t\t'&since=' + ((typeof since !== 'undefined' && since !== null) ? since : '');\r\n\r\n\t\treturn this._get('', params, instanceParams, callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the url.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @returns {string}\r\n\t */\r\n\tgetUrl(url)\r\n\t{\r\n\t\tlet baseUrl = this.url;\r\n\t\tif (!url)\r\n\t\t{\r\n\t\t\treturn this.replaceUrl(baseUrl);\r\n\t\t}\r\n\r\n\t\tif (url[0] === '/')\r\n\t\t{\r\n\t\t\turl = url.substring(1);\r\n\t\t}\r\n\r\n\t\tconst fullUrl = (url[0] === '?')\r\n\t\t? baseUrl + url\r\n\t\t: baseUrl + '/' + url;\r\n\r\n\t\treturn this.replaceUrl(fullUrl);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make an ajax request.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @param {string} method\r\n\t * @param {(string|object)} params\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\tsetupRequest(url, method, params, callBack, requestCallBack)\r\n\t{\r\n\t\tconst settings = {\r\n\t\t\turl: this.getUrl(url),\r\n\t\t\tmethod,\r\n\t\t\tparams,\r\n\t\t\tcompleted: (response, xhr) =>\r\n\t\t\t{\r\n\t\t\t\tif (typeof requestCallBack === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\trequestCallBack(response);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getResponse(response, callBack, xhr);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst overrideHeader = this._isFormData(params);\r\n\t\tif (overrideHeader)\r\n\t\t{\r\n\t\t\tsettings.headers = {};\r\n\t\t}\r\n\r\n\t\treturn Ajax(settings);\r\n\t}\r\n\r\n\t/**\r\n\t * Set up an EventSource for real-time activity updates with auto-reconnection.\r\n\t *\r\n\t * @param {string} url - The URL path relative to the model's base URL.\r\n\t * @param {string} params - The query parameters.\r\n\t * @param {function} callBack - The callback function for incoming updates.\r\n\t * @param {function|null} onOpenCallBack - Optional callback when connection opens.\r\n\t * @param {boolean} [reconnect=true] - Whether to auto-reconnect on disconnection.\r\n\t * @returns {object} Object with source and cleanup function\r\n\t */\r\n\tsetupEventSource(url, params, callBack, onOpenCallBack, reconnect = true)\r\n\t{\r\n\t\tlet source = null;\r\n\t\tlet reconnectTimer = null;\r\n\t\tlet intentionallyClosed = false;\r\n\r\n\t\t/**\r\n\t\t * Connects to the EventSource and sets up event handlers.\r\n\t\t *\r\n\t\t * @returns {void}\r\n\t\t */\r\n\t\tconst connect = () =>\r\n\t\t{\r\n\t\t\tif (intentionallyClosed)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst fullUrl = this.getUrl(url);\r\n\t\t\tconst queryString = params ? '?' + params : '';\r\n\t\t\tsource = new EventSource(fullUrl + queryString, { withCredentials: true });\r\n\r\n\t\t\tsource.onopen = () =>\r\n\t\t\t{\r\n\t\t\t\tif (onOpenCallBack)\r\n\t\t\t\t{\r\n\t\t\t\t\tonOpenCallBack();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tsource.onerror = (error) =>\r\n\t\t\t{\r\n\t\t\t\tsource.close();\r\n\r\n\t\t\t\tif (!intentionallyClosed && reconnect)\r\n\t\t\t\t{\r\n\t\t\t\t\tconst RECONNECT_DELAY = 3000; // 3 seconds\r\n\t\t\t\t\treconnectTimer = setTimeout(() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tconnect();\r\n\t\t\t\t\t}, RECONNECT_DELAY);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tsource.onmessage = (event) =>\r\n\t\t\t{\r\n\t\t\t\ttry\r\n\t\t\t\t{\r\n\t\t\t\t\tconst data = JSON.parse(event.data);\r\n\t\t\t\t\tif (callBack)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcallBack(data);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (error)\r\n\t\t\t\t{\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tconnect();\r\n\r\n\t\t// Return object with source getter and cleanup function\r\n\t\treturn {\r\n\t\t\tget source() { return source; },\r\n\t\t\tclose: () =>\r\n\t\t\t{\r\n\t\t\t\tintentionallyClosed = true;\r\n\t\t\t\tif (reconnectTimer && reconnect)\r\n\t\t\t\t{\r\n\t\t\t\t\tclearTimeout(reconnectTimer);\r\n\t\t\t\t}\r\n\t\t\t\tif (source)\r\n\t\t\t\t{\r\n\t\t\t\t\tsource.close();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will replace the url params with the model data.\r\n\t *\r\n\t * @param {string} url\r\n\t * @returns {string}\r\n\t */\r\n\treplaceUrl(url)\r\n\t{\r\n\t\tif (WatcherHelper.isWatching(url))\r\n\t\t{\r\n\t\t\turl = WatcherHelper.replaceParams(url, this.model);\r\n\t\t}\r\n\r\n\t\tif (url.endsWith('/'))\r\n\t\t{\r\n\t\t\turl = url.substring(0, url.length - 1);\r\n\t\t}\r\n\r\n\t\treturn url;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the data is a form data object.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} data\r\n\t * @returns {boolean}\r\n\t */\r\n\t_isFormData(data)\r\n\t{\r\n\t\treturn data instanceof FormData;\r\n\t}\r\n\r\n\t/**\r\n\t * This will make an ajax request.\r\n\t *\r\n\t * @protected\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\trequest(params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request('', 'POST', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a GET request.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\t_get(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\tparams = this.setupParams(params);\r\n\t\tparams = this.addParams(params, instanceParams);\r\n\r\n\t\turl = url || '';\r\n\r\n\t\tif (params)\r\n\t\t{\r\n\t\t\turl += '?' + params;\r\n\t\t}\r\n\r\n\t\treturn this.setupRequest(url, \"GET\", '', callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a POST request.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\t_post(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'POST', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a PUT request.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\t_put(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'PUT', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a PATCH request.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\t_patch(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'PATCH', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make a DELETE request.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\t_delete(url, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\treturn this._request(url, 'DELETE', params, instanceParams, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will make an ajax request.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} url\r\n\t * @param {string} method\r\n\t * @param {(string|object)} params\r\n\t * @param {string} instanceParams\r\n\t * @param {function} callBack\r\n\t * @param {function} [requestCallBack]\r\n\t * @returns {XMLHttpRequest}\r\n\t */\r\n\t_request(url, method, params, instanceParams, callBack, requestCallBack)\r\n\t{\r\n\t\tparams = this.setupParams(params);\r\n\t\tparams = this.addParams(params, instanceParams);\r\n\r\n\t\treturn this.setupRequest(url, method, params, callBack, requestCallBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the response.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} response\r\n\t * @param {function} callBack\r\n\t * @param {object} xhr\r\n\t * @returns {void}\r\n\t */\r\n\tgetResponse(response, callBack, xhr)\r\n\t{\r\n\t\t/* this will check to return the response\r\n\t\tto the callBack function */\r\n\t\tif (typeof callBack === 'function')\r\n\t\t{\r\n\t\t\tcallBack(response, xhr);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will extend the model service.\r\n\t *\r\n\t * @param {object} child\r\n\t * @returns {object}\r\n\t */\r\n\tstatic extend(child)\r\n\t{\r\n\t\tif (!child)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst parent = this;\r\n\t\tclass service extends parent\r\n\t\t{\r\n\t\t\tconstructor(model)\r\n\t\t\t{\r\n\t\t\t\tsuper(model);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tObject.assign(service.prototype, child);\r\n\t\treturn service;\r\n\t}\r\n}", "import { Types } from '../../../../shared/types.js';\r\nimport { Data } from '../deep-data/deep-data.js';\r\nimport { setupAttrSettings } from './attrs.js';\r\nimport { ModelService } from './model-service.js';\r\n\r\n/**\r\n * Gets the default attributes from the given settings object.\r\n *\r\n * @function setupDefaultAttr\r\n * @param {object} settings - An object which may contain a `defaults` property.\r\n * @param {object} [settings.defaults] - A set of default attributes, where each property is a key-value pair for attributes.\r\n * @returns {object} A shallow copy of the `defaults` object if it exists, otherwise an empty object.\r\n */\r\nconst setupDefaultAttr = (settings) =>\r\n{\r\n\tconst attributes = {};\r\n\tif (!Types.isObject(settings) || !settings.defaults)\r\n\t{\r\n\t\treturn attributes;\r\n\t}\r\n\r\n\tconst { defaults } = settings;\r\n\tObject.keys(defaults).forEach(prop =>\r\n\t{\r\n\t\tconst attr = defaults[prop];\r\n\t\tif (typeof attr !== 'function')\r\n\t\t{\r\n\t\t\tattributes[prop] = attr;\r\n\t\t}\r\n\t});\r\n\r\n\tdelete settings.defaults;\r\n\treturn attributes;\r\n};\r\n\r\n/**\r\n * Extracts the `xhr` configuration from the given settings object.\r\n *\r\n * @function getXhr\r\n * @param {object} settings - The settings object that may contain `xhr` config.\r\n * @param {object} [settings.xhr] - An object containing properties to configure an XHR or remote request.\r\n * @returns {object} A shallow copy of `settings.xhr` if it exists, otherwise an empty object.\r\n */\r\nconst getXhr = (settings) =>\r\n{\r\n\tif (!settings || typeof settings.xhr !== 'object')\r\n\t{\r\n\t\treturn {};\r\n\t}\r\n\r\n\tconst xhr = { ...settings.xhr };\r\n\tdelete settings.xhr;\r\n\treturn xhr;\r\n};\r\n\r\n/**\r\n * Tracks the incremental number of model types created.\r\n *\r\n * @type {number}\r\n * @default 0\r\n */\r\nlet modelTypeNumber = 0;\r\n\r\n/**\r\n * The Model class extends Data to provide structure\r\n * for connecting to a remote service.\r\n *\r\n * @class Model\r\n * @extends Data\r\n */\r\nexport class Model extends Data\r\n{\r\n\t/**\r\n\t * Creates a new Model instance.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} [settings] - Optional configuration for the model.\r\n\t */\r\n\tconstructor(settings)\r\n\t{\r\n\t\tconst proxy = super(settings);\r\n\t\tthis.initialize();\r\n\r\n\t\t// @ts-ignore (returning the proxy for Data's built-in behavior)\r\n\t\treturn proxy;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets up initial properties for this model instance.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.attributes = {};\r\n\t\tthis.stage = {};\r\n\t\tthis.url = this.url || '';\r\n\t\tthis.xhr = this.xhr || {};\r\n\t}\r\n\r\n\t/**\r\n\t * Called after the model is constructed to allow\r\n\t * additional initialization logic.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tinitialize()\r\n\t{\r\n\t\t// ...\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a new subclass of the current Model and returns its constructor.\r\n\t *\r\n\t * @static\r\n\t * @param {object} [settings={}] - Configuration for the extended model.\r\n\t * @returns {typeof Model} The extended model class (subclass of Model).\r\n\t */\r\n\tstatic extend(settings = {})\r\n\t{\r\n\t\tconst parent = this;\r\n\t\tconst xhr = getXhr(settings);\r\n\t\tconst service = parent.prototype.service.extend(xhr);\r\n\t\tconst defaultAttributes = setupDefaultAttr(settings);\r\n\r\n\t\tclass ExtendedModel extends parent\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * Creates a new ExtendedModel instance.\r\n\t\t\t *\r\n\t\t\t * @constructor\r\n\t\t\t * @param {object} [instanceSettings] - Instance-specific attribute settings.\r\n\t\t\t */\r\n\t\t\tconstructor(instanceSettings)\r\n\t\t\t{\r\n\t\t\t\tconst instanceAttr = {\r\n\t\t\t\t\t...defaultAttributes,\r\n\t\t\t\t\t...setupAttrSettings(instanceSettings)\r\n\t\t\t\t};\r\n\t\t\t\tsuper(instanceAttr);\r\n\r\n\t\t\t\tthis.xhr = new service(this);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * A unique identifier for this model type.\r\n\t\t\t *\r\n\t\t\t * @type {string}\r\n\t\t\t */\r\n\t\t\tdataTypeId = `bm${modelTypeNumber++}`;\r\n\t\t}\r\n\r\n\t\tObject.assign(ExtendedModel.prototype, settings);\r\n\t\tExtendedModel.prototype.service = service;\r\n\r\n\t\treturn ExtendedModel;\r\n\t}\r\n}\r\n\r\nModel.prototype.service = ModelService;", "import { BasicData } from './basic-data.js';\r\n\r\n/**\r\n * SimpleData\r\n *\r\n * This will extend Data to add a simple data object\r\n * that doesn't allow deep nested data.\r\n *\r\n * @class\r\n * @augments BasicData\r\n */\r\nexport class SimpleData extends BasicData\r\n{\r\n\r\n}", "import { SimpleData } from '../data/data.js';\r\n\r\n /**\r\n * State\r\n *\r\n * This will create a state to track the state\r\n * of an object.\r\n *\r\n * @class\r\n * @augments SimpleData\r\n */\r\nexport class State extends SimpleData\r\n{\r\n\t/**\r\n\t * This will setup the state object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t * @override\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an action to the state.\r\n\t *\r\n\t * @param {string} action\r\n\t * @param {*} state\r\n\t * @returns {object} self\r\n\t */\r\n\taddAction(action, state)\r\n\t{\r\n\t\tif (typeof state !== 'undefined')\r\n\t\t{\r\n\t\t\tthis.set(action, state);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the state of an action.\r\n\t *\r\n\t * @param {string} action\r\n\t * @returns {*}\r\n\t */\r\n\tgetState(action)\r\n\t{\r\n\t\treturn this.get(action);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an action or a callBack\r\n\t * from an action. if no token is passed the\r\n\t * whole action is removed.\r\n\t *\r\n\t * @param {string} action\r\n\t * @param {string} [token]\r\n\t * @returns {object} self\r\n\t */\r\n\tremoveAction(action, token)\r\n\t{\r\n\t\t/* if we have a token then the token will be\r\n\t\tthe only item removed */\r\n\t\tif (token)\r\n\t\t{\r\n\t\t\tthis.off(action, token);\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst actions = this.stage;\r\n\t\tif (typeof actions[action] !== 'undefined')\r\n\t\t{\r\n\t\t\tdelete actions[action];\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n}", "import { State } from './state.js';\r\n\r\n /**\r\n * StateTarget\r\n *\r\n * This will create a state target to track the state\r\n * of an object.\r\n *\r\n * @class\r\n * @augments State\r\n */\r\nexport class StateTarget extends State\r\n{\r\n\t/**\r\n\t * This will create a state target.\r\n\t *\r\n\t * @constructor\r\n\t * @param {string} id\r\n\t */\r\n\tconstructor(id)\r\n\t{\r\n\t\tsuper();\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the state target object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t * @override\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.stage = {};\r\n\t\tthis.id = null;\r\n\t}\r\n}", "import { StateTarget } from './state-target.js';\r\n\r\n /**\r\n * StateTracker\r\n *\r\n * This will create a state tracker that can\r\n * add and remove targets, actions, and action\r\n * subscriber callBack functions.\r\n *\r\n * @class\r\n */\r\nexport class StateTracker\r\n{\r\n\t/**\r\n\t * @member {Map} targets\r\n\t * @private\r\n\t */\r\n\tstatic targets = new Map();\r\n\r\n\t/**\r\n\t * This will restore a state target.\r\n\t *\r\n\t * @param {string} id\r\n\t * @param {StateTarget} target\r\n\t * @returns {void}\r\n\t */\r\n\tstatic restore(id, target)\r\n\t{\r\n\t\tthis.targets.set(id, target);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the state target.\r\n\t *\r\n\t * @param {string} id\r\n\t * @returns {StateTarget}\r\n\t */\r\n\tstatic getTarget(id)\r\n\t{\r\n\t\tif (!this.targets.has(id))\r\n\t\t{\r\n this.targets.set(id, new StateTarget(id));\r\n }\r\n return this.targets.get(id);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the state of an action.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @returns {*}\r\n\t */\r\n\tstatic getActionState(targetId, action)\r\n\t{\r\n\t\tconst target = this.getTarget(targetId);\r\n\t\treturn target.get(action);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new target.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} [action]\r\n\t * @param {*} [state] the primary action state\r\n\t * @returns {StateTarget}\r\n\t */\r\n\tstatic add(targetId, action, state)\r\n\t{\r\n\t\tconst target = this.getTarget(targetId);\r\n\t\tif (action)\r\n\t\t{\r\n\t\t\ttarget.addAction(action, state);\r\n\t\t}\r\n\t\treturn target;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new action to a target.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {string} [state]\r\n\t * @returns {StateTarget}\r\n\t */\r\n\tstatic addAction(targetId, action, state)\r\n\t{\r\n\t\treturn this.add(targetId, action, state);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the action from a target.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {string} [token]\r\n\t * @returns {void}\r\n\t */\r\n\tstatic removeAction(targetId, action, token)\r\n\t{\r\n\t\tthis.off(targetId, action, token);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new subscriber to the action.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {function} callBack\r\n\t * @returns {?string}\r\n\t */\r\n\tstatic on(targetId, action, callBack)\r\n\t{\r\n\t\tconst target = this.getTarget(targetId);\r\n\t\tif (action)\r\n\t\t{\r\n\t\t\treturn target.on(action, callBack);\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a subscriber from an action.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {string} token\r\n\t * @returns {void}\r\n\t */\r\n\tstatic off(targetId, action, token)\r\n\t{\r\n\t\tthis.remove(targetId, action, token);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a target or action or callBack.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} [action]\r\n\t * @param {string} [token]\r\n\t * @returns {void}\r\n\t */\r\n\tstatic remove(targetId, action, token)\r\n\t{\r\n\t\tconst targets = this.targets,\r\n\t\ttarget = targets.get(targetId);\r\n\t\tif (!target)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (action)\r\n\t\t{\r\n\t\t\ttarget.off(action, token);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.targets.delete(targetId);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the action state.\r\n\t *\r\n\t * @param {string} targetId\r\n\t * @param {string} action\r\n\t * @param {*} state\r\n\t * @returns {void}\r\n\t */\r\n\tstatic set(targetId, action, state)\r\n\t{\r\n\t\tconst target = this.getTarget(targetId);\r\n\t\ttarget.set(action, state);\r\n\t}\r\n}", "import { Events } from \"../../main/events/events.js\";\r\n\r\n/**\r\n * EventHelper\r\n *\r\n * This will create an event object to make\r\n * adding and removing events easier.\r\n *\r\n * @class\r\n */\r\nexport class EventHelper\r\n{\r\n\t/**\r\n\t * This will create an event helper.\r\n\t *\r\n\t * @constructor\r\n\t */\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {Array<object>} events\r\n\t\t */\r\n\t\tthis.events = [];\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an array of events.\r\n\t *\r\n\t * @param {Array<Array>} events\r\n\t * @returns {void}\r\n\t */\r\n\taddEvents(events)\r\n\t{\r\n\t\tconst length = events.length;\r\n\t\tif (length < 1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tevents.forEach((event) =>\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * @type {array} event\r\n\t\t\t */\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.on(...event);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an event.\r\n\t *\r\n\t * @param {string|Array<string>} event\r\n\t * @param {object} obj\r\n\t * @param {function} callBack\r\n\t * @param {boolean} capture\r\n\t * @returns {void}\r\n\t */\r\n\ton(event, obj, callBack, capture)\r\n\t{\r\n\t\tEvents.on(event, obj, callBack, capture);\r\n\r\n\t\tthis.events.push({\r\n\t\t\tevent,\r\n\t\t\tobj,\r\n\t\t\tcallBack,\r\n\t\t\tcapture\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove an event.\r\n\t *\r\n\t * @param {string|Array<string>} event\r\n\t * @param {object} obj\r\n\t * @param {function} callBack\r\n\t * @param {boolean} capture\r\n\t * @returns {void}\r\n\t */\r\n\toff(event, obj, callBack, capture)\r\n\t{\r\n\t\tEvents.off(event, obj, callBack, capture);\r\n\r\n\t\tlet option,\r\n\t\tevents = this.events;\r\n\t\tfor (var i = 0, length = events.length; i < length; i++)\r\n\t\t{\r\n\t\t\toption = events[i];\r\n\t\t\tif (option.event === event && option.obj === obj)\r\n\t\t\t{\r\n\t\t\t\tevents.splice(i, 1);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will set all events.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tset()\r\n\t{\r\n\t\tthis.events.forEach((event) =>\r\n\t\t{\r\n\t\t\tEvents.on(event.event, event.obj, event.callBack, event.capture);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will unset all events.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tunset()\r\n\t{\r\n\t\tthis.events.forEach((event) =>\r\n\t\t{\r\n\t\t\tEvents.off(event.event, event.obj, event.callBack, event.capture);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset the events.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\treset()\r\n\t{\r\n\t\tthis.unset();\r\n\t\tthis.events = [];\r\n\t}\r\n}", "import { StateTracker } from '../state/state-tracker.js';\r\n\r\n/**\r\n * StateHelper\r\n *\r\n * This is a helper to manage component states.\r\n *\r\n * @class\r\n */\r\nexport class StateHelper\r\n{\r\n\t/**\r\n\t * This will create a state helper.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} state\r\n\t * @param {object} states\r\n\t */\r\n\tconstructor(state, states)\r\n\t{\r\n\t\t/**\r\n\t\t * @member {array} remoteStates\r\n\t\t */\r\n\t\tthis.remoteStates = [];\r\n\r\n\t\tconst actions = this.convertStates(states);\r\n\t\tthis.addStatesToTarget(state, actions);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add states to a state.\r\n\t *\r\n\t * @param {object} state\r\n\t * @param {object} states\r\n\t * @returns {void}\r\n\t */\r\n\taddStates(state, states)\r\n\t{\r\n\t\tconst actions = this.convertStates(states);\r\n\t\tthis.addStatesToTarget(state, actions);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a state object.\r\n\t *\r\n\t * @param {string} action\r\n\t * @param {*} state\r\n\t * @param {function} callBack\r\n\t * @param {string} [targetId]\r\n\t * @returns {object}\r\n\t */\r\n\tcreateState(action, state, callBack, targetId)\r\n\t{\r\n\t\treturn {\r\n\t\t\taction,\r\n\t\t\tstate,\r\n\t\t\tcallBack,\r\n\t\t\ttargetId,\r\n\t\t\ttoken: null\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will convert an action object to a state array.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} action\r\n\t * @returns {array}\r\n\t */\r\n\tconvertStates(action)\r\n\t{\r\n\t\tconst actions = [];\r\n\t\tfor (var prop in action)\r\n\t\t{\r\n\t\t\tif (!Object.prototype.hasOwnProperty.call(action, prop))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif (prop === 'remotes')\r\n\t\t\t{\r\n\t\t\t\tthis.setupRemoteStates(action[prop], actions);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar targetId = null,\r\n\t\t\tcallBack = null,\r\n\t\t\tstate = action[prop];\r\n\t\t\tif (state && typeof state === 'object')\r\n\t\t\t{\r\n\t\t\t\tcallBack = state.callBack;\r\n\t\t\t\ttargetId = state.id || state.targetId;\r\n\t\t\t\tstate = state.state;\r\n\t\t\t}\r\n\r\n\t\t\tactions.push(this.createState(\r\n\t\t\t\tprop,\r\n\t\t\t\tstate,\r\n\t\t\t\tcallBack,\r\n\t\t\t\ttargetId\r\n\t\t\t));\r\n\t\t}\r\n\t\treturn actions;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup remote states.\r\n\t *\r\n\t * @protected\r\n\t * @param {array} remotes\r\n\t * @param {array} actions\r\n\t * @returns {void}\r\n\t */\r\n\tsetupRemoteStates(remotes, actions)\r\n\t{\r\n\t\tlet remote;\r\n\t\tfor (var i = 0, length = remotes.length; i < length; i++)\r\n\t\t{\r\n\t\t\tremote = remotes[i];\r\n\t\t\tif (!remote)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tfor (var prop in remote)\r\n\t\t\t{\r\n\t\t\t\tif (!Object.prototype.hasOwnProperty.call(remote, prop) || prop === 'id')\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar callBack = null,\r\n\t\t\t\tvalue = remote[prop],\r\n\t\t\t\tstate = (value !== null)? value : undefined;\r\n\t\t\t\tif (state && typeof state === 'object')\r\n\t\t\t\t{\r\n\t\t\t\t\tcallBack = state.callBack;\r\n\t\t\t\t\tstate = state.state;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tactions.push(this.createState(\r\n\t\t\t\t\tprop,\r\n\t\t\t\t\tstate,\r\n\t\t\t\t\tcallBack,\r\n\t\t\t\t\tremote.id\r\n\t\t\t\t));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove remote states.\r\n\t *\r\n\t * @param {object} state\r\n\t * @returns {void}\r\n\t */\r\n\tremoveRemoteStates(state)\r\n\t{\r\n\t\tconst remoteStates = this.remoteStates;\r\n\t\tif (remoteStates)\r\n\t\t{\r\n\t\t\tthis.removeActions(state, remoteStates);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the actions.\r\n\t *\r\n\t * @param {object} state\r\n\t * @param {array} actions\r\n\t * @returns {void}\r\n\t */\r\n\tremoveActions(state, actions)\r\n\t{\r\n\t\tif (actions.length < 1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (var i = 0, length = actions.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar action = actions[i];\r\n\t\t\tif (action.token)\r\n\t\t\t{\r\n\t\t\t\tthis.unbindRemoteState(state, action.token);\r\n\t\t\t}\r\n\t\t\tStateTracker.remove(action.targetId, action.action, action.token);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will restore a state.\r\n\t *\r\n\t * @param {object} state\r\n\t * @returns {void}\r\n\t */\r\n\trestore(state)\r\n\t{\r\n\t\tStateTracker.restore(state.id, state);\r\n\r\n\t\tconst remotes = this.remoteStates;\r\n\t\tif (!remotes)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (var i = 0, length = remotes.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar action = remotes[i];\r\n\t\t\taction.token = this.bindRemoteState(state, action.action, action.targetId);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup a two way bind to a remote state.\r\n\t *\r\n\t * @param {object} target\r\n\t * @param {string} actionEvent\r\n\t * @param {string} remoteTargetId\r\n\t * @returns {string}\r\n\t */\r\n\tbindRemoteState(target, actionEvent, remoteTargetId)\r\n\t{\r\n\t\tconst remoteTarget = StateTracker.getTarget(remoteTargetId);\r\n\t\treturn target.link(remoteTarget, actionEvent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will unbind a remote state.\r\n\t *\r\n\t * @param {object} target\r\n\t * @param {string} token\r\n\t * @return {void}\r\n\t */\r\n\tunbindRemoteState(target, token)\r\n\t{\r\n\t\ttarget.unlink(token);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the states to the target.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} state\r\n\t * @param {array} actions\r\n\t * @returns {void}\r\n\t */\r\n\taddStatesToTarget(state, actions)\r\n\t{\r\n\t\tconst remotes = this.remoteStates;\r\n\r\n\t\tfor (var i = 0, length = actions.length; i < length; i++)\r\n\t\t{\r\n\t\t\tvar action = actions[i],\r\n\t\t\ttoken = this.addAction(state, action);\r\n\r\n\t\t\tif (action.targetId)\r\n\t\t\t{\r\n\t\t\t\taction.token = token;\r\n\t\t\t\tremotes.push(action);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (remotes.length < 1)\r\n\t\t{\r\n\t\t\tthis.remoteStates = [];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add an action.\r\n\t *\r\n\t * @param {object} target\r\n\t * @param {object} action\r\n\t * @returns {string}\r\n\t */\r\n\taddAction(target, action)\r\n\t{\r\n\t\tlet token,\r\n\t\tactionEvent = action.action;\r\n\r\n\t\t/* this will check to select the remote target if set */\r\n\t\tconst targetId = action.targetId;\r\n\t\tif (targetId)\r\n\t\t{\r\n\t\t\ttoken = this.bindRemoteState(target, actionEvent, targetId);\r\n\t\t}\r\n\r\n\t\tif (typeof action.state !== 'undefined')\r\n\t\t{\r\n\t\t\ttarget.addAction(actionEvent, action.state);\r\n\t\t}\r\n\r\n\t\tconst callBack = action.callBack;\r\n\t\tif (typeof callBack === 'function')\r\n\t\t{\r\n\t\t\ttarget.on(actionEvent, callBack);\r\n\t\t}\r\n\r\n\t\treturn token;\r\n\t}\r\n}", "import { ArrayProp, DefaultProps, ObjectProp, StringProp } from \"./prop-utils.js\";\r\n\r\n/**\r\n * This will parse the arguments passed to the atom.\r\n *\r\n * @param {array} args\r\n * @returns {object}\r\n */\r\nexport const parseArgs = (args) =>\r\n{\r\n\tif (!args)\r\n\t{\r\n\t\treturn DefaultProps();\r\n\t}\r\n\r\n\t/**\r\n\t * This will handle string children and allow them\r\n\t * to have watcher props.\r\n\t */\r\n\tconst first = args[0];\r\n\tconst firstType = typeof first;\r\n\tif (firstType === 'string' || firstType === 'number')\r\n\t{\r\n\t\treturn StringProp(first);\r\n\t}\r\n\r\n\t/**\r\n\t * This will handle the child array.\r\n\t */\r\n\tif (Array.isArray(first))\r\n\t{\r\n\t\treturn ArrayProp(first);\r\n\t}\r\n\r\n\t/**\r\n\t * This will handle default props and children.\r\n\t */\r\n\treturn ObjectProp(args);\r\n};", "import { DataTracker } from '../../main/data-tracker/data-tracker.js';\r\nimport { Html } from '../html/html.js';\r\nimport { parseArgs } from './parse-args.js';\r\n\r\n/**\r\n * This will register the component system to the data\r\n * tracker to remove components that have been nested\r\n * in layouts.\r\n */\r\nDataTracker.addType('components', (data) =>\r\n{\r\n\tif (!data)\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst component = data.component;\r\n\tif (!component || !component.isUnit)\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (component.persistToken && component.parent)\r\n\t{\r\n\t\tcomponent.parent.removePersistedChild(component.persistToken);\r\n\t}\r\n\r\n\tif (component.rendered === true)\r\n\t{\r\n\t\tcomponent.prepareDestroy();\r\n\t\tcomponent.cleanUpAfterDestroy();\r\n\t}\r\n});\r\n\r\n/**\r\n * @type {number} unitNumber\r\n */\r\nlet unitNumber = 0;\r\n\r\n/**\r\n * Unit\r\n *\r\n * @class\r\n *\r\n * This will allow units to be extended\r\n * from a single factory.\r\n *\r\n * @param {...any} args\r\n *\r\n * @example\r\n * class Alert extends Unit\r\n *\t{\r\n *\t\trender()\r\n *\t\t{\r\n *\t\t\treturn {\r\n *\r\n *\t\t\t};\r\n *\t\t}\r\n *\t}\r\n */\r\nexport class Unit\r\n{\r\n\t/**\r\n\t * This will create a unit.\r\n\t *\r\n\t * @constructor\r\n\t * @param {...any} args\r\n\t */\r\n\tconstructor(...args)\r\n\t{\r\n\t\t/**\r\n\t\t * @member {boolean} isUnit\r\n\t\t */\r\n\t\tthis.isUnit = true;\r\n\r\n\t\t/**\r\n\t\t * @member {Data|null} data\r\n\t\t */\r\n\t\tthis.data = null;\r\n\r\n\t\t/**\r\n\t\t * @member {boolean|null} persist\r\n\t\t */\r\n\t\tthis.persist = null;\r\n\r\n\t\t/**\r\n\t\t * @member {?array} nest\r\n\t\t */\r\n\t\tthis.nest = null;\r\n\r\n\t\t/**\r\n\t\t * @member {StateTarget|null} state\r\n\t\t */\r\n\t\tthis.state = null;\r\n\r\n\t\t/**\r\n\t\t * @member {?object} panel\r\n\t\t */\r\n\t\tthis.panel = null;\r\n\r\n\t\t/**\r\n\t\t * @member {?Unit} parent\r\n\t\t */\r\n\t\tthis.parent = null;\r\n\r\n\t\t/**\r\n\t\t * @member {?string} unitType\r\n\t\t */\r\n\t\tthis.unitType = null;\r\n\r\n\t\t/**\r\n\t\t * @member {array} cached\r\n\t\t */\r\n\t\tthis.cached = [];\r\n\r\n\t\tthis.init();\r\n\r\n\t\t/**\r\n\t\t * This will allow the unit to access optional args.\r\n\t\t */\r\n\t\tconst {props, children} = parseArgs(args);\r\n\t\tthis.setupProps(props);\r\n\r\n\t\t/**\r\n\t\t * @member {array} children\r\n\t\t */\r\n\t\tthis.children = children || [];\r\n\t\tthis.persistedChildren = {};\r\n\t\tthis.persistedCount = 0;\r\n\r\n\t\tthis.onCreated();\r\n\r\n\t\t/**\r\n\t\t * @member {boolean} rendered\r\n\t\t */\r\n\t\tthis.rendered = false;\r\n\r\n\t\t/**\r\n\t\t * @member {?object} container\r\n\t\t */\r\n\t\tthis.container = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the component number and unique\r\n\t * instance id for the component elements.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tinit()\r\n\t{\r\n\t\tthis.id = 'cp-' + (unitNumber++);\r\n\t\t// @ts-ignore\r\n\t\tthis.unitType = this.constructor.name.toLowerCase();\r\n\t}\r\n\r\n\t/**\r\n\t * This will declare the component props.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tdeclareProps()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a persisted child.\r\n\t *\r\n\t * @param {object} child\r\n\t * @returns {string}\r\n\t */\r\n\taddPersistedChild(child)\r\n\t{\r\n\t\tconst count = this.persistedCount++;\r\n\t\tlet token = ('pc' + count);\r\n\r\n\t\tconst keys = Object.keys(this.persistedChildren);\r\n\t\tconst key = keys[count];\r\n\r\n\t\t/**\r\n\t\t * Check to see if the child has a persisted state\r\n\t\t * and if so, resume the scope with the persisted state.\r\n\t\t */\r\n\t\tconst persistedChild = this.persistedChildren[key];\r\n\t\tif (persistedChild)\r\n\t\t{\r\n\t\t\tif (child.unitType === persistedChild.unitType)\r\n\t\t\t{\r\n\t\t\t\ttoken = key;\r\n\t\t\t\tchild.resumeScope(persistedChild);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tchild.persistToken = token;\r\n\r\n\t\t/**\r\n\t\t * This will add the child to the persisted children\r\n\t\t * so that it can be resumed later.\r\n\t\t */\r\n\t\tthis.persistedChildren[token] = child;\r\n\t\treturn token;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a persisted child by its token.\r\n\t *\r\n\t * @param {string} token\r\n\t * @returns {void}\r\n\t */\r\n\tremovePersistedChild(token)\r\n\t{\r\n\t\tif (!this.rendered)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!token || !this.persistedChildren[token])\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdelete this.persistedChildren[token];\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the component props.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} [props]\r\n\t * @returns {void}\r\n\t */\r\n\tsetupProps(props)\r\n\t{\r\n\t\tthis.declareProps();\r\n\t\tif (!props || typeof props !== 'object')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (var prop in props)\r\n\t\t{\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(props, prop))\r\n\t\t\t{\r\n\t\t\t\tthis[prop] = props[prop];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the child scope instance of the component.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tgetChildScope()\r\n\t{\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the parent context.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetParentContext()\r\n\t{\r\n\t\tif (!this.parent)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn this.parent.getContext();\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the context.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetupContext()\r\n\t{\r\n\t\tconst parentContext = this.getParentContext();\r\n\t\tconst context = this.setContext(parentContext);\r\n\t\tif (context)\r\n\t\t{\r\n\t\t\tthis.context = context;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.context = parentContext;\r\n\t\tthis.setupAddingContext();\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the adding context.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetupAddingContext()\r\n\t{\r\n\t\tconst parentContext = this.context;\r\n\t\tconst context = this.addContext(parentContext);\r\n\t\tif (!context)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst branchName = context[0];\r\n\t\tif (!branchName)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.addingContext = true;\r\n\t\tthis.contextBranchName = branchName;\r\n\t\tthis.addContextBranch(branchName, context[1]);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a branch to the context.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} branchName\r\n\t * @param {*} value\r\n\t * @returns {void}\r\n\t */\r\n\taddContextBranch(branchName, value)\r\n\t{\r\n\t\tthis.context ??= {};\r\n\t\tthis.context[branchName] = value;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the component context.\r\n\t *\r\n\t * @param {object|null} context\r\n\t * @returns {object|null}\r\n\t */\r\n\tsetContext(context)\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add context to the parent context.\r\n\t *\r\n\t * @param {object|null} context\r\n\t * @returns {array|null}\r\n\t */\r\n\taddContext(context)\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the added context from the parent.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tremoveContext()\r\n\t{\r\n\t\tif (!this.addingContext)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.removeContextBranch(this.contextBranchName);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a context branch.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} branch\r\n\t * @returns {void}\r\n\t */\r\n\tremoveContextBranch(branch)\r\n\t{\r\n\t\tif (!branch)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdelete this.context[branch];\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the context.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetContext()\r\n\t{\r\n\t\treturn this.context;\r\n\t}\r\n\r\n\t/**\r\n\t * override this to do something when created.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tonCreated()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the component.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\treturn {\r\n\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will cache the layout panel and set the main id.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} layout\r\n\t * @returns {object}\r\n\t */\r\n\t_cacheRoot(layout)\r\n\t{\r\n\t\tif (!layout)\r\n\t\t{\r\n\t\t\treturn layout;\r\n\t\t}\r\n\r\n\t\tif (!layout.id)\r\n\t\t{\r\n\t\t\tlayout.id = this.getId();\r\n\t\t}\r\n\r\n\t\tlayout.cache = 'panel';\r\n\t\treturn layout;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the component layout.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object}\r\n\t */\r\n\t_createLayout()\r\n\t{\r\n\t\treturn this.render();\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepare the layout.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object}\r\n\t */\r\n\tprepareLayout()\r\n\t{\r\n\t\tconst layout = this._createLayout();\r\n\t\treturn this._cacheRoot(layout);\r\n\t}\r\n\r\n\t/**\r\n\t * This will build the layout.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tafterBuild()\r\n\t{\r\n\t\tDataTracker.add(this.panel, 'components',\r\n\t\t{\r\n\t\t\tcomponent: this\r\n\t\t});\r\n\r\n\t\tthis.rendered = true;\r\n\t\tthis.afterLayout();\r\n\t}\r\n\r\n\t/**\r\n\t * This will activate the post build actions.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tafterLayout()\r\n\t{\r\n\t\tthis.afterSetup();\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the content on condition of a property.\r\n\t *\r\n\t * @protected\r\n\t * @param {*} prop\r\n\t * @param {*} content\r\n\t * @returns {object}\r\n\t */\r\n\tif(prop, content)\r\n\t{\r\n\t\treturn (!prop)? null : (content || prop);\r\n\t}\r\n\r\n\t/**\r\n\t * This will map an array to children elements.\r\n\t *\r\n\t * @protected\r\n\t * @param {array} items\r\n\t * @param {function} callBack\r\n\t * @returns {array}\r\n\t */\r\n\tmap(items, callBack)\r\n\t{\r\n\t\tconst children = [];\r\n\t\tif (!items || items.length < 1)\r\n\t\t{\r\n\t\t\treturn children;\r\n\t\t}\r\n\r\n\t\tfor (var i = 0, length = items.length; i < length; i++)\r\n\t\t{\r\n\t\t\tconst item = callBack(items[i], i);\r\n\t\t\tchildren.push(item);\r\n\t\t}\r\n\t\treturn children;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove children from an element.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @returns {object}\r\n\t */\r\n\tremoveAll(ele)\r\n\t{\r\n\t\treturn Html.removeAll(ele);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get an id of the component or the full\r\n\t * id that has the component id prepended to the\r\n\t * requested id.\r\n\t *\r\n\t * @param {string} [id]\r\n\t * @returns {string}\r\n\t */\r\n\tgetId(id)\r\n\t{\r\n\t\tlet mainId = this.id;\r\n\t\tif (typeof id === 'string')\r\n\t\t{\r\n\t\t\tmainId += '-' + id;\r\n\t\t}\r\n\t\treturn mainId;\r\n\t}\r\n\r\n\t/**\r\n\t * This will cache an element to the component.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {string} propName\r\n\t * @returns {void}\r\n\t */\r\n\tcacheEle(ele, propName)\r\n\t{\r\n\t\tif (!propName)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis[propName] = ele;\r\n\t\tthis.cached.push(propName);\r\n\t}\r\n\r\n\t/**\r\n\t * This will initialize the component.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tinitialize()\r\n\t{\r\n\t\tthis.setupContext();\r\n\t\tthis.beforeSetup();\r\n\t}\r\n\r\n\t/**\r\n\t * override this to do something before setup.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tbeforeSetup()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * override this to do something after setup.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tafterSetup()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup and render the component.\r\n\t *\r\n\t * @param {object} container\r\n\t * @returns {void}\r\n\t */\r\n\tsetup(container)\r\n\t{\r\n\t\tthis.setContainer(container);\r\n\t\tthis.initialize();\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the container.\r\n\t *\r\n\t * @param {object} container\r\n\t * @returns {void}\r\n\t */\r\n\tsetContainer(container)\r\n\t{\r\n\t\tthis.container = container;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the component.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\t_remove()\r\n\t{\r\n\t\tthis.prepareDestroy();\r\n\t\tthis.removeContext();\r\n\r\n\t\tconst panel = this.panel || this.id;\r\n\t\tHtml.removeElement(panel);\r\n\r\n\t\tthis.cleanUpAfterDestroy();\r\n\t}\r\n\r\n\t/**\r\n\t * This will clean up after destroy.\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tcleanUpAfterDestroy()\r\n\t{\r\n\t\t/**\r\n\t\t * This will clear the panel and container references\r\n\t\t * to prevent memory leaks.\r\n\t\t */\r\n\t\tthis.panel = null;\r\n\t\tthis.container = null;\r\n\r\n\t\t/**\r\n\t\t * This will clear all cached element references\r\n\t\t * to prevent memory leaks.\r\n\t\t */\r\n\t\tthis.cached.forEach(propName =>\r\n\t\t{\r\n\t\t\tthis[propName] = null;\r\n\t\t});\r\n\t\tthis.cached = [];\r\n\r\n\t\t/**\r\n\t\t * This will clear the component data if it is not\r\n\t\t * set to persist to free up memory.\r\n\t\t */\r\n\t\tif (this.persist !== true)\r\n\t\t{\r\n\t\t\tthis.data = null;\r\n\t\t\tthis.state = null;\r\n\t\t\tthis.stateHelper = null;\r\n\t\t\tthis.children = [];\r\n\t\t\tthis.context = null;\r\n\t\t\tthis.parent = null;\r\n\t\t\tthis.persistedChildren = {};\r\n\t\t\tthis.unitType = null;\r\n\t\t\tthis.id = null;\r\n\t\t\tthis.persistToken = null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepare the component to be destroyed.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tprepareDestroy()\r\n\t{\r\n\t\tthis.persistedCount = 0;\r\n\t\tthis.rendered = false;\r\n\t\tthis.beforeDestroy();\r\n\r\n\t\t/**\r\n\t\t * This will unlink the data to prevent memory leaks.\r\n\t\t */\r\n\t\tif (this.data && typeof this.data.unlink === 'function')\r\n\t\t{\r\n\t\t\tthis.data.unlink();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Override this to do something before destroy.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tbeforeDestroy()\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will destroy the component.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tdestroy()\r\n\t{\r\n\t\tthis._remove();\r\n\t}\r\n}", "import { Objects } from '../../shared/objects.js';\r\nimport { StateTracker } from '../state/state-tracker.js';\r\nimport { EventHelper } from './event-helper.js';\r\nimport { StateHelper } from './state-helper.js';\r\nimport { Unit } from './unit.js';\r\n\r\n/**\r\n * Component\r\n *\r\n * This will allow components to be extended\r\n * from a single factory.\r\n *\r\n * @class\r\n * @augments Unit\r\n *\r\n * @param {...any} args\r\n *\r\n * @example\r\n * class QuickFlashPanel extends Component\r\n *\t{\r\n *\t\trender()\r\n *\t\t{\r\n *\t\t\treturn {\r\n *\r\n *\t\t\t};\r\n *\t\t}\r\n *\t}\r\n */\r\nexport class Component extends Unit\r\n{\r\n\t/**\r\n\t * This will create a component.\r\n\t *\r\n\t * @constructor\r\n\t * @param {...any} args\r\n\t */\r\n\tconstructor(...args)\r\n\t{\r\n\t\tsuper(...args);\r\n\r\n\t\t/**\r\n\t\t * @param {boolean} isComponent\r\n\t\t */\r\n\t\tthis.isComponent = true;\r\n\r\n\t\t/**\r\n\t\t * @param {boolean} stateResumed\r\n\t\t */\r\n\t\tthis.stateResumed = false;\r\n\r\n\t\t/* this will allow the component to override the\r\n\t\tstate target id to add a custom id */\r\n\t\t/**\r\n\t\t * @member {string} [stateTargetId] // optional override of state id\r\n\t\t */\r\n\t\tthis.stateTargetId = null;\r\n\t\tthis._setupData();\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the data.\r\n\t *\r\n\t * @returns {object|null}\r\n\t */\r\n\tsetData()\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the component data.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\t_setupData()\r\n\t{\r\n\t\tif (this.data)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst data = this.setData();\r\n\t\tif (data)\r\n\t\t{\r\n\t\t\tthis.data = data;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume the component scope when persisting.\r\n\t *\r\n\t * @param {object} persistedLayout\r\n\t * @returns {void}\r\n\t */\r\n\tresumeScope(persistedLayout)\r\n\t{\r\n\t\tthis.data = persistedLayout.data;\r\n\t\tthis.state = persistedLayout.state;\r\n\t\tthis.stateHelper = persistedLayout.stateHelper;\r\n\t\tthis.persistedChildren = persistedLayout.persistedChildren;\r\n\t\tthis.id = persistedLayout.id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will initialize the component.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object}\r\n\t */\r\n\tinitialize()\r\n\t{\r\n\t\tthis.setupContext();\r\n\t\tthis.addStates();\r\n\t\tthis.beforeSetup();\r\n\t}\r\n\r\n\t/**\r\n\t * This will activate the post build actions.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tafterLayout()\r\n\t{\r\n\t\tthis.addEvents();\r\n\t\tthis.afterSetup();\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the state target.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} [id]\r\n\t * @returns {void}\r\n\t */\r\n\tsetupStateTarget(id)\r\n\t{\r\n\t\tconst targetId = id || this.stateTargetId || this.id;\r\n\t\tthis.state = StateTracker.getTarget(targetId);\r\n\t}\r\n\r\n\t/**\r\n\t * Override this to setup the component states.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object}\r\n\t *\r\n\t * @example\r\n\t * return {\r\n\t *\r\n\t * \t// simple state\r\n\t * \taction: 'state', // any primitive value\r\n\t *\r\n\t * \t// a more complex state\r\n\t * \tcomplexAction: {\r\n\t * \t\tstate: 'state', // any primitive value\r\n\t * \t\tcallBack(state, prevState)\r\n\t * \t\t{\r\n\t * \t\t\t// do something\r\n\t * \t\t}\r\n\t * \t}\r\n\t * };\r\n\t */\r\n\tsetupStates()\r\n\t{\r\n\t\t/*\r\n\t\treturn {\r\n\t\t\taction: 'state'\r\n\t\t};\r\n\r\n\t\tor\r\n\r\n\t\treturn {\r\n\t\t\taction:\r\n\t\t\t{\r\n\t\t\t\tstate: 'state',\r\n\t\t\t\tcallBack(state, prevState)\r\n\t\t\t\t{\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};*/\r\n\r\n\t\treturn {\r\n\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the states.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\taddStates()\r\n\t{\r\n\t\t/* this will check to restore previous a previous state if the\r\n\t\tcomponent has been preserved. */\r\n\t\tconst state = this.state;\r\n\t\tif (state)\r\n\t\t{\r\n\t\t\tthis.stateResumed = true;\r\n\t\t\tthis.stateHelper.restore(state);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* this will only setupa state manager if\r\n\t\twe have states */\r\n\t\tconst states = this.setupStates();\r\n\t\tif (Objects.isEmpty(states))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.setStateHelper(states);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the state helper.\r\n\t *\r\n\t * @param {object} [states]\r\n\t * @returns {void}\r\n\t */\r\n\tsetStateHelper(states = {})\r\n\t{\r\n\t\t/**\r\n\t\t * This will prevent the state helper from being\r\n\t\t * reset.\r\n\t\t */\r\n\t\tif (this.state)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.setupStateTarget();\r\n\t\tthis.stateHelper = new StateHelper(this.state, states);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a state.\r\n\t *\r\n\t * @param {object} state\r\n\t * @returns {void}\r\n\t */\r\n\taddState(state)\r\n\t{\r\n\t\t/**\r\n\t\t * This will prevet new states from being added if the\r\n\t\t * component has been resumed or the state helper is\r\n\t\t * missing.\r\n\t\t */\r\n\t\tif (!this.stateHelper || this.stateResumed == true)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.stateHelper.addStates(this.state, state);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the states.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tremoveStates()\r\n\t{\r\n\t\tconst state = this.state;\r\n\t\tif (!state)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.stateHelper.removeRemoteStates(state);\r\n\t\tstate.remove();\r\n\t\tthis.stateResumed = false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the event helper.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tsetEventHelper()\r\n\t{\r\n\t\t/**\r\n\t\t * This will prevent the event helper from being\r\n\t\t * reset.\r\n\t\t */\r\n\t\tif (this.events)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.events = new EventHelper();\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {array}\r\n\t *\r\n\t * @example\r\n\t * return [\r\n\t * \t// event, element, function, capture\r\n\t * \t['click', this.element, function(e){}, false]\r\n\t * ];\r\n\t */\r\n\tsetupEvents()\r\n\t{\r\n\t\treturn [\r\n\t\t\t//['action', element, function(e){}, false]\r\n\t\t];\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\taddEvents()\r\n\t{\r\n\t\tconst events = this.setupEvents();\r\n\t\tif (events.length < 1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.setEventHelper();\r\n\t\tthis.events.addEvents(events);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tremoveEvents()\r\n\t{\r\n\t\tconst events = this.events;\r\n\t\tif (events)\r\n\t\t{\r\n\t\t\tevents.reset();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepare the component to be destroyed.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tprepareDestroy()\r\n\t{\r\n\t\tthis.persistedCount = 0;\r\n\t\tthis.rendered = false;\r\n\t\tthis.beforeDestroy();\r\n\t\tthis.removeEvents();\r\n\t\tthis.removeStates();\r\n\t\tthis.removeContext();\r\n\r\n\t\t/**\r\n\t\t * Unlink data when not persisting to prevent memory leaks.\r\n\t\t * Data watchers keep references to the component and DOM.\r\n\t\t */\r\n\t\tif (this.data && this.persist !== true)\r\n\t\t{\r\n\t\t\tthis.data.unlink();\r\n\t\t}\r\n\t}\r\n}", "/**\r\n * This will store the pod shorthand method alaises.\r\n *\r\n * @constant\r\n * @type {object} SHORTHAND_METHODS\r\n */\r\nexport const SHORTHAND_METHODS =\r\n{\r\n created: 'onCreated',\r\n setStates: 'setupStates',\r\n state: 'setupStates',\r\n events: 'setupEvents',\r\n before: 'beforeSetup',\r\n render: 'render',\r\n after: 'afterSetup',\r\n destroy: 'beforeDestroy'\r\n};", "import { Component } from './component.js';\r\nimport { SHORTHAND_METHODS } from './shorthand-methods.js';\r\n\r\n/**\r\n * This will get the jot method by value. If the method is an\r\n * object, it will be nested in a function.\r\n *\r\n * @param {object|function} value\r\n * @returns {function}\r\n */\r\nconst getJotShorthandMethod = (value) =>\r\n{\r\n\treturn (typeof value === 'function')? value : () => value;\r\n};\r\n\r\n/**\r\n * This will create a jot component object that will be used\r\n * to create the jot component.\r\n *\r\n * @param {object} settings\r\n * @returns {object}\r\n */\r\nconst JotComponent = (settings) =>\r\n{\r\n\tconst component = {};\r\n\tif (!settings)\r\n\t{\r\n\t\treturn component;\r\n\t}\r\n\r\n\tObject.entries(settings).forEach(([prop, value]) =>\r\n\t{\r\n\t\tconst alias = SHORTHAND_METHODS[prop] || prop;\r\n\t\tcomponent[alias] = getJotShorthandMethod(value);\r\n\t});\r\n\r\n\treturn component;\r\n};\r\n\r\n/**\r\n * This will create a class.\r\n *\r\n * @param {typeof Component} Base\r\n * @param {object} settings\r\n * @returns {typeof Component} Child - The child class that extends the base class.\r\n */\r\nconst createClass = (Base, settings) =>\r\n{\r\n\tclass Child extends Base {}\r\n\tObject.assign(Child.prototype, settings);\r\n\treturn Child;\r\n};\r\n\r\n/**\r\n * This will create a shorthand component.\r\n *\r\n * @param {object|function} layout\r\n * @param {typeof Component} [extend=Component]\r\n * @returns {typeof Component|null} A class (constructor) or `null` if no layout is given.\r\n */\r\nexport const Jot = (layout, extend = Component) =>\r\n{\r\n\tif (!layout)\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\tlet settings;\r\n\tconst layoutType = typeof layout;\r\n\r\n\t/**\r\n\t * This will handle the layout components that are objects.\r\n\t */\r\n\tif (layoutType === 'object' && layout.render)\r\n\t{\r\n\t\tsettings = JotComponent(layout);\r\n\t\treturn createClass(extend, settings);\r\n\t}\r\n\r\n\t/**\r\n\t * This will handle non component layouts. If the layout is not\r\n\t * a function, it will be wrapped in a function to be used as\r\n\t * the render method.\r\n\t */\r\n\tconst render = (layoutType === 'function')? layout : () => layout;\r\n\tsettings = { render };\r\n\treturn createClass(extend, settings);\r\n};", "import { Component } from './component.js';\r\nimport { SHORTHAND_METHODS } from './shorthand-methods.js';\r\n\r\n/**\r\n * Pods\r\n *\r\n * Pods are components that are created using a shorthand method.\r\n *\r\n * @author Chris Durfee\r\n * @author Cayon Christiansen\r\n */\r\n\r\n/**\r\n * This will modify the methods to convert the shorthand\r\n * methods to the full methods.\r\n *\r\n * @param {object} proxy\r\n * @param {typeof Component} component\r\n * @returns {object}\r\n */\r\nconst modifyMethods = (proxy, component) =>\r\n{\r\n Object.entries(proxy).forEach(([prop, value]) =>\r\n {\r\n const alias = SHORTHAND_METHODS[prop] || prop;\r\n component.prototype[alias] = value;\r\n });\r\n\r\n return component;\r\n};\r\n\r\n/**\r\n * This will create a class.\r\n *\r\n * @param {typeof Component} Base\r\n * @returns {typeof Component}\r\n */\r\nconst extendBaseClass = (Base) =>\r\n{\r\n return class extends Base {}\r\n};\r\n\r\n/**\r\n * This will create a pod component.\r\n *\r\n * @param {function} callBack\r\n * @param {typeof Component} extend - The class to extend.\r\n * @returns {typeof Component}\r\n */\r\nexport const Pod = (callBack, extend = Component) =>\r\n{\r\n if (!callBack)\r\n {\r\n return null;\r\n }\r\n\r\n const component = extendBaseClass(extend);\r\n\r\n /**\r\n * This will call the callback function and pass the component\r\n * to set up the component.\r\n *\r\n * The result is the render method.\r\n */\r\n const proxy = {};\r\n const render = callBack(proxy);\r\n\r\n /**\r\n * This will modify the methods to convert the shorthand\r\n * methods to the full methods.\r\n */\r\n modifyMethods(proxy, component);\r\n\r\n component.prototype.render = render;\r\n return component;\r\n};", "\r\n/**\r\n * This will add date functions to the base framework.\r\n *\r\n */\r\nexport const DateTime =\r\n{\r\n\t/**\r\n\t * @member {array} monthName\r\n\t */\r\n\tmonthNames: [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],\r\n\r\n\t/**\r\n\t * @member {array} dayNames\r\n\t */\r\n\tdayNames: [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\r\n\r\n\t/**\r\n\t * This will get the day name.\r\n\t *\r\n\t * @param {number} [day]\r\n\t * @param {boolean} [shortenName=false]\r\n\t * @returns {?string}\r\n\t */\r\n\tgetDayName(day = new Date().getDay(), shortenName = false)\r\n\t{\r\n\t\tconst days = this.dayNames;\r\n\t\tif (day > days.length)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t/* we want to check to shorten name */\r\n\t\tconst dayName = days[day];\r\n\t\treturn (shortenName)? dayName.substring(0, 3) : dayName;\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert month to js.\r\n\t *\r\n\t * @param {number} month\r\n\t * @returns {string}\r\n\t */\r\n\tconvertJsMonth(month)\r\n\t{\r\n\t\treturn this.padNumber(month + 1);\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert a date.\r\n\t *\r\n\t * @param {string} dateString\r\n\t * @param {boolean} [addYear]\r\n\t * @returns {string}\r\n\t */\r\n\tconvertDate(dateString, addYear = false)\r\n\t{\r\n\t\tdateString = (dateString)? dateString.replace(/\\s/, 'T'): ''; //For safari\r\n\r\n\t\tconst date = new Date(dateString),\r\n\t\tyear = (addYear === true)? ' ' + date.getFullYear() : '';\r\n\t\treturn this.getDayName(date.getDay()) + ', ' + this.getMonthName(date.getMonth(), true) + ' ' + this.padNumber(date.getDate()) + year;\r\n\t},\r\n\r\n\t/**\r\n\t * This will add leading zero to number less than 10.\r\n\t *\r\n\t * @param {number} number\r\n\t * @returns {string}\r\n\t */\r\n\tpadNumber(number)\r\n\t{\r\n\t\treturn (number <= 9)? '0' + number : String(number);\r\n\t},\r\n\r\n\t/**\r\n\t * This will create a new date object.\r\n\t *\r\n\t * @param {string} dateString\r\n\t * @returns {Date}\r\n\t */\r\n\tcreateDate(dateString)\r\n\t{\r\n\t\tif (!dateString)\r\n\t\t{\r\n\t\t\treturn new Date();\r\n\t\t}\r\n\r\n\t\tif (typeof dateString === 'string' && dateString.indexOf('-') > -1)\r\n\t\t{\r\n\t\t\tdateString = dateString.replace(/\\s/, 'T'); //For safari\r\n\t\t\tdateString = (dateString.indexOf(':') > -1)? dateString : dateString + \"T00:00:00\";\r\n\t\t}\r\n\t\treturn new Date(dateString);\r\n\t},\r\n\r\n\t/**\r\n\t * This will format a date.\r\n\t *\r\n\t * @param {string} formatType\r\n\t * @param {string} dateString\r\n\t * @returns {string}\r\n\t */\r\n\tformat(formatType, dateString)\r\n\t{\r\n\t\tconst date = this.createDate(dateString);\r\n\t\treturn this.renderDate(date.getFullYear(), date.getMonth() + 1, date.getDate(), formatType);\r\n\t},\r\n\r\n\t/**\r\n\t * This will format time.\r\n\t *\r\n\t * @param {string} dateString\r\n\t * @param {number} format\r\n\t * @returns {string}\r\n\t */\r\n\tformatTime(dateString, format)\r\n\t{\r\n\t\tconst date = this.createDate(dateString);\r\n\t\tconst formatType = (format === 24)? 'sql' : 'standard';\r\n\r\n\t\treturn this.renderTime(date.getHours(), date.getMinutes(), date.getSeconds(), formatType);\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the meridian.\r\n\t *\r\n\t * @param {number|string} hours\r\n\t * @returns {string}\r\n\t */\r\n\tgetMeridian(hours)\r\n\t{\r\n\t\thours = Number(hours);\r\n\t\treturn (hours >= 12)? 'PM' : 'AM';\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert 24 hour time to 12 hour time.\r\n\t *\r\n\t * @param {number|string} hours\r\n\t * @returns {number}\r\n\t */\r\n\tconvert24To12(hours)\r\n\t{\r\n\t\thours = Number(hours);\r\n\t\tif (hours > 12)\r\n\t\t{\r\n\t\t\thours = hours - 12;\r\n\t\t}\r\n\t\treturn hours;\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert 12 hour time to 24 hour time.\r\n\t *\r\n\t * @param {number|string} hours\r\n\t * @param {string} meridian\r\n\t * @returns {number}\r\n\t */\r\n\tconvert12To24(hours, meridian)\r\n\t{\r\n\t\thours = Number(hours);\r\n\t\tif (meridian.toLowerCase() === 'pm')\r\n\t\t{\r\n\t\t\thours = hours + 12;\r\n\t\t}\r\n\t\treturn hours;\r\n\t},\r\n\r\n\t/**\r\n\t * This will render a date.\r\n\t *\r\n\t * @param {number} year\r\n\t * @param {number|string} month\r\n\t * @param {number|string} day\r\n\t * @param {string} [format='sql']\r\n\t * @returns {string}\r\n\t */\r\n\trenderDate(year, month, day, format = 'sql')\r\n\t{\r\n\t\tmonth = Number(month);\r\n\t\tday = Number(day);\r\n\r\n\t\tif (format === 'sql')\r\n\t\t{\r\n\t\t\treturn `${year}-${this.padNumber(month)}-${this.padNumber(day)}`;\r\n\t\t}\r\n\r\n\t\treturn `${this.padNumber(month)}/${this.padNumber(day)}/${year}`;\r\n\t},\r\n\r\n\t/**\r\n\t * This will render time.\r\n\t *\r\n\t * @param {number} hours\r\n\t * @param {number} minutes\r\n\t * @param {number} [seconds=0]\r\n\t * @param {string} [format='sql']\r\n\t * @returns {string}\r\n\t */\r\n\trenderTime(hours, minutes, seconds = 0, format = 'sql')\r\n\t{\r\n\t\tif (format === 'sql')\r\n\t\t{\r\n\t\t\treturn `${this.padNumber(hours)}:${this.padNumber(minutes)}:${this.padNumber(seconds)}`;\r\n\t\t}\r\n\r\n\t\tconst meridian = this.getMeridian(hours);\r\n\t\thours = this.convert24To12(hours);\r\n\r\n\t\treturn `${hours}:${this.padNumber(minutes)} ${meridian}`;\r\n\t},\r\n\r\n\t/**\r\n\t * This will check for leap year.\r\n\t *\r\n\t * @param {number} year\r\n\t * @returns {boolean}\r\n\t */\r\n\tleapYear(year)\r\n\t{\r\n\t\treturn ((year % 400 === 0) || (year % 100 !== 0 && year % 4 === 0));\r\n\t},\r\n\r\n\t/**\r\n\t * This will get a month name.\r\n\t *\r\n\t * @param {number} [month]\r\n\t * @param {boolean} [shortenName]\r\n\t * @returns {string}\r\n\t */\r\n\tgetMonthName(month = new Date().getMonth(), shortenName = false)\r\n\t{\r\n\t\tconst months = this.monthNames;\r\n\t\tif (month > months.length)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tconst monthName = months[month];\r\n\t\tif (!monthName)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\t\treturn (shortenName)? monthName.substring(0, 3) : monthName;\r\n\t},\r\n\r\n\t/**\r\n\t * This will return the month length.\r\n\t *\r\n\t * @param {number} [month]\r\n\t * @param {number} [year]\r\n\t * @returns {number}\r\n\t */\r\n\tgetMonthLength(month, year)\r\n\t{\r\n\t\t/* we want to check to use params or use\r\n\t\tdefault */\r\n\t\tconst date = new Date();\r\n\t\tmonth = (typeof month !== 'undefined')? month : date.getMonth();\r\n\t\tyear = (typeof year !== 'undefined')? year : date.getFullYear();\r\n\r\n\t\t/* we need to get the month lengths for\r\n\t\tthe year */\r\n\t\tconst yearMonthLengths = this.getMonthsLength(year);\r\n\r\n\t\t/* we can select the month length from\r\n\t\tthe yearMonthLengths array */\r\n\t\treturn yearMonthLengths[month];\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the length of all the months.\r\n\t *\r\n\t * @param {number} year\r\n\t * @returns {array}\r\n\t */\r\n\tgetMonthsLength(year = new Date().getFullYear())\r\n\t{\r\n\t\tconst isLeapYear = this.leapYear(year);\r\n\t\tconst days = (isLeapYear === true)?\r\n\t\t\t[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\r\n\t\t:\r\n\t\t\t[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\n\r\n\t\treturn days;\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the local date.\r\n\t *\r\n\t * @param {string} remoteData\r\n\t * @param {string} [remoteTimeZone]\r\n\t * @returns {Date}\r\n\t */\r\n\tgetLocalDate(remoteData, remoteTimeZone = 'America/Denver')\r\n\t{\r\n\t\tlet date = new Date(remoteData);\r\n\r\n\t\tif (Number.isNaN(date.getMonth()) === true)\r\n\t\t{\r\n\t\t\tconst pattern = /[- :]/,\r\n\t\t\tvalues = remoteData.split(pattern);\r\n\r\n\t\t\t// @ts-ignore\r\n\t\t\tdate = new Date(values[0], values[1] - 1, values[2], values[3], values[4], values[5]);\r\n\t\t}\r\n\r\n\t\tconst invdate = new Date(Date.parse(date.toLocaleString('en-US', {\r\n\t\t\ttimeZone: remoteTimeZone\r\n\t\t})));\r\n\r\n\t\tconst diff = date.getTime() - invdate.getTime();\r\n\t\treturn new Date(date.getTime() + diff);\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert a remote date to local time.\r\n\t *\r\n\t * @param {string} remoteData\r\n\t * @param {boolean} sqlformat\r\n\t * @param {boolean} timeOnly\r\n\t * @param {string} [remoteTimeZone]\r\n\t * @returns {string}\r\n\t */\r\n\tgetLocalTime(remoteData, sqlformat = false, timeOnly = false, remoteTimeZone = 'America/Denver')\r\n\t{\r\n\t\tif (!remoteData)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tconst date = this.getLocalDate(remoteData, remoteTimeZone);\r\n\t\tconst month = date.getMonth() + 1;\r\n\r\n\t\tconst format = (sqlformat) === true? 'sql' : 'standard';\r\n\r\n\t\tlet formated = '';\r\n\t\tif (timeOnly === false)\r\n\t\t{\r\n\t\t\tformated += this.renderDate(date.getFullYear(), month, date.getDate(), format) + ' ';\r\n\t\t}\r\n\t\treturn (formated + this.renderTime(date.getHours(), date.getMinutes(), date.getSeconds(), format));\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the difference from now.\r\n\t *\r\n\t * @param {string} date\r\n\t * @param {boolean} [setHours]\r\n\t * @returns {number}\r\n\t */\r\n\tgetDiffFromNow(date, setHours = false)\r\n\t{\r\n\t\tdate = date.replace(/\\s/, 'T'); //For safari\r\n\t\tconst diffDate = new Date(date);\r\n\r\n\t\tconst now = new Date();\r\n\t\tif (setHours === true)\r\n\t\t{\r\n\t\t\tnow.setHours(0,0,0,0);\r\n\t\t}\r\n\r\n\t\tlet timeDiff = now.getTime() - diffDate.getTime();\r\n\t\treturn timeDiff;\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the age.\r\n\t *\r\n\t * @param {string} date\r\n\t * @returns {string}\r\n\t */\r\n\tgetAge(date)\r\n\t{\r\n\t\tconst milliseconds = this.getDiffFromNow(date);\r\n\r\n\t\tlet age,\r\n\t\tdays;\r\n\t\tswitch(true)\r\n\t\t{\r\n\t\t\tcase milliseconds < 86400000:\r\n\t\t\t\tage = '1 day';\r\n\t\t\t\tbreak;\r\n\t\t\tcase milliseconds < 604800000:\r\n\t\t\t\tdays = this.toDays(milliseconds);\r\n\t\t\t\tage = (days) + ' days';\r\n\t\t\t\tbreak;\r\n\t\t\tcase milliseconds < 1209600000:\r\n\t\t\t\tage = '1 week';\r\n\t\t\t\tbreak;\r\n\t\t\tcase milliseconds < 2592000000:\r\n\t\t\t\tdays = this.toDays(milliseconds);\r\n\t\t\t\tvar weeks = Math.floor(days / 7);\r\n\t\t\t\tage = weeks + ' weeks';\r\n\t\t\t\tbreak;\r\n\t\t\tcase milliseconds < 5184000000:\r\n\t\t\t\tage = '1 month';\r\n\t\t\t\tbreak;\r\n\t\t\tcase milliseconds < 31104000000:\r\n\t\t\t\tvar months = this.toMonths(milliseconds);\r\n\t\t\t\tage = months + ' months';\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tvar years = this.toYears(milliseconds);\r\n\t\t\t\tage = years;\r\n\t\t}\r\n\r\n\t\treturn String(age);\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the time frame.\r\n\t *\r\n\t * @param {string} date\r\n\t * @returns {string}\r\n\t */\r\n\tgetTimeFrame(date)\r\n\t{\r\n\t\tconst timeDiff = this.getDiffFromNow(date);\r\n\t\treturn this.convertToEstimate(timeDiff);\r\n\t},\r\n\r\n\t/**\r\n\t *\r\n\t * @param {number} milliseconds\r\n\t * @returns {string}\r\n\t */\r\n\tconvertToEstimate(milliseconds)\r\n\t{\r\n\t\tlet timeFrame = '';\r\n\t\tlet days, weeks, years, months, hours, minutes, seconds;\r\n\r\n\t\tif (milliseconds <= 0)\r\n\t\t{\r\n\t\t\tswitch (true)\r\n\t\t\t{\r\n\t\t\t\tcase milliseconds < -63072000000:\r\n\t\t\t\t\tyears = this.toYears(Math.abs(milliseconds));\r\n\t\t\t\t\ttimeFrame = 'in ' + years + ' years';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -31536000000:\r\n\t\t\t\t\ttimeFrame = 'in a year';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -5184000000:\r\n\t\t\t\t\tmonths = this.toMonths(Math.abs(milliseconds));\r\n\t\t\t\t\ttimeFrame = 'in ' + months + ' months';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -2592000000:\r\n\t\t\t\t\ttimeFrame = 'in a month';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -1209600000:\r\n\t\t\t\t\tdays = this.toDays(Math.abs(milliseconds)),\r\n\t\t\t\t\tweeks = Math.floor(days / 7);\r\n\t\t\t\t\ttimeFrame = 'in ' + weeks + ' weeks';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -604800000:\r\n\t\t\t\t\ttimeFrame = 'in a week';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -172800000:\r\n\t\t\t\t\tdays = this.toDays(Math.abs(milliseconds));\r\n\t\t\t\t\ttimeFrame = 'in ' + (days) + ' days';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -86400000:\r\n\t\t\t\t\ttimeFrame = 'tomorrow';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -7200000:\r\n\t\t\t\t\thours = this.toHours(Math.abs(milliseconds));\r\n\t\t\t\t\ttimeFrame = 'in ' + hours + ' hours';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds <= -3600000:\r\n\t\t\t\t\ttimeFrame = 'in an hour';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -120000:\r\n\t\t\t\t\tminutes = this.toMinutes(Math.abs(milliseconds));\r\n\t\t\t\t\ttimeFrame = 'in ' + minutes + ' minutes';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -60000:\r\n\t\t\t\t\ttimeFrame = 'in a minute';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -2000:\r\n\t\t\t\t\tseconds = this.toSeconds(Math.abs(milliseconds));\r\n\t\t\t\t\ttimeFrame = 'in ' + seconds + ' seconds';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < -1:\r\n\t\t\t\t\ttimeFrame = 'in 1 second';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\ttimeFrame = 'now';\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tswitch (true)\r\n\t\t\t{\r\n\t\t\t\tcase milliseconds < 1000:\r\n\t\t\t\t\ttimeFrame = '1 second ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 60000:\r\n\t\t\t\t\tseconds = this.toSeconds(milliseconds);\r\n\t\t\t\t\ttimeFrame = seconds + ' seconds ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 120000:\r\n\t\t\t\t\ttimeFrame = '1 minute ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 3600000:\r\n\t\t\t\t\tminutes = this.toMinutes(milliseconds);\r\n\t\t\t\t\ttimeFrame = minutes + ' minutes ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 7200000:\r\n\t\t\t\t\ttimeFrame = '1 hour ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 86400000:\r\n\t\t\t\t\thours = this.toHours(milliseconds);\r\n\t\t\t\t\ttimeFrame = hours + ' hours ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 172800000:\r\n\t\t\t\t\ttimeFrame = 'yesterday';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 604800000:\r\n\t\t\t\t\tdays = this.toDays(milliseconds);\r\n\t\t\t\t\ttimeFrame = (days) + ' days ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 1209600000:\r\n\t\t\t\t\ttimeFrame = 'a week ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 2592000000:\r\n\t\t\t\t\tdays = this.toDays(milliseconds),\r\n\t\t\t\t\tweeks = Math.floor(days / 7);\r\n\t\t\t\t\ttimeFrame = weeks + ' weeks ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 5184000000:\r\n\t\t\t\t\ttimeFrame = 'a month ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 31536000000:\r\n\t\t\t\t\tmonths = this.toMonths(milliseconds);\r\n\t\t\t\t\ttimeFrame = months + ' months ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase milliseconds < 63072000000:\r\n\t\t\t\t\ttimeFrame = 'a year ago';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tyears = this.toYears(milliseconds);\r\n\t\t\t\t\ttimeFrame = years + ' years ago';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn timeFrame;\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert to years.\r\n\t *\r\n\t * @param {number} milliseconds\r\n\t * @returns {number}\r\n\t */\r\n\ttoYears(milliseconds)\r\n\t{\r\n\t\tif (typeof milliseconds !== 'number')\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn Math.floor(milliseconds / (1000 * 60 * 60 * 24 * 365.26));\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert to months.\r\n\t *\r\n\t * @param {number} milliseconds\r\n\t * @returns {number}\r\n\t */\r\n\ttoMonths(milliseconds)\r\n\t{\r\n\t\tif (typeof milliseconds === 'number')\r\n\t\t{\r\n\t\t\treturn Math.floor(milliseconds / (1000 * 60 * 60 * 24 * 30));\r\n\t\t}\r\n\t\treturn 0;\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert to days.\r\n\t *\r\n\t * @param {number} milliseconds\r\n\t * @returns {number}\r\n\t */\r\n\ttoDays(milliseconds)\r\n\t{\r\n\t\tif (typeof milliseconds !== 'number')\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn Math.floor(milliseconds / (60 * 60 * 1000 * 24) * 1);\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert to hours.\r\n\t *\r\n\t * @param {number} milliseconds\r\n\t * @returns {number}\r\n\t */\r\n\ttoHours(milliseconds)\r\n\t{\r\n\t\tif (typeof milliseconds !== 'number')\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn Math.floor((milliseconds % (60 * 60 * 1000 * 24)) / (60 * 60 * 1000) * 1);\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert to minutes.\r\n\t *\r\n\t * @param {number} milliseconds\r\n\t * @returns {number}\r\n\t */\r\n\ttoMinutes(milliseconds)\r\n\t{\r\n\t\tif (typeof milliseconds !== 'number')\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn Math.floor(((milliseconds % (60 * 60 * 1000 * 24)) % (60 * 60 * 1000)) / (60 * 1000) * 1);\r\n\t},\r\n\r\n\t/**\r\n\t * This will convert to seconds.\r\n\t *\r\n\t * @param {number} milliseconds\r\n\t * @returns {number}\r\n\t */\r\n\ttoSeconds(milliseconds)\r\n\t{\r\n\t\tif (typeof milliseconds !== 'number')\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn Math.floor((((milliseconds % (60 * 60 * 1000 * 24)) % (60 * 60 * 1000)) % (60 * 1000)) / 1000 * 1);\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the difference between two dates.\r\n\t *\r\n\t * @param {string} startDate\r\n\t * @param {string} endDate\r\n\t * @returns {object}\r\n\t */\r\n\tgetDifference(startDate, endDate)\r\n\t{\r\n\t\t/* we want to convert the dates to objects */\r\n\t\tconst start = new Date(startDate),\r\n\t\tend = new Date(endDate),\r\n\r\n\t\t/* we want to subtract the start time from the end */\r\n\t\tdifference = (end.getTime() - start.getTime());\r\n\r\n\t\treturn {\r\n\t\t\tyears: this.toYears(difference),\r\n\t\t\tdays: this.toDays(difference),\r\n\t\t\thours: this.toHours(difference),\r\n\t\t\tminutes: this.toMinutes(difference),\r\n\t\t\tseconds: this.toSeconds(difference)\r\n\t\t};\r\n\t}\r\n};", "/**\r\n * This will create a directive object.\r\n *\r\n * @param {string} name\r\n * @param {function} callBack\r\n * @returns {object}\r\n */\r\nexport const Directive = (name, callBack) =>\r\n{\r\n return {\r\n name,\r\n callBack\r\n };\r\n};", "import { Directive } from './directive.js';\r\n\r\n/**\r\n * Directives\r\n *\r\n * This will hold all directives.\r\n */\r\nexport const Directives =\r\n{\r\n /**\r\n * @member {array} keys\r\n */\r\n keys: [],\r\n\r\n /**\r\n * @member {object} items\r\n */\r\n items: {},\r\n\r\n /**\r\n * This will add a directive.\r\n *\r\n * @param {string} name\r\n * @param {function} callBack\r\n * @returns {object}\r\n */\r\n add(name, callBack)\r\n {\r\n this.keys.push(name);\r\n this.items[name] = Directive(name, callBack);\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * This will get a directive.\r\n *\r\n * @param {string} name\r\n * @returns {object|null}\r\n */\r\n get(name)\r\n {\r\n return this.items[name] || null;\r\n },\r\n\r\n /**\r\n * This will get all directive names.\r\n *\r\n * @returns {array}\r\n */\r\n all()\r\n {\r\n return this.keys;\r\n }\r\n};", "/**\r\n * This will create an attribute directive object.\r\n *\r\n * @param {string} attr\r\n * @param {object} directive\r\n * @returns {object}\r\n */\r\nexport const AttributeDirective = (attr, directive) =>\r\n{\r\n\treturn {\r\n\t\tattr,\r\n\t\tdirective\r\n\t};\r\n};", "/**\r\n * This will create an attribute object.\r\n *\r\n * @param {string} key\r\n * @param {*} value\r\n * @returns {object}\r\n */\r\nexport const Attribute = (key, value) =>\r\n{\r\n return {\r\n key,\r\n value\r\n };\r\n};", "/**\r\n * This will create an element object.\r\n *\r\n * @param {string} tag\r\n * @param {array} attr\r\n * @param {array} directives\r\n * @param {array} children\r\n * @returns {object}\r\n */\r\nexport const Element = (tag, attr, directives, children) =>\r\n{\r\n return {\r\n tag,\r\n attr,\r\n directives,\r\n children,\r\n };\r\n};", "import { Objects } from '../../../shared/objects.js';\r\nimport { normalizeAttr } from '../../html/html.js';\r\nimport { Directives } from '../directives/directives.js';\r\nimport { WatcherHelper } from '../watcher-helper.js';\r\nimport { AttributeDirective } from './attribute-directive.js';\r\nimport { Attribute } from './attribute.js';\r\nimport { Element } from './element.js';\r\n\r\n/**\r\n * Parser\r\n *\r\n * This will parse JSON layouts.\r\n *\r\n * @class\r\n */\r\nexport class Parser\r\n{\r\n\t/**\r\n\t * This will get the tag name of an element.\r\n\t *\r\n\t * @static\r\n\t * @private\r\n\t * @param {object} obj\r\n\t * @returns {string}\r\n\t */\r\n\tstatic getTag(obj)\r\n\t{\r\n\t\treturn obj.tag || 'div';\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the element children.\r\n\t *\r\n\t * @static\r\n\t * @param {object} obj\r\n\t * @returns {void}\r\n\t */\r\n\tstatic setupChildren(obj)\r\n\t{\r\n\t\tif (obj.nest)\r\n\t\t{\r\n\t\t\tobj.children = obj.nest;\r\n\t\t\tdelete obj.nest;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the element content.\r\n\t *\r\n\t * @param {string} key\r\n\t * @param {*} value\r\n\t * @param {array} attr\r\n\t * @param {array} children\r\n\t * @returns {boolean}\r\n\t */\r\n\tstatic setElementContent(key, value, attr, children)\r\n\t{\r\n\t\tif (key === 'text')\r\n\t\t{\r\n\t\t\tchildren.push({\r\n\t\t\t\ttag: 'text',\r\n\t\t\t\ttextContent: value\r\n\t\t\t});\r\n\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (key === 'html' || key === 'innerHTML')\r\n\t\t{\r\n\t\t\tattr.push(Attribute('innerHTML', value));\r\n\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the text as a watcher.\r\n\t *\r\n\t * @private\r\n\t * @static\r\n\t * @param {array} directives\r\n\t * @param {string} key\r\n\t * @param {string} value\r\n\t * @returns {void}\r\n\t */\r\n\tstatic setTextAsWatcher(directives, key, value)\r\n\t{\r\n\t\tdirectives.push(\r\n\t\t\tAttributeDirective(\r\n\t\t\t\tAttribute(\r\n\t\t\t\t\tkey,\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * This will convert the watcher to a custom\r\n\t\t\t\t\t * watcher object.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * We also need to normalize the attribute name.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tWatcherHelper.getWatcherSettings(value, normalizeAttr(key))\r\n\t\t\t\t),\r\n\t\t\t\tDirectives.get('watch')\r\n\t\t\t)\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the button type.\r\n\t *\r\n\t * @static\r\n\t * @param {string} tag\r\n\t * @param {object} obj\r\n\t * @param {array} attr\r\n\t */\r\n\tstatic setButtonType(tag, obj, attr)\r\n\t{\r\n\t\tif (tag === 'button')\r\n\t\t{\r\n\t\t\tconst type = obj.type || 'button';\r\n\t\t\tattr.push(Attribute('type', type));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will parse a layout element.\r\n\t *\r\n\t * @static\r\n\t * @param {object} obj\r\n\t * @param {object} parent\r\n\t * @returns {object}\r\n\t */\r\n\tstatic parse(obj, parent)\r\n\t{\r\n\t\tconst attr = [],\r\n\t\tdirectives = [],\r\n\t\ttag = this.getTag(obj);\r\n\r\n\t\tthis.setButtonType(tag, obj, attr);\r\n\t\tthis.setupChildren(obj);\r\n\r\n\t\tlet children = [];\r\n\t\tvar value, directive;\r\n\t\tfor (var key in obj)\r\n\t\t{\r\n\t\t\tif (!Objects.hasOwnProp(obj, key) || key === 'tag')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvalue = obj[key];\r\n\t\t\tif (value === undefined || value === null)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * Handle children separately to prevent it from being\r\n\t\t\t * set as an attribute (which would fail since DOM elements\r\n\t\t\t * have a read-only children property).\r\n\t\t\t */\r\n\t\t\tif (key === 'children')\r\n\t\t\t{\r\n\t\t\t\tchildren = Array.isArray(value) ? children.concat(value) : children.concat([value]);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will set up the attribute directives.\r\n\t\t\t */\r\n\t\t\tif ((directive = Directives.get(key)) !== null)\r\n\t\t\t{\r\n\t\t\t\tdirectives.push(\r\n\t\t\t\t\tAttributeDirective(\r\n\t\t\t\t\t\tAttribute(key, value),\r\n\t\t\t\t\t\tdirective\r\n\t\t\t\t\t)\r\n\t\t\t\t);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst type = typeof value;\r\n\t\t\tif (type === 'object')\r\n\t\t\t{\r\n\t\t\t\t/**\r\n\t\t\t\t * This will check if the value is a watcher.\r\n\t\t\t\t */\r\n\t\t\t\tif (WatcherHelper.isWatching(value))\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.setTextAsWatcher(directives, key, value);\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tchildren.push(value);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will set event callbacks to bind to the element on the this keyword\r\n\t\t\t * and pass the parent element in the args.\r\n\t\t\t */\r\n\t\t\tif (type === 'function')\r\n\t\t\t{\r\n\t\t\t\tconst callback = value;\r\n\t\t\t\t/**\r\n\t\t\t\t * Store the original callback reference on the wrapper function\r\n\t\t\t\t * so it can be matched during event removal.\r\n\t\t\t\t */\r\n\t\t\t\tconst wrapper = function(e)\r\n\t\t\t\t{\r\n\t\t\t\t\tcallback.call(this, e, parent);\r\n\t\t\t\t};\r\n\t\t\t\t// @ts-ignore - Add originalCallback for event cleanup tracking\r\n\t\t\t\twrapper.originalCallback = callback;\r\n\t\t\t\tvalue = wrapper;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will check if the value is a watcher.\r\n\t\t\t */\r\n\t\t\tif (WatcherHelper.isWatching(value))\r\n\t\t\t{\r\n\t\t\t\tthis.setTextAsWatcher(directives, key, value);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will set the element text and html content.\r\n\t\t\t */\r\n\t\t\tif (this.setElementContent(key, value, attr, children))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tattr.push(Attribute(key, value));\r\n\t\t}\r\n\r\n\t\treturn Element(\r\n\t\t\ttag,\r\n\t\t\tattr,\r\n\t\t\tdirectives,\r\n\t\t\tchildren\r\n\t\t);\r\n\t}\r\n}", "\r\n/**\r\n * Render\r\n *\r\n * This will be thase class for a render.\r\n *\r\n * @class\r\n */\r\nexport class Render\r\n{\r\n\t/**\r\n\t * This will render the layout\r\n\t *\r\n\t * @param {object} obj The JSON layout.\r\n\t * @param {object} [container] The parent receiving the layout.\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @returns {*} The layout result.\r\n\t */\r\n\tbuild(obj, container, parent)\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the component.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} component\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tsetupComponent(component, container, parent)\r\n\t{\r\n\t\t/**\r\n\t\t * We want to set the parent to the component before setting\r\n\t\t * up the component.\r\n\t\t */\r\n\t\tcomponent.parent = parent;\r\n\r\n\t\t/**\r\n\t\t * We only set the persist if both the parent allows\r\n\t\t * and the child does not explicitly deny it.\r\n\t\t */\r\n\t\tif (parent && parent.persist === true && component.persist !== false)\r\n\t\t{\r\n\t\t\tcomponent.persist = true;\r\n\t\t\tcomponent.parent.addPersistedChild(component);\r\n\t\t}\r\n\r\n\t\tif (component.cache && parent)\r\n\t\t{\r\n\t\t\tparent[component.cache] = component;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will set up the component, build the layout, and\r\n\t\t * call the afterBuild method.\r\n\t\t */\r\n\t\tcomponent.setup(container);\r\n\t}\r\n\r\n\t/**\r\n\t * This will build a component.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} component\r\n\t * @returns {*}\r\n\t */\r\n\tbuildComponent(component)\r\n\t{\r\n\t\t/**\r\n\t\t * This will build the layout and return the result.\r\n\t\t */\r\n\t\tconst layout = component.prepareLayout();\r\n\t\tconst result = this.build(layout, component.container, component.getChildScope());\r\n\r\n\t\tcomponent.afterBuild();\r\n\r\n\t\t/**\r\n\t\t * This will call the onCreated method if it exists.\r\n\t\t */\r\n\t\tif (component.component && typeof component.onCreated === 'function')\r\n\t\t{\r\n\t\t\tcomponent.onCreated(component);\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a component.\r\n\t *\r\n\t * @param {object} component\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {*} the build result.\r\n\t */\r\n\tcreateComponent(component, container, parent)\r\n\t{\r\n\t\tthis.setupComponent(component, container, parent);\r\n\t\tthis.buildComponent(component);\r\n\r\n\t\treturn component;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element directives.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} directives\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tsetDirectives(ele, directives, parent)\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a node.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {void}\r\n\t */\r\n\tremoveNode(node)\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove all the children from an element.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @returns {void}\r\n\t */\r\n\tremoveAll(ele)\r\n\t{\r\n\r\n\t}\r\n}", "import { Component } from '../../component/component.js';\r\nimport { Parser } from '../element/parser.js';\r\nimport { HtmlHelper } from '../html-helper.js';\r\nimport { Render } from './render.js';\r\n\r\n/**\r\n * BrowserRender\r\n *\r\n * This will redner the layout in the browser.\r\n *\r\n * @class\r\n */\r\nexport class BrowserRender extends Render\r\n{\r\n\t/**\r\n\t * This will build a JSON layout.\r\n\t *\r\n\t * @override\r\n\t * @param {object} obj The JSON layout.\r\n\t * @param {object} [container] The parent receiving the layout.\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @returns {*} The doc Frag element.\r\n\t */\r\n\tbuild(obj, container, parent)\r\n\t{\r\n\t\tconst fragment = HtmlHelper.createDocFragment();\r\n\t\tconst elements = Array.isArray(obj) ? obj : [obj];\r\n\t\telements.forEach(element => this.buildElement(element, fragment, parent));\r\n\r\n\t\tif (container && typeof container === 'object')\r\n\t\t{\r\n\t\t\tcontainer.appendChild(fragment);\r\n\t\t}\r\n\t\treturn fragment;\r\n\t}\r\n\r\n\t/**\r\n\t * This will build an element or component.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {object} container\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @returns {void}\r\n\t */\r\n\tbuildElement(obj, container, parent)\r\n\t{\r\n\t\tif (!obj)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (obj.isUnit === true)\r\n\t\t{\r\n\t\t\tthis.createComponent(obj, container, parent);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.createElement(obj, container, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create an element.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {object} container\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @returns {void}\r\n\t */\r\n\tcreateElement(obj, container, parent)\r\n\t{\r\n\t\t/**\r\n\t\t * If there is data or state bindings, we want to\r\n\t\t * create a temporary component to handle those\r\n\t\t * bindings and nest the layout inside of it.\r\n\t\t */\r\n\t\tif (obj.data || obj.state)\r\n\t\t{\r\n\t\t\tthis.createTempComponent(obj, container, parent);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst settings = Parser.parse(obj, parent);\r\n\t\tconst ele = this.createNode(settings, container, parent);\r\n\r\n\t\tthis.cache(ele, obj.cache, parent);\r\n\r\n\t\t/* we want to recursively add the children to\r\n\t\tthe new element */\r\n\t\tsettings.children.forEach(child =>\r\n\t\t{\r\n\t\t\tif (child !== null)\r\n\t\t\t{\r\n\t\t\t\tthis.buildElement(child, ele, parent);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tconst directives = settings.directives;\r\n\t\tif (directives && directives.length)\r\n\t\t{\r\n\t\t\tthis.setDirectives(ele, directives, parent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a temporary component for data/state\r\n\t * bindings in the layout.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tcreateTempComponent(obj, container, parent)\r\n\t{\r\n\t\tconst props = {\r\n\t\t\tsetData: () => obj.data,\r\n\t\t\trender()\r\n\t\t\t{\r\n\t\t\t\treturn {...obj, data: null, state: null};\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (obj.state)\r\n\t\t{\r\n\t\t\tprops.setupStateTarget = function(id)\r\n\t\t\t{\r\n\t\t\t\tthis.state = obj.state;\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst component = new Component(props);\r\n\t\tthis.createComponent(component, container, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element directives.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} directives\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tsetDirectives(ele, directives, parent)\r\n\t{\r\n\t\tdirectives.forEach(directive =>\r\n\t\t{\r\n\t\t\tthis.handleDirective(ele, directive, parent);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will handle an attr directive.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} ele\r\n\t * @param {object} attrDirective\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\thandleDirective(ele, attrDirective, parent)\r\n\t{\r\n\t\tattrDirective.directive.callBack(ele, attrDirective.attr.value, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will cache an element to the parent.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {string} propName\r\n\t * @param {object} parent\r\n\t */\r\n\tcache(ele, propName, parent)\r\n\t{\r\n\t\tif (parent && propName)\r\n\t\t{\r\n\t\t\tparent.cacheEle(ele, propName);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a node.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {object}\r\n\t */\r\n\tcreateNode(settings, container, parent)\r\n\t{\r\n\t\tconst tag = settings.tag;\r\n\t\tif (tag === 'text')\r\n\t\t{\r\n\t\t\tconst child = settings.attr[0];\r\n\t\t\tconst text = (child)? child.value : '';\r\n\t\t\treturn HtmlHelper.createText(text, container);\r\n\t\t}\r\n\t\telse if (tag === 'comment')\r\n\t\t{\r\n\t\t\tconst child = settings.attr[0];\r\n\t\t\tconst text = (child)? child.value : '';\r\n\t\t\treturn HtmlHelper.createComment(text, container);\r\n\t\t}\r\n\r\n\t\treturn HtmlHelper.create(tag, settings.attr, container, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a node.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {void}\r\n\t */\r\n\tremoveNode(node)\r\n\t{\r\n\t\tHtmlHelper.removeElement(node);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove all the children from an element.\r\n\t *\r\n\t * @override\r\n\t * @param {object} ele\r\n\t * @returns {void}\r\n\t */\r\n\tremoveAll(ele)\r\n\t{\r\n\t\tHtmlHelper.removeAll(ele);\r\n\t}\r\n}", "import { removeEventPrefix } from '../html/html.js';\r\n\r\nconst selfClosingTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'source'];\r\n\r\n/**\r\n * HtmlToString\r\n *\r\n * This will render html to a string.\r\n *\r\n * @class\r\n */\r\n// @ts-ignore\r\nexport class HtmlToString\r\n{\r\n /**\r\n * This will create a node string.\r\n *\r\n * @param {string} tag\r\n * @param {array} attrs\r\n * @param {string} children\r\n * @returns {string}\r\n */\r\n\tstatic create(tag, attrs = [], children = '')\r\n {\r\n let innerContent = this.getInnerContent(attrs);\r\n innerContent += this.getInnerHtml(attrs);\r\n\r\n const attrString = this.createAttributes(attrs);\r\n\r\n if (selfClosingTags.includes(tag))\r\n {\r\n return `<${tag} ${attrString} />`;\r\n }\r\n\r\n return `<${tag} ${attrString}>` + innerContent + children + `</${tag}>`;\r\n }\r\n\r\n /**\r\n * This will get the inner content.\r\n *\r\n * @param {object} attrs\r\n * @returns {string}\r\n */\r\n static getInnerContent(attrs)\r\n {\r\n let content = '';\r\n attrs.forEach(({ key, value }, index) =>\r\n {\r\n if (key !== 'text' && key !== 'textContent')\r\n {\r\n return '';\r\n }\r\n\r\n attrs.splice(index, 1);\r\n content += value;\r\n });\r\n\r\n return content;\r\n }\r\n\r\n /**\r\n * This will get the inner html.\r\n *\r\n * @param {object} attrs\r\n * @returns {string}\r\n */\r\n static getInnerHtml(attrs)\r\n {\r\n let content = '';\r\n attrs.forEach(({ key, value }, index) =>\r\n {\r\n if (key !== 'html' && key !== 'innerHTML')\r\n {\r\n return '';\r\n }\r\n\r\n attrs.splice(index, 1);\r\n content += value;\r\n });\r\n\r\n return content;\r\n }\r\n\r\n /**\r\n * This will create a text node.\r\n *\r\n * @param {array} attrs\r\n * @returns {string}\r\n */\r\n static createAttributes(attrs = [])\r\n {\r\n if (!attrs || attrs.length < 1)\r\n {\r\n return '';\r\n }\r\n\r\n return attrs\r\n .map(attr => {\r\n let { key, value } = attr;\r\n\r\n if (typeof value === 'function')\r\n {\r\n key = 'on' + removeEventPrefix(key);\r\n }\r\n return `${key}=\"${value}\"`;\r\n })\r\n .join(' ');\r\n }\r\n\r\n /**\r\n * This will create a text node.\r\n *\r\n * @param {string} text\r\n * @returns {string}\r\n */\r\n static createText(text)\r\n {\r\n return text;\r\n }\r\n\r\n /**\r\n * This will create a comment node.\r\n *\r\n * @param {string} text\r\n * @returns {string}\r\n */\r\n static createComment(text)\r\n {\r\n return `<!-- ${text} -->`;\r\n }\r\n}", "import { Parser } from '../element/parser.js';\r\nimport { HtmlToString } from '../html-to-string.js';\r\nimport { Render } from './render.js';\r\n\r\n/**\r\n * ServerRender\r\n *\r\n * This will render the layout on the server.\r\n *\r\n * @class\r\n */\r\nexport class ServerRender extends Render\r\n{\r\n\t/**\r\n\t * This will render the layout\r\n\t *\r\n\t * @param {object} obj The JSON layout.\r\n\t * @param {object} [container] The parent receiving the layout.\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @returns {*} The layout result\r\n\t */\r\n\tbuild(obj, container, parent)\r\n\t{\r\n\t\tconst elements = Array.isArray(obj) ? obj : [obj];\r\n\t\treturn elements.map(element => this.buildElement(element, parent)).join('');\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a component.\r\n\t *\r\n\t * @param {object} component\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {*} the build result.\r\n\t */\r\n\tcreateComponent(component, container, parent)\r\n\t{\r\n\t\tthis.setupComponent(component, container, parent);\r\n\t\treturn this.buildComponent(component);\r\n\t}\r\n\r\n\t/**\r\n * This will build an element or component and return an HTML string.\r\n *\r\n * @protected\r\n * @param {object} obj\r\n * @param {object} [parent] The component adding the layout.\r\n * @returns {*}\r\n */\r\n\tbuildElement(obj, parent)\r\n\t{\r\n\t\tif (!obj)\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tif (obj.isUnit === true)\r\n\t\t{\r\n\t\t\treturn this.createComponent(obj, parent);\r\n\t\t}\r\n\r\n\t\treturn this.createElement(obj, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create an element and return an HTML string.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} obj\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @returns {string} The HTML string.\r\n\t */\r\n\tcreateElement(obj, parent)\r\n\t{\r\n\t\tconst settings = Parser.parse(obj, parent);\r\n\r\n\t\tconst childrenHtml = settings.children\r\n\t\t\t.map(child => (child !== null ? this.buildElement(child, parent) : ''))\r\n\t\t\t.join('');\r\n\r\n\t\treturn this.createNode(settings, childrenHtml);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a node.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @param {string} childrenHtml\r\n\t * @returns {object}\r\n\t */\r\n\tcreateNode(settings, childrenHtml)\r\n\t{\r\n\t\tconst tag = settings.tag;\r\n\t\tif (tag === 'text')\r\n\t\t{\r\n\t\t\tconst child = settings.attr[0];\r\n\t\t\tconst text = (child)? child.value : '';\r\n\t\t\treturn HtmlToString.createText(text);\r\n\t\t}\r\n\t\telse if (tag === 'comment')\r\n\t\t{\r\n\t\t\tconst child = settings.attr[0];\r\n\t\t\tconst text = (child)? child.value : '';\r\n\t\t\treturn HtmlToString.createComment(text);\r\n\t\t}\r\n\r\n\t\treturn HtmlToString.create(tag, settings.attr, childrenHtml);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove all the children from an element.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @returns {void}\r\n\t */\r\n\tremoveAll(ele)\r\n\t{\r\n\r\n\t}\r\n}", "import { BrowserRender } from './browser-render.js';\r\nimport { ServerRender } from './server-render.js';\r\n\r\n/**\r\n * RenderController\r\n *\r\n * This will set up the render engine.\r\n *\r\n * @class\r\n */\r\nexport class RenderController\r\n{\r\n /**\r\n * This will check if we are in the browser.\r\n *\r\n * @returns {boolean}\r\n */\r\n static browserIsSupported()\r\n {\r\n return (typeof window !== 'undefined' && typeof document === 'object');\r\n }\r\n\r\n /**\r\n * This will create a History Object based on navigation support\r\n *\r\n * @returns Render\r\n */\r\n static setup()\r\n {\r\n if (this.browserIsSupported())\r\n {\r\n return new BrowserRender();\r\n }\r\n\r\n return new ServerRender();\r\n }\r\n}", "import { base } from '../../main/base.js';\r\nimport { Jot } from \"../component/jot.js\";\r\nimport { RenderController } from './render/render-controller.js';\r\n\r\n/**\r\n * This will set up the render engine.\r\n */\r\nconst render = RenderController.setup();\r\n\r\n/**\r\n * This will check if the layout is a component.\r\n *\r\n * @param {object} layout\r\n * @returns {boolean}\r\n */\r\nconst isComponent = (layout) => (typeof layout === 'object' && layout.isUnit === true);\r\n\r\n/**\r\n * This will create a Jot component.\r\n *\r\n * @param {object} layout\r\n * @returns {object}\r\n */\r\nconst createJotComponent = (layout) =>\r\n{\r\n\tconst Component = Jot(layout);\r\n\treturn new Component();\r\n};\r\n\r\n/**\r\n * Builder\r\n *\r\n * This will build JSON layouts.\r\n *\r\n * @class\r\n */\r\nexport class Builder\r\n{\r\n\t/**\r\n\t * This will render a function/Unit/Component.\r\n\t *\r\n\t * @param {object|function} layout\r\n\t * @param {object} container\r\n\t * @param {object} [parent]\r\n\t * @returns {*} The render result.\r\n\t */\r\n\tstatic render(layout, container, parent)\r\n\t{\r\n\t\tif (!layout)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (!isComponent(layout))\r\n\t\t{\r\n\t\t\tlayout = createJotComponent(layout);\r\n\t\t}\r\n\r\n\t\treturn render.createComponent(layout, container, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will build a JSON layout.\r\n\t *\r\n\t * @param {object} obj The JSON layout.\r\n\t * @param {object} [container] The parent receiving the layout.\r\n\t * @param {object} [parent] The component adding the layout.\r\n\t * @returns {*} The render result.\r\n\t */\r\n\tstatic build(obj, container, parent)\r\n\t{\r\n\t\treturn render.build(obj, container, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will rebuild a layout.\r\n\t *\r\n\t * @param {object} layout\r\n\t * @param {object} ele\r\n\t * @param {object} parent\r\n\t * @returns {object}\r\n\t */\r\n\tstatic rebuild(layout, ele, parent)\r\n\t{\r\n\t\trender.removeAll(ele);\r\n\t\treturn this.build(layout, ele, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the element directives.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @param {array} directives\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tstatic setDirectives(ele, directives, parent)\r\n\t{\r\n\t\trender.setDirectives(ele, directives, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a node.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {object}\r\n\t */\r\n\tstatic createNode(settings, container, parent)\r\n\t{\r\n\t\treturn render.createNode(settings, container, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a node.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {void}\r\n\t */\r\n\tstatic removeNode(node)\r\n\t{\r\n\t\trender.removeNode(node);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove all children from an element.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @returns {void}\r\n\t */\r\n\tstatic removeAll(ele)\r\n\t{\r\n\t\trender.removeAll(ele);\r\n\t}\r\n}\r\n\r\nbase.augment(\r\n{\r\n\t/**\r\n\t * This will build a JSON layout.\r\n\t *\r\n\t * @param {object} obj\r\n\t * @param {object} [container]\r\n\t * @param {object} [parent]\r\n\t * @returns {object}\r\n\t */\r\n\tbuildLayout(obj, container, parent)\r\n\t{\r\n\t\tBuilder.build(obj, container, parent);\r\n\t}\r\n});", "import { Builder } from '../layout/builder.js';\r\n\r\n/**\r\n * This will track previously loaded scripts and styles.\r\n *\r\n * @type {Array<string>}\r\n */\r\nconst loaded = [];\r\n\r\n/**\r\n * This will check if a script or style has been loaded.\r\n *\r\n * @param {string} src\r\n * @returns {boolean}\r\n */\r\nconst isLoaded = (src) => loaded.indexOf(src) !== -1;\r\n\r\n/**\r\n * This will create a script atom.\r\n *\r\n * @param {object} props\r\n * @returns {object}\r\n */\r\nconst Script = (props) => ({\r\n\ttag: 'script',\r\n\tsrc: props.src,\r\n\tasync: false,\r\n\tload(e)\r\n\t{\r\n\t\tloaded.push(props.src);\r\n\r\n\t\tconst callBack = props.load;\r\n\t\tif (callBack)\r\n\t\t{\r\n\t\t\tcallBack();\r\n\t\t}\r\n\t}\r\n});\r\n\r\n/**\r\n * This will create a style atom.\r\n *\r\n * @param {object} props\r\n * @returns {object}\r\n */\r\nconst Style = (props) => ({\r\n\ttag: 'link',\r\n\trel: 'stylesheet',\r\n\ttype: 'text/css',\r\n\thref: props.src,\r\n\tload(e)\r\n\t{\r\n\t\tloaded.push(props.src);\r\n\r\n\t\tconst callBack = props.load;\r\n\t\tif (callBack)\r\n\t\t{\r\n\t\t\tcallBack();\r\n\t\t}\r\n\t}\r\n});\r\n\r\n/**\r\n * Group\r\n *\r\n * This will setup a depends group to load all\r\n * dependencies before loaded the script.\r\n *\r\n * @class\r\n */\r\nexport class Group\r\n{\r\n\t/**\r\n\t * This will create a group.\r\n\t *\r\n\t * @param {function} callBack\r\n\t */\r\n\tconstructor(callBack)\r\n\t{\r\n\t\t/**\r\n\t\t * @member {number} percent\r\n\t\t */\r\n\t\tthis.percent = 0;\r\n\r\n\t\t/**\r\n\t\t * @member {number} loaded\r\n\t\t */\r\n\t\tthis.loaded = 0;\r\n\r\n\t\t/**\r\n\t\t * @member {number} total\r\n\t\t */\r\n\t\tthis.total = 0;\r\n\r\n\t\t/**\r\n\t\t * @member {function} callBack\r\n\t\t */\r\n\t\tthis.callBack = callBack || null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the resource to the document.\r\n\t *\r\n\t * @param {string} src\r\n\t * @returns {void}\r\n\t */\r\n\tadd(src)\r\n\t{\r\n\t\tthis.total++;\r\n\t\tlet atom;\r\n\r\n\t\tconst load = this.update.bind(this);\r\n\t\tif (src.indexOf('.css') !== -1)\r\n\t\t{\r\n\t\t\tatom = Style({\r\n\t\t\t\tload,\r\n\t\t\t\tsrc\r\n\t\t\t});\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tatom = Script({\r\n\t\t\t\tload,\r\n\t\t\t\tsrc\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tBuilder.build(atom, document.head);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the dependencies to the document.\r\n\t *\r\n\t * @param {Array<string>} files\r\n\t * @returns {void}\r\n\t */\r\n\taddFiles(files)\r\n\t{\r\n\t\tif (!files)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfiles.forEach(src =>\r\n\t\t{\r\n\t\t\tif (!isLoaded(src))\r\n\t\t\t{\r\n\t\t\t\tthis.add(src);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the progress.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tupdate()\r\n\t{\r\n\t\tconst percent = this.updateProgress();\r\n\t\tif (percent < 100)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst callBack = this.callBack;\r\n\t\tif (callBack)\r\n\t\t{\r\n\t\t\tcallBack();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the progress.\r\n\t *\r\n\t * @returns {number}\r\n\t */\r\n\tupdateProgress()\r\n\t{\r\n\t\t++this.loaded;\r\n\t\treturn (this.percent = Math.floor(this.loaded / this.total * 100));\r\n\t}\r\n}", "import { Builder } from '../layout/builder.js';\r\n\r\n/**\r\n * This will check if an object is a contructor.\r\n *\r\n * @param {object|function} object\r\n * @returns {boolean}\r\n */\r\nconst isConstructor = (object) =>\r\n{\r\n if (!object)\r\n {\r\n return false;\r\n }\r\n\r\n return (typeof object?.prototype?.constructor === 'function');\r\n};\r\n\r\n/**\r\n * LayoutManager\r\n *\r\n * This will process the layout for the component or atom.\r\n *\r\n * @class\r\n */\r\nexport class LayoutManager\r\n{\r\n\t/**\r\n\t * Processes and configures a layout from a module.\r\n\t *\r\n\t * @param {object} module\r\n\t * @param {object} config\r\n\t * @returns {object|null}\r\n\t */\r\n\tstatic process(module, config)\r\n\t{\r\n\t\tlet layout = module.default;\r\n\t\tif (!layout)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (config.callback)\r\n\t\t{\r\n\t\t\treturn config.callback(layout);\r\n\t\t}\r\n\r\n\t\tif (isConstructor(layout))\r\n\t\t{\r\n\t\t\tlayout = new layout();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tlayout = layout();\r\n\t\t}\r\n\r\n\t\tif (layout.isUnit === true)\r\n\t\t{\r\n\t\t\tlayout.route = config.route;\r\n\r\n\t\t\tif (config.persist)\r\n\t\t\t{\r\n\t\t\t\tlayout.persist = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn layout;\r\n\t}\r\n\r\n /**\r\n * This will render the layout to the DOM.\r\n *\r\n * @param {object} layout\r\n * @param {object} element\r\n * @param {object} parent\r\n * @return {object|null}\r\n */\r\n static render(layout, element, parent)\r\n\t{\r\n\t\tconst fragment = Builder.build(layout, null, parent);\r\n\t\tconst firstChild = fragment.firstChild || layout?.panel;\r\n\t\telement.after(fragment);\r\n\t\treturn firstChild;\r\n\t}\r\n}", "/**\r\n * ModuleLoader\r\n *\r\n * This will load a module from a source.\r\n *\r\n * @class\r\n */\r\nexport class ModuleLoader\r\n{\r\n\t/**\r\n\t * Loads a module from a source.\r\n\t *\r\n\t * @param {Promise} modulePromise\r\n\t * @param {function} callback\r\n\t * @returns {Promise}\r\n\t */\r\n\tstatic load(modulePromise, callback)\r\n\t{\r\n\t\treturn modulePromise.then(module =>\r\n\t\t{\r\n\t\t\tif (callback)\r\n\t\t\t{\r\n\t\t\t\tcallback(module);\r\n\t\t\t}\r\n\t\t\treturn module;\r\n\t\t})\r\n\t\t.catch(error =>\r\n\t\t{\r\n\t\t\tconsole.error('Error loading module:', error);\r\n\t\t});\r\n\t}\r\n}", "import { Component } from \"../component/component.js\";\r\nimport { Jot } from \"../component/jot.js\";\r\nimport { Builder } from '../layout/builder.js';\r\nimport { Group } from \"./group.js\";\r\nimport { LayoutManager } from \"./layout-manager.js\";\r\nimport { ModuleLoader } from \"./module-loader.js\";\r\n\r\n/**\r\n * This will create a comment.\r\n *\r\n * @param {object} props\r\n * @returns {object}\r\n */\r\nconst Comment = (props) => ({\r\n\ttag: 'comment',\r\n\ttextContent: 'import placeholder',\r\n\tonCreated: props.onCreated\r\n});\r\n\r\n/**\r\n * This will get the promise from the src.\r\n *\r\n * @param {object|string} src\r\n * @returns {Promise}\r\n */\r\nconst getPromise = (src) =>\r\n{\r\n\tconst type = typeof src\r\n\tif (type === 'string')\r\n\t{\r\n\t\treturn import(src);\r\n\t}\r\n\telse if (type === 'function')\r\n\t{\r\n\t\treturn src();\r\n\t}\r\n\treturn src;\r\n};\r\n\r\n/**\r\n * ImportWrapper\r\n *\r\n * This will create an import wrapper component that\r\n * will wrap the comment atom to pass route to the\r\n * imported layout.\r\n *\r\n * @type {typeof Component}\r\n */\r\nexport const ImportWrapper = Jot(\r\n{\r\n\t/**\r\n\t * This will declare the component props.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tdeclareProps()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {boolean}\r\n\t\t */\r\n\t\tthis.loaded = false;\r\n\r\n\t\t/**\r\n\t\t * @member {boolean}\r\n\t\t */\r\n\t\tthis.blockRender = false;\r\n\t},\r\n\r\n\t/**\r\n\t * This will render the import wrapper.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\t/**\r\n\t\t * This will create a comment atom to be replaced\r\n\t\t * by the module.\r\n\t\t */\r\n\t\treturn Comment(\r\n\t\t{\r\n\t\t\tonCreated: (ele) =>\r\n\t\t\t{\r\n\t\t\t\tconst src = this.src;\r\n\t\t\t\tif (!src)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this.layout)\r\n\t\t\t\t{\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * This will cache the layout root to be removed\r\n\t\t\t\t\t * before the module is destroyed.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tthis.layoutRoot = LayoutManager.render(this.layout, this.panel, this.parent);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * This will set up a resource group to load the\r\n\t\t\t\t * depends before the module.\r\n\t\t\t\t */\r\n\t\t\t\tif (this.depends)\r\n\t\t\t\t{\r\n\t\t\t\t\tconst group = new Group(() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis.loadAndRender(ele);\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tgroup.addFiles(this.depends);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.loadAndRender(ele);\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * This will load the module and render the layout.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @returns {void}\r\n\t */\r\n\tloadAndRender(ele)\r\n\t{\r\n\t\tthis.src = getPromise(this.src);\r\n\t\tModuleLoader.load(this.src, (module) =>\r\n\t\t{\r\n\t\t\tthis.loaded = true;\r\n\r\n\t\t\t/**\r\n\t\t\t * We don't want to render if the render has been blocked\r\n\t\t\t * by the destroy method.\r\n\t\t\t */\r\n\t\t\tif (this.blockRender === true)\r\n\t\t\t{\r\n\t\t\t\tthis.blockRender = false;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst layout = this.layout || LayoutManager.process(module,\r\n\t\t\t{\r\n\t\t\t\tcallback: this.callback,\r\n\t\t\t\troute: this.route,\r\n\t\t\t\tpersist: this.persist\r\n\t\t\t});\r\n\r\n\t\t\tthis.layout = layout;\r\n\r\n\t\t\t/**\r\n\t\t\t * This will cache the layout root to be removed\r\n\t\t\t * before the module is destroyed.\r\n\t\t\t */\r\n\t\t\tthis.layoutRoot = LayoutManager.render(layout, ele, this.parent);\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * This will check if the layout should be updated.\r\n\t *\r\n\t * @param {object} layout\r\n\t * @returns {boolean}\r\n\t */\r\n\tshouldUpdate(layout)\r\n\t{\r\n\t\tif (this.updateLayout === true)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn (this.updateLayout = (layout && layout.isUnit && typeof layout.update === 'function'));\r\n\t},\r\n\r\n\t/**\r\n\t * This will update the module layout.\r\n\t *\r\n\t * @param {object} params\r\n\t * @returns {void}\r\n\t */\r\n\tupdateModuleLayout(params)\r\n\t{\r\n\t\tconst layout = this.layout;\r\n\t\tif (this.shouldUpdate(layout) && layout)\r\n\t\t{\r\n\t\t\tlayout.update(params);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will call if the import is added to a route. This will pass\r\n\t * the update params to the imported layout.\r\n\t *\r\n\t * @param {object} params\r\n\t * @returns {void}\r\n\t */\r\n\tupdate(params)\r\n\t{\r\n\t\tif (this.loaded === true)\r\n\t\t{\r\n\t\t\tthis.updateModuleLayout(params);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove the imported layout when the\r\n\t * comment is being removed.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tdestroy()\r\n\t{\r\n\t\tif (!this.layoutRoot)\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * The layout has been requested to load and now is called\r\n\t\t\t * destroy before the module has loaded.\r\n\t\t\t *\r\n\t\t\t * We will block the render and exit now.\r\n\t\t\t */\r\n\t\t\tthis.blockRender = true;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.blockRender = false;\r\n\t\tBuilder.removeNode(this.layoutRoot);\r\n\r\n\t\t/**\r\n\t\t * Clear all references to allow garbage collection.\r\n\t\t */\r\n\t\tthis.layoutRoot = null;\r\n\t\tthis.layout = null;\r\n\t\tthis.src = null;\r\n\t\tthis.route = null;\r\n\t\tthis.callback = null;\r\n\t\tthis.depends = null;\r\n\t}\r\n});", "import { ImportWrapper } from './import-wrapper.js';\r\n\r\n/**\r\n * This will import a module.\r\n *\r\n * @param {object|string} props\r\n * @returns {object}\r\n */\r\nexport const Import = (props) =>\r\n{\r\n\tconst type = typeof props;\r\n\tif (type === 'string' || type === 'function' || props instanceof Promise)\r\n\t{\r\n\t\tprops = {\r\n\t\t\tsrc: props\r\n\t\t};\r\n\t}\r\n\r\n\treturn new ImportWrapper(props);\r\n};", "import { Dom } from \"../../../../../base.js\";\r\nimport { DataTracker } from \"../../../../../main/data-tracker/data-tracker.js\";\r\nimport { Events } from \"../../../../../main/events/events.js\";\r\n\r\n/**\r\n * This will add the aniamtion class then remove it\r\n * when the aniamtion has ended.\r\n *\r\n * @param {object} ele\r\n * @param {string} className\r\n * @param {function|null} doneCallBack\r\n * @returns {void}\r\n */\r\nconst addAnimationClass = (ele, className, doneCallBack = null) =>\r\n{\r\n\tEvents.on('animationend', ele, function animateEnd()\r\n\t{\r\n\t\tDom.removeClass(ele, className);\r\n\t\tEvents.off('animationend', ele, animateEnd);\r\n\r\n\t\tif (doneCallBack)\r\n\t\t{\r\n\t\t\tdoneCallBack();\r\n\t\t}\r\n\t});\r\n\r\n\tDom.addClass(ele, className);\r\n};\r\n\r\n/**\r\n * This will add the animation on creation.\r\n *\r\n * @param {object} ele\r\n * @param {string} animationClass\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const animateIn = (ele, animationClass, parent) =>\r\n{\r\n\taddAnimationClass(ele, animationClass);\r\n};\r\n\r\n/**\r\n * This will add the animation on deletion.\r\n *\r\n * @param {object} ele\r\n * @param {string} animationClass\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const animateOut = (ele, animationClass, parent) =>\r\n{\r\n\tconst remove = () => (ele && ele.remove());\r\n\ttrack(ele, () => addAnimationClass(ele, animationClass, remove), parent);\r\n};\r\n\r\n/**\r\n * This will register the directive with the data tracker\r\n * to call the callback when the element is destroyed.\r\n */\r\nDataTracker.addType('manual-destroy', (data) =>\r\n{\r\n\tif (!data)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\tdata.callBack(data.ele, data.parent);\r\n});\r\n\r\n/**\r\n * This will track the animation to add the animation before destroy.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nconst track = (ele, callBack, parent) =>\r\n{\r\n\tDataTracker.add(ele, 'manual-destroy',\r\n\t{\r\n\t\tele,\r\n\t\tcallBack,\r\n\t\tparent\r\n\t});\r\n};", "import { Dom } from \"../../../../shared/dom.js\";\r\nimport { dataBinder } from \"../../../data-binder/data-binder.js\";\r\nimport { getBindAttr } from \"../../../data-binder/sources/get-bind-attr.js\";\r\nimport { Html } from \"../../../html/html.js\";\r\nimport { Builder } from \"../../builder.js\";\r\n\r\n/**\r\n * This will setup a data watcher.\r\n *\r\n * @param {object} ele\r\n * @param {object} data\r\n * @param {(function|object)} settings\r\n * @param {string} parent\r\n * @returns {void}\r\n */\r\nexport const onUpdate = (ele, data, settings, parent) =>\r\n{\r\n\tif (Array.isArray(settings[0]))\r\n\t{\r\n\t\tsettings.forEach((itemSettings) =>\r\n\t\t{\r\n\t\t\tif (!itemSettings)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tonUpdate(ele, data, itemSettings, parent);\r\n\t\t});\r\n\r\n\t\treturn;\r\n\t}\r\n\r\n\tsetWatcher(ele, data, settings, parent);\r\n};\r\n\r\n/**\r\n * This will setup a data watcher.\r\n *\r\n * @param {object} ele\r\n * @param {object} data\r\n * @param {array} settings\r\n * @param {string} parent\r\n * @returns {void}\r\n */\r\nconst setWatcher = (ele, data, settings, parent) =>\r\n{\r\n\tlet prop,\r\n\tcallBack;\r\n\r\n\tif (settings.length < 3)\r\n\t{\r\n\t\t[prop, callBack] = settings;\r\n\t}\r\n\telse\r\n\t{\r\n\t\t[data, prop, callBack] = settings;\r\n\t}\r\n\r\n\tif (!data || !prop)\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst update = getUpdateMethod(ele, prop, callBack, parent);\r\n\tdataBinder.watch(ele, data, prop, update);\r\n};\r\n\r\n/**\r\n * This will get the update method.\r\n *\r\n * @param {object} ele\r\n * @param {object} prop\r\n * @param {*} callBack\r\n * @param {object} parent\r\n * @returns {function}\r\n */\r\nconst getUpdateMethod = (ele, prop, callBack, parent) =>\r\n{\r\n\tif (typeof callBack === 'object')\r\n\t{\r\n\t\treturn (value) =>\r\n\t\t{\r\n\t\t\taddClass(ele, callBack, value);\r\n\t\t};\r\n\t}\r\n\r\n\treturn (value) =>\r\n\t{\r\n\t\tupdateElement(ele, callBack, prop, value, parent);\r\n\t};\r\n};\r\n\r\n/**\r\n * This will setup a data watcher.\r\n *\r\n * @private\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {string} value\r\n * @param {object} parent\r\n */\r\nconst updateElement = (ele, callBack, prop, value, parent) =>\r\n{\r\n\tlet result = callBack(value, ele, parent);\r\n\tswitch (typeof result)\r\n\t{\r\n\t\tcase 'object':\r\n\t\t\t/**\r\n\t\t\t * This will set the previous result if needed.\r\n\t\t\t */\r\n\t\t\trebuild(result, ele, parent);\r\n\t\t\tbreak;\r\n\t\tcase 'string':\r\n\t\t\tconst attr = getBindAttr(ele);\r\n\t\t\tif (attr !== 'textContent')\r\n\t\t\t{\r\n\t\t\t\tDom.setAttr(ele, attr, result);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tHtml.addHtml(ele, result);\r\n\t\t\tbreak;\r\n\t}\r\n};\r\n\r\n/**\r\n * This will reset an element innerHTML and rebuild.\r\n *\r\n * @private\r\n * @param {object} layout\r\n * @param {object} ele\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nconst rebuild = (layout, ele, parent) =>\r\n{\r\n\tBuilder.rebuild(layout, ele, parent);\r\n};\r\n\r\n/**\r\n * This will add or remove a class from an element.\r\n *\r\n * @param {object} ele\r\n * @param {object} stateStyles\r\n * @param {*} newValue\r\n * @returns {void}\r\n */\r\nconst addClass = (ele, stateStyles, newValue) =>\r\n{\r\n\tfor (const [prop, value] of Object.entries(stateStyles))\r\n\t{\r\n\t\tif (!prop)\r\n\t\t{\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (value === newValue)\r\n\t\t{\r\n\t\t\tDom.addClass(ele, prop);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tDom.removeClass(ele, prop);\r\n\t\t}\r\n\t}\r\n};", "import { onUpdate } from '../dom-methods.js';\r\nimport { getParentData } from './get-parent-data.js';\r\n\r\n/**\r\n * This will add an onSet watcher.\r\n *\r\n * @param {object} ele\r\n * @param {array} onSet\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const onSet = (ele, onSet, parent) =>\r\n{\r\n\tconst data = getParentData(parent);\r\n\tonUpdate(ele, data, onSet, parent);\r\n};", "import { Dom } from \"../../../../../shared/dom.js\";\r\nimport { onSet } from \"../reactive/on-set.js\";\r\n\r\n/**\r\n * This will add aria attributes.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {string} role\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addRole = (ele, role, parent) =>\r\n{\r\n if (!role)\r\n {\r\n return;\r\n }\r\n\r\n if (role)\r\n {\r\n Dom.setAttr(ele, 'role', role);\r\n }\r\n};\r\n\r\n/**\r\n * This will setup the onSet callBack.\r\n *\r\n * @param {string} attr\r\n * @returns {function}\r\n */\r\nconst onSetCallBack = (attr) =>\r\n{\r\n return (val, ele) =>\r\n {\r\n const text = (val)? \"true\" : \"false\";\r\n Dom.setAttr(ele, attr, text);\r\n };\r\n};\r\n\r\n/**\r\n * This will add aria attributes.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {object} attributes\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addAria = (ele, attributes, parent) =>\r\n{\r\n if (!attributes)\r\n {\r\n return;\r\n }\r\n\r\n const role = attributes.role;\r\n if (role)\r\n {\r\n Dom.setAttr(ele, 'role', role);\r\n attributes.role = null;\r\n }\r\n\r\n Object.entries(attributes).forEach(([key, value]) =>\r\n {\r\n if (value === null)\r\n {\r\n return;\r\n }\r\n\r\n const attr = `aria-${key}`;\r\n if (Array.isArray(value))\r\n {\r\n const settings = [...value];\r\n settings.push(onSetCallBack(attr));\r\n onSet(ele, settings, parent);\r\n }\r\n else\r\n {\r\n Dom.setAttr(ele, attr, value);\r\n }\r\n });\r\n}", "import { Builder } from \"../../builder.js\";\r\nimport { Parser } from \"../../element/parser.js\";\r\nimport { HtmlHelper } from \"../../html-helper.js\";\r\n\r\n/**\r\n * This will add the attributes to the element.\r\n *\r\n * @param {object} ele\r\n * @param {object} attributes\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addAttributes = (ele, attributes, parent) =>\r\n{\r\n if (!attributes)\r\n {\r\n return;\r\n }\r\n\r\n const parsed = Parser.parse(attributes, parent);\r\n HtmlHelper.addAttributes(ele, parsed.attr, parent);\r\n Builder.setDirectives(ele, parsed.directives, parent);\r\n};", "import { DataTracker } from \"../../../../../main/data-tracker/data-tracker.js\";\r\nimport { addAttributes } from \"../attribute-helpers.js\";\r\n\r\n/**\r\n * This will track the context from an atom to remove\r\n * it when the element is removed.\r\n */\r\nDataTracker.addType('context', (data) =>\r\n{\r\n\tif (!data)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\tdata.parent.removeContextBranch(data.branch);\r\n});\r\n\r\n/**\r\n * This will get the parent context.\r\n *\r\n * @param {object|null} parent\r\n * @returns {object|null}\r\n */\r\nconst getParentContext = (parent) =>\r\n{\r\n return (!parent)? null : parent.getContext();\r\n};\r\n\r\n/**\r\n * This will set the context attributes.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {function} context\r\n * @param {object} [parent]\r\n * @returns {void}\r\n */\r\nexport const context = (ele, context, parent) =>\r\n{\r\n if (typeof context !== 'function')\r\n {\r\n return;\r\n }\r\n\r\n const parentContext = getParentContext(parent);\r\n const attributes = context(parentContext);\r\n addAttributes(ele, attributes, parent);\r\n};\r\n\r\n/**\r\n * This will use the parent context.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} [parent]\r\n * @returns {void}\r\n */\r\nexport const useContext = (ele, callBack, parent) =>\r\n{\r\n if (typeof callBack !== 'function')\r\n {\r\n return;\r\n }\r\n\r\n const parentContext = getParentContext(parent);\r\n callBack(parentContext);\r\n};\r\n\r\n/**\r\n * This will add context the parent context.\r\n *\r\n * @param {object} ele\r\n * @param {array|function} callBack\r\n * @param {object} [parent]\r\n * @returns {void}\r\n */\r\nexport const addContext = (ele, callBack, parent) =>\r\n{\r\n if (typeof callBack !== 'function' || !parent)\r\n {\r\n return;\r\n }\r\n\r\n const parentContext = getParentContext(parent);\r\n const childContext = callBack(parentContext);\r\n if (!childContext)\r\n {\r\n return;\r\n }\r\n\r\n parent.addContextBranch(childContext[0], childContext[1]);\r\n}\r\n\r\n/**\r\n * This will track the child context on the element.\r\n *\r\n * @param {object} ele\r\n * @param {string} branchName\r\n * @param {object} parent\r\n */\r\nconst trackContext = (ele, branchName, parent) =>\r\n{\r\n DataTracker.add(ele, 'context',\r\n {\r\n branch: branchName,\r\n parent: parent\r\n });\r\n};", "/**\r\n * This is called whrn the data directive is used.\r\n *\r\n * @param {object} ele\r\n * @param {*} data\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const data = (ele, data, parent) =>\r\n{\r\n\r\n};", "/**\r\n * This will add an event to the parent events.\r\n *\r\n * @param {object} ele\r\n * @param {*} data\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const debug = (ele, data, parent) =>\r\n{\r\n if (!parent)\r\n {\r\n return;\r\n }\r\n\r\n const layout = (parent._layout)? parent._layout : parent.render();\r\n console.log('Debug: ', 'ele: ', ele);\r\n console.log('Data: ', data);\r\n console.log('Layout: ', layout);\r\n console.log('parent: ', parent);\r\n};", "import { Builder } from \"../../../builder.js\";\r\n\r\n/**\r\n * This will cache the element in the parent.\r\n *\r\n * @param {object} ele\r\n * @param {string} propName\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const cache = (ele, propName, parent) =>\r\n{\r\n // if (!propName || !parent)\r\n // {\r\n // return;\r\n // }\r\n\r\n // parent[propName] = ele;\r\n};\r\n\r\n/**\r\n * This will pass the parent state to the callBack.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const useParent = (ele, callBack, parent) =>\r\n{\r\n if (!callBack || !parent)\r\n {\r\n return;\r\n }\r\n\r\n const layout = callBack(parent, ele);\r\n if (!layout)\r\n {\r\n return;\r\n }\r\n\r\n Builder.build(layout, ele, parent);\r\n};\r\n\r\n/**\r\n * This will pass the parent state to the callBack.\r\n *\r\n * @param {object} ele\r\n * @param {string} name\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const getId = (ele, name, parent) =>\r\n{\r\n if (!name || !parent)\r\n {\r\n return;\r\n }\r\n\r\n const id = parent.getId(name);\r\n ele.id = id;\r\n};\r\n\r\n/**\r\n * This will pass the parent state to the callBack.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const useData = (ele, callBack, parent) =>\r\n{\r\n if (!callBack || !parent)\r\n {\r\n return;\r\n }\r\n\r\n const layout = callBack(parent.data, ele);\r\n if (!layout)\r\n {\r\n return;\r\n }\r\n\r\n Builder.build(layout, ele, parent);\r\n};\r\n\r\n/**\r\n * This will pass the parent state to the callBack.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const useState = (ele, callBack, parent) =>\r\n{\r\n if (!callBack || !parent)\r\n {\r\n return;\r\n }\r\n\r\n const layout = callBack(parent.state, ele);\r\n if (!layout)\r\n {\r\n return;\r\n }\r\n\r\n Builder.build(layout, ele, parent);\r\n};\r\n\r\n/**\r\n * This will pass the parent state to the callBack.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addState = (ele, callBack, parent) =>\r\n{\r\n if (!callBack || !parent)\r\n {\r\n return;\r\n }\r\n\r\n const state = parent.state;\r\n const states = callBack(state);\r\n if (!parent.state)\r\n {\r\n parent.setStateHelper(states);\r\n return;\r\n }\r\n\r\n parent.addState(states);\r\n};\r\n\r\n/**\r\n * This will add an event to the parent events.\r\n *\r\n * @param {object} ele\r\n * @param {array} event - event, element, function, capture\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addEvent = (ele, event, parent) =>\r\n{\r\n if (!event || !parent)\r\n {\r\n return;\r\n }\r\n\r\n if (!parent.events)\r\n {\r\n parent.setEventHelper();\r\n }\r\n\r\n /**\r\n * This will replace the callback funciton to pass\r\n * the parent and event.\r\n */\r\n if (event[2])\r\n {\r\n const callBack = event[2];\r\n event[2] = (e) =>\r\n {\r\n callBack(e, parent);\r\n };\r\n }\r\n\r\n parent.events.on(...event);\r\n};", "import { dataBinder } from '../../../../data-binder/data-binder.js';\r\nimport { getParentData } from './get-parent-data.js';\r\n\r\n/**\r\n * This will bind an element to data.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {(string|array)} bind\r\n * @param {*} parent\r\n * @returns {void}\r\n */\r\nexport const bind = (ele, bind, parent) =>\r\n{\r\n let data, prop, filter;\r\n\r\n if (typeof bind === 'string')\r\n {\r\n data = getParentData(parent);\r\n if (!data)\r\n {\r\n return;\r\n }\r\n prop = bind;\r\n }\r\n else if (Array.isArray(bind))\r\n {\r\n if ((typeof bind[0] !== 'object'))\r\n {\r\n const dataSource = getParentData(parent);\r\n if (!dataSource)\r\n {\r\n return;\r\n }\r\n\r\n bind.unshift(dataSource);\r\n }\r\n\r\n [data, prop, filter] = bind;\r\n }\r\n\r\n dataBinder.bind(ele, data, prop, filter);\r\n};", "import { onUpdate } from '../dom-methods.js';\r\n\r\n/**\r\n * This will add an onState watcher.\r\n *\r\n * @param {object} ele\r\n * @param {array} onState\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const onState = (ele, onState, parent) =>\r\n{\r\n onUpdate(ele, parent.state, onState, parent);\r\n};", "import { Dom } from \"../../../../../shared/dom.js\";\r\nimport { onSet } from \"../reactive/on-set.js\";\r\nimport { onState } from \"./on-state.js\";\r\n\r\n/**\r\n * This will setup the onSet callBack.\r\n *\r\n * @param {array} dataValue\r\n * @returns {function}\r\n */\r\nconst onSetCallBack = (dataValue) =>\r\n{\r\n return (newValue, ele) =>\r\n {\r\n const [attr, value, addingString = 'active'] = dataValue;\r\n const text = (newValue === value)? addingString : \"\";\r\n Dom.setData(ele, attr, text);\r\n };\r\n};\r\n\r\n/**\r\n * This will add data set attibute by binding to the data prop.\r\n *\r\n * @param {object} ele\r\n * @param {array} attribute\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addDataSet = (ele, attribute, parent) =>\r\n{\r\n if (!attribute)\r\n {\r\n return;\r\n }\r\n\r\n /**\r\n * This will remove the last value from the attribute array\r\n * to use as the data value.\r\n */\r\n const settings = [...attribute];\r\n const dataValue = settings.pop();\r\n\r\n /**\r\n * This will add a callBack to to be used when the\r\n * data is set.\r\n */\r\n settings.push(onSetCallBack(dataValue));\r\n onSet(ele, settings, parent);\r\n}\r\n\r\n/**\r\n * This will add data set attibute by binding to the data prop.\r\n *\r\n * @param {object} ele\r\n * @param {array} attribute\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addDataStateSet = (ele, attribute, parent) =>\r\n{\r\n if (!attribute)\r\n {\r\n return;\r\n }\r\n\r\n /**\r\n * This will remove the last value from the attribute array\r\n * to use as the data value.\r\n */\r\n const settings = [...attribute];\r\n const dataValue = settings.pop();\r\n\r\n /**\r\n * This will add a callBack to to be used when the\r\n * data is set.\r\n */\r\n settings.push(onSetCallBack(dataValue));\r\n onState(ele, settings, parent);\r\n}", "import { dataBinder } from \"../../../../data-binder/data-binder.js\";\r\nimport { Builder } from \"../../../builder.js\";\r\nimport { getParentData } from './get-parent-data.js';\r\n\r\n/**\r\n * This will watch a data attr and update the\r\n * children to the element when the attr value is updated.\r\n *\r\n * @param {object} ele\r\n * @param {array} settings\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const forEach = (ele, settings, parent) =>\r\n{\r\n let data, prop, item, scope;\r\n\r\n if (settings.length < 3)\r\n {\r\n const parentData = getParentData(parent);\r\n if (!parentData)\r\n {\r\n return;\r\n }\r\n\r\n data = parentData;\r\n [prop, item, scope] = settings;\r\n }\r\n else\r\n {\r\n [data, prop, item, scope] = settings;\r\n }\r\n\r\n const scopeData = (scope !== false);\r\n dataBinder.watch(ele, data, prop, (items) =>\r\n {\r\n Builder.removeAll(ele);\r\n if (!items || items.length < 1)\r\n {\r\n return;\r\n }\r\n\r\n const children = [];\r\n items.forEach((row, index) =>\r\n {\r\n const scoped = (scopeData)? data.scope(`${prop}[${index}]`) : null;\r\n const layout = item(\r\n items[index],\r\n index,\r\n scoped,\r\n children\r\n );\r\n if (layout === null)\r\n {\r\n return;\r\n }\r\n\r\n children.push(layout);\r\n });\r\n\r\n return Builder.build(children, ele, parent);\r\n });\r\n}", "import { Builder } from \"../../../builder.js\";\r\n\r\n/**\r\n * This will map children to the element.\r\n *\r\n * @param {object} ele\r\n * @param {array} settings\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const map = (ele, settings, parent) =>\r\n{\r\n\tconst items = settings[0];\r\n\tif (!items || items.length < 1)\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst item = settings[1];\r\n\tconst children = [];\r\n\r\n\titems.forEach((row, i) =>\r\n\t{\r\n\t\tif (!row)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst layout = item(row, i);\r\n\t\tif (layout === null)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tchildren.push(layout);\r\n\t});\r\n\r\n\tBuilder.build(children, ele, parent);\r\n};", "/**\r\n * This will be called when an element onCreated directive is called.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const onCreated = (ele, callBack, parent) =>\r\n{\r\n\tcallBack(ele, parent);\r\n};", "import { DataTracker } from \"../../../../../main/data-tracker/data-tracker.js\";\r\n\r\n/**\r\n * This will register the directive with the data tracker\r\n * to call the callback when the element is destroyed.\r\n */\r\nDataTracker.addType('destroyed', (data) =>\r\n{\r\n\tif (!data)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\tdata.callBack(data.ele, data.parent);\r\n});\r\n\r\n/**\r\n * This will add a callback to be called when\r\n * the element is destroyed.\r\n *\r\n * @param {object} ele\r\n * @param {(object|array)} callBack\r\n * @param {object} [parent]\r\n * @returns {void}\r\n */\r\nexport const onDestroyed = (ele, callBack, parent) =>\r\n{\r\n track(ele, callBack, parent);\r\n};\r\n\r\n/**\r\n * This will track a route.\r\n *\r\n * @param {object} ele\r\n * @param {function} callBack\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nconst track = (ele, callBack, parent) =>\r\n{\r\n DataTracker.add(ele, 'destroyed',\r\n {\r\n ele,\r\n callBack,\r\n parent\r\n });\r\n};", "import { WatcherHelper } from '../../../watcher-helper.js';\r\n\r\n/**\r\n * This will add a watcher.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {(array|object)} watcher\r\n * @param {object} [parent]\r\n * @returns {void}\r\n */\r\nexport const watch = (ele, watcher, parent) =>\r\n{\r\n if (!watcher)\r\n {\r\n return;\r\n }\r\n\r\n if (Array.isArray(watcher) && typeof watcher[0] !== 'string')\r\n {\r\n for (var i = 0, length = watcher.length; i < length; i++)\r\n {\r\n WatcherHelper.setup(ele, watcher[i], parent);\r\n }\r\n }\r\n else\r\n {\r\n WatcherHelper.setup(ele, watcher, parent);\r\n }\r\n};", "\r\nlet routerNumber = 0;\r\n\r\n/**\r\n * History\r\n *\r\n * This will setup the history controller.\r\n * @class\r\n */\r\nexport class History\r\n{\r\n\t/**\r\n\t * @constructor\r\n\t * @param {object} router\r\n\t */\r\n\tconstructor(router)\r\n\t{\r\n\t\tthis.router = router;\r\n\t\tthis.locationId = 'base-app-router-' + routerNumber++;\r\n\t\tthis.callBack = this.check.bind(this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if the history api is supported\r\n\t * and add events.\r\n\t *\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.addEvent();\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check to activate the router.\r\n\t *\r\n\t * @param {object} evt\r\n\t */\r\n\tcheck(evt)\r\n\t{\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the current scroll position.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tgetScrollPosition()\r\n\t{\r\n\t\treturn {\r\n\t\t\tx: window.scrollX,\r\n\t\t\ty: window.scrollY\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will scroll to a position.\r\n\t *\r\n\t * @param {object} scrollPosition\r\n\t * @returns {void}\r\n\t */\r\n\tscrollTo(scrollPosition)\r\n\t{\r\n\t\twindow.scrollTo(scrollPosition.x, scrollPosition.y);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\taddEvent()\r\n\t{\r\n\t\treturn this;\r\n\t}\r\n}", "import { Events } from \"../../../main/events/events.js\";\r\nimport { History } from \"./history.js\";\r\n\r\n/**\r\n * BrowserHistory\r\n *\r\n * This will setup the history controller.\r\n *\r\n * @class\r\n */\r\nexport class BrowserHistory extends History\r\n{\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\taddEvent()\r\n\t{\r\n\t\tEvents.on('popstate', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t *\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\tremoveEvent()\r\n\t{\r\n\t\tEvents.off('popstate', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check to activate the router.\r\n\t *\r\n\t * @param {object} evt\r\n\t */\r\n\tcheck(evt)\r\n\t{\r\n\t\t/* we want to check if the event has a state and if the\r\n\t\tstate location is from the background */\r\n\t\tconst state = evt.state;\r\n\t\tif (!state || state.location !== this.locationId)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tevt.preventDefault();\r\n\t\tevt.stopPropagation();\r\n\r\n\t\tthis.router.checkActiveRoutes(state.uri);\r\n\r\n\t\tconst scrollPosition = state.scrollPosition;\r\n\t\tif (scrollPosition)\r\n\t\t{\r\n\t\t\tthis.scrollTo(scrollPosition);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a state object.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {*} data\r\n\t * @returns {object}\r\n\t */\r\n\tcreateState(uri, data = {})\r\n\t{\r\n\t\tconst scrollPosition = this.getScrollPosition();\r\n\r\n\t\treturn {\r\n\t\t\tlocation: this.locationId,\r\n\t\t\t...data,\r\n\t\t\tscrollPosition,\r\n\t\t\turi\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a state to the history.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {object} data\r\n\t * @param {boolean} replace\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\taddState(uri, data, replace = false)\r\n\t{\r\n\t\tconst history = window.history,\r\n\t\tlastState = history.state;\r\n\t\tif (lastState && lastState.uri === uri)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst stateObj = this.createState(uri, data);\r\n\t\tconst method = (replace === false)? 'pushState' : 'replaceState';\r\n\t\thistory[method](stateObj, null, uri);\r\n\r\n\t\treturn this;\r\n\t}\r\n}", "import { Events } from \"../../../main/events/events.js\";\r\nimport { History } from \"./history.js\";\r\n\r\n/**\r\n * HashHistory\r\n *\r\n * This will setup the history controller.\r\n *\r\n * @class\r\n */\r\nexport class HashHistory extends History\r\n{\r\n\t/**\r\n\t * This will add the events.\r\n\t *\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\taddEvent()\r\n\t{\r\n\t\tEvents.on('hashchange', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the events.\r\n\t *\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\tremoveEvent()\r\n\t{\r\n\t\tEvents.off('hashchange', window, this.callBack);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check to activate the router.\r\n\t *\r\n\t * @param {object} evt\r\n\t */\r\n\tcheck(evt)\r\n\t{\r\n\t\tthis.router.checkActiveRoutes(evt.newURL);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a state to the history.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {object} data\r\n\t * @param {boolean} replace\r\n\t * @returns {object} a reference to the object.\r\n\t */\r\n\taddState(uri, data, replace)\r\n\t{\r\n\t\twindow.location.hash = uri;\r\n\r\n\t\treturn this;\r\n\t}\r\n}", "import { BrowserHistory } from './browser-history.js';\r\nimport { HashHistory } from './hash-history.js';\r\n\r\n/**\r\n * HistoryController\r\n *\r\n * This will setup the history controller.\r\n *\r\n * @class\r\n */\r\nexport class HistoryController\r\n{\r\n /**\r\n * This will check if browser based navigation is supported\r\n *\r\n * @returns {boolean}\r\n */\r\n static browserIsSupported()\r\n {\r\n return (typeof window === 'object' && 'history' in window && 'pushState' in window.history);\r\n }\r\n\r\n /**\r\n * This will create a History Object based on navigation support\r\n *\r\n * @param {object} router\r\n * @returns {object}\r\n */\r\n static setup(router)\r\n {\r\n if (this.browserIsSupported())\r\n {\r\n return new BrowserHistory(router).setup();\r\n }\r\n\r\n return new HashHistory(router).setup();\r\n }\r\n}", "import { Component } from \"./component.js\";\r\nimport { Jot } from \"./jot.js\";\r\n\r\n/**\r\n * Cloak Component\r\n *\r\n * This will create a component that can accept data from a parent component\r\n * or it will use the parent's data or context data to set a local context\r\n * to act as if it's data scope is the parent component.\r\n *\r\n * @type {typeof Component}\r\n */\r\nexport class CloakComponent extends Component\r\n{\r\n\t/**\r\n\t * This will get the child scope instance of the component.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tgetChildScope()\r\n\t{\r\n\t\treturn this.parent;\r\n\t}\r\n}\r\n\r\n/**\r\n * This will create a Cloak component.\r\n *\r\n * @param {*} props\r\n * @returns {typeof CloakComponent}\r\n */\r\nexport const Cloak = (props) => Jot(props, CloakComponent);\r\n", "import { Cloak } from \"../../component/cloak.js\";\r\nimport { Builder } from \"../../layout/builder.js\";\r\n\r\n/**\r\n * ComponentHelper\r\n *\r\n * This will create a helper to create and destroy components\r\n * that are added to a route.\r\n *\r\n * @class\r\n */\r\nexport class ComponentHelper\r\n{\r\n\t/**\r\n\t * This will create a component helper.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} routeProxy\r\n\t * @param {object} settings\r\n\t */\r\n\tconstructor(routeProxy, settings)\r\n\t{\r\n\t\tthis.route = routeProxy;\r\n\r\n\t\tthis.originalTemplate = settings.component;\r\n\t\tthis.template = settings.component;\r\n\t\tthis.component = null;\r\n\t\tthis.hasTemplate = false;\r\n\r\n\t\tthis.setup = false;\r\n\t\tthis.container = settings.container;\r\n\t\tthis.persist = settings.persist;\r\n\t\tthis.parent = settings.parent;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create the component.\r\n\t *\r\n\t * @param {object} params\r\n\t * @returns {void}\r\n\t */\r\n\tfocus(params)\r\n\t{\r\n\t\tif (this.setup === false)\r\n\t\t{\r\n\t\t\tthis.create();\r\n\t\t}\r\n\r\n\t\tthis.update(params);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the template.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetupTemplate()\r\n\t{\r\n\t\tconst template = this.template;\r\n\t\tconst type = typeof template;\r\n\t\tif (type === 'function')\r\n\t\t{\r\n\t\t\tthis.initializeComponent();\r\n\t\t}\r\n\t\telse if (type === 'object')\r\n\t\t{\r\n\t\t\tthis.initializeTemplateObject();\r\n\t\t}\r\n\r\n\t\tthis.hasTemplate = true;\r\n\t}\r\n\r\n\t/**\r\n\t * This will initialize the component by calling the function\r\n\t * that should return a new instance of a component.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tinitializeComponent()\r\n\t{\r\n\t\tconst comp = this.template();\r\n this.transferSettings(comp);\r\n }\r\n\r\n\t/**\r\n\t * This will transfer the settings to the component.\r\n\t *\r\n\t * @param {object} comp\r\n\t * @returns {void}\r\n\t */\r\n\ttransferSettings(comp)\r\n\t{\r\n\t\tthis.persist = (this.persist && comp.persist !== false);\r\n Object.assign(comp, { route: this.route, persist: this.persist });\r\n\t\tthis.component = comp;\r\n\t}\r\n\r\n\t/**\r\n\t * This will initialize the template object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tinitializeTemplateObject()\r\n\t{\r\n if (!this.template.isUnit)\r\n\t\t{\r\n this.template = new (Cloak(this.template));\r\n }\r\n\r\n const comp = this.template;\r\n this.transferSettings(comp);\r\n }\r\n\r\n\t/**\r\n\t * This will create the route component.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tcreate()\r\n\t{\r\n\t\tthis.setupTemplate();\r\n\r\n\t\tif (!this.hasTemplate)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.setup = true;\r\n\t\tconst comp = this.component;\r\n\t\tBuilder.render(comp, this.container, this.parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the component.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tremove()\r\n\t{\r\n\t\tif (this.setup !== true)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.setup = false;\r\n\r\n\t\tconst component = this.component;\r\n\t\tif (!component)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (typeof component.destroy === 'function')\r\n\t\t{\r\n\t\t\tcomponent.destroy();\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Clear component reference and reset state to allow\r\n\t\t * the component to be recreated if the route is selected again.\r\n\t\t */\r\n\t\tthis.component = null;\r\n\t\tthis.template = this.originalTemplate;\r\n\t\tthis.hasTemplate = false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will call the component update method and pass the params.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} params\r\n\t * @returns {void}\r\n\t */\r\n\tupdate(params)\r\n\t{\r\n\t\tconst component = this.component;\r\n\t\tif (!component)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (typeof component.update === 'function')\r\n\t\t{\r\n\t\t\tcomponent.update(params);\r\n\t\t}\r\n\t}\r\n}", "/**\r\n * This will get the default route params.\r\n *\r\n * @param {array} params\r\n * @returns {(object|null)}\r\n */\r\nexport const getParamDefaults = (params) =>\r\n{\r\n\tif (!params.length)\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst defaults = {};\r\n\tparams.forEach((param) =>\r\n\t{\r\n\t\tdefaults[param] = null;\r\n\t});\r\n\r\n\treturn defaults;\r\n};\r\n\r\n/**\r\n * This will get the param keys from the uri.\r\n *\r\n * @param {string} uri\r\n * @returns {array}\r\n */\r\nexport const paramPattern = (uri) =>\r\n{\r\n\tconst params = [];\r\n\tif (!uri)\r\n\t{\r\n\t\treturn params;\r\n\t}\r\n\r\n\tconst filter = /[*?]/g;\r\n\turi = uri.replace(filter, '');\r\n\r\n\tconst pattern = /:(.[^./?&($]+)\\?*/g,\r\n\tmatches = uri.match(pattern);\r\n\tif (matches === null)\r\n\t{\r\n\t\treturn params;\r\n\t}\r\n\r\n\tmatches.forEach((param) =>\r\n\t{\r\n\t\tif (param)\r\n\t\t{\r\n\t\t\tparam = param.replace(':', '');\r\n\t\t\tparams.push(param);\r\n\t\t}\r\n\t});\r\n\r\n\treturn params;\r\n};", "/**\r\n * Replaces all slashes in the URI.\r\n *\r\n * @param {string} uri - The URI to process.\r\n * @returns {string} - The processed URI.\r\n */\r\nconst replaceSlashes = (uri) => uri.replace(/\\//g, \"/\");\r\n\r\n/**\r\n * Sets up optional slashes before the optional params.\r\n *\r\n * @param {string} uriQuery - The URI query to process.\r\n * @returns {string} - The processed URI query.\r\n */\r\nconst setupOptionalSlashes = (uriQuery) =>\r\n{\r\n\treturn uriQuery.replace(/(\\/):[^/(]*?\\?/g, (str) => str.replace(/\\//g, '(?:$|/)'));\r\n};\r\n\r\n/**\r\n * Sets up optional params and params and stops at the last slash or query start.\r\n *\r\n * @param {string} uriQuery - The URI query to process.\r\n * @returns {string} - The processed URI query.\r\n */\r\nconst setupOptionalParams = (uriQuery) =>\r\n{\r\n uriQuery = uriQuery.replace(/(\\?\\/+\\*?)/g, '?/*');\r\n return uriQuery.replace(/(:[^/?&($]+)/g, (str) => (str.indexOf('.') < 0) ? '([^/|?]+)' : '([^/|?]+.*)');\r\n};\r\n\r\n/**\r\n * Sets up the wildcard and param checks to be modified to the route URI string.\r\n *\r\n * @param {string} uriQuery - The URI query to process.\r\n * @returns {string} - The processed URI query.\r\n */\r\nconst setupWildcard = (uriQuery) => uriQuery.replace(/(\\*)/g, '.*');\r\n\r\n/**\r\n * Sets the string end if the wildcard is not set.\r\n *\r\n * @param {string} uriQuery - The URI query to process.\r\n * @param {string} uri - The original URI.\r\n * @returns {string} - The processed URI query.\r\n */\r\nconst setStringEnd = (uriQuery, uri) => uriQuery += (uri[uri.length - 1] === '*') ? '' : '$';\r\n\r\n/**\r\n * Sets up a route URI pattern.\r\n *\r\n * @param {string} uri - The URI to process.\r\n * @returns {string} - The processed URI pattern.\r\n */\r\nexport const routePattern = (uri) =>\r\n{\r\n if (!uri)\r\n\t{\r\n return '';\r\n }\r\n\r\n let uriQuery = replaceSlashes(uri);\r\n uriQuery = setupOptionalSlashes(uriQuery);\r\n uriQuery = setupOptionalParams(uriQuery);\r\n uriQuery = setupWildcard(uriQuery);\r\n uriQuery = setStringEnd(uriQuery, uri);\r\n return uriQuery;\r\n};", "import { DataProxy } from '../../data/data-proxy.js';\r\nimport { BasicData } from '../../data/types/basic-data.js';\r\nimport { Import } from '../../import/import.js';\r\nimport { ComponentHelper } from './component-helper.js';\r\nimport { getParamDefaults, paramPattern } from './param-pattern.js';\r\nimport { routePattern } from './route-pattern.js';\r\n\r\n/**\r\n * This will keep track of the route count.\r\n *\r\n * @type {number}\r\n */\r\nlet routeCount = 0;\r\n\r\n/**\r\n * Route\r\n *\r\n * This will create a route.\r\n *\r\n * @class\r\n * @augments BasicData\r\n */\r\nexport class Route extends BasicData\r\n{\r\n\t/**\r\n\t * This will create a route.\r\n\t *\r\n\t * @constructor\r\n\t * @param {object} settings\r\n\t * @param {function} titleCallBack\r\n\t */\r\n\tconstructor(settings, titleCallBack)\r\n\t{\r\n\t\tconst uri = settings.baseUri;\r\n\r\n\t\tconst paramKeys = paramPattern(uri);\r\n\t\tconst params = getParamDefaults(paramKeys);\r\n\t\tconst proxy = super(params);\r\n\r\n\t\tthis.uri = uri;\r\n\t\tthis.paramKeys = paramKeys;\r\n\t\tthis.titleCallBack = titleCallBack;\r\n\r\n\t\tthis.setupRoute(settings);\r\n\t\tthis.set('active', false);\r\n\r\n\t\t// @ts-ignore\r\n\t\treturn proxy;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the data object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetup()\r\n\t{\r\n\t\tthis.stage = {};\r\n\t\tthis.id = null;\r\n\t\tthis.uri = null;\r\n\t\tthis.uriQuery = null;\r\n\t\tthis.controller = null;\r\n\t\tthis.paramKeys = null;\r\n\t\tthis.titleCallBack = null;\r\n\t\tthis.path = null;\r\n\t\tthis.referralPath = null;\r\n\t\tthis.params = null;\r\n\t\tthis.callBack = null;\r\n\t\tthis.title = null;\r\n\t\tthis.preventScroll = false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the route settings.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} settings\r\n\t * @returns {void}\r\n\t */\r\n\tsetupRoute(settings)\r\n\t{\r\n\t\tthis.id = settings.id || 'bs-rte-' + routeCount++;\r\n\r\n\t\tthis.path = null;\r\n\t\tthis.referralPath = null;\r\n\r\n\t\t/* route reg ex */\r\n\t\tlet uriMatch = routePattern(this.uri);\r\n\t\tthis.uriQuery = new RegExp('^' + uriMatch);\r\n\r\n\t\t/* params */\r\n\t\tthis.params = null;\r\n\r\n\t\t/* this will setup the template and route component\r\n\t\tif one has been set */\r\n\t\tthis.setupComponentHelper(settings);\r\n\r\n\t\tthis.callBack = settings.callBack;\r\n\t\tthis.title = settings.title;\r\n\t\tthis.preventScroll = settings.preventScroll || false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the route title.\r\n\t *\r\n\t * @param {string|function} title\r\n\t * @returns {void}\r\n\t */\r\n\tsetTitle(title)\r\n\t{\r\n\t\tthis.title = title;\r\n\t\tthis.titleCallBack(this, title);\r\n\t}\r\n\r\n\t/**\r\n\t * This will deactivate the route.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tdeactivate()\r\n\t{\r\n\t\tthis.set('active', false);\r\n\r\n\t\tconst controller = this.controller;\r\n\t\tif (controller)\r\n\t\t{\r\n\t\t\tcontroller.remove();\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Clear the path references to allow garbage collection.\r\n\t\t */\r\n\t\tthis.path = null;\r\n\t\tthis.referralPath = null;\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the route layout.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @returns {object|null}\r\n\t */\r\n\tgetLayout(settings)\r\n\t{\r\n\t\tif (settings.component)\r\n\t\t{\r\n\t\t\treturn settings.component;\r\n\t\t}\r\n\r\n\t\tlet imported = settings.import;\r\n\t\tif (!imported)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Return a factory function that creates a new Import wrapper\r\n\t\t * each time, allowing the component to be recreated after destroy.\r\n\t\t */\r\n\t\treturn () => Import(imported);\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the route layout.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} settings\r\n\t * @returns {void}\r\n\t */\r\n\tsetupComponentHelper(settings)\r\n\t{\r\n\t\tconst component = this.getLayout(settings);\r\n\t\tif (!component)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst {container, persist, parent} = settings;\r\n\t\tconst helperSettings =\r\n\t\t{\r\n\t\t\tcomponent,\r\n\t\t\tcontainer,\r\n\t\t\tpersist,\r\n\t\t\tparent\r\n\t\t};\r\n\r\n\t\tconst proxy = DataProxy(this);\r\n\t\tthis.controller = new ComponentHelper(proxy, helperSettings);\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume the route.\r\n\t *\r\n\t * @param {object} container\r\n\t * @returns {void}\r\n\t */\r\n\tresume(container)\r\n\t{\r\n\t\tconst controller = this.controller;\r\n\t\tif (controller)\r\n\t\t{\r\n\t\t\tcontroller.container = container;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the route path.\r\n\t *\r\n\t * @param {string} path\r\n\t * @param {string} referralPath\r\n\t * @returns {void}\r\n\t */\r\n\tsetPath(path, referralPath)\r\n\t{\r\n\t\tthis.path = path;\r\n\t\tthis.referralPath = referralPath;\r\n\t}\r\n\r\n\t/**\r\n\t * This will select the route.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tselect()\r\n\t{\r\n\t\tthis.set('active', true);\r\n\r\n\t\tconst params = this.stage,\r\n\t\tcallBack = this.callBack;\r\n\t\tif (typeof callBack === 'function')\r\n\t\t{\r\n\t\t\tcallBack(params);\r\n\t\t}\r\n\r\n\t\tconst controller = this.controller;\r\n\t\tif (controller)\r\n\t\t{\r\n\t\t\tcontroller.focus(params);\r\n\t\t}\r\n\r\n\t\tconst path = this.path;\r\n\t\tif (!path)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst hash = path.split('#')[1];\r\n\t\tif (!hash)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.scrollToId(hash);\r\n\t}\r\n\r\n\t/**\r\n\t * This will scroll to the element by id.\r\n\t *\r\n\t * @param {string} hash\r\n\t * @returns {void}\r\n\t */\r\n\tscrollToId(hash)\r\n\t{\r\n\t\tif (!hash)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst ele = document.getElementById(hash);\r\n\t\tif (!ele)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tele.scrollIntoView(true);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a route matches the path.\r\n\t *\r\n\t * @param {string} path\r\n\t * @returns {object|boolean}\r\n\t */\r\n\tmatch(path)\r\n\t{\r\n\t\t/**\r\n\t\t * @type {boolean|array}\r\n\t\t */\r\n\t\tlet matched = false;\r\n\r\n\t\t/**\r\n\t\t * We want to check to use the supplied uri or get the\r\n\t\t * current uri if not setup.\r\n\t\t */\r\n\t\tconst result = path.match(this.uriQuery);\r\n\t\tif (result === null)\r\n\t\t{\r\n\t\t\tthis.resetParams();\r\n\t\t\treturn matched;\r\n\t\t}\r\n\r\n\t\tif (!Array.isArray(result))\r\n\t\t{\r\n\t\t\treturn matched;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will remove the first match from the\r\n\t\t * the params.\r\n\t\t */\r\n\t\tresult.shift();\r\n\t\tmatched = result;\r\n\r\n\t\t/**\r\n\t\t * This will get the uri params of the route\r\n\t\t * and if set will save them to the route.\r\n\t\t */\r\n\t\tthis.setParams(result);\r\n\t\treturn matched;\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset the params.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tresetParams()\r\n\t{\r\n\t\tthis.stage = {};\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the params.\r\n\t *\r\n\t * @param {object} values\r\n\t */\r\n\tsetParams(values)\r\n\t{\r\n\t\tif (!Array.isArray(values))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst keys = this.paramKeys;\r\n\t\tif (!keys)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst params = {};\r\n\t\tkeys.forEach((key, i) =>\r\n\t\t{\r\n\t\t\tif (typeof key !== 'undefined')\r\n\t\t\t{\r\n\t\t\t\tparams[key] = values[i];\r\n\t\t\t}\r\n\t\t});\r\n\t\tthis.set(params);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the params.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tgetParams()\r\n\t{\r\n\t\treturn this.stage;\r\n\t}\r\n}", "/**\r\n * This will convert a string to title case.\r\n *\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst toTitleCase = (str) =>\r\n{\r\n const pattern = /\\w\\S*/;\r\n return str.replace(pattern, (txt) =>\r\n {\r\n return txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();\r\n });\r\n};\r\n\r\n/**\r\n * This will replace any params in the string.\r\n *\r\n * @param {string} str\r\n * @param {object} route\r\n * @returns {string}\r\n */\r\nconst replaceParams = (str, route) =>\r\n{\r\n if (str.indexOf(':') === -1)\r\n {\r\n return str;\r\n }\r\n\r\n const params = route.stage;\r\n for (const [key, value] of Object.entries(params))\r\n {\r\n const pattern = new RegExp(':' + key, 'gi');\r\n str = str.replace(pattern, value);\r\n }\r\n\r\n return str;\r\n};\r\n\r\n/**\r\n * This will create a title.\r\n *\r\n * @param {object} route\r\n * @param {*} title\r\n * @returns {string}\r\n */\r\nconst createTitle = (route, title) =>\r\n{\r\n if (!title)\r\n {\r\n return title;\r\n }\r\n\r\n if (typeof title === 'function')\r\n {\r\n title = title(route.stage);\r\n }\r\n\r\n title = replaceParams(title, route);\r\n return toTitleCase(title);\r\n};\r\n\r\n/**\r\n * This will add the root title to the title.\r\n *\r\n * @param {string} title\r\n * @param {string} rootTitle\r\n * @returns {string}\r\n */\r\nconst addRootTitle = (title, rootTitle) =>\r\n{\r\n if (rootTitle !== '')\r\n {\r\n title += \" - \" + rootTitle;\r\n }\r\n return title;\r\n};\r\n\r\n/**\r\n * This will set the title.\r\n *\r\n * @param {object} route\r\n * @param {*} title\r\n * @param {string} rootTitle\r\n * @returns {string}\r\n */\r\nexport const setTitle = (route, title, rootTitle) =>\r\n{\r\n if (!title)\r\n {\r\n return title;\r\n }\r\n\r\n title = createTitle(route, title);\r\n return addRootTitle(title, rootTitle);\r\n};", "/**\r\n * Utils\r\n *\r\n * These are some helper functions for the router.\r\n *\r\n * @constant\r\n * @type {object} Utils\r\n */\r\nexport const Utils =\r\n{\r\n\t/**\r\n\t * This will remove the begining and ending slashes from a url.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @returns {string}\r\n\t */\r\n\tremoveSlashes(uri)\r\n\t{\r\n\t\tif (typeof uri !== 'string')\r\n\t\t{\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Remove the first slash.\r\n\t\t */\r\n\t\tif (uri.substring(0, 1) === '/')\r\n\t\t{\r\n\t\t\turi = uri.substring(1);\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Remove the last slash.\r\n\t\t */\r\n\t\tif (uri.substring(-1) === '/')\r\n\t\t{\r\n\t\t\turi = uri.substring(0, uri.length - 1);\r\n\t\t}\r\n\r\n\t\treturn uri;\r\n\t}\r\n};", "import { Component } from '../component/component.js';\r\nimport { router } from './router.js';\r\n\r\n/**\r\n * Watcher\r\n *\r\n * This will create a watcher object.\r\n *\r\n * @param {string} attr\r\n * @param {string} value\r\n * @returns {object}\r\n */\r\nconst Watcher = (attr, value) => ({\r\n attr,\r\n value\r\n});\r\n\r\n/**\r\n * This will check if the path is active.\r\n *\r\n * @param {string} path\r\n * @param {string} url\r\n * @returns {boolean}\r\n */\r\nconst iSActive = (path, url) => new RegExp('^' + path + '($|#|/|\\\\.).*').test(url);\r\n\r\n/**\r\n * NavLink\r\n *\r\n * This will create a nav link that will add an active\r\n * class when the browser route path matches the link\r\n * href.\r\n *\r\n * @property {string} activeClass - The active class to add.\r\n * @property {string} class - The class\r\n * @property {string} exact - The exact match\r\n * @property {string|object} href - The href or watcher object\r\n * @property {string|object} text - The text or watcher object\r\n * @property {array|string} nest - The nested elements\r\n *\r\n * @class\r\n * @extends Component\r\n */\r\nexport class NavLink extends Component\r\n{\r\n /**\r\n * This will configure the link active class.\r\n *\r\n * @protected\r\n * @returns {void}\r\n */\r\n beforeSetup()\r\n {\r\n // @ts-ignore\r\n this.selectedClass = this.activeClass || 'active';\r\n }\r\n\r\n /**\r\n * This will render the component.\r\n *\r\n * @returns {object}\r\n */\r\n render()\r\n {\r\n // @ts-ignore\r\n const href = this.href,\r\n // @ts-ignore\r\n text = this.text,\r\n watchers = this.setupWatchers(href, text);\r\n\r\n return {\r\n tag: 'a',\r\n // @ts-ignore\r\n class: this.class || this.className || null,\r\n onState: ['selected', {\r\n [this.selectedClass]: true\r\n }],\r\n href: this.getString(href),\r\n text: this.getString(text),\r\n nest: this.nest || this.children,\r\n // @ts-ignore\r\n dataStateSet: this.dataSet,\r\n watch: watchers\r\n };\r\n }\r\n\r\n /**\r\n * This will get the link path.\r\n *\r\n * @returns {string|null}\r\n */\r\n getLinkPath()\r\n {\r\n // @ts-ignore\r\n return this?.panel?.pathname || null;\r\n }\r\n\r\n /**\r\n * This will get string.\r\n *\r\n * @param {string} string\r\n * @returns {(string|null)}\r\n */\r\n getString(string)\r\n {\r\n const type = typeof string;\r\n return (type !== 'object' && type !== 'undefined')? string : null;\r\n }\r\n\r\n /**\r\n * This will setup the watchers.\r\n *\r\n * @protected\r\n * @param {string} href\r\n * @param {string} text\r\n * @returns {array}\r\n */\r\n setupWatchers(href, text)\r\n {\r\n // @ts-ignore\r\n const exact = (this.exact === true),\r\n data = router.data;\r\n\r\n const watchers = [];\r\n\r\n if (href && typeof href === 'object')\r\n {\r\n watchers.push(Watcher('href', href));\r\n }\r\n\r\n if (text && typeof text === 'object')\r\n {\r\n watchers.push(Watcher('text', text));\r\n }\r\n\r\n watchers.push({\r\n value: ['[[path]]', data],\r\n callBack: (value, ele) =>\r\n {\r\n if (typeof ele.pathname === 'undefined')\r\n {\r\n return;\r\n }\r\n\r\n const path = ele.pathname + ele.hash;\r\n\t\t\t\tconst selected = exact? (value === path) : (iSActive(ele.pathname, value));\r\n this.update(selected);\r\n }\r\n });\r\n\r\n return watchers;\r\n }\r\n\r\n /**\r\n * This will setup the states.\r\n *\r\n * @protected\r\n * @returns {object}\r\n */\r\n setupStates()\r\n {\r\n return {\r\n selected: false\r\n };\r\n }\r\n\r\n /**\r\n * This will update the class on the element.\r\n *\r\n * @param {boolean} selected\r\n * @returns {void}\r\n */\r\n update(selected)\r\n {\r\n this.state.selected = selected;\r\n }\r\n}", "import { Events } from '../../main/events/events.js';\r\nimport { Dom } from '../../shared/dom.js';\r\nimport { Data } from '../data/data.js';\r\nimport { HistoryController } from './history/history-controller.js';\r\nimport { Route } from './routes/route.js';\r\nimport { setTitle } from './set-title.js';\r\nimport { Utils } from './utils.js';\r\nexport { NavLink } from './nav-link.js';\r\n\r\n/**\r\n * This will get the location.\r\n *\r\n * @returns {object}\r\n */\r\nconst getLocation = () => (typeof window !== 'undefined')? window.location : {};\r\n\r\n/**\r\n * Router\r\n *\r\n * This will create a browser router.\r\n *\r\n * @class\r\n */\r\nexport class Router\r\n{\r\n\tconstructor()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {string} version\r\n\t\t */\r\n\t\tthis.version = '1.0.2';\r\n\r\n\t\t/**\r\n\t\t * This is the root of the uri for the routing object\r\n\t\t * and the base title.\r\n\t\t */\r\n\t\tthis.baseURI = '/';\r\n\t\tthis.title = '';\r\n\r\n\t\tthis.lastPath = null;\r\n\t\tthis.path = null;\r\n\r\n\t\t/**\r\n\t\t * This will be used to access our history object.\r\n\t\t */\r\n\t\tthis.history = null;\r\n\t\tthis.callBackLink = null;\r\n\t\tthis.location = getLocation();\r\n\r\n\t\t/**\r\n\t\t * This will store each route added to the router.\r\n\t\t */\r\n\t\tthis.routes = [];\r\n\t\tthis.switches = new Map();\r\n\t\tthis.switchCount = 0;\r\n\r\n\t\t/**\r\n\t\t * @member {object} data\r\n\t\t */\r\n\t\tthis.data = new Data(\r\n\t\t{\r\n\t\t\tpath: ''\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup our history object.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tsetupHistory()\r\n\t{\r\n\t\tthis.history = HistoryController.setup(this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a new route.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} settings\r\n\t * @returns {object}\r\n\t */\r\n\tcreateRoute(settings)\r\n\t{\r\n\t\tconst uri = settings.uri || '*';\r\n\t\tsettings.baseUri = this.createURI(uri);\r\n\r\n\t\treturn new Route(settings, this.updateTitle.bind(this));\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a new route to the router.\r\n\t *\r\n\t * @param {object} settings\r\n\t * @returns {object}\r\n\t */\r\n\tadd(settings)\r\n\t{\r\n\t\tif (typeof settings !== 'object')\r\n\t\t{\r\n\t\t\tconst args = arguments;\r\n\t\t\tsettings =\r\n\t\t\t{\r\n\t\t\t\turi: args[0],\r\n\t\t\t\tcomponent: args[1],\r\n\t\t\t\tcallBack: args[2],\r\n\t\t\t\ttitle: args[3],\r\n\t\t\t\tid: args[4],\r\n\t\t\t\tcontainer: args[5]\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst route = this.createRoute(settings);\r\n\t\tthis.addRoute(route);\r\n\t\treturn route;\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a route.\r\n\t *\r\n\t * @param {object} route\r\n\t * @returns {void}\r\n\t */\r\n\taddRoute(route)\r\n\t{\r\n\t\tthis.routes.push(route);\r\n\t\tthis.checkRoute(route, this.getPath());\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume a route.\r\n\t *\r\n\t * @param {object} route\r\n\t * @param {object} container\r\n\t * @returns {void}\r\n\t */\r\n\tresume(route, container)\r\n\t{\r\n\t\troute.resume(container);\r\n\t\tthis.addRoute(route);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the base path.\r\n\t *\r\n\t * @protected\r\n\t * @returns {string}\r\n\t */\r\n\tgetBasePath()\r\n\t{\r\n\t\tif (!this.basePath)\r\n\t\t{\r\n\t\t\tlet pathURI = this.baseURI || '';\r\n\t\t\tif ((pathURI[pathURI.length - 1] !== '/'))\r\n\t\t\t{\r\n\t\t\t\tpathURI += '/';\r\n\t\t\t}\r\n\t\t\tthis.basePath = pathURI;\r\n\t\t}\r\n\t\treturn this.basePath;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a uri.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} uri\r\n\t * @returns {string}\r\n\t */\r\n\tcreateURI(uri)\r\n\t{\r\n\t\tconst baseUri = this.getBasePath();\r\n\t\treturn (baseUri + Utils.removeSlashes(uri));\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a route by uri.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @returns {(object|boolean)}\r\n\t */\r\n\tgetRoute(uri)\r\n\t{\r\n\t\tconst routes = this.routes,\r\n\t\tlength = routes.length;\r\n\t\tif (length > 0)\r\n\t\t{\r\n\t\t\tfor (var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar route = routes[i];\r\n\t\t\t\tif (route.uri === uri)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn route;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a route by id.\r\n\t *\r\n\t * @param {string} id\r\n\t * @returns {(object|boolean)}\r\n\t */\r\n\tgetRouteById(id)\r\n\t{\r\n\t\tconst routes = this.routes,\r\n\t\tlength = routes.length;\r\n\t\tif (length > 0)\r\n\t\t{\r\n\t\t\tfor (var i = 0; i < length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar route = routes[i];\r\n\t\t\t\tif (route.id === id)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn route;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a route.\r\n\t *\r\n\t * @param {object} route\r\n\t */\r\n\tremoveRoute(route)\r\n\t{\r\n\t\tconst routes = this.routes,\r\n\t\tindex = routes.indexOf(route);\r\n\t\tif (index > -1)\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * Deactivate the route to properly clean up\r\n\t\t\t * its component before removing.\r\n\t\t\t */\r\n\t\t\tif (route && typeof route.deactivate === 'function')\r\n\t\t\t{\r\n\t\t\t\troute.deactivate();\r\n\t\t\t}\r\n\t\t\troutes.splice(index, 1);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a switch.\r\n\t *\r\n\t * @param {array} group\r\n\t * @returns {number} the switch id.\r\n\t */\r\n\taddSwitch(group)\r\n\t{\r\n\t\tconst id = this.switchCount++;\r\n\t\tconst switchArray = this.getSwitchGroup(id);\r\n\r\n\t\tgroup.forEach((item) =>\r\n\t\t{\r\n\t\t\tif (!item)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst route = this.createRoute(item);\r\n\t\t\tswitchArray.push(route);\r\n\t\t});\r\n\r\n\t\tthis.checkGroup(switchArray, this.getPath());\r\n\t\treturn id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will resume a switch.\r\n\t *\r\n\t * @param {object} group\r\n\t * @param {object} container\r\n\t * @returns {number} the switch id.\r\n\t */\r\n\tresumeSwitch(group, container)\r\n\t{\r\n\t\tconst id = this.switchCount++;\r\n\t\tconst switchArray = this.getSwitchGroup(id);\r\n\r\n\t\tgroup.forEach((item) =>\r\n\t\t{\r\n\t\t\tconst route = item.component.route;\r\n\t\t\troute.resume(container);\r\n\t\t\tswitchArray.push(route);\r\n\t\t});\r\n\r\n\t\tthis.checkGroup(switchArray, this.getPath());\r\n\t\treturn id;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get a switch group by id.\r\n\t *\r\n\t * @param {number} id\r\n\t * @returns {array}\r\n\t */\r\n\tgetSwitchGroup(id)\r\n\t{\r\n\t\tconst switches = this.switches.get(id);\r\n\t\tif (switches)\r\n\t\t{\r\n\t\t\treturn switches;\r\n\t\t}\r\n\r\n\t\tconst group = [];\r\n\t\tthis.switches.set(id, group);\r\n\t\treturn group;\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a switch by id.\r\n\t *\r\n\t * @param {string} id\r\n\t * @returns {void}\r\n\t */\r\n\tremoveSwitch(id)\r\n\t{\r\n\t\tconst group = this.switches.get(id);\r\n\t\tif (group)\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * Deactivate all routes in the group to properly\r\n\t\t\t * clean up their components before removing.\r\n\t\t\t */\r\n\t\t\tfor (const route of group)\r\n\t\t\t{\r\n\t\t\t\tif (route && typeof route.deactivate === 'function')\r\n\t\t\t\t{\r\n\t\t\t\t\troute.deactivate();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.switches.delete(id);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a route by uri.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @returns {object} a reference to the router object.\r\n\t */\r\n\tremove(uri)\r\n\t{\r\n\t\turi = this.createURI(uri);\r\n\r\n\t\tconst route = this.getRoute(uri);\r\n\t\tif (route !== false)\r\n\t\t{\r\n\t\t\tthis.removeRoute(route);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the router.\r\n\t *\r\n\t * @param {string} [baseURI]\r\n\t * @param {string} [title]\r\n\t * @returns {object} a reference to the router object.\r\n\t */\r\n\tsetup(baseURI, title)\r\n\t{\r\n\t\tthis.baseURI = baseURI || '/';\r\n\t\tthis.updateBaseTag(this.baseURI);\r\n\t\tthis.title = (typeof title !== 'undefined')? title : '';\r\n\r\n\t\tthis.setupHistory();\r\n\r\n\t\t// @ts-ignore\r\n\t\tthis.data.path = this.getPath();\r\n\r\n\t\tthis.callBackLink = this.checkLink.bind(this);\r\n\t\tEvents.on('click', document, this.callBackLink);\r\n\r\n\t\t/* this will route to the first url entered\r\n\t\twhen the router loads. this will fix the issue\r\n\t\tthat stopped the first endpoint from being\r\n\t\tadded to the history */\r\n\t\tconst endPoint = this.getEndPoint();\r\n\t\tthis.navigate(endPoint, null, true);\r\n\t\treturn this;\r\n\t}\r\n\r\n\tupdateBaseTag(url)\r\n\t{\r\n\t\t/* this will modify the base tag to ref from\r\n\t\tthe base url for all xhr */\r\n\t\tconst ele = document.getElementsByTagName('base');\r\n\t\tif (ele.length)\r\n\t\t{\r\n\t\t\tele[0].href = url;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the parent element link.\r\n\t *\r\n\t * @param {object} ele\r\n\t * @returns {(object|boolean)}\r\n\t */\r\n\tgetParentLink(ele)\r\n\t{\r\n\t\tlet target = ele.parentNode;\r\n\t\twhile (target !== null)\r\n\t\t{\r\n\t\t\tif (target.nodeName.toLowerCase() === 'a')\r\n\t\t\t{\r\n\t\t\t\treturn target;\r\n\t\t\t}\r\n\r\n\t\t\ttarget = target.parentNode;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a link was routed.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} evt\r\n\t */\r\n\tcheckLink(evt)\r\n\t{\r\n\t\tif (evt.ctrlKey === true)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tlet target = evt.target || evt.srcElement;\r\n\t\tif (target.nodeName.toLowerCase() !== 'a')\r\n\t\t{\r\n\t\t\t/* this will check to get the parent to check\r\n\t\t\tif the child is contained in a link */\r\n\t\t\ttarget = this.getParentLink(target);\r\n\t\t\tif (target === false)\r\n\t\t\t{\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (target.target === '_blank' || Dom.data(target, 'cancel-route'))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tconst href = target.getAttribute('href');\r\n\t\tif (typeof href !== 'undefined')\r\n\t\t{\r\n\t\t\tconst baseUri = this.baseURI,\r\n\t\t\tpath = (baseUri !== '/')? href.replace(baseUri, '') : href;\r\n\r\n\t\t\tthis.navigate(path);\r\n\r\n\t\t\tevt.preventDefault();\r\n\t\t\tevt.stopPropagation();\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset the router.\r\n\t *\r\n\t * @returns {object} a reference to the router object.\r\n\t */\r\n\treset()\r\n\t{\r\n\t\t/**\r\n\t\t * Deactivate all routes to properly clean up their components\r\n\t\t * before clearing the arrays.\r\n\t\t */\r\n\t\tconst routes = this.routes;\r\n\t\tfor (let i = 0, length = routes.length; i < length; i++)\r\n\t\t{\r\n\t\t\tconst route = routes[i];\r\n\t\t\tif (route && typeof route.deactivate === 'function')\r\n\t\t\t{\r\n\t\t\t\troute.deactivate();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.routes = [];\r\n\t\tthis.switches = new Map();\r\n\t\tthis.switchCount = 0;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will check the active routes.\r\n\t *\r\n\t * @returns {object} a reference to the router object.\r\n\t */\r\n\tactivate()\r\n\t{\r\n\t\tthis.checkActiveRoutes();\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will navigate the router.\r\n\t *\r\n\t * @param {string} uri\r\n\t * @param {object} [data]\r\n\t * @param {boolean} [replace]\r\n\t * @returns {object} a reference to the router object.\r\n\t */\r\n\tnavigate(uri, data, replace)\r\n\t{\r\n\t\turi = this.createURI(uri);\r\n\t\tthis.history.addState(uri, data, replace);\r\n\t\tthis.activate();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the data path.\r\n\t * @protected\r\n\t */\r\n\tupdatePath()\r\n\t{\r\n\t\tconst path = this.getPath();\r\n\t\t// @ts-ignore\r\n\t\tthis.data.path = path;\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the title.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} route\r\n\t */\r\n\tupdateTitle(route)\r\n\t{\r\n\t\tif (!route || !route.title)\r\n\t\t{\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tconst title = route.title;\r\n\t\tdocument.title = setTitle(route, title, this.title);\r\n\t}\r\n\r\n\t/**\r\n\t * This will check the routes to match the path.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} [path]\r\n\t */\r\n\tcheckActiveRoutes(path)\r\n\t{\r\n\t\tthis.lastPath = this.path;\r\n\r\n\t\tpath = path || this.getPath();\r\n\t\tthis.path = path;\r\n\r\n\t\tconst routes = this.routes,\r\n\t\tlength = routes.length;\r\n\r\n\t\tlet route;\r\n\t\tfor (var i = 0; i < length; i++)\r\n\t\t{\r\n\t\t\troute = routes[i];\r\n\t\t\tif (typeof route === 'undefined')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tthis.checkRoute(route, path);\r\n\t\t}\r\n\r\n\t\tthis.checkSwitches(path);\r\n\t\tthis.updatePath();\r\n\t}\r\n\r\n\t/**\r\n\t * Checks all switch groups against the given path.\r\n\t * Activates the first matching route or falls back to the first route in the group if none match.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} [path]\r\n\t * @returns {void}\r\n\t */\r\n\tcheckSwitches(path)\r\n\t{\r\n\t\tconst switches = this.switches;\r\n\t\tswitches.forEach((group) =>\r\n\t\t{\r\n\t\t\tthis.checkGroup(group, path);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Checks a single group of routes against the path.\r\n\t * Selects the first matching route if any; otherwise selects the first route.\r\n\t * Deactivates previously active routes if changed.\r\n\t *\r\n\t * @protected\r\n\t * @param {object[]} group\r\n\t * @param {string} path\r\n\t * @returns {void}\r\n\t */\r\n\tcheckGroup(group, path)\r\n\t{\r\n\t\tif (!group.length)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * The last selected route should be checked first to\r\n\t\t * deactive it if it doesn't match the path.\r\n\t\t */\r\n\t\tconst lastSelected = group.find((route) => route.get('active'));\r\n\t\tif (lastSelected)\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * If the last selected route matches the path, we select it.\r\n\t\t\t * Otherwise, we deactivate it.\r\n\t\t\t */\r\n\t\t\tconst matched = lastSelected.match(path);\r\n\t\t\tif (matched === false)\r\n\t\t\t{\r\n\t\t\t\tlastSelected.deactivate();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * We will check each route in the group to see if it matches the path. If a route\r\n\t\t * matches the path, we select it. If a route has a controller, we deactivate all\r\n\t\t * subsequent routes and select the first route with a controller.\r\n\t\t */\r\n\t\tlet selected;\r\n\t\tfor (const route of group)\r\n\t\t{\r\n\t\t\tif (typeof route === 'undefined')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// If we have already found a matching route, and it has a controller,\r\n\t\t\t// we deactivate subsequent routes.\r\n\t\t\tif (selected)\r\n\t\t\t{\r\n\t\t\t\troute.deactivate();\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst matched = route.match(path);\r\n\t\t\tif (matched !== false && selected === undefined)\r\n\t\t\t{\r\n\t\t\t\tif (route.controller)\r\n\t\t\t\t{\r\n\t\t\t\t\tselected = route;\r\n\t\t\t\t\tthis.select(route);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * If no route matched the path, we select the first route in the group.\r\n\t\t */\r\n\t\tconst firstRoute = group[0];\r\n\t\tif (!selected)\r\n\t\t{\r\n\t\t\tthis.select(firstRoute);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will check if a route matches the path.\r\n\t *\r\n\t * @param {object} route\r\n\t * @param {string} path\r\n\t * @returns {boolean}\r\n\t */\r\n\tcheckRoute(route, path)\r\n\t{\r\n\t\tconst check = this.check(route, path);\r\n\t\tif (check !== false)\r\n\t\t{\r\n\t\t\tthis.select(route);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\troute.deactivate();\r\n\t\t}\r\n\t\treturn check;\r\n\t}\r\n\r\n\t/**\r\n\t * This will select a route if the route matches the path.\r\n\t *\r\n\t * @param {object} route\r\n\t * @param {string} [path]\r\n\t * @returns {boolean}\r\n\t */\r\n\tcheck(route, path)\r\n\t{\r\n\t\t/* we want to check if the route has been\r\n\t\tdeleted from the routes */\r\n\t\tif (!route)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/* we want to check to use the supplied uri or get the\r\n\t\tcurrent uri if not setup */\r\n\t\tpath = path || this.getPath();\r\n\r\n\t\t/* we want to check if the route uri matches the path uri */\r\n\t\treturn (route.match(path) !== false);\r\n\t}\r\n\r\n\t/**\r\n\t * This will select the route.\r\n\t *\r\n\t * @param {object} route\r\n\t * @returns {void}\r\n\t */\r\n\tselect(route)\r\n\t{\r\n\t\tif (!route)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\troute.setPath(this.path, this.lastPath);\r\n\t\troute.select();\r\n\t\tthis.updateTitle(route);\r\n\r\n\t\tif (route.preventScroll !== true)\r\n\t\t{\r\n\t\t\tthis.checkToScroll();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will check to scroll to the top of the page.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tcheckToScroll()\r\n\t{\r\n\t\tconst shouldScrollToTop = this.shouldScrollToTop();\r\n\t\tif (shouldScrollToTop)\r\n\t\t{\r\n window.scrollTo(0, 0);\r\n }\r\n\t}\r\n\r\n\t/**\r\n\t * This will clean the path.\r\n\t *\r\n\t * @param {string|null} path\r\n\t * @returns {string}\r\n\t */\r\n\tcleanPath(path)\r\n\t{\r\n\t\tif (!path)\r\n\t\t{\r\n\t\t\treturn '/';\r\n\t\t}\r\n\r\n\t\treturn path.split('?')[0].split('#')[0];\r\n\t}\r\n\r\n\t/**\r\n\t * This will scroll to the top of the page if the route has changed.\r\n\t *\r\n\t * @returns {boolean}\r\n\t */\r\n\tshouldScrollToTop()\r\n\t{\r\n\t\tconst path = this.cleanPath(this.getPath());\r\n\t\tconst lastPath = this.cleanPath(this.lastPath);\r\n const prevSegments = lastPath.split('/');\r\n const currentSegments = path.split('/');\r\n\r\n\t\t/**\r\n\t\t * If the path has changed, we want to scroll to the top.\r\n\t\t */\r\n\t\tif (prevSegments.length !== currentSegments.length)\r\n\t\t{\r\n\t\t\treturn true\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * We want to check if the last segment of the path has changed.\r\n\t\t * If it has, we want to scroll to the top.\r\n\t\t */\r\n\t\tconst lastSegment = prevSegments[prevSegments.length - 1];\r\n\t\tconst currentSegment = currentSegments[currentSegments.length - 1];\r\n return (lastSegment !== currentSegment);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the endpoint.\r\n\t *\r\n\t * @returns {string}\r\n\t */\r\n\tgetEndPoint()\r\n\t{\r\n\t\tconst path = this.getPath();\r\n\t\treturn (path.replace(this.baseURI, '') || '/');\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove the router events.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tdestroy()\r\n\t{\r\n\t\tEvents.off('click', document, this.callBackLink);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the location pathname.\r\n\t *\r\n\t * @returns {string}\r\n\t */\r\n\tgetPath()\r\n\t{\r\n\t\t/* we want to get the window location path */\r\n\t\tlet location = this.location,\r\n\t\tpath = this.path = location.pathname;\r\n\r\n\t\tif (this.history.type === 'hash')\r\n\t\t{\r\n\t\t\treturn location.hash.replace('#', '');\r\n\t\t}\r\n\r\n\t\treturn path + location.search + location.hash;\r\n\t}\r\n}\r\n\r\n/**\r\n * This will create a new router.\r\n *\r\n * @type {Router}\r\n */\r\nexport const router = new Router();", "import { DataTracker } from \"../../../../main/data-tracker/data-tracker.js\";\r\nimport { router } from \"../../../router/router.js\";\r\n\r\n/**\r\n * This will register the route system to the data\r\n * tracker to remove routes that have been nested\r\n * in layouts.\r\n */\r\nDataTracker.addType('routes', (data) =>\r\n{\r\n if (!data)\r\n {\r\n return false;\r\n }\r\n\r\n const route = data.route;\r\n if (route)\r\n {\r\n router.removeRoute(route);\r\n }\r\n});\r\n\r\n/**\r\n * This will add a route.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {(object|array)} route\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addRoute = (ele, route, parent) =>\r\n{\r\n if (!route)\r\n {\r\n return;\r\n }\r\n\r\n if (Array.isArray(route))\r\n {\r\n route.forEach((item) =>\r\n {\r\n if (!item)\r\n {\r\n return;\r\n }\r\n\r\n setupRoute(ele, item, parent);\r\n });\r\n }\r\n else\r\n {\r\n setupRoute(ele, route, parent);\r\n }\r\n};\r\n\r\n/**\r\n * This will setup a route.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {object} route\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nconst setupRoute = (ele, route, parent) =>\r\n{\r\n // this will check to resume route\r\n // if (checkResume(route))\r\n // {\r\n // \tresumeRoute(ele, route.component.route);\r\n // \treturn;\r\n // }\r\n\r\n route.container = ele;\r\n route.parent = parent;\r\n\r\n const newRoute = router.add(route);\r\n trackRoute(ele, newRoute);\r\n};\r\n\r\n/**\r\n * This will check to resume route.\r\n *\r\n * @param {object} route\r\n */\r\n// const checkResume = (route) =>\r\n// {\r\n// return (route && route.component && route.component.route);\r\n// };\r\n\r\n/**\r\n * This will resume a route.\r\n *\r\n * @param {object} ele\r\n * @param {object} route\r\n */\r\n// const resumeRoute = (ele, route) =>\r\n// {\r\n// router.resume(route, ele);\r\n\r\n// trackRoute(ele, route);\r\n// };\r\n\r\n/**\r\n * This will track a route.\r\n *\r\n * @param {object} ele\r\n * @param {object} route\r\n * @returns {void}\r\n */\r\nconst trackRoute = (ele, route) =>\r\n{\r\n DataTracker.add(ele, 'routes',\r\n {\r\n route\r\n });\r\n};", "/**\r\n * This is called when the state directive is used.\r\n *\r\n * @param {object} ele\r\n * @param {*} data\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const state = (ele, data, parent) =>\r\n{\r\n\r\n};", "import { DataTracker } from \"../../../../main/data-tracker/data-tracker.js\";\r\nimport { router } from \"../../../router/router.js\";\r\n\r\n/**\r\n * This will register the switch system to the data\r\n * tracker to remove switches that have been nested\r\n * in layouts.\r\n */\r\nDataTracker.addType('switch', (data) =>\r\n{\r\n\tif (!data)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst id = data.id;\r\n\trouter.removeSwitch(id);\r\n});\r\n\r\n/**\r\n * This will add a switch.\r\n *\r\n * @protected\r\n * @param {object} ele\r\n * @param {array} group\r\n * @param {object} parent\r\n * @returns {void}\r\n */\r\nexport const addSwitch = (ele, group, parent) =>\r\n{\r\n\tlet route = group[0];\r\n\t// this will check to resume switch\r\n\t// if (checkResume(route))\r\n\t// {\r\n\t// \tresumeSwitch(ele, group);\r\n\t// \treturn;\r\n\t// }\r\n\r\n\tgroup.forEach((item) =>\r\n\t{\r\n\t\tif (!item)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\titem.container = ele;\r\n\t\titem.parent = parent;\r\n\t});\r\n\r\n\tconst id = router.addSwitch(group);\r\n\ttrackSwitch(ele, id);\r\n};\r\n\r\n/**\r\n * This will check to resume route.\r\n *\r\n * @param {object} route\r\n */\r\n// const checkResume = (route) =>\r\n// {\r\n// return (route && route.component && route.component.route);\r\n// };\r\n\r\n/**\r\n * This will resume a route.\r\n *\r\n * @param {object} ele\r\n * @param {object} route\r\n */\r\n// const resumeSwitch = (ele, route) =>\r\n// {\r\n// router.resume(route, ele);\r\n\r\n// trackSwitch(ele, route);\r\n// };\r\n\r\n/**\r\n * This will track a switch.\r\n *\r\n * @param {object} ele\r\n * @param {number} id\r\n * @returns {void}\r\n */\r\nconst trackSwitch = (ele, id) =>\r\n{\r\n\tDataTracker.add(ele, 'switch',\r\n\t{\r\n\t\tid\r\n\t});\r\n};", "import { Directives } from '../directives.js';\r\nimport { animateIn, animateOut } from './animate/animate.js';\r\nimport { addAria, addRole } from './aria/aria.js';\r\nimport { addContext, context, useContext } from './context/context-directives.js';\r\nimport { data } from './data.js';\r\nimport { debug } from './debug.js';\r\nimport { addEvent, addState, cache, getId, useData, useParent, useState } from './parent/parent-directives.js';\r\nimport { bind } from './reactive/bind.js';\r\nimport { addDataSet, addDataStateSet } from './reactive/data-set.js';\r\nimport { forEach } from './reactive/for-each.js';\r\nimport { map } from './reactive/map.js';\r\nimport { onCreated } from './reactive/on-created.js';\r\nimport { onDestroyed } from './reactive/on-destroyed.js';\r\nimport { onSet } from './reactive/on-set.js';\r\nimport { onState } from './reactive/on-state.js';\r\nimport { watch } from './reactive/watch.js';\r\nimport { addRoute } from './route.js';\r\nimport { state } from './state.js';\r\nimport { addSwitch } from './switch.js';\r\n\r\nDirectives\r\n\t.add('cache', cache)\r\n\t.add('onCreated', onCreated)\r\n\t.add('onDestroyed', onDestroyed)\r\n\t.add('bind', bind)\r\n\t.add('data', data)\r\n\t.add('state', state)\r\n\t.add('onSet', onSet)\r\n\t.add('onState', onState)\r\n\t.add('animateIn', animateIn)\r\n\t.add('animateOut', animateOut)\r\n\t.add('watch', watch)\r\n\t.add('useParent', useParent)\r\n\t.add('useData', useData)\r\n\t.add('useState', useState)\r\n\t.add('getId', getId)\r\n\t.add('addState', addState)\r\n\t.add('addEvent', addEvent)\r\n\t.add('map', map)\r\n\t.add('for', forEach)\r\n\t//.add('html', addHtml)\r\n\t.add('useContext', useContext)\r\n\t.add('addContext', addContext)\r\n\t.add('context', context)\r\n\t.add('role', addRole)\r\n\t.add('aria', addAria)\r\n\t.add('route', addRoute)\r\n\t.add('debug', debug)\r\n\t.add('dataSet', addDataSet)\r\n\t.add('dataStateSet', addDataStateSet)\r\n\t.add('switch', addSwitch);", "import { base } from './main/base.js';\r\nimport { DataTracker } from './main/data-tracker/data-tracker.js';\r\nimport { EventMethods } from './main/events/event-methods.js';\r\nimport { Ajax } from './modules/ajax/ajax.js';\r\nimport { Atom } from './modules/atom/atom.js';\r\nimport { Component } from './modules/component/component.js';\r\nimport { Jot } from './modules/component/jot.js';\r\nimport { Pod } from './modules/component/pod.js';\r\nimport { Unit } from './modules/component/unit.js';\r\nimport { dataBinder } from './modules/data-binder/data-binder.js';\r\nimport { Data, Model, SimpleData } from './modules/data/data.js';\r\nimport { DateTime } from \"./modules/date/date-time.js\";\r\nimport { Html } from './modules/html/html.js';\r\nimport { Import } from './modules/import/import.js';\r\nimport { Builder } from './modules/layout/builder.js';\r\nimport './modules/layout/directives/core/default-directives.js';\r\nimport { Directives } from './modules/layout/directives/directives.js';\r\nimport { NavLink, router } from './modules/router/router.js';\r\nimport { StateTracker as Store } from './modules/state/state-tracker.js';\r\nimport { State } from './modules/state/state.js';\r\nimport { Arrays } from './shared/arrays.js';\r\nimport { Dom } from './shared/dom.js';\r\nimport { Encode } from './shared/encode/encode.js';\r\nimport { Objects } from './shared/objects.js';\r\nimport { Strings } from './shared/strings.js';\r\nimport { Types } from './shared/types.js';\r\n\r\n/**\r\n * This will set the base module classes to the base object. This is\r\n * used to make the modules available to the application. This is\r\n * to support legacy code.\r\n */\r\nbase.augment(\r\n{\r\n Ajax,\r\n Html,\r\n dataBinder,\r\n Data,\r\n SimpleData,\r\n Model,\r\n State,\r\n Builder,\r\n router,\r\n Component\r\n});\r\n\r\n/**\r\n * This will export base and all the modules.\r\n */\r\nexport { Ajax, Arrays, Atom, base, Builder, Component, Data, dataBinder, DataTracker, DateTime, Directives, Dom, Encode, EventMethods as Events, Html, Import, Jot, Model, NavLink, Objects, Pod, router, SimpleData, State, Store, Strings, Types, Unit };\r\n\r\n"],
5
+ "mappings": "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",
6
6
  "names": ["Arrays", "list", "array", "element", "fromIndex", "Types", "data", "type", "Objects", "prototype", "sourceObj", "targetObj", "Types", "key", "obj", "entity", "sourceClass", "targetClass", "source", "target", "prop", "TrackerTypes", "type", "callBack", "Tracker", "addingType", "data", "type", "callBack", "removingType", "typeData", "TrackerTypes", "length", "value", "typeKey", "DataTracker", "type", "callBack", "TrackerTypes", "obj", "data", "id", "tracker", "Tracker", "countProperty", "obj", "count", "property", "value", "matchProperties", "obj1", "obj2", "matched", "value1", "Objects", "value2", "compareObjects", "option1Count", "option2Count", "equals", "option1", "option2", "option1Type", "Events", "obj", "Types", "DataTracker", "event", "fn", "capture", "swapped", "originalFn", "evt", "data", "result", "listener", "events", "eventObj", "swappable", "i", "maxLength", "type", "EventMethods", "Events", "event", "obj", "fn", "capture", "events", "evt", "eventType", "settings", "params", "e", "options", "Types", "eventTypes", "prop", "value", "getMouseWheelType", "type", "callBackFn", "cancelDefault", "mouseWheelResults", "delta", "Base", "DataTracker", "methods", "Types", "prototype", "property", "obj", "methodName", "overrideMethod", "args", "Arrays", "errors", "err", "defaultText", "value", "method", "argArray", "addArgs", "base", "Objects", "EventMethods", "equals", "XhrDefaultSettings", "setupBaseAjaxMethods", "base", "XhrDefaultSettings", "params", "callBack", "settingsObj", "Objects", "Strings", "str", "maxLength", "decode", "limit", "objURL", "regExp", "a", "b", "d", "match", "delimiter", "pattern", "txt", "XhrRequest", "args", "xhr", "method", "url", "async", "items", "XhrDefaultSettings", "settings", "i", "length", "callBack", "object", "params", "prop", "addingParams", "paramsType", "addingType", "Strings", "key", "Objects", "fixedParams", "base", "maxLength", "arg", "headers", "header", "e", "overrideType", "removeEvents", "Events", "response", "responseType", "setupBaseAjaxMethods", "Ajax", "args", "XhrRequest", "prepareChildren", "value", "setChildString", "DefaultProps", "StringProp", "ArrayProp", "ObjectProp", "args", "ConnectionTracker", "id", "attr", "connection", "attrMap", "existing", "value", "i", "len", "Source", "token", "OneWaySource", "Source", "data", "msg", "callBack", "Connection", "OneWayConnection", "Connection", "data", "OneWaySource", "TwoWaySource", "Source", "pubSub", "msg", "callBack", "DataSource", "TwoWaySource", "data", "prop", "pubSub", "value", "committer", "Dom", "id", "name", "obj", "Arrays", "selector", "single", "elements", "html", "Types", "property", "value", "Strings", "css", "currentValue", "currentStyle", "inheritedStyle", "prop", "queryString", "previous", "left", "top", "w", "doc", "de", "b", "width", "height", "body", "depth", "position", "count", "tmpClassName", "adding", "i", "maxLength", "getBindAttr", "element", "attr", "tagName", "type", "SetAttr", "element", "attr", "value", "Dom", "UpdateRadioAttr", "UpdateCheckboxAttr", "UpdateAttr", "GetAttr", "GetAttribute", "ElementSource", "TwoWaySource", "filter", "pubSub", "type", "customAttr", "getBindAttr", "pattern", "committer", "TwoWayConnection", "Connection", "pubSub", "element", "attr", "filter", "ElementSource", "data", "prop", "DataSource", "source", "lastToken", "DataPubSub", "msg", "callBack", "token", "subscribers", "args", "DataBinder", "ConnectionTracker", "DataPubSub", "element", "data", "prop", "filter", "bindProp", "bindAttr", "parts", "connection", "connectionElement", "value", "customAttr", "id", "TwoWayConnection", "msg", "attr", "callBack", "Types", "OneWayConnection", "committer", "evt", "target", "Events", "dataBinder", "getParentData", "parent", "NORMALIZED_NAMES", "normalizeAttr", "prop", "removeEventPrefix", "Html", "node", "attrs", "container", "prepend", "obj", "type", "Dom", "value", "content", "attr", "Events", "attrName", "text", "selectElem", "optionArray", "defaultValue", "Types", "settings", "option", "ele", "DataTracker", "children", "length", "i", "child", "dataBinder", "manualDestroy", "newParent", "parent", "optionalNode", "deepCopy", "HtmlHelper", "Html", "nodeName", "attrs", "container", "parent", "ele", "item", "prop", "value", "attr", "removeEventPrefix", "Events", "e", "Dom", "attrName", "normalizeAttr", "content", "child", "WATCHER_PATTERN", "WatcherHelper", "value", "string", "Types", "matches", "match", "ele", "attr", "HtmlHelper", "data", "isArray", "count", "watcherData", "result", "settings", "parent", "getParentData", "props", "values", "i", "length", "isDataArray", "overrideCallBack", "isMultiProp", "committer", "callBack", "attribute", "lastItem", "prop", "dataBinder", "WatcherProp", "watch", "parseArgs", "args", "DefaultProps", "first", "firstType", "StringProp", "WatcherHelper", "ArrayProp", "children", "ObjectProp", "Atom", "callBack", "props", "getNewPath", "path", "prop", "isNan", "propPath", "createHandler", "data", "dataRoot", "target", "receiver", "value", "dataTarget", "Objects", "newPath", "DataProxy", "root", "LocalData", "key", "defaultValue", "data", "value", "setupAttrSettings", "settings", "attributes", "Types", "clonedSettings", "Objects", "prop", "settingValue", "dataNumber", "EVENT", "createEventMessage", "attr", "event", "BasicData", "settings", "DataPubSub", "attributes", "setupAttrSettings", "DataProxy", "id", "attrName", "callBack", "message", "token", "val", "committer", "stopMerge", "prevValue", "dataBinder", "args", "items", "value", "obj", "currentValue", "key", "defaultValue", "data", "LocalData", "alias", "tokens", "prop", "childAttr", "propValue", "remoteToken", "links", "Objects", "removeFromLinks", "DataUtils", "str", "pattern", "PropertyHelper", "obj", "attr", "val", "DataUtils", "prop", "props", "length", "end", "i", "propValue", "Publisher", "obj", "attr", "val", "callBack", "DataUtils", "prop", "props", "length", "end", "path", "i", "publish", "nextProp", "nextAttr", "pathString", "subPath", "value", "Data", "BasicData", "attr", "val", "committer", "stopMerge", "PropertyHelper", "EVENT", "data", "value", "prop", "constructor", "index", "currentValue", "values", "key", "item", "event", "callBack", "path", "obj", "Publisher", "subPath", "dataBinder", "Objects", "replacements", "escapeChars", "str", "removeNewLines", "pattern", "match", "sanitize", "text", "prepareUrl", "data", "type", "prop", "value", "decode", "encode", "Encode", "obj", "removeNewLines", "before", "Objects", "after", "prepareUrl", "encode", "decode", "data", "ModelService", "model", "result", "callBack", "params", "defaults", "object", "prop", "addingParams", "Strings", "key", "instanceParams", "id", "response", "item", "Encode", "url", "offset", "limit", "lastCursor", "since", "data", "search", "filter", "dates", "orderBy", "groupBy", "baseUrl", "fullUrl", "method", "requestCallBack", "settings", "xhr", "Ajax", "onOpenCallBack", "reconnect", "source", "reconnectTimer", "intentionallyClosed", "connect", "queryString", "error", "event", "WatcherHelper", "child", "parent", "service", "setupDefaultAttr", "settings", "attributes", "Types", "defaults", "prop", "attr", "getXhr", "xhr", "modelTypeNumber", "Model", "Data", "proxy", "parent", "service", "defaultAttributes", "ExtendedModel", "instanceSettings", "instanceAttr", "setupAttrSettings", "ModelService", "SimpleData", "BasicData", "State", "SimpleData", "action", "state", "token", "actions", "StateTarget", "State", "id", "StateTracker", "id", "target", "StateTarget", "targetId", "action", "state", "token", "callBack", "targets", "EventHelper", "events", "event", "obj", "callBack", "capture", "Events", "option", "i", "length", "StateHelper", "state", "states", "actions", "action", "callBack", "targetId", "prop", "remotes", "remote", "i", "length", "value", "remoteStates", "StateTracker", "target", "actionEvent", "remoteTargetId", "remoteTarget", "token", "parseArgs", "args", "DefaultProps", "first", "firstType", "StringProp", "ArrayProp", "ObjectProp", "DataTracker", "data", "component", "unitNumber", "Unit", "args", "props", "children", "parseArgs", "child", "count", "token", "key", "persistedChild", "prop", "parentContext", "context", "branchName", "value", "branch", "layout", "content", "items", "callBack", "i", "length", "item", "ele", "Html", "id", "mainId", "propName", "container", "panel", "Component", "Unit", "args", "data", "persistedLayout", "id", "targetId", "StateTracker", "state", "states", "Objects", "StateHelper", "EventHelper", "events", "SHORTHAND_METHODS", "getJotShorthandMethod", "value", "JotComponent", "settings", "component", "prop", "alias", "SHORTHAND_METHODS", "createClass", "Base", "Child", "Jot", "layout", "extend", "Component", "layoutType", "modifyMethods", "proxy", "component", "prop", "value", "alias", "SHORTHAND_METHODS", "extendBaseClass", "Base", "Pod", "callBack", "extend", "Component", "render", "DateTime", "day", "shortenName", "days", "dayName", "month", "dateString", "addYear", "date", "year", "number", "formatType", "format", "hours", "meridian", "minutes", "seconds", "months", "monthName", "remoteData", "remoteTimeZone", "pattern", "values", "invdate", "diff", "sqlformat", "timeOnly", "formated", "setHours", "diffDate", "now", "milliseconds", "age", "weeks", "years", "timeDiff", "timeFrame", "startDate", "endDate", "start", "end", "difference", "Directive", "name", "callBack", "Directives", "name", "callBack", "Directive", "AttributeDirective", "attr", "directive", "Attribute", "key", "value", "Element", "tag", "attr", "directives", "children", "Parser", "obj", "key", "value", "attr", "children", "Attribute", "directives", "AttributeDirective", "WatcherHelper", "normalizeAttr", "Directives", "tag", "type", "parent", "directive", "Objects", "callback", "wrapper", "e", "Element", "Render", "obj", "container", "parent", "component", "layout", "result", "ele", "directives", "node", "BrowserRender", "Render", "obj", "container", "parent", "fragment", "HtmlHelper", "element", "settings", "Parser", "ele", "child", "directives", "props", "id", "component", "Component", "directive", "attrDirective", "propName", "tag", "text", "node", "selfClosingTags", "HtmlToString", "tag", "attrs", "children", "innerContent", "attrString", "content", "key", "value", "index", "attr", "removeEventPrefix", "text", "ServerRender", "Render", "obj", "container", "parent", "element", "component", "settings", "Parser", "childrenHtml", "child", "tag", "text", "HtmlToString", "ele", "RenderController", "BrowserRender", "ServerRender", "render", "RenderController", "isComponent", "layout", "createJotComponent", "Component", "Jot", "Builder", "container", "parent", "obj", "ele", "directives", "settings", "node", "base", "loaded", "isLoaded", "src", "Script", "props", "e", "callBack", "Style", "Group", "atom", "load", "Builder", "files", "isConstructor", "object", "LayoutManager", "module", "config", "layout", "element", "parent", "fragment", "Builder", "firstChild", "ModuleLoader", "modulePromise", "callback", "module", "error", "Comment", "props", "getPromise", "src", "type", "ImportWrapper", "Jot", "ele", "LayoutManager", "Group", "ModuleLoader", "module", "layout", "params", "Builder", "Import", "props", "type", "ImportWrapper", "addAnimationClass", "ele", "className", "doneCallBack", "Events", "animateEnd", "Dom", "animateIn", "animationClass", "parent", "animateOut", "remove", "track", "DataTracker", "data", "callBack", "onUpdate", "ele", "data", "settings", "parent", "itemSettings", "setWatcher", "prop", "callBack", "update", "getUpdateMethod", "dataBinder", "value", "addClass", "updateElement", "result", "rebuild", "attr", "getBindAttr", "Dom", "Html", "layout", "Builder", "stateStyles", "newValue", "onSet", "ele", "parent", "data", "getParentData", "onUpdate", "addRole", "ele", "role", "parent", "Dom", "onSetCallBack", "attr", "val", "text", "addAria", "attributes", "key", "value", "settings", "onSet", "addAttributes", "ele", "attributes", "parent", "parsed", "Parser", "HtmlHelper", "Builder", "DataTracker", "data", "getParentContext", "parent", "context", "ele", "parentContext", "attributes", "addAttributes", "useContext", "callBack", "addContext", "childContext", "data", "ele", "parent", "debug", "ele", "data", "parent", "layout", "cache", "ele", "propName", "parent", "useParent", "callBack", "layout", "Builder", "getId", "name", "id", "useData", "useState", "addState", "state", "states", "addEvent", "event", "e", "bind", "ele", "parent", "data", "prop", "filter", "getParentData", "dataSource", "dataBinder", "onState", "ele", "parent", "onUpdate", "onSetCallBack", "dataValue", "newValue", "ele", "attr", "value", "addingString", "text", "Dom", "addDataSet", "attribute", "parent", "settings", "onSet", "addDataStateSet", "onState", "forEach", "ele", "settings", "parent", "data", "prop", "item", "scope", "parentData", "getParentData", "scopeData", "dataBinder", "items", "Builder", "children", "row", "index", "scoped", "layout", "map", "ele", "settings", "parent", "items", "item", "children", "row", "i", "layout", "Builder", "onCreated", "ele", "callBack", "parent", "DataTracker", "data", "onDestroyed", "ele", "callBack", "parent", "track", "watch", "ele", "watcher", "parent", "i", "length", "WatcherHelper", "routerNumber", "History", "router", "evt", "scrollPosition", "BrowserHistory", "History", "Events", "evt", "state", "scrollPosition", "uri", "data", "replace", "history", "lastState", "stateObj", "HashHistory", "History", "Events", "evt", "uri", "data", "replace", "HistoryController", "router", "BrowserHistory", "HashHistory", "CloakComponent", "Component", "Cloak", "props", "Jot", "ComponentHelper", "routeProxy", "settings", "params", "type", "comp", "Cloak", "Builder", "component", "getParamDefaults", "params", "defaults", "param", "paramPattern", "uri", "filter", "pattern", "matches", "replaceSlashes", "uri", "setupOptionalSlashes", "uriQuery", "str", "setupOptionalParams", "setupWildcard", "setStringEnd", "routePattern", "routeCount", "Route", "BasicData", "settings", "titleCallBack", "uri", "paramKeys", "paramPattern", "params", "getParamDefaults", "proxy", "uriMatch", "routePattern", "title", "controller", "imported", "Import", "component", "container", "persist", "parent", "helperSettings", "DataProxy", "ComponentHelper", "path", "referralPath", "callBack", "hash", "ele", "matched", "result", "values", "keys", "key", "toTitleCase", "str", "pattern", "txt", "replaceParams", "route", "params", "key", "value", "createTitle", "title", "addRootTitle", "rootTitle", "setTitle", "Utils", "uri", "Watcher", "attr", "value", "iSActive", "path", "url", "NavLink", "Component", "href", "text", "watchers", "string", "type", "exact", "data", "router", "ele", "selected", "getLocation", "Router", "Data", "HistoryController", "settings", "uri", "Route", "args", "route", "container", "pathURI", "Utils", "routes", "length", "i", "id", "index", "group", "switchArray", "item", "switches", "baseURI", "title", "Events", "endPoint", "url", "ele", "target", "evt", "Dom", "href", "baseUri", "path", "data", "replace", "setTitle", "lastSelected", "selected", "firstRoute", "check", "prevSegments", "currentSegments", "lastSegment", "currentSegment", "location", "router", "DataTracker", "data", "route", "router", "addRoute", "ele", "parent", "item", "setupRoute", "newRoute", "trackRoute", "state", "ele", "data", "parent", "DataTracker", "data", "id", "router", "addSwitch", "ele", "group", "parent", "route", "item", "trackSwitch", "Directives", "cache", "onCreated", "onDestroyed", "bind", "data", "state", "onSet", "onState", "animateIn", "animateOut", "watch", "useParent", "useData", "useState", "getId", "addState", "addEvent", "map", "forEach", "useContext", "addContext", "context", "addRole", "addAria", "addRoute", "debug", "addDataSet", "addDataStateSet", "addSwitch", "base", "Ajax", "Html", "dataBinder", "Data", "SimpleData", "Model", "State", "Builder", "router", "Component"]
7
7
  }