jsl-ui 9.3.2 → 9.6.0
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/lib/components/auto-suggest/AutoSuggestComponent.js +1 -1
- package/lib/components/button/ButtonComponent.js +1 -1
- package/lib/components/checkbox/CheckBoxComponent.js +1 -1
- package/lib/components/date/DateComponent.js +1 -1
- package/lib/components/date-range/DateRangeComponent.js +1 -1
- package/lib/components/dialog/DialogComponent.js +2 -2
- package/lib/components/expander/ExpanderComponent.js +8 -8
- package/lib/components/form-field/FormFieldComponent.d.ts +1 -0
- package/lib/components/form-field/FormFieldComponent.js +3 -2
- package/lib/components/grid/GridComponent.js +1 -1
- package/lib/components/input/InputComponent.js +3 -3
- package/lib/components/navigation/NavigationComponent.js +13 -11
- package/lib/components/notification/Notification.js +1 -1
- package/lib/components/number/NumberComponent.js +1 -1
- package/lib/components/progress/ProgressComponent.js +2 -2
- package/lib/components/ribbon-menu/RibbonMenuComponent.js +9 -7
- package/lib/components/select/SelectComponent.js +3 -3
- package/lib/components/select/SelectDDAreaComponent.js +23 -19
- package/lib/components/stack-panel/SplitterComponent.js +1 -1
- package/lib/components/tabs/TabsComponent.js +24 -22
- package/lib/components/time/TimeComponent.js +4 -4
- package/lib/components/tree-view/TreeViewComponent.js +1 -1
- package/lib/components/virtual-render/VirtualRenderComponent.js +2 -2
- package/lib/core/culture.js +2 -2
- package/lib/grid/filterDialogs/excelFilter.js +4 -4
- package/lib/grid/slick.editors.date.d.ts +1 -0
- package/lib/grid/slick.editors.date.js +58 -0
- package/lib/grid/slick.formatters.js +1 -1
- package/lib/grid/slick.grid.d.ts +1 -0
- package/lib/grid/slick.grid.js +5 -5
- package/lib/grid/slick.groupitemmetadataprovider.d.ts +4 -4
- package/lib/index.js.map +1 -1
- package/lib/interaction/dataconverter.js +1 -0
- package/lib/ui/dialog.d.ts +1 -0
- package/lib/ui/dialog.js +8 -2
- package/package.json +2 -2
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["grid.ts","grid/slick.core.ts","core/jq.ts","node_modules/@parcel/transformer-js/src/esmodule-helpers.js","grid/slick.creator.ts","grid/slick.grid.ts","interaction/resizable.ts","core/polyfills.ts","interaction/eventhandler.ts","grid/plugins/slick.rowselectionmodel.ts","grid/slick.dataview.ts","grid/slick.groupitemmetadataprovider.ts","grid/plugins/slick.headermenu.ts","grid/plugins/slick.headerbuttons.ts","grid/slick.formatters.ts","core/numeric.ts","core/culture.ts","core/date.ts","grid/filterDialogs/excelFilter.ts","core/lang.ts","core/helper.ts","ui/dialog.ts","components/virtual-render/VirtualRenderComponent.ts","grid/slick.editors.core.ts","grid/slick.editors.nav.ts","grid/slick.tree.ts","grid/plugins/slick.cellrangedecorator.ts","grid/plugins/slick.cellrangeselector.ts","grid/plugins/slick.cellselectionmodel.ts"],"sourcesContent":["\r\nexport * from \"./grid/slick.core\";\r\nexport * from \"./grid/slick.creator\";\r\nexport * from \"./grid/slick.dataview\";\r\nexport * from \"./grid/slick.editors.core\";\r\nexport * from \"./grid/slick.formatters\";\r\nexport * from \"./grid/slick.grid\";\r\nexport * from \"./grid/slick.groupitemmetadataprovider\";\r\nexport * from \"./grid/slick.tree\";\r\n\r\nexport * from \"./grid/plugins/slick.cellrangedecorator\";\r\nexport * from \"./grid/plugins/slick.cellrangeselector\";\r\nexport * from \"./grid/plugins/slick.cellselectionmodel\";\r\nexport * from \"./grid/plugins/slick.headermenu\";\r\nexport * from \"./grid/plugins/slick.rowselectionmodel\";\r\n","import { jQueryReplacement, IjQueryReplacement } from \"../core/jq\";\r\nimport { ISlickGrid } from \"./slick.grid\";\r\n\r\nexport interface ISlick {\r\n \"Event\": () => void;\r\n \"EventData\": () => void;\r\n \"EventHandler\": () => void;\r\n \"Range\": (fromRow: number, fromCell: number, toRow: number, toCell: number) => void;\r\n \"NonDataRow\": () => void;\r\n \"Group\": any;\r\n \"GroupTotals\": any;\r\n \"EditorLock\": () => void;\r\n \"GlobalEditorLock\": any;\r\n // \"TreeColumns\": (treeColumns: any) => void;\r\n \"keyCode\": any;\r\n \"preClickClassName\": string;\r\n $: IjQueryReplacement;\r\n // formatters: { [index:string] : {formatter: ISlickFormatter} }\r\n}\r\n\r\nexport interface ISlickEvent<T> {\r\n subscribe(fnc: (e, args: T) => any);\r\n notify(e, args: T);\r\n countHandlers(): number;\r\n}\r\n\r\nexport interface ISlickFormatterResult {\r\n addClasses?: string[];\r\n toolTip?: string;\r\n text?: string;\r\n}\r\n\r\nexport type ISlickFormatter = (row: number, cell: number, value: any, columnDef: ISlickColumn, dataContext: any, grid?: ISlickGrid<any>) => string | ISlickFormatterResult;\r\n\r\nexport interface ISlickColumn {\r\n id: string;\r\n field?: string;\r\n name?: string;\r\n resizable?: boolean;\r\n sortable?: boolean;\r\n minWidth?: number;\r\n width?: number;\r\n maxWidth?: number;\r\n previousWidth?: number; // only for internal use\r\n rerenderOnResize?: boolean;\r\n headerCssClass?: string;\r\n defaultSortAsc?: boolean;\r\n focusable?: boolean;\r\n selectable?: boolean;\r\n format?: string;\r\n formatter?: ISlickFormatter;\r\n cssClass?: string;\r\n columnGroup?: string; // correct?\r\n editor?: any; // TODO\r\n editorOptions?: any;\r\n readonly?: boolean;\r\n valueList?: string[] | { [key: string]: string } | Array<{text: string, value: any}>;\r\n sortByVisibleValue?: boolean;\r\n comparer?: (a: any, b: any) => 0 | 1 | -1;\r\n header?: {buttons: [{image?: string, html?: string, showOnHover?: boolean, handler: (e:any) => void, cssClass?: string, tooltip?: string, command?: string}]};\r\n filterable?: boolean;\r\n hideMenu?: boolean;\r\n toolTip?: string;\r\n maxLength?: number;\r\n alwaysRenderColumn?: boolean;\r\n asyncPostRender?: (node: HTMLElement, row: number, item: Text, column: ISlickColumn, status: boolean) => void;\r\n asyncPostRenderCleanup?: (node: HTMLElement, row: number, column: ISlickColumn) => void;\r\n cannotTriggerInsert?: boolean;\r\n groupTotalsFormatter?: (item: any, columnDef: ISlickColumn, grid: any) => string | ISlickFormatterResult;\r\n}\r\n\r\n\r\nexport let Slick: ISlick = {\r\n \"Event\": Event,\r\n \"EventData\": EventData,\r\n \"EventHandler\": EventHandler,\r\n \"Range\": Range,\r\n \"NonDataRow\": NonDataItem,\r\n \"Group\": Group,\r\n \"GroupTotals\": GroupTotals,\r\n \"EditorLock\": EditorLock,\r\n\r\n /***\r\n * A global singleton editor lock.\r\n * @class GlobalEditorLock\r\n * @static\r\n * @constructor\r\n */\r\n \"GlobalEditorLock\": new EditorLock(),\r\n // \"TreeColumns\": TreeColumns,\r\n\r\n \"keyCode\": {\r\n SPACE: 8,\r\n BACKSPACE: 8,\r\n DELETE: 46,\r\n DOWN: 40,\r\n END: 35,\r\n ENTER: 13,\r\n ESCAPE: 27,\r\n HOME: 36,\r\n INSERT: 45,\r\n LEFT: 37,\r\n PAGE_DOWN: 34,\r\n PAGE_UP: 33,\r\n RIGHT: 39,\r\n TAB: 9,\r\n UP: 38,\r\n A: 65\r\n },\r\n \"preClickClassName\": \"slick-edit-preclick\",\r\n $: jQueryReplacement\r\n // formatters:{}\r\n};\r\n\r\n/***\r\n * An event object for passing data to event handlers and letting them control propagation.\r\n * <p>This is pretty much identical to how W3C and jQuery implement events.</p>\r\n * @class EventData\r\n * @constructor\r\n */\r\nfunction EventData() {\r\n var isPropagationStopped = false;\r\n var isImmediatePropagationStopped = false;\r\n\r\n /***\r\n * Stops event from propagating up the DOM tree.\r\n * @method stopPropagation\r\n */\r\n this.stopPropagation = function () {\r\n isPropagationStopped = true;\r\n };\r\n\r\n /***\r\n * Returns whether stopPropagation was called on this event object.\r\n * @method isPropagationStopped\r\n * @return {Boolean}\r\n */\r\n this.isPropagationStopped = function (): boolean {\r\n return isPropagationStopped;\r\n };\r\n\r\n /***\r\n * Prevents the rest of the handlers from being executed.\r\n * @method stopImmediatePropagation\r\n */\r\n this.stopImmediatePropagation = function () {\r\n isImmediatePropagationStopped = true;\r\n };\r\n\r\n /***\r\n * Returns whether stopImmediatePropagation was called on this event object.\\\r\n * @method isImmediatePropagationStopped\r\n * @return {Boolean}\r\n */\r\n this.isImmediatePropagationStopped = function (): boolean {\r\n return isImmediatePropagationStopped;\r\n };\r\n}\r\n\r\n/***\r\n * A simple publisher-subscriber implementation.\r\n * @class Event\r\n * @constructor\r\n */\r\nfunction Event() {\r\n var handlers: Function[] = [];\r\n\r\n /***\r\n * Adds an event handler to be called when the event is fired.\r\n * <p>Event handler will receive two arguments - an <code>EventData</code> and the <code>data</code>\r\n * object the event was fired with.<p>\r\n * @method subscribe\r\n * @param fn {Function} Event handler.\r\n */\r\n this.subscribe = function (fn: Function) {\r\n handlers.push(fn);\r\n };\r\n\r\n this.countHandlers = function () {\r\n return handlers.length;\r\n };\r\n\r\n /***\r\n * Removes an event handler added with <code>subscribe(fn)</code>.\r\n * @method unsubscribe\r\n * @param fn {Function} Event handler to be removed.\r\n */\r\n this.unsubscribe = function (fn: Function) {\r\n for (var i = handlers.length - 1; i >= 0; i--) {\r\n if (handlers[i] === fn) {\r\n handlers.splice(i, 1);\r\n }\r\n }\r\n };\r\n\r\n /***\r\n * Fires an event notifying all subscribers.\r\n * @method notify\r\n * @param args {Object} Additional data object to be passed to all handlers.\r\n * @param e {EventData}\r\n * Optional.\r\n * An <code>EventData</code> object to be passed to all handlers.\r\n * For DOM events, an existing W3C/jQuery event object can be passed in.\r\n * @param scope {Object}\r\n * Optional.\r\n * The scope (\"this\") within which the handler will be executed.\r\n * If not specified, the scope will be set to the <code>Event</code> instance.\r\n */\r\n this.notify = function (args: any, e, scope: any) {\r\n e = e || new EventData();\r\n scope = scope || this;\r\n\r\n var returnValue;\r\n for (var i = 0; i < handlers.length && !((e.isPropagationStopped && e.isPropagationStopped()) || (e.isImmediatePropagationStopped && e.isImmediatePropagationStopped())); i++) {\r\n returnValue = handlers[i].call(scope, e, args);\r\n }\r\n\r\n return returnValue;\r\n };\r\n}\r\n\r\nfunction EventHandler() {\r\n var handlers = [];\r\n\r\n this.subscribe = function (event, handler) {\r\n handlers.push({\r\n event: event,\r\n handler: handler\r\n });\r\n event.subscribe(handler);\r\n\r\n return this; // allow chaining\r\n };\r\n\r\n this.unsubscribe = function (event, handler) {\r\n var i = handlers.length;\r\n while (i--) {\r\n if (handlers[i].event === event &&\r\n handlers[i].handler === handler) {\r\n handlers.splice(i, 1);\r\n event.unsubscribe(handler);\r\n return;\r\n }\r\n }\r\n\r\n return this; // allow chaining\r\n };\r\n\r\n this.unsubscribeAll = function () {\r\n var i = handlers.length;\r\n while (i--) {\r\n handlers[i].event.unsubscribe(handlers[i].handler);\r\n }\r\n handlers = [];\r\n\r\n return this; // allow chaining\r\n };\r\n}\r\n\r\n/***\r\n * A structure containing a range of cells.\r\n * @class Range\r\n * @constructor\r\n * @param fromRow {Integer} Starting row.\r\n * @param fromCell {Integer} Starting cell.\r\n * @param toRow {Integer} Optional. Ending row. Defaults to <code>fromRow</code>.\r\n * @param toCell {Integer} Optional. Ending cell. Defaults to <code>fromCell</code>.\r\n */\r\nexport function Range(fromRow: number, fromCell: number, toRow?: number, toCell?: number) {\r\n if (toRow === undefined && toCell === undefined) {\r\n toRow = fromRow;\r\n toCell = fromCell;\r\n }\r\n\r\n /***\r\n * @property fromRow\r\n * @type {Integer}\r\n */\r\n this.fromRow = Math.min(fromRow, toRow);\r\n\r\n /***\r\n * @property fromCell\r\n * @type {Integer}\r\n */\r\n this.fromCell = Math.min(fromCell, toCell);\r\n\r\n /***\r\n * @property toRow\r\n * @type {Integer}\r\n */\r\n this.toRow = Math.max(fromRow, toRow);\r\n\r\n /***\r\n * @property toCell\r\n * @type {Integer}\r\n */\r\n this.toCell = Math.max(fromCell, toCell);\r\n\r\n /***\r\n * Returns whether a range represents a single row.\r\n * @method isSingleRow\r\n * @return {Boolean}\r\n */\r\n this.isSingleRow = function (): boolean {\r\n return this.fromRow == this.toRow;\r\n };\r\n\r\n /***\r\n * Returns whether a range represents a single cell.\r\n * @method isSingleCell\r\n * @return {Boolean}\r\n */\r\n this.isSingleCell = function (): boolean {\r\n return this.fromRow == this.toRow && this.fromCell == this.toCell;\r\n };\r\n\r\n /***\r\n * Returns whether a range contains a given cell.\r\n * @method contains\r\n * @param row {Integer}\r\n * @param cell {Integer}\r\n * @return {Boolean}\r\n */\r\n this.contains = function (row, cell) {\r\n return row >= this.fromRow && row <= this.toRow &&\r\n cell >= this.fromCell && cell <= this.toCell;\r\n };\r\n\r\n /***\r\n * Returns a readable representation of a range.\r\n * @method toString\r\n * @return {String}\r\n */\r\n this.toString = function (): string {\r\n if (this.isSingleCell()) {\r\n return \"(\" + this.fromRow + \":\" + this.fromCell + \")\";\r\n } else {\r\n return \"(\" + this.fromRow + \":\" + this.fromCell + \" - \" + this.toRow + \":\" + this.toCell + \")\";\r\n }\r\n };\r\n}\r\n\r\n\r\n/***\r\n * A base class that all special / non-data rows (like Group and GroupTotals) derive from.\r\n * @class NonDataItem\r\n * @constructor\r\n */\r\nfunction NonDataItem() {\r\n this.__nonDataRow = true;\r\n}\r\n\r\n\r\n/***\r\n * Information about a group of rows.\r\n * @class Group\r\n * @extends Slick.NonDataItem\r\n * @constructor\r\n */\r\nfunction Group() {\r\n this.__group = true;\r\n\r\n /**\r\n * Grouping level, starting with 0.\r\n * @property level\r\n * @type {Number}\r\n */\r\n this.level = 0;\r\n\r\n /***\r\n * Number of rows in the group.\r\n * @property count\r\n * @type {Integer}\r\n */\r\n this.count = 0;\r\n\r\n /***\r\n * Grouping value.\r\n * @property value\r\n * @type {Object}\r\n */\r\n this.value = null;\r\n\r\n /***\r\n * Formatted display value of the group.\r\n * @property title\r\n * @type {String}\r\n */\r\n this.title = null;\r\n\r\n /***\r\n * Whether a group is collapsed.\r\n * @property collapsed\r\n * @type {Boolean}\r\n */\r\n this.collapsed = false;\r\n\r\n /***\r\n * Whether a group selection checkbox is checked.\r\n * @property selectChecked\r\n * @type {Boolean}\r\n */\r\n this.selectChecked = false;\r\n\r\n /***\r\n * GroupTotals, if any.\r\n * @property totals\r\n * @type {GroupTotals}\r\n */\r\n this.totals = null;\r\n\r\n /**\r\n * Rows that are part of the group.\r\n * @property rows\r\n * @type {Array}\r\n */\r\n this.rows = [];\r\n\r\n /**\r\n * Sub-groups that are part of the group.\r\n * @property groups\r\n * @type {Array}\r\n */\r\n this.groups = null;\r\n\r\n /**\r\n * A unique key used to identify the group. This key can be used in calls to DataView\r\n * collapseGroup() or expandGroup().\r\n * @property groupingKey\r\n * @type {Object}\r\n */\r\n this.groupingKey = null;\r\n}\r\n\r\nGroup.prototype = new NonDataItem();\r\n\r\n/***\r\n * Compares two Group instances.\r\n * @method equals\r\n * @return {Boolean}\r\n * @param group {Group} Group instance to compare to.\r\n */\r\nGroup.prototype.equals = function (group): boolean {\r\n return this.value === group.value &&\r\n this.count === group.count &&\r\n this.collapsed === group.collapsed &&\r\n this.title === group.title;\r\n};\r\n\r\n/***\r\n * Information about group totals.\r\n * An instance of GroupTotals will be created for each totals row and passed to the aggregators\r\n * so that they can store arbitrary data in it. That data can later be accessed by group totals\r\n * formatters during the display.\r\n * @class GroupTotals\r\n * @extends Slick.NonDataItem\r\n * @constructor\r\n */\r\nfunction GroupTotals() {\r\n this.__groupTotals = true;\r\n\r\n /***\r\n * Parent Group.\r\n * @param group\r\n * @type {Group}\r\n */\r\n this.group = null;\r\n\r\n /***\r\n * Whether the totals have been fully initialized / calculated.\r\n * Will be set to false for lazy-calculated group totals.\r\n * @param initialized\r\n * @type {Boolean}\r\n */\r\n this.initialized = false;\r\n}\r\n\r\nGroupTotals.prototype = new NonDataItem();\r\n\r\n/***\r\n * A locking helper to track the active edit controller and ensure that only a single controller\r\n * can be active at a time. This prevents a whole class of state and validation synchronization\r\n * issues. An edit controller (such as SlickGrid) can query if an active edit is in progress\r\n * and attempt a commit or cancel before proceeding.\r\n * @class EditorLock\r\n * @constructor\r\n */\r\nfunction EditorLock() {\r\n var activeEditController = null;\r\n\r\n /***\r\n * Returns true if a specified edit controller is active (has the edit lock).\r\n * If the parameter is not specified, returns true if any edit controller is active.\r\n * @method isActive\r\n * @param editController {EditController}\r\n * @return {Boolean}\r\n */\r\n this.isActive = function (editController) {\r\n return (editController ? activeEditController === editController : activeEditController !== null);\r\n };\r\n\r\n /***\r\n * Sets the specified edit controller as the active edit controller (acquire edit lock).\r\n * If another edit controller is already active, and exception will be throw new Error(.\r\n * @method activate\r\n * @param editController {EditController} edit controller acquiring the lock\r\n */\r\n this.activate = function (editController) {\r\n if (editController === activeEditController) { // already activated?\r\n return;\r\n }\r\n if (activeEditController !== null) {\r\n throw new Error(\"SlickGrid.EditorLock.activate: an editController is still active, can't activate another editController\");\r\n }\r\n if (!editController.commitCurrentEdit) {\r\n throw new Error(\"SlickGrid.EditorLock.activate: editController must implement .commitCurrentEdit()\");\r\n }\r\n if (!editController.cancelCurrentEdit) {\r\n throw new Error(\"SlickGrid.EditorLock.activate: editController must implement .cancelCurrentEdit()\");\r\n }\r\n activeEditController = editController;\r\n };\r\n\r\n /***\r\n * Unsets the specified edit controller as the active edit controller (release edit lock).\r\n * If the specified edit controller is not the active one, an exception will be throw new Error(.\r\n * @method deactivate\r\n * @param editController {EditController} edit controller releasing the lock\r\n */\r\n this.deactivate = function (editController) {\r\n if (activeEditController !== editController) {\r\n throw new Error(\"SlickGrid.EditorLock.deactivate: specified editController is not the currently active one\");\r\n }\r\n activeEditController = null;\r\n };\r\n\r\n /***\r\n * Attempts to commit the current edit by calling \"commitCurrentEdit\" method on the active edit\r\n * controller and returns whether the commit attempt was successful (commit may fail due to validation\r\n * errors, etc.). Edit controller's \"commitCurrentEdit\" must return true if the commit has succeeded\r\n * and false otherwise. If no edit controller is active, returns true.\r\n * @method commitCurrentEdit\r\n * @return {Boolean}\r\n */\r\n this.commitCurrentEdit = function (): boolean {\r\n return (activeEditController ? activeEditController.commitCurrentEdit() : true);\r\n };\r\n\r\n /***\r\n * Attempts to cancel the current edit by calling \"cancelCurrentEdit\" method on the active edit\r\n * controller and returns whether the edit was successfully cancelled. If no edit controller is\r\n * active, returns true.\r\n * @method cancelCurrentEdit\r\n * @return {Boolean}\r\n */\r\n this.cancelCurrentEdit = function cancelCurrentEdit() {\r\n return (activeEditController ? activeEditController.cancelCurrentEdit() : true);\r\n };\r\n}\r\n\r\n// /**\r\n// *\r\n// * @param {Array} treeColumns Array com levels of columns\r\n// * @returns {{hasDepth: 'hasDepth', getTreeColumns: 'getTreeColumns', extractColumns: 'extractColumns', getDepth: 'getDepth', getColumnsInDepth: 'getColumnsInDepth', getColumnsInGroup: 'getColumnsInGroup', visibleColumns: 'visibleColumns', filter: 'filter', reOrder: reOrder}}\r\n// * @constructor\r\n// */\r\n// function TreeColumns(treeColumns) {\r\n\r\n// var columnsById = {};\r\n\r\n// function init() {\r\n// mapToId(treeColumns);\r\n// }\r\n\r\n// function mapToId(columns) {\r\n// columns\r\n// .forEach(function (column) {\r\n// columnsById[column.id] = column;\r\n\r\n// if (column.columns) {\r\n// mapToId(column.columns);\r\n// }\r\n// });\r\n// }\r\n\r\n// function filter(node, condition) {\r\n\r\n// return node.filter(function (column) {\r\n\r\n// var valid = condition.call(column);\r\n\r\n// if (valid && column.columns) {\r\n// column.columns = filter(column.columns, condition);\r\n// }\r\n\r\n// return valid && (!column.columns || column.columns.length);\r\n// });\r\n\r\n// }\r\n\r\n// function sort(columns, grid) {\r\n// columns\r\n// .sort(function (a, b) {\r\n// var indexA = getOrDefault(grid.getColumnIndex(a.id)),\r\n// indexB = getOrDefault(grid.getColumnIndex(b.id));\r\n\r\n// return indexA - indexB;\r\n// })\r\n// .forEach(function (column) {\r\n// if (column.columns) {\r\n// sort(column.columns, grid);\r\n// }\r\n// });\r\n// }\r\n\r\n// function getOrDefault(value) {\r\n// return typeof value === \"undefined\" ? -1 : value;\r\n// }\r\n\r\n// function getDepth(node) {\r\n// if (node.length) {\r\n// for (var i in node)\r\n// return getDepth(node[i]);\r\n// }\r\n// else if (node.columns) {\r\n// return 1 + getDepth(node.columns);\r\n// }\r\n// else {\r\n// return 1;\r\n// }\r\n// }\r\n\r\n// function getColumnsInDepth(node: any[], depth: number, current?: number) {\r\n// var columns = [];\r\n// current = current || 0;\r\n\r\n// if (depth == current) {\r\n\r\n// if (node.length) {\r\n// node.forEach(function (n) {\r\n// if (n.columns)\r\n// n.extractColumns = function () {\r\n// return extractColumns(n);\r\n// };\r\n// });\r\n// }\r\n\r\n// return node;\r\n// } else {\r\n// for (var i in node) {\r\n// if (node[i].columns) {\r\n// columns = columns.concat(getColumnsInDepth(node[i].columns, depth, current + 1));\r\n// }\r\n// }\r\n// }\r\n\r\n// return columns;\r\n// }\r\n\r\n// function extractColumns(node) {\r\n// var result = [];\r\n\r\n// if (node.hasOwnProperty(\"length\")) {\r\n\r\n// for (var i = 0; i < node.length; i++) {\r\n// result = result.concat(extractColumns(node[i]));\r\n// }\r\n\r\n// } else {\r\n\r\n// if (node.hasOwnProperty(\"columns\")) {\r\n\r\n// result = result.concat(extractColumns(node.columns));\r\n// } else {\r\n// return node;\r\n// }\r\n\r\n// }\r\n\r\n// return result;\r\n// }\r\n\r\n// function cloneTreeColumns() {\r\n// return (<any>window).Slick.$.shallowExtend([], treeColumns);\r\n// }\r\n\r\n// init();\r\n\r\n// this.hasDepth = function () {\r\n\r\n// for (var i in treeColumns) {\r\n// if (treeColumns[i].hasOwnProperty('columns'))\r\n// return true;\r\n// }\r\n\r\n// return false;\r\n// };\r\n\r\n// this.getTreeColumns = function () {\r\n// return treeColumns;\r\n// };\r\n\r\n// this.extractColumns = function () {\r\n// return this.hasDepth() ? extractColumns(treeColumns) : treeColumns;\r\n// };\r\n\r\n// this.getDepth = function () {\r\n// return getDepth(treeColumns);\r\n// };\r\n\r\n// this.getColumnsInDepth = function (depth) {\r\n// return getColumnsInDepth(treeColumns, depth);\r\n// };\r\n\r\n// this.getColumnsInGroup = function (groups) {\r\n// return extractColumns(groups);\r\n// };\r\n\r\n// this.visibleColumns = function () {\r\n// return filter(cloneTreeColumns(), function () {\r\n// return this.visible;\r\n// });\r\n// };\r\n\r\n// this.filter = function (condition) {\r\n// return filter(cloneTreeColumns(), condition);\r\n// };\r\n\r\n// this.reOrder = function (grid) {\r\n// return sort(treeColumns, grid);\r\n// };\r\n\r\n// this.getById = function (id) {\r\n// return columnsById[id];\r\n// };\r\n\r\n// this.getInIds = function (ids) {\r\n// return ids.map(function (id) {\r\n// return columnsById[id];\r\n// });\r\n// };\r\n// }\r\n\r\n// (<any>window).Slick = Slick;\r\n\r\n","export interface IjQueryWrapper {\r\n length: number;\r\n empty: () => IjQueryWrapper;\r\n appendTo: (selector: IjQueryWrapper | HTMLElement) => IjQueryWrapper;\r\n append: (el: HTMLElement) => IjQueryWrapper;\r\n add: (selector: IjQueryWrapper | HTMLElement) => IjQueryWrapper;\r\n css: (key: string, value?: any) => IjQueryWrapper | any;\r\n attr: (key: string, value?: any) => IjQueryWrapper | string;\r\n closestClass: (name: string, stopAt?: string) => IjQueryWrapper;\r\n data: (name: string, value?: any) => any;\r\n remove(): void;\r\n html: (value?: any) => string | IjQueryWrapper;\r\n text: (value: string) => IjQueryWrapper;\r\n addClass: (name: string) => IjQueryWrapper;\r\n hasClass: (name: string) => boolean;\r\n height: (val?: number | string) => number | IjQueryWrapper;\r\n width: (val?: number | string) => number | IjQueryWrapper;\r\n removeClass: (name: string) => IjQueryWrapper;\r\n offset: () => { top: number, left: number };\r\n children: () => IjQueryWrapper;\r\n on: (eventname: string, fnc: Function) => IjQueryWrapper;\r\n toggleClass: (name: string, state?: boolean) => IjQueryWrapper;\r\n find: (selector: string) => IjQueryWrapper;\r\n slideDown: (speed: string, done: Function) => IjQueryWrapper;\r\n slideUp: (speed: string, done: Function) => IjQueryWrapper;\r\n index: () => number;\r\n}\r\n\r\nexport interface IjQueryReplacement {\r\n (selector?: string | HTMLElement | Document): IjQueryWrapper;\r\n deepExtend?: (out: any, ...a: any[]) => any;\r\n shallowExtend?: (out: any, ...a: any[]) => any;\r\n each?: (array: any[] | IjQueryWrapper, fnc: (idx: number, val: any) => void) => void;\r\n}\r\n\r\nfunction deepExtend(out: any, ...a: any[]): any {\r\n out = out || {};\r\n\r\n for (let i = 1; i < arguments.length; i++) {\r\n let obj = arguments[i];\r\n\r\n if (!obj)\r\n continue;\r\n\r\n for (let key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n if (obj[key] !== null && typeof obj[key] === 'object')\r\n out[key] = deepExtend((Array.isArray(obj[key]) && out[key] === undefined) ? [] : out[key], obj[key]);\r\n else\r\n out[key] = obj[key];\r\n }\r\n }\r\n }\r\n\r\n return out;\r\n}\r\n\r\nfunction getParentWithClass(el: HTMLElement, c: string, stopAt?: string): HTMLElement {\r\n if (el.classList.contains(c))\r\n return el;\r\n if (stopAt !== undefined && el.classList.contains(stopAt))\r\n return undefined;\r\n if (el.parentElement) {\r\n return getParentWithClass(el.parentElement, c);\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction jQWrapper(elements: HTMLElement[]): IjQueryWrapper {\r\n let _elements: any = elements;\r\n\r\n _elements.empty = function (): IjQueryWrapper {\r\n for (let x of _elements) {\r\n x.innerHTML = '';\r\n }\r\n return this;\r\n };\r\n\r\n _elements.appendTo = function (selector: IjQueryWrapper | HTMLElement): IjQueryWrapper {\r\n for (let i = 0; i < _elements.length; i++) {\r\n if (selector instanceof HTMLElement) {\r\n selector.appendChild(_elements[i]);\r\n } else {\r\n for (let j = 0; j < selector.length; j++) {\r\n selector[j].appendChild(_elements[i]);\r\n }\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n _elements.append = function (el: HTMLElement): IjQueryWrapper {\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i].appendChild(el);\r\n }\r\n return this;\r\n };\r\n\r\n _elements.add = function (selector: IjQueryWrapper | HTMLElement): IjQueryWrapper {\r\n if (selector !== undefined) {\r\n if (selector instanceof HTMLElement) {\r\n _elements.push(selector);\r\n } else {\r\n for (let i = 0; i < selector.length; i++) {\r\n _elements.push(selector[i]);\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n _elements.css = function (key: string | any, value?: any): IjQueryWrapper | any {\r\n // TODO: support object instead of just simple keys\r\n if (value === undefined) {\r\n if (typeof (key) === \"string\") {\r\n if (!_elements.length) {\r\n return undefined;\r\n }\r\n const computed = [\"borderLeftWidth\", \"borderRightWidth\", \"paddingLeft\", \"paddingRight\",\r\n \"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\"];\r\n if (computed.indexOf(key) < 0) {\r\n return _elements[0].style[key];\r\n }\r\n return window.getComputedStyle(_elements[0])[key];\r\n } else {\r\n for (const keyEl in key) {\r\n if (!key.hasOwnProperty(keyEl)) {\r\n continue;\r\n }\r\n for (let i = 0; i < _elements.length; i++) {\r\n if ([\"height\", \"width\", \"top\", \"left\", \"bottom\", \"right\"].indexOf(keyEl) >= 0 && typeof key[keyEl] === \"number\") {\r\n _elements[i].style[keyEl] = key[keyEl] + \"px\";\r\n } else {\r\n _elements[i].style[keyEl] = key[keyEl];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < _elements.length; i++) {\r\n if ([\"height\", \"width\", \"top\", \"left\", \"bottom\", \"right\"].indexOf(key) >= 0 && typeof value === \"number\") {\r\n _elements[i].style[key] = value + \"px\";\r\n } else {\r\n _elements[i].style[key] = value;\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n _elements.attr = function (key: string, value?: any): IjQueryWrapper | string {\r\n if (value === undefined) {\r\n return _elements.length ? _elements[0][key] : undefined;\r\n }\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i][key] = value;\r\n }\r\n return this;\r\n }\r\n\r\n _elements.closestClass = function (name: string, stopAt?: string): IjQueryWrapper {\r\n let result = jQueryReplacement();\r\n for (let i = 0; i < _elements.length; i++) {\r\n let match = getParentWithClass(_elements[i], name, stopAt);\r\n result.add(match);\r\n }\r\n return result;\r\n }\r\n\r\n _elements.remove = function (): void {\r\n for (let i = 0; i < _elements.length; i++) {\r\n let el = _elements[i];\r\n el.parentNode.removeChild(el);\r\n }\r\n }\r\n\r\n _elements.data = function (name: string, value?: any): any {\r\n if (_elements.length === 0)\r\n return undefined;\r\n if (value === undefined) {\r\n return _elements[0][name];\r\n }\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i][name] = value;\r\n }\r\n return this;\r\n }\r\n\r\n _elements.html = function (value?: any): string | IjQueryWrapper {\r\n if (value === undefined) {\r\n return _elements.length ? _elements[0].innerHTML : undefined;\r\n }\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i].innerHTML = value;\r\n }\r\n return this;\r\n }\r\n\r\n _elements.text = function (value: string): IjQueryWrapper {\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i].innerText = value;\r\n }\r\n return this;\r\n }\r\n\r\n _elements.height = function (value?: number | string): number | IjQueryWrapper {\r\n if (value === undefined) {\r\n if (!_elements.length) {\r\n return undefined;\r\n }\r\n let cssHeight = parseInt(_elements[0].style.height);\r\n if (isNaN(cssHeight)) {\r\n return _elements[0].offsetHeight;\r\n } else {\r\n return cssHeight;\r\n }\r\n }\r\n for (let i = 0; i < _elements.length; i++) {\r\n if (typeof value === \"string\") {\r\n _elements[i].style.height = value;\r\n } else {\r\n //_elements[i].offsetHeight = value;\r\n _elements[i].style.height = value + \"px\";\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n _elements.width = function (value?: number | string): number | IjQueryWrapper {\r\n if (value === undefined) {\r\n if (!_elements.length) {\r\n return undefined;\r\n }\r\n // let cssHeight = parseInt(_elements[0].style.width);\r\n // if (isNaN(cssHeight)) {\r\n return _elements[0].offsetWidth;\r\n // } else {\r\n // return cssHeight;\r\n // }\r\n }\r\n for (let i = 0; i < _elements.length; i++) {\r\n if (typeof value === \"string\") {\r\n _elements[i].style.width = value;\r\n } else {\r\n //_elements[i].offsetWidth = value;\r\n _elements[i].style.width = value + \"px\";\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n _elements.removeClass = function (name: string): IjQueryWrapper {\r\n for (let i = 0; i < _elements.length; i++) {\r\n if (name.indexOf(' ') > 0) {\r\n let names = name.split(' ');\r\n for (let nIdx = 0; nIdx < names.length; nIdx++) {\r\n _elements[i].classList.remove(names[nIdx]);\r\n }\r\n } else {\r\n _elements[i].classList.remove(name);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n _elements.offset = function (): { top: number, left: number } {\r\n if (_elements.length === 0)\r\n return undefined;\r\n let el = _elements[0];\r\n let rect = el.getBoundingClientRect();\r\n return {\r\n top: rect.top + document.body.scrollTop,\r\n left: rect.left + document.body.scrollLeft\r\n };\r\n }\r\n\r\n _elements.children = function (): IjQueryWrapper {\r\n let result: HTMLElement[] = [];\r\n for (let i = 0; i < _elements.length; i++) {\r\n for (let cidx = 0; cidx < _elements[i].children.length; cidx++) {\r\n result.push(_elements[i].children[cidx]);\r\n }\r\n }\r\n return jQWrapper(result);\r\n }\r\n\r\n _elements.on = function (eventname: string, fnc: Function): IjQueryWrapper {\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i].addEventListener(eventname, fnc);\r\n }\r\n return this;\r\n }\r\n\r\n _elements.toggleClass = function (name: string, state?: boolean): IjQueryWrapper {\r\n for (let i = 0; i < _elements.length; i++) {\r\n if (state === false || _elements[i].classList.contains(name)) {\r\n _elements[i].classList.remove(name);\r\n } else if (state === true || !_elements[i].classList.contains(name)) {\r\n _elements[i].classList.add(name);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n _elements.find = function (selector: string): IjQueryWrapper {\r\n var result = jQueryReplacement();\r\n for (let i = 0; i < _elements.length; i++) {\r\n let found = _elements[i].querySelectorAll(selector);\r\n for (let j = 0; j < found.length; j++) {\r\n result.add(found[j]);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n _elements.slideDown = function (speed: string, done: Function): IjQueryWrapper {\r\n //TODO\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i].style.display = '';\r\n }\r\n return this;\r\n }\r\n\r\n _elements.slideUp = function (speed: string, done: Function): IjQueryWrapper {\r\n //TODO\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i].style.display = 'none';\r\n }\r\n return this;\r\n }\r\n\r\n _elements.addClass = function (name: string): IjQueryWrapper {\r\n if (name) {\r\n {\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i].classList.add(name);\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n _elements.hasClass = function (name: string): boolean {\r\n for (let i = 0; i < _elements.length; i++) {\r\n if (_elements[i].classList.contains(name))\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n _elements.index = function (): number {\r\n var index = 0;\r\n let node = _elements[0];\r\n if (!node)\r\n return -1;\r\n while ((node = node.previousElementSibling)) {\r\n index++;\r\n }\r\n return index;\r\n }\r\n\r\n\r\n return _elements;\r\n}\r\n\r\nexport let jQueryReplacement: IjQueryReplacement = function (selector?: string | HTMLElement): IjQueryWrapper {\r\n let elements: HTMLElement[] = [];\r\n if (typeof selector === \"string\") {\r\n if (selector[0] === '<') {\r\n var tmp = document.createElement(\"div\");\r\n tmp.innerHTML = selector;\r\n elements.push(<HTMLElement>tmp.firstElementChild);\r\n } else {\r\n var q = document.querySelectorAll(selector);\r\n\r\n if (q) {\r\n for (let i = 0; i < q.length; i++) {\r\n let node: Node = q[i];\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n elements.push(node as HTMLElement);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n if (selector !== undefined) {\r\n elements.push(<HTMLElement>selector);\r\n }\r\n }\r\n return jQWrapper(elements);\r\n};\r\n\r\njQueryReplacement.deepExtend = deepExtend;\r\njQueryReplacement.each = function (array: any[] | IjQueryWrapper, fnc: (idx: number, val: any) => void): void {\r\n for (let i = 0; i < array.length; i++) {\r\n fnc(i, array[i]);\r\n }\r\n};\r\njQueryReplacement.shallowExtend = function (out, ...rest) {\r\n out = out || {};\r\n\r\n for (var i = 1; i < arguments.length; i++) {\r\n if (!arguments[i])\r\n continue;\r\n\r\n for (var key in arguments[i]) {\r\n if (arguments[i].hasOwnProperty(key))\r\n out[key] = arguments[i][key];\r\n }\r\n }\r\n\r\n return out;\r\n};\r\n\r\n","exports.interopDefault = function(a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function(a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function(source, dest) {\n Object.keys(source).forEach(function(key) {\n if (key === 'default' || key === '__esModule') {\n return;\n }\n\n // Skip duplicate re-exports when they have the same value.\n if (key in dest && dest[key] === source[key]) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function() {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function(dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n","import { ISlickColumn, Slick, ISlickFormatterResult, ISlickEvent } from \"./slick.core\";\r\nimport { SlickGrid, ISlickGridOptions, ISlickGrid } from \"./slick.grid\";\r\nimport { RowSelectionModel } from \"./plugins/slick.rowselectionmodel\";\r\nimport { DataView, ISlickDataView } from \"./slick.dataview\";\r\nimport { GroupItemMetadataProvider } from \"./slick.groupitemmetadataprovider\";\r\nimport { jQueryReplacement, IjQueryWrapper } from \"../core/jq\";\r\nimport { HeaderMenu } from \"./plugins/slick.headermenu\";\r\nimport { HeaderButtons } from \"./plugins/slick.headerbuttons\";\r\nimport { TextFormatter } from \"./slick.formatters\";\r\nimport { ExcelFilter } from \"./filterDialogs/excelFilter\";\r\nimport { UILang } from \"../core/lang\";\r\n\r\nexport interface ISlickCreatorOptions extends ISlickGridOptions {\r\n primaryKey: string;\r\n showHeaderMenu?: boolean;\r\n provideDefaultValues?: (item: any) => boolean | void;\r\n groupItemOptions?: any; // TODO\r\n showColumnGroups?: boolean;\r\n mode?: \"client\" | \"server\";\r\n dataView?: any; // TODO\r\n saveColumnsKey?: string;\r\n groupItemMetadataProvider?: any;\r\n getFilterValues?: (column: ISlickColumn /* TODO: selected values of other columns */) => Promise<{ [key: string]: any[] } | any[]>;\r\n showFilterDialog?: (column: ISlickColumn, grid: IJSLGrid<any>) => void;\r\n}\r\n\r\nexport interface IJSLGrid<T> extends ISlickGrid<T> {\r\n dataView: ISlickDataView<T>;\r\n setHeight: (height: number) => void;\r\n getHeight: () => number;\r\n sort: (column: ISlickColumn, sortAsc?: boolean) => void;\r\n refreshData: () => void;\r\n setData: (newData: T[]) => void;\r\n getData: () => T[];\r\n refresh: () => void;\r\n addFormula: (field: string, fnc: (row: T, grid: IJSLGrid<T>, field: string) => any,\r\n usedColumns: string[]) => void;\r\n getFormattedValue: (column: ISlickColumn, value: any, item?: T) => string;\r\n getContentWidth: (column: ISlickColumn, row: number) => number;\r\n fitToContent: (column: ISlickColumn) => void;\r\n triggerAllFormulas: () => void;\r\n columnHasFilter: (columnId: string) => boolean;\r\n refreshDataItem: (item: T) => void;\r\n addFilter: (filter: {\r\n field: string,\r\n columnId?: string,\r\n match: (item: T, field: string) => boolean, combine?: \"or\" | \"and\"\r\n }, dontrefresh?: boolean) => void;\r\n setFilters: (filters: Array<{\r\n field: string,\r\n columnId?: string,\r\n match: (item: T, field: string) => boolean, combine?: \"or\" | \"and\"\r\n }>, dontrefresh?: boolean) => void;\r\n getFilters: () => Array<{\r\n field: string,\r\n columnId?: string,\r\n match: (item: T, field: string) => boolean, combine?: \"or\" | \"and\"\r\n }>;\r\n clearFilter: (field?: string, dontrefresh?: boolean) => void;\r\n refreshFilters: (refreshFilters?: boolean) => void;\r\n getSelectedItems: () => T[];\r\n onAfterEdit: ISlickEvent<{\r\n grid: IJSLGrid<T>,\r\n oldValue: any,\r\n newValue: any,\r\n column: ISlickColumn,\r\n item: T\r\n }>;\r\n onFiltersChanged: ISlickEvent<void>;\r\n getHeaderMenu: () => any;\r\n getFilterDialog: () => any;\r\n}\r\n\r\nconst $ = jQueryReplacement;\r\n\r\nexport function createJSLGrid<T>(selector: string | HTMLDivElement, data: T[],\r\n columns: ISlickColumn[], option: ISlickCreatorOptions): IJSLGrid<T> {\r\n\r\n const formulaObjects:\r\n Array<{\r\n column: string;\r\n fnc: (item: any, creator: IJSLGrid<any>, field: string) => any\r\n }> = [];\r\n\r\n let headerMenu;\r\n let headerButtons;\r\n\r\n const formulas = {};\r\n\r\n let container: HTMLDivElement;\r\n\r\n let filters: Array<{ field: string, columnId?: string, match: (item: T, field: string) => boolean, combine?: \"or\" | \"and\" }> = [];\r\n\r\n let customCommandHandler;\r\n\r\n let grid: IJSLGrid<T>;\r\n let dataView: ISlickDataView<T>;\r\n\r\n //let options: ISlickCreatorOptions;\r\n\r\n function createMe() {\r\n\r\n sanitizeColumns(columns);\r\n const options = $.shallowExtend({ explicitInitialization: true, mode: \"client\" }, option);\r\n\r\n container = typeof (selector) === \"string\" ?\r\n document.querySelector(selector) as HTMLDivElement :\r\n selector as HTMLDivElement;\r\n\r\n if (!container) {\r\n throw new Error(\"error: selector for SlickCreator is invalid\");\r\n }\r\n\r\n if (options.showColumnGroups) {\r\n options.createPreHeaderPanel = true;\r\n options.showPreHeaderPanel = true;\r\n }\r\n\r\n customCommandHandler = option.editCommandHandler;\r\n options.editCommandHandler = (a, b, c) => { handleEditCommand(a, b, c); };\r\n\r\n const groupItemMetadataProvider = options.groupItemMetadataProvider || GroupItemMetadataProvider(options.groupItemOptions);\r\n if (options.dataView != null) {\r\n dataView = options.dataView;\r\n } else {\r\n dataView = new DataView({ inlineFilters: true, groupItemMetadataProvider });\r\n dataView.setItems(data, options.primaryKey);\r\n }\r\n grid = new SlickGrid(container, dataView, columns, options);\r\n grid.registerPlugin(groupItemMetadataProvider);\r\n grid.setSelectionModel(new RowSelectionModel());\r\n\r\n grid.onHeaderCellRendered.subscribe((e, args) => {\r\n if (columnHasFilter(args.column.id)) {\r\n //this column is filtered\r\n args.node.classList.add(\"slick-filtered-header\");\r\n }\r\n });\r\n\r\n addCustomEvents();\r\n setupDefaultSort();\r\n setupChangeEvents();\r\n if (options.showHeaderMenu) {\r\n setupHeaderMenu();\r\n }\r\n setupHeaderButtons();\r\n\r\n if (!option.explicitInitialization) {\r\n grid.init();\r\n }\r\n\r\n if (options.showColumnGroups) {\r\n setTimeout(() => {\r\n // TODO -> find better solution then timeout\r\n grid.onColumnsResized.subscribe(() => {\r\n CreateColumnGroups();\r\n });\r\n CreateColumnGroups();\r\n }, 1);\r\n }\r\n\r\n if (options.saveColumnsKey) {\r\n grid.onColumnsResized.subscribe(() => {\r\n storeColumnSettings();\r\n });\r\n grid.onColumnsReordered.subscribe(() => {\r\n storeColumnSettings();\r\n });\r\n loadColumnSettings();\r\n }\r\n\r\n }\r\n\r\n function CreateColumnGroups() {\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n const columns = grid.getColumns();\r\n if (options.frozenColumn >= 0) {\r\n // Add column groups to left panel\r\n let $preHeaderPanel = $(grid.getPreHeaderPanel());\r\n renderHeaderGroups($preHeaderPanel, 0, options.frozenColumn + 1);\r\n // Add column groups to right panel\r\n $preHeaderPanel = $(grid.getPreHeaderPanelRight());\r\n renderHeaderGroups($preHeaderPanel, options.frozenColumn + 1, columns.length);\r\n } else {\r\n const $preHeaderPanel = $(grid.getPreHeaderPanel());\r\n renderHeaderGroups($preHeaderPanel, 0, columns.length);\r\n }\r\n\r\n function renderHeaderGroups(preHeaderPanel, start, end) {\r\n preHeaderPanel.empty()\r\n .addClass(\"slick-header-columns\")\r\n .css(\"left\", \"-1000px\")\r\n .width(grid.getHeadersWidth());\r\n preHeaderPanel[0].parentElement.classList.add(\"slick-header\");\r\n\r\n const headerColumnWidthDiff = grid.getHeaderColumnWidthDiff();\r\n let header;\r\n let lastColumnGroup = \"\";\r\n let widthTotal = 0;\r\n\r\n for (let i = start; i < end; i++) {\r\n const m = columns[i];\r\n if (lastColumnGroup === m.columnGroup && i > start) {\r\n widthTotal += m.width;\r\n header.width(widthTotal - headerColumnWidthDiff);\r\n } else {\r\n widthTotal = m.width;\r\n header = (($(\"<div class='ui-state-default slick-header-column' />\")\r\n .html(\"<span class='slick-column-name'>\" + (m.columnGroup || '') + \"</span>\") as IjQueryWrapper)\r\n .width(m.width - headerColumnWidthDiff) as IjQueryWrapper)\r\n .appendTo(preHeaderPanel);\r\n }\r\n lastColumnGroup = m.columnGroup;\r\n }\r\n }\r\n\r\n }\r\n\r\n function storeColumnSettings() {\r\n const cols = grid.getColumns();\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n const colSettings = cols.map((c) => ({id: c.id, width: c.width}));\r\n if (window.localStorage) {\r\n localStorage.setItem(\"_grid_col_settings_\" + options.saveColumnsKey, JSON.stringify(colSettings));\r\n }\r\n }\r\n\r\n function loadColumnSettings() {\r\n if (!window.localStorage) {\r\n return;\r\n }\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n const key = options.saveColumnsKey;\r\n if (key) {\r\n const cols = grid.getColumns();\r\n const colSettings = JSON.parse(localStorage.getItem(\"_grid_col_settings_\" + key));\r\n if (!colSettings) {\r\n return;\r\n }\r\n for (let i = 0; i < colSettings.length; i++) {\r\n for (let j = 0; j < cols.length; j++) {\r\n if (cols[j].id === colSettings[i].id) {\r\n const c = cols[j];\r\n c.width = colSettings[i].width;\r\n if (i !== j) {\r\n cols.splice(j, 1);\r\n cols.splice(i, 0, c);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n grid.setColumns(cols);\r\n }\r\n }\r\n\r\n function sanitizeColumns(cols: ISlickColumn[]) {\r\n for (let i = 0; i < cols.length; i++) {\r\n const c = cols[i];\r\n if (c.field === undefined && c.id) {\r\n c.field = c.id;\r\n }\r\n }\r\n }\r\n\r\n function addCustomEvents() {\r\n (grid as any).onAfterEdit = new Slick.Event();\r\n (grid as any).onFiltersChanged = new Slick.Event();\r\n }\r\n\r\n function setupChangeEvents() {\r\n dataView.onRowsChanged.subscribe((e, args) => {\r\n grid.invalidateRows(args.rows);\r\n grid.render();\r\n // for (let idx = 0; idx < args.rows.length; idx++) {\r\n // grid.updateRow(args.rows[idx]);\r\n // }\r\n // grid.invalidate();\r\n });\r\n\r\n dataView.onRowCountChanged.subscribe((e, args) => {\r\n grid.updateRowCount();\r\n grid.render();\r\n });\r\n\r\n grid.onAddNewRow.subscribe((e, args) => {\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n if (options.provideDefaultValues != null) {\r\n const result = options.provideDefaultValues(args.item);\r\n if (result === false) {\r\n return;\r\n }\r\n }\r\n dataView.addItem(args.item);\r\n (grid as any).onAfterEdit.notify({\r\n grid,\r\n oldValue: undefined,\r\n newValue: grid.getDataItemValueForColumn(args.item, args.column),\r\n column: args.column,\r\n item: args.item\r\n });\r\n });\r\n }\r\n\r\n function setupDefaultSort() {\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n if (options.mode === \"client\") {\r\n grid.onSort.subscribe((e, args) => {\r\n sort(args.sortCol, args.sortAsc);\r\n });\r\n }\r\n // TODO: multi column sort\r\n }\r\n\r\n function setupHeaderButtons() {\r\n headerButtons = new HeaderButtons({});\r\n grid.registerPlugin(headerButtons);\r\n }\r\n\r\n function setupHeaderMenu() {\r\n headerMenu = new HeaderMenu({});\r\n grid.registerPlugin(headerMenu);\r\n headerMenu.onBeforeMenuShow.subscribe((e, args) => {\r\n const column: ISlickColumn = args.column;\r\n const menu = args.menu;\r\n if (column.sortable) {\r\n menu.items.push({\r\n title: UILang.grid.Sort + \" \" + UILang.grid.Asc,\r\n command: \"sort-asc\"\r\n });\r\n menu.items.push({\r\n title: UILang.grid.Sort + \" \" + UILang.grid.Desc,\r\n command: \"sort-desc\"\r\n });\r\n }\r\n if (column.filterable) {\r\n menu.items.push({\r\n title: UILang.grid.Filter,\r\n command: \"filter\"\r\n });\r\n if (filters.filter((f) => f.columnId === column.id).length > 0) {\r\n menu.items.push({\r\n title: UILang.grid.ClearFilter,\r\n command: \"clear-filter\"\r\n });\r\n }\r\n }\r\n });\r\n\r\n headerMenu.onCommand.subscribe((e, args) => {\r\n if (args.command === \"sort-asc\" || args.command === \"sort-desc\") {\r\n grid.onSort.notify({\r\n sortAsc: args.command === \"sort-asc\",\r\n sortCol: args.column,\r\n columnId: args.column.id,\r\n sortCols: [{ columnId: args.column.id, sortCol: args.column, sortAsc: args.command === \"sort-asc\" }],\r\n multiColumnSort: false\r\n }, e);\r\n // sort(args.column, args.command === \"sort-asc\");\r\n } else if (args.command === \"filter\") {\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n if (options.showFilterDialog != null) {\r\n options.showFilterDialog(args.column, grid);\r\n } else {\r\n new ExcelFilter(grid).show(args.column);\r\n }\r\n } else if (args.command === \"clear-filter\") {\r\n clearFilter(args.column.id);\r\n }\r\n });\r\n\r\n }\r\n\r\n // refresh formulas depending on the given column\r\n function triggerFormula(column, item): void {\r\n const f = formulas[column];\r\n if (f) {\r\n for (let i = 0, l = f.length; i < l; i++) {\r\n item[f[i].column] = f[i].fnc(item, column);\r\n }\r\n }\r\n }\r\n\r\n function handleEditCommand(item, column, editCommand) {\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n const oldVal = grid.getDataItemValueForColumn(item, column);\r\n if (customCommandHandler) {\r\n customCommandHandler(item, column, editCommand);\r\n } else {\r\n editCommand.execute();\r\n }\r\n triggerFormula(column.field, item);\r\n dataView.updateItem(item[options.primaryKey], item);\r\n\r\n const afterEditResult = (grid as any).onAfterEdit.notify({\r\n grid,\r\n oldValue: oldVal,\r\n newValue: grid.getDataItemValueForColumn(item, column),\r\n column,\r\n item\r\n });\r\n\r\n if (afterEditResult === false) {\r\n item[column.field] = oldVal;\r\n triggerFormula(column.field, item);\r\n dataView.updateItem(item[options.primaryKey], item);\r\n }\r\n }\r\n\r\n function setHeight(height: number): void {\r\n $(container).height(height);\r\n grid.resizeCanvas();\r\n }\r\n\r\n function getHeight(): number {\r\n return $(container).height() as number;\r\n }\r\n\r\n function sort(column: ISlickColumn, sortAsc?: boolean) {\r\n\r\n function _comparer(a, b) {\r\n let x = grid.getDataItemValueForColumn(a, column);\r\n let y = grid.getDataItemValueForColumn(b, column);\r\n if (typeof x === \"string\" && typeof y === \"string\") {\r\n x = x.toLocaleLowerCase();\r\n y = y.toLocaleLowerCase();\r\n }\r\n if (x == null && y != null) {\r\n return -1;\r\n } else if (x != null && y == null) {\r\n return 1;\r\n } else {\r\n return (x === y ? 0 : (x > y ? 1 : -1));\r\n }\r\n }\r\n\r\n function _visibleComparer(a, b) {\r\n const x = column.formatter(0, 0, grid.getDataItemValueForColumn(a, column), column, a);\r\n const y = column.formatter(0, 0, grid.getDataItemValueForColumn(b, column), column, b);\r\n let xStr = (Object.prototype.toString.call(x) !== \"[object Object]\" ? (x as string) : (x as ISlickFormatterResult).text);\r\n let yStr = (Object.prototype.toString.call(y) !== \"[object Object]\" ? (y as string) : (y as ISlickFormatterResult).text);\r\n if (typeof x === \"string\" && typeof y === \"string\") {\r\n xStr = x.toLocaleLowerCase();\r\n yStr = y.toLocaleLowerCase();\r\n }\r\n return (xStr === yStr ? 0 : (xStr > yStr ? 1 : -1));\r\n }\r\n\r\n const comparer = column.comparer || (column.sortByVisibleValue ? _visibleComparer : _comparer);\r\n dataView.sort(comparer, sortAsc ? true : false);\r\n }\r\n\r\n function setData(newData: T[]) {\r\n data = newData;\r\n dataView.setItems(data);\r\n refresh();\r\n }\r\n\r\n function getData(): T[] {\r\n return data;\r\n }\r\n\r\n function refreshData() {\r\n // var selrows = self.getSelectedRows();\r\n dataView.setItems(data);\r\n // self.setSelectedRows(selrows);\r\n refresh();\r\n }\r\n\r\n function refresh() {\r\n grid.invalidate();\r\n }\r\n\r\n function addFormula(field: string, fnc: (row: T, grid: IJSLGrid<T>, field: string) => any,\r\n usedColumns: string[]) {\r\n formulaObjects.push({ fnc, column: field });\r\n for (let i = 0; i < usedColumns.length; i++) {\r\n if (!formulas[usedColumns[i]]) {\r\n formulas[usedColumns[i]] = [];\r\n }\r\n formulas[usedColumns[i]].push({ fnc, column: field });\r\n }\r\n }\r\n\r\n /**\r\n * returns the string representation of a value based on column settings\r\n */\r\n function getFormattedValue(column: ISlickColumn, value: any, item?: T): string {\r\n const formatter = column.formatter || TextFormatter;\r\n const formatterResult = formatter(0, 0, value, column, item, grid);\r\n return (Object.prototype.toString.call(formatterResult) !== \"[object Object]\" ?\r\n (formatterResult as string) :\r\n ((formatterResult as ISlickFormatterResult).text));\r\n }\r\n\r\n function getContentWidth(column: ISlickColumn, row: number): number {\r\n const item = dataView.getItem(row);\r\n const html = getFormattedValue(column, grid.getDataItemValueForColumn(item, column), item);\r\n if (html.indexOf(\"<\") >= 0) {\r\n return calcLengthInternal(html, true) + 12;\r\n } else {\r\n if (convertElement == null) {\r\n convertElement = document.createElement(\"span\");\r\n }\r\n convertElement.innerHTML = html;\r\n return calcTextLength(convertElement.textContent) + 12;\r\n }\r\n }\r\n\r\n let measureElement: HTMLSpanElement;\r\n let convertElement: HTMLSpanElement;\r\n const charWidth = {};\r\n\r\n function calcTextLength(text: string) {\r\n let result = 0;\r\n for (let i = 0; i < text.length; i++) {\r\n const c = text[i];\r\n let w = charWidth[c];\r\n if (w == null) {\r\n charWidth[c] = w = calcLengthInternal(c, false);\r\n }\r\n result += w;\r\n }\r\n return result;\r\n }\r\n\r\n function calcLengthInternal(c: string, isHTML: boolean): number {\r\n if (measureElement == null) {\r\n measureElement = document.createElement(\"span\");\r\n measureElement.style.top = \"-100000px\";\r\n measureElement.style.position = \"absolute\";\r\n measureElement.style.whiteSpace = \"pre\";\r\n document.body.appendChild(measureElement);\r\n grid.onBeforeDestroy.subscribe(() => {\r\n if (measureElement.parentElement != null) {\r\n measureElement.parentElement.removeChild(measureElement);\r\n }\r\n });\r\n }\r\n if (isHTML) {\r\n measureElement.innerHTML = c;\r\n } else {\r\n measureElement.textContent = c;\r\n }\r\n\r\n return measureElement.getBoundingClientRect().width;\r\n }\r\n\r\n function fitToContent(column: ISlickColumn): void {\r\n let width = 10;\r\n for (let idx = 0, len = grid.getDataLength(); idx < len; idx++) {\r\n //const d = grid.getDataItem(idx);\r\n width = Math.max(width, getContentWidth(column, idx));\r\n }\r\n column.width = width;\r\n grid.setColumns(grid.getColumns());\r\n // TODO: raise column resize event\r\n // TODO (2): find more performant way to refresh columns\r\n }\r\n\r\n function triggerAllFormulas(): void {\r\n\r\n if (formulaObjects.length === 0) {\r\n return;\r\n }\r\n for (let j = 0; j < formulaObjects.length; j++) {\r\n for (let i = 0; i < data.length; i++) {\r\n const val = formulaObjects[j].fnc(data[i], grid, formulaObjects[j].column);\r\n data[i][formulaObjects[j].column] = val;\r\n }\r\n }\r\n refreshData();\r\n }\r\n\r\n function columnHasFilter(columnId: string): boolean {\r\n for (let i = 0, l = (filters ? filters.length : 0); i < l; i++) {\r\n if (filters[i].columnId === columnId) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function refreshDataItem(item: T): void {\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n dataView.updateItem(item[options.primaryKey], item);\r\n // formula refresh\r\n for (const f in formulas) {\r\n if (formulas.hasOwnProperty(f)) {\r\n triggerFormula(f, item);\r\n }\r\n }\r\n grid.updateRow(dataView.getRowByItem(item));\r\n }\r\n\r\n function addFilter(filter: {\r\n field: string,\r\n columnId?: string,\r\n match: (item: T, field: string) => boolean, combine?: \"or\" | \"and\"\r\n }, dontrefresh?: boolean): void {\r\n let filterArray;\r\n if (Array.isArray(filter)) {\r\n filterArray = filter;\r\n } else {\r\n filterArray = [filter];\r\n }\r\n for (let idx = 0; idx < filterArray.length; idx++) {\r\n // add filter\r\n filters.push(filterArray[idx]);\r\n }\r\n if (!dontrefresh) {\r\n refreshFilters();\r\n }\r\n }\r\n\r\n function setFilters(f: Array<{\r\n field: string,\r\n columnId?: string,\r\n match: (item: T, field: string) => boolean, combine?: \"or\" | \"and\"\r\n }>,\r\n dontrefresh?: boolean): void {\r\n filters = f;\r\n if (!dontrefresh) {\r\n refreshFilters();\r\n }\r\n }\r\n\r\n function getFilters() {\r\n return filters;\r\n }\r\n\r\n function clearFilter(columnId?: string, dontrefresh?: boolean): void {\r\n if (columnId === undefined) { // clear all filters\r\n filters.length = 0;\r\n } else {\r\n for (let i = 0; i < filters.length; i++) {\r\n if (filters[i].columnId === columnId) {\r\n filters.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n }\r\n if (!dontrefresh) {\r\n refreshFilters();\r\n }\r\n }\r\n\r\n function refreshFilters(noColumnHeaderRefresh?: boolean): void {\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n\r\n function client_filter(item, args): boolean {\r\n const filterArray = args;\r\n // no filter present -> show all rows\r\n if (filterArray.length === 0) {\r\n return true;\r\n }\r\n\r\n if (filterArray.length === 1) {\r\n return filterArray[0].match.call(null, item, filterArray[0].field);\r\n } else {\r\n let result = true;\r\n let i = 0;\r\n while (i < filterArray.length) {\r\n let orResult = false;\r\n while (i < filterArray.length) { // combine or(s)\r\n if (orResult || filterArray[i].match.call(null, item, filterArray[i].field)) {\r\n orResult = true;\r\n }\r\n if (filterArray[i].combine !== \"or\") {\r\n break;\r\n } else {\r\n i++;\r\n }\r\n }\r\n if (!orResult) {\r\n result = false;\r\n break;\r\n }\r\n i++;\r\n }\r\n return result;\r\n }\r\n }\r\n\r\n if (options.mode === \"client\") {\r\n dataView.setFilterArgs(filters);\r\n dataView.setFilter(client_filter);\r\n }\r\n // redraw columns\r\n if (!noColumnHeaderRefresh) {\r\n grid.setColumns(grid.getColumns());\r\n }\r\n (grid as any).onFiltersChanged.notify();\r\n }\r\n\r\n function getSelectedItems(): T[] {\r\n const selRows = grid.getSelectedRows();\r\n const rows = [];\r\n for (let i = 0; i < selRows.length; i++) {\r\n const rowIdx = selRows[i];\r\n const toPush = dataView.getItem(rowIdx);\r\n if (toPush !== undefined && !(toPush as any).__group && !(toPush as any).__groupTotals) {\r\n rows.push(toPush);\r\n }\r\n }\r\n return rows;\r\n }\r\n\r\n function getHeaderMenu(): any { // TODO -> type\r\n return headerMenu;\r\n }\r\n\r\n // function setHierachy(o: IGridTreeOptions): GridTree {\r\n // return new GridTree(this, o);\r\n // }\r\n\r\n createMe();\r\n\r\n return $.shallowExtend(grid, {\r\n dataView,\r\n setHeight,\r\n getHeight,\r\n sort,\r\n refreshData,\r\n setData,\r\n getData,\r\n refresh,\r\n addFormula,\r\n getFormattedValue,\r\n getContentWidth,\r\n fitToContent,\r\n triggerAllFormulas,\r\n columnHasFilter,\r\n refreshDataItem,\r\n addFilter,\r\n setFilters,\r\n getFilters,\r\n clearFilter,\r\n refreshFilters,\r\n getSelectedItems,\r\n getHeaderMenu // ,\r\n // setHierachy\r\n });\r\n}\r\n","/**\r\n * @license\r\n * (c) 2009-2016 Michael Leibman\r\n * michael{dot}leibman{at}gmail{dot}com\r\n * http://github.com/mleibman/slickgrid\r\n *\r\n * Distributed under MIT license.\r\n * All rights reserved.\r\n *\r\n * SlickGrid v2.4\r\n */\r\n\r\nimport { jQueryReplacement, IjQueryWrapper, IjQueryReplacement } from \"../core/jq\";\r\nimport { Slick, ISlickColumn, ISlickFormatterResult, ISlickFormatter, ISlickEvent } from \"./slick.core\";\r\nimport \"./slick.grid.css\";\r\nimport \"./slick-default-theme.css\";\r\nimport { Resizable } from \"../interaction/resizable\";\r\nimport { EventHandler } from \"../interaction/eventhandler\";\r\n\r\nexport interface ISlickGridOptions {\r\n syncColumnCellResize?: boolean;\r\n alwaysShowVerticalScroll?: boolean;\r\n alwaysShowHorizontalScroll?: boolean;\r\n alwaysAllowHorizontalScroll?: boolean;\r\n explicitInitialization?: boolean;\r\n rowHeight?: number;\r\n defaultColumnWidth?: number;\r\n enableAddRow?: boolean;\r\n leaveSpaceForNewRows?: boolean;\r\n editable?: boolean;\r\n autoEdit?: boolean;\r\n suppressActiveCellChangeOnEdit?: boolean;\r\n enableCellNavigation?: boolean;\r\n enableColumnReorder?: boolean;\r\n asyncEditorLoading?: boolean;\r\n asyncEditorLoadDelay?: number;\r\n forceFitColumns?: boolean;\r\n enableAsyncPostRender?: boolean;\r\n asyncPostRenderDelay?: number;\r\n enableAsyncPostRenderCleanup?: boolean;\r\n asyncPostRenderCleanupDelay?: number;\r\n autoHeight?: boolean;\r\n editorLock?: any;\r\n showHeaderRow?: boolean;\r\n headerRowHeight?: number;\r\n createFooterRow?: boolean;\r\n showFooterRow?: boolean;\r\n footerRowHeight?: number;\r\n createPreHeaderPanel?: boolean;\r\n showPreHeaderPanel?: boolean;\r\n preHeaderPanelHeight?: number;\r\n showTopPanel?: boolean;\r\n topPanelHeight?: number;\r\n formatterFactory?: { getFormatter: (column: ISlickColumn, row?: number) => ISlickFormatter };\r\n editorFactory?: { getEditor: (column: ISlickColumn, row?: number) => any };\r\n cellFlashingCssClass?: string;\r\n selectedCellCssClass?: string;\r\n multiSelect?: boolean;\r\n enableTextSelectionOnCells?: boolean;\r\n dataItemColumnValueExtractor?: (item: any, columnDef: ISlickColumn) => any;\r\n frozenBottom?: boolean;\r\n frozenColumn?: number;\r\n frozenRow?: number;\r\n fullWidthRows?: boolean;\r\n multiColumnSort?: boolean;\r\n numberedMultiColumnSort?: boolean;\r\n tristateMultiColumnSort?: boolean;\r\n sortColNumberInSeparateSpan?: boolean;\r\n defaultFormatter?: ISlickFormatter;\r\n forceSyncScrolling?: boolean;\r\n addNewRowCssClass?: string;\r\n preserveCopiedSelectionOnPaste?: boolean;\r\n showCellSelection?: boolean;\r\n viewportClass?: string;\r\n minRowBuffer?: number;\r\n emulatePagingWhenScrolling?: boolean;\r\n editorCellNavOnLRKeys?: boolean;\r\n doPaging?: boolean;\r\n resizeHandleWidth?: string;\r\n variableRowHeight?: boolean;\r\n editCommandHandler?: (item: any, column: ISlickColumn, editCommand: any) => void;\r\n resizeDelta?: number;\r\n dragDelta?: number;\r\n}\r\n\r\ninterface ICacheEntry {\r\n rowNode?: HTMLElement[];\r\n\r\n // colSpans of rendered cells (by column idx).\r\n // can also be used for checking whether a cell has been rendered.\r\n cellColSpans: number[];\r\n\r\n // cell nodes (by column idx). Lazy-populated by ensureCellNodesInRowsCache().\r\n cellNodesByColumnIdx: HTMLElement[];\r\n\r\n // column indices of cell nodes that have been rendered, but not yet indexed in\r\n // cellNodesByColumnIdx. These are in the same order as cell nodes added at the\r\n // end of the row.\r\n cellRenderQueue: number[];\r\n}\r\n\r\nexport interface ISlickGrid<T> {\r\n \"slickGridVersion\": string;\r\n\r\n /* events */\r\n \"onScroll\": ISlickEvent<{ scrollLeft: number, scrollTop: number }>;\r\n \"onSort\": ISlickEvent<{\r\n multiColumnSort: boolean,\r\n columnId?: string,\r\n sortCol?: ISlickColumn,\r\n sortAsc?: boolean,\r\n sortCols?: Array<{\r\n columnId?: string,\r\n sortCol?: ISlickColumn\r\n sortAsc?: boolean\r\n }>\r\n }>;\r\n \"onAppendRow\": ISlickEvent<{ row: number, item: T }>;\r\n \"onBeforeRemoveRow\": ISlickEvent<{ row: number, dom: HTMLDivElement }>;\r\n \"onClick\": ISlickEvent<{ row: number, cell: number }>;\r\n \"onDblClick\": ISlickEvent<{ row: number, cell: number }>;\r\n \"onColumnsResized\": ISlickEvent<any>;\r\n \"onAppendCell\": ISlickEvent<{ row: number, cell: number, value: any, item: T, column: ISlickColumn, dom: HTMLDivElement }>;\r\n \"onCellChange\": ISlickEvent<{ row: number, cell: number, item: T }>;\r\n \"onAddNewRow\": ISlickEvent<{ item: T, column: ISlickColumn }>;\r\n \"onHeaderRowCellRendered\": ISlickEvent<{ node: HTMLElement, column: ISlickColumn, grid: ISlickGrid<T> }>;\r\n \"onFooterRowCellRendered\": ISlickEvent<{ node: HTMLElement, column: ISlickColumn, grid: ISlickGrid<T> }>;\r\n \"onHeaderCellRendered\": ISlickEvent<{ node: HTMLElement, column: ISlickColumn, grid: ISlickGrid<T> }>;\r\n \"onBeforeEditCell\": ISlickEvent<{ row: number, cell: number, item: T, column: ISlickColumn }>;\r\n \"onSelectedRowsChanged\": ISlickEvent<{ rows: number[] }>;\r\n \"onBeforeDestroy\": ISlickEvent<any>;\r\n \"onColumnsReordered\": ISlickEvent<any>;\r\n \"onViewportChanged\": ISlickEvent<any>;\r\n \"onActiveCellChanged\": ISlickEvent<{ row: number, cell: number }>;\r\n \"onDragInit\": ISlickEvent<any>;\r\n \"onDragStart\": ISlickEvent<any>;\r\n \"onDrag\": ISlickEvent<any>;\r\n \"onDragEnd\": ISlickEvent<any>;\r\n\r\n\r\n /* methods */\r\n \"registerPlugin\": (plugin) => void;\r\n \"init\": () => void;\r\n \"resizeCanvas\": () => void;\r\n \"invalidate\": () => void;\r\n \"invalidateAllRows\": () => void;\r\n \"updateRow\": (row: number) => void;\r\n \"getColumns\": () => ISlickColumn[];\r\n \"setColumns\": (columns: ISlickColumn[]) => void;\r\n \"getSelectedRows\": () => number[];\r\n \"setSelectedRows\": (rows: number[]) => void;\r\n \"invalidateRows\": (rows: number[]) => void;\r\n \"render\": () => void;\r\n \"updateRowCount\": () => void;\r\n \"getColumnIndex\": (columnId: string) => number;\r\n \"scrollRowIntoView\": (row: number, doPaging?: boolean) => void;\r\n \"flashCell\": (row: number, cell: number, speed?: number, times?: number) => void;\r\n \"getActiveCell\": () => { row: number, cell: number };\r\n \"setActiveCell\": (row: number, cell: number, opt_editMode?: boolean,\r\n preClickModeOn?: boolean, suppressActiveCellChangedEvent?: boolean) => void;\r\n \"gotoCell\": (row: number, cell: number, forceEdit?: boolean, e?: any) => void;\r\n \"destroy\": () => void;\r\n \"getColumnById\": (id: string) => ISlickColumn;\r\n \"getHeaderColumnWidthDiff\": () => number;\r\n \"getPreHeaderPanel\": () => HTMLDivElement;\r\n \"getPreHeaderPanelRight\": () => HTMLDivElement;\r\n \"getHeadersWidth\": () => number;\r\n \"getViewportNode\": () => HTMLDivElement;\r\n \"updateColumnHeader\": (columnId: string, title: string, toolTip: string) => void;\r\n \"setSortColumn\": (columnId: string, ascending?: boolean) => void;\r\n \"setSortColumns\": (columns: Array<{ columnId: string, ascending?: boolean }>) => void;\r\n \"getSortColumns\": () => Array<{ columnId: string, ascending?: boolean }>;\r\n \"autosizeColumns\": () => void;\r\n \"setOptions\": (args: ISlickGridOptions, supressRender?: boolean) => void;\r\n \"getOptions\": () => ISlickGridOptions;\r\n \"scrollRowToTop\": (row: number) => void;\r\n \"scrollCellIntoView\": (row: number, cell: number, doPaging?: boolean) => void;\r\n \"scrollColumnIntoView\": (cell: number) => void;\r\n \"getCellFromPoint\": (x: number, y: number) => { row: number, cell: number };\r\n \"getCellFromEvent\": (e: any, dd: any) => { row: number, cell: number };\r\n \"getActiveCellNode\": () => HTMLElement;\r\n // \"unregisterPlugin\": unregisterPlugin,\r\n // \"getPluginByName\": getPluginByName,\r\n \"getDataLength\": () => number;\r\n \"getDataItem\": (idx: number) => T;\r\n \"getSelectionModel\": () => any; // TODO\r\n \"setSelectionModel\": (model: any) => void; // TODO\r\n \"getContainerNode\": () => HTMLDivElement;\r\n \"getDataItemValueForColumn\": (item: T, columnDef: ISlickColumn) => any;\r\n \"getViewport\": (viewPortTop?: number, viewPortLeft?: number) => { top: number, bottom: number, leftPx: number, rightPx: number };\r\n \"getRenderedRange\": (viewportTop?: number, viewportLeft?: number) => { top: number, bottom: number, leftPx: number, rightPx: number };\r\n \"getEditController\": () => {commitCurrentEdit: () => boolean, cancelCurrentEdit: () => boolean};\r\n\r\n // // Events\r\n // \"onHeaderContextMenu\": new Slick.Event(),\r\n // \"onHeaderClick\": new Slick.Event(),\r\n // ,\r\n // \"onBeforeHeaderCellDestroy\": new Slick.Event(),\r\n // \"onBeforeHeaderRowCellDestroy\": new Slick.Event(),\r\n // \"onBeforeFooterRowCellDestroy\": new Slick.Event(),\r\n // \"onMouseEnter\": new Slick.Event(),\r\n // \"onMouseLeave\": new Slick.Event(),\r\n // \"onContextMenu\": new Slick.Event(),\r\n // \"onKeyDown\": new Slick.Event(),\r\n // \"onValidationError\": new Slick.Event(),\r\n // ,\r\n // \"onBeforeCellEditorDestroy\": new Slick.Event(),\r\n // \r\n // \"onActiveCellPositionChanged\": new Slick.Event(),\r\n // \"onDragInit\": new Slick.Event(),\r\n // \"onDragStart\": new Slick.Event(),\r\n // \"onDrag\": new Slick.Event(),\r\n // \"onDragEnd\": new Slick.Event(),\r\n // \"onCellCssStylesChanged\": new Slick.Event(),\r\n // \"onAutosizeColumns\": new Slick.Event(),\r\n // \"onRendered\": new Slick.Event(),\r\n\r\n // // Methods\r\n // \"setData\": setData,\r\n // \"getData\": getData,\r\n\r\n // \"getContainerNode\": getContainerNode,\r\n // \"updatePagingStatusFromView\": updatePagingStatusFromView,\r\n // \"applyFormatResultToCellNode\": applyFormatResultToCellNode,\r\n\r\n // \"invalidateRow\": invalidateRow,\r\n // \"invalidateAllRows\": invalidateAllRows,\r\n // \"updateCell\": updateCell,\r\n // \"updateRow\": updateRow,\r\n\r\n // \"getCanvasNode\": getCanvasNode,\r\n // \"getUID\": getUID,\r\n //\r\n // \"getScrollbarDimensions\": getScrollbarDimensions,\r\n // ,\r\n // \"getCanvasWidth\": getCanvasWidth,\r\n // \"getCanvases\": getCanvases,\r\n // \"getActiveCanvasNode\": getActiveCanvasNode,\r\n // \"setActiveCanvasNode\": setActiveCanvasNode,\r\n // \"getActiveViewportNode\": getActiveViewportNode,\r\n // \"setActiveViewportNode\": setActiveViewportNode,\r\n // \"focus\": setFocus,\r\n // \"scrollTo\": scrollTo,\r\n\r\n // \"getActiveCellPosition\": getActiveCellPosition,\r\n // \"resetActiveCell\": resetActiveCell,\r\n // \"editActiveCell\": makeActiveCellEditable,\r\n // \"getCellEditor\": getCellEditor,\r\n // \"getCellNode\": getCellNode,\r\n // \"getCellNodeBox\": getCellNodeBox,\r\n // \"canCellBeSelected\": canCellBeSelected,\r\n // \"canCellBeActive\": canCellBeActive,\r\n // \"navigatePrev\": navigatePrev,\r\n // \"navigateNext\": navigateNext,\r\n // \"navigateUp\": navigateUp,\r\n // \"navigateDown\": navigateDown,\r\n // \"navigateLeft\": navigateLeft,\r\n // \"navigateRight\": navigateRight,\r\n // \"navigatePageUp\": navigatePageUp,\r\n // \"navigatePageDown\": navigatePageDown,\r\n // \"navigateTop\": navigateTop,\r\n // \"navigateBottom\": navigateBottom,\r\n // \"navigateRowStart\": navigateRowStart,\r\n // \"navigateRowEnd\": navigateRowEnd,\r\n // \"getTopPanel\": getTopPanel,\r\n // \"setTopPanelVisibility\": setTopPanelVisibility,\r\n //\r\n // \"setPreHeaderPanelVisibility\": setPreHeaderPanelVisibility,\r\n // \"getHeader\": getHeader,\r\n // \"getHeaderColumn\": getHeaderColumn,\r\n // \"setHeaderRowVisibility\": setHeaderRowVisibility,\r\n // \"getHeaderRow\": getHeaderRow,\r\n // \"getHeaderRowColumn\": getHeaderRowColumn,\r\n // \"setFooterRowVisibility\": setFooterRowVisibility,\r\n // \"getFooterRow\": getFooterRow,\r\n // \"getFooterRowColumn\": getFooterRowColumn,\r\n // \"getGridPosition\": getGridPosition,\r\n // \"addCellCssStyles\": addCellCssStyles,\r\n // \"setCellCssStyles\": setCellCssStyles,\r\n // \"removeCellCssStyles\": removeCellCssStyles,\r\n // \"getCellCssStyles\": getCellCssStyles,\r\n // \"getFrozenRowOffset\": getFrozenRowOffset,\r\n\r\n // // IEditor implementation\r\n // \"getEditorLock\": getEditorLock\r\n}\r\n\r\nlet $: IjQueryReplacement = Slick.$;\r\n\r\n$.deepExtend(Slick, { Grid: SlickGrid });\r\n\r\n// shared across all grids on the page\r\nvar scrollbarDimensions;\r\nvar maxSupportedCssHeight; // = 500000; // browser's breaking point\r\n\r\n\r\nexport function SlickGrid(container: HTMLDivElement | string, data, columns: ISlickColumn[], options: ISlickGridOptions) {\r\n // settings\r\n var defaults: ISlickGridOptions = {\r\n // syncColumnCellResize: true, // TODO: remove this option\r\n alwaysShowVerticalScroll: false,\r\n alwaysShowHorizontalScroll: false,\r\n alwaysAllowHorizontalScroll: false,\r\n explicitInitialization: false,\r\n rowHeight: 28,\r\n defaultColumnWidth: 80,\r\n enableAddRow: false,\r\n leaveSpaceForNewRows: false,\r\n editable: false,\r\n autoEdit: true,\r\n suppressActiveCellChangeOnEdit: false,\r\n enableCellNavigation: true,\r\n enableColumnReorder: true,\r\n asyncEditorLoading: false,\r\n asyncEditorLoadDelay: 100,\r\n forceFitColumns: false,\r\n enableAsyncPostRender: false,\r\n asyncPostRenderDelay: 50,\r\n enableAsyncPostRenderCleanup: false,\r\n asyncPostRenderCleanupDelay: 40,\r\n autoHeight: false,\r\n editorLock: Slick.GlobalEditorLock,\r\n showHeaderRow: false,\r\n headerRowHeight: 28,\r\n createFooterRow: false,\r\n showFooterRow: false,\r\n footerRowHeight: 28,\r\n createPreHeaderPanel: false,\r\n showPreHeaderPanel: false,\r\n preHeaderPanelHeight: 28,\r\n showTopPanel: false,\r\n topPanelHeight: 28,\r\n formatterFactory: null,\r\n editorFactory: null,\r\n cellFlashingCssClass: \"flashing\",\r\n selectedCellCssClass: \"selected\",\r\n multiSelect: true,\r\n enableTextSelectionOnCells: false,\r\n dataItemColumnValueExtractor: null,\r\n frozenBottom: false,\r\n frozenColumn: -1,\r\n frozenRow: -1,\r\n fullWidthRows: false,\r\n multiColumnSort: false,\r\n numberedMultiColumnSort: false,\r\n tristateMultiColumnSort: false,\r\n sortColNumberInSeparateSpan: false,\r\n defaultFormatter: defaultFormatter,\r\n forceSyncScrolling: false,\r\n addNewRowCssClass: \"new-row\",\r\n preserveCopiedSelectionOnPaste: false,\r\n showCellSelection: true,\r\n viewportClass: null,\r\n minRowBuffer: 3,\r\n emulatePagingWhenScrolling: true, // when scrolling off bottom of viewport, place new row at top of viewport\r\n editorCellNavOnLRKeys: false, // TODO: change to true per default?\r\n doPaging: true,\r\n resizeDelta: 2, // NEW\r\n dragDelta: 3, // NEW\r\n };\r\n\r\n var columnDefaults = {\r\n name: \"\",\r\n resizable: true,\r\n sortable: false,\r\n minWidth: 30,\r\n width: undefined,\r\n rerenderOnResize: false,\r\n headerCssClass: null,\r\n defaultSortAsc: true,\r\n focusable: true,\r\n selectable: true\r\n };\r\n\r\n // scroller\r\n var th; // virtual height\r\n var h; // real scrollable height\r\n var ph; // page height\r\n var n; // number of pages\r\n var cj; // \"jumpiness\" coefficient\r\n\r\n var page = 0; // current page\r\n var offset = 0; // current page offset\r\n var vScrollDir = 1;\r\n // var programmaticScrollingTimeout;\r\n\r\n // private\r\n var initialized = false;\r\n var $container: IjQueryWrapper;\r\n var uid = \"slickgrid_\" + Math.round(1000000 * Math.random());\r\n var self = this;\r\n var $focusSink: IjQueryWrapper, $focusSink2: IjQueryWrapper;\r\n var $groupHeaders: IjQueryWrapper = $();\r\n var $headerScroller: IjQueryWrapper;\r\n var $headers: IjQueryWrapper;\r\n var $headerRow: IjQueryWrapper, $headerRowScroller: IjQueryWrapper, $headerRowSpacerL: IjQueryWrapper, $headerRowSpacerR: IjQueryWrapper;\r\n var $footerRow: IjQueryWrapper, $footerRowScroller: IjQueryWrapper, $footerRowSpacerL: IjQueryWrapper, $footerRowSpacerR: IjQueryWrapper;\r\n var $preHeaderPanel: IjQueryWrapper, $preHeaderPanelScroller: IjQueryWrapper, $preHeaderPanelSpacer: IjQueryWrapper;\r\n var $preHeaderPanelR: IjQueryWrapper, $preHeaderPanelScrollerR: IjQueryWrapper, $preHeaderPanelSpacerR: IjQueryWrapper;\r\n var $topPanelScroller: IjQueryWrapper;\r\n var $topPanel: IjQueryWrapper;\r\n var $viewport: IjQueryWrapper;\r\n var $canvas: IjQueryWrapper;\r\n var $style: IjQueryWrapper;\r\n var $boundAncestors: IjQueryWrapper;\r\n // var treeColumns;\r\n var stylesheet, columnCssRulesL, columnCssRulesR;\r\n var viewportH: number, viewportW: number;\r\n var canvasWidth: number, canvasWidthL: number, canvasWidthR: number;\r\n var headersWidth: number, headersWidthL: number, headersWidthR: number;\r\n var viewportHasHScroll: boolean, viewportHasVScroll: boolean;\r\n var headerColumnWidthDiff = 0, headerColumnHeightDiff = 0, // border+padding\r\n cellWidthDiff = 0, cellHeightDiff = 0, jQueryNewWidthBehaviour = false;\r\n var absoluteColumnMinWidth;\r\n var hasFrozenRows = false;\r\n var frozenRowsHeight = 0;\r\n var actualFrozenRow = -1;\r\n var paneTopH = 0;\r\n var paneBottomH = 0;\r\n var viewportTopH = 0;\r\n var viewportBottomH = 0;\r\n var topPanelH = 0;\r\n var headerRowH = 0;\r\n var footerRowH = 0;\r\n\r\n var tabbingDirection = 1;\r\n var $activeCanvasNode: IjQueryWrapper;\r\n var $activeViewportNode: IjQueryWrapper;\r\n var activePosX;\r\n var activeRow, activeCell;\r\n var activeCellNode: HTMLElement = null;\r\n var currentEditor = null;\r\n var serializedEditorValue;\r\n var editController;\r\n\r\n var rowsCache: { [key: string]: ICacheEntry } = {};\r\n var rowPositionCache = [];\r\n\r\n var renderedRows = 0;\r\n var numVisibleRows = 0;\r\n var prevScrollTop = 0;\r\n var scrollTop = 0;\r\n var lastRenderedScrollTop = 0;\r\n var lastRenderedScrollLeft = 0;\r\n var prevScrollLeft = 0;\r\n var scrollLeft = 0;\r\n\r\n var selectionModel;\r\n var selectedRows = [];\r\n\r\n var plugins = [];\r\n var cellCssClasses = {};\r\n\r\n var columnsById = {};\r\n var sortColumns = [];\r\n var columnPosLeft = [];\r\n var columnPosRight = [];\r\n\r\n var pagingActive = false;\r\n var pagingIsLastPage = false;\r\n\r\n var scrollThrottle = ActionThrottle(render, 50);\r\n\r\n // async call handles\r\n var h_editorLoader = null;\r\n var h_render = null;\r\n var h_postrender = null;\r\n var h_postrenderCleanup = null;\r\n var postProcessedRows = {};\r\n var postProcessToRow = null;\r\n var postProcessFromRow = null;\r\n var postProcessedCleanupQueue = [];\r\n var postProcessgroupId = 0;\r\n\r\n var $paneHeaderL: IjQueryWrapper;\r\n var $paneHeaderR: IjQueryWrapper;\r\n var $paneTopL: IjQueryWrapper;\r\n var $paneTopR: IjQueryWrapper;\r\n var $paneBottomL: IjQueryWrapper;\r\n var $paneBottomR: IjQueryWrapper;\r\n\r\n var $headerScrollerL: IjQueryWrapper;\r\n var $headerScrollerR: IjQueryWrapper;\r\n\r\n var $headerL: IjQueryWrapper;\r\n var $headerR: IjQueryWrapper;\r\n\r\n var $groupHeadersL: IjQueryWrapper[];\r\n var $groupHeadersR: IjQueryWrapper[];\r\n\r\n var $headerRowScrollerL: IjQueryWrapper;\r\n var $headerRowScrollerR: IjQueryWrapper;\r\n\r\n var $footerRowScrollerL: IjQueryWrapper;\r\n var $footerRowScrollerR: IjQueryWrapper;\r\n\r\n var $headerRowL: IjQueryWrapper;\r\n var $headerRowR: IjQueryWrapper;\r\n\r\n var $footerRowL: IjQueryWrapper;\r\n var $footerRowR: IjQueryWrapper;\r\n\r\n var $topPanelScrollerL: IjQueryWrapper;\r\n var $topPanelScrollerR: IjQueryWrapper;\r\n\r\n var $topPanelL: IjQueryWrapper;\r\n var $topPanelR: IjQueryWrapper;\r\n\r\n var $viewportTopL: IjQueryWrapper;\r\n var $viewportTopR: IjQueryWrapper;\r\n var $viewportBottomL: IjQueryWrapper;\r\n var $viewportBottomR: IjQueryWrapper;\r\n\r\n var $canvasTopL: IjQueryWrapper;\r\n var $canvasTopR: IjQueryWrapper;\r\n var $canvasBottomL: IjQueryWrapper;\r\n var $canvasBottomR: IjQueryWrapper;\r\n\r\n var $viewportScrollContainerX: IjQueryWrapper;\r\n var $viewportScrollContainerY: IjQueryWrapper;\r\n var $headerScrollContainer: IjQueryWrapper;\r\n var $headerRowScrollContainer: IjQueryWrapper;\r\n var $footerRowScrollContainer: IjQueryWrapper;\r\n\r\n var scrollEventHandler;\r\n\r\n // store css attributes if display:none is active in container or parent\r\n var cssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" };\r\n var $hiddenParents: IjQueryWrapper;\r\n var oldProps = [];\r\n // var columnResizeDragging = false;\r\n // var columnDragging = false;\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////\r\n // initialization\r\n\r\n function init() {\r\n $container = $(container);\r\n if ($container.length < 1) {\r\n throw new Error(\"SlickGrid requires a valid container, \" + container + \" does not exist in the DOM.\");\r\n }\r\n\r\n if (options.showFooterRow && !options.createFooterRow) {\r\n throw new Error(\"option showFooterRow requires option createFooterRow to be set\");\r\n }\r\n\r\n cacheCssForHiddenInit();\r\n\r\n // calculate these only once and share between grid instances\r\n maxSupportedCssHeight = maxSupportedCssHeight || getMaxSupportedCssHeight();\r\n\r\n options = $.shallowExtend({}, defaults, options);\r\n validateAndEnforceOptions();\r\n columnDefaults.width = options.defaultColumnWidth;\r\n\r\n // treeColumns = new Slick.TreeColumns(columns);\r\n // columns = treeColumns.extractColumns();\r\n\r\n updateColumnProps();\r\n\r\n //// validate loaded JavaScript modules against requested options\r\n // if (options.enableColumnReorder && !$.fn.sortable) {\r\n // throw new Error(\"SlickGrid's 'enableColumnReorder = true' option requires jquery-ui.sortable module to be loaded\");\r\n // }\r\n\r\n editController = {\r\n \"commitCurrentEdit\": commitCurrentEdit,\r\n \"cancelCurrentEdit\": cancelCurrentEdit\r\n };\r\n\r\n $container\r\n .empty()\r\n .css(\"overflow\", \"hidden\")\r\n .css(\"outline\", 0)\r\n .addClass(uid)\r\n .addClass(\"slickgrid\")\r\n .addClass(\"ui-widget\");\r\n\r\n const isTouch = ((\"ontouchstart\" in window) || ((navigator as any).msMaxTouchPoints > 0));\r\n if (isTouch) {\r\n $container.addClass(\"js-touch\");\r\n }\r\n // $container.addClass(\"js-touch\");\r\n\r\n // set up a positioning container if needed\r\n if (!/relative|absolute|fixed/.test($container.css(\"position\"))) {\r\n $container.css(\"position\", \"relative\");\r\n }\r\n\r\n $focusSink = $(\"<div tabIndex='0' hideFocus style='position:fixed;width:0;height:0;top:0;left:0;outline:0;'></div>\").appendTo($container);\r\n\r\n // containers used for scrolling frozen columns and rows\r\n $paneHeaderL = $(\"<div class='slick-pane slick-pane-header slick-pane-left' tabIndex='0' />\").appendTo($container);\r\n $paneHeaderR = $(\"<div class='slick-pane slick-pane-header slick-pane-right' tabIndex='0' />\").appendTo($container);\r\n $paneTopL = $(\"<div class='slick-pane slick-pane-top slick-pane-left' tabIndex='0' />\").appendTo($container);\r\n $paneTopR = $(\"<div class='slick-pane slick-pane-top slick-pane-right' tabIndex='0' />\").appendTo($container);\r\n $paneBottomL = $(\"<div class='slick-pane slick-pane-bottom slick-pane-left' tabIndex='0' />\").appendTo($container);\r\n $paneBottomR = $(\"<div class='slick-pane slick-pane-bottom slick-pane-right' tabIndex='0' />\").appendTo($container);\r\n\r\n if (options.createPreHeaderPanel) {\r\n $preHeaderPanelScroller = $(\"<div class='slick-preheader-panel ui-state-default' style='overflow:hidden;position:relative;' />\").appendTo($paneHeaderL);\r\n $preHeaderPanel = $(\"<div />\").appendTo($preHeaderPanelScroller);\r\n $preHeaderPanelSpacer = $(\"<div style='display:block;height:1px;position:absolute;top:0;left:0;'></div>\")\r\n .appendTo($preHeaderPanelScroller);\r\n\r\n $preHeaderPanelScrollerR = $(\"<div class='slick-preheader-panel ui-state-default' style='overflow:hidden;position:relative;' />\").appendTo($paneHeaderR);\r\n $preHeaderPanelR = $(\"<div />\").appendTo($preHeaderPanelScrollerR);\r\n $preHeaderPanelSpacerR = $(\"<div style='display:block;height:1px;position:absolute;top:0;left:0;'></div>\")\r\n .appendTo($preHeaderPanelScrollerR);\r\n\r\n if (!options.showPreHeaderPanel) {\r\n $preHeaderPanelScroller[0].style.display = \"none\";\r\n $preHeaderPanelScrollerR[0].style.display = \"none\";\r\n }\r\n }\r\n\r\n // append the header scroller containers\r\n $headerScrollerL = $(\"<div class='slick-header ui-state-default slick-header-left' />\").appendTo($paneHeaderL);\r\n $headerScrollerR = $(\"<div class='slick-header ui-state-default slick-header-right' />\").appendTo($paneHeaderR);\r\n\r\n // cache the header scroller containers\r\n $headerScroller = $().add($headerScrollerL).add($headerScrollerR);\r\n $groupHeaders = $();\r\n // if (treeColumns.hasDepth()) {\r\n // $groupHeadersL = [], $groupHeadersR = [];\r\n // for (var index = 0; index < treeColumns.getDepth() - 1; index++) {\r\n // $groupHeadersL[index] = $(\"<div class='slick-group-header-columns slick-group-header-columns-left' style='left:-1000px' />\").appendTo($headerScrollerL);\r\n // $groupHeadersR[index] = $(\"<div class='slick-group-header-columns slick-group-header-columns-right' style='left:-1000px' />\").appendTo($headerScrollerR);\r\n // $groupHeaders.add($groupHeadersL[index]).add($groupHeadersR[index]);\r\n // }\r\n // }\r\n\r\n // append the columnn containers to the headers\r\n var headerL = document.createElement(\"div\");\r\n headerL.className = \"slick-header-columns slick-header-columns-left\";\r\n headerL.style.left = \"-1000px\";\r\n var headerR = document.createElement(\"div\");\r\n headerR.className = \"slick-header-columns slick-header-columns-right\";\r\n headerR.style.left = \"-1000px\";\r\n $headerL = $(headerL).appendTo($headerScrollerL);\r\n $headerR = $(headerR).appendTo($headerScrollerR);\r\n\r\n // cache the header columns\r\n $headers = $().add($headerL).add($headerR);\r\n\r\n $headers.on(\"selectstart\", function (event) {\r\n event.preventDefault();\r\n });\r\n\r\n var headerRowScrollerL = document.createElement(\"div\");\r\n headerRowScrollerL.className = \"slick-headerrow ui-state-default\";\r\n var headerRowScrollerR = document.createElement(\"div\");\r\n headerRowScrollerR.className = \"slick-headerrow ui-state-default\";\r\n $headerRowScrollerL = $(headerRowScrollerL).appendTo($paneTopL);\r\n $headerRowScrollerR = $(headerRowScrollerR).appendTo($paneTopR);\r\n\r\n $headerRowScroller = $().add($headerRowScrollerL).add($headerRowScrollerR);\r\n\r\n var headerRowSpacerL = document.createElement(\"div\");\r\n headerRowSpacerL.style.display = \"block\";\r\n headerRowSpacerL.style.height = \"1px\";\r\n headerRowSpacerL.style.left = \"0\";\r\n headerRowSpacerL.style.top = \"0\";\r\n headerRowSpacerL.style.position = \"absolute\";\r\n\r\n var headerRowSpacerR = document.createElement(\"div\");\r\n headerRowSpacerR.style.display = \"block\";\r\n headerRowSpacerR.style.height = \"1px\";\r\n headerRowSpacerR.style.left = \"0\";\r\n headerRowSpacerR.style.top = \"0\";\r\n headerRowSpacerR.style.position = \"absolute\";\r\n\r\n $headerRowSpacerL = $(headerRowSpacerL)\r\n .appendTo($headerRowScrollerL);\r\n $headerRowSpacerR = $(headerRowSpacerR)\r\n .appendTo($headerRowScrollerR);\r\n\r\n var headerRowL = document.createElement(\"div\");\r\n headerRowL.className = \"slick-headerrow-columns slick-headerrow-columns-left\";\r\n\r\n var headerRowR = document.createElement(\"div\");\r\n headerRowR.className = \"slick-headerrow-columns slick-headerrow-columns-right\";\r\n\r\n $headerRowL = $(headerRowL).appendTo($headerRowScrollerL);\r\n $headerRowR = $(headerRowR).appendTo($headerRowScrollerR);\r\n\r\n $headerRow = $().add($headerRowL).add($headerRowR);\r\n\r\n // append the top panel scroller\r\n var topPanelScrollerL = document.createElement(\"div\");\r\n topPanelScrollerL.className = \"slick-top-panel-scroller ui-state-default\";\r\n var topPanelScrollerR = document.createElement(\"div\");\r\n topPanelScrollerR.className = \"slick-top-panel-scroller ui-state-default\";\r\n $topPanelScrollerL = $(topPanelScrollerL).appendTo($paneTopL);\r\n $topPanelScrollerR = $(topPanelScrollerR).appendTo($paneTopR);\r\n\r\n $topPanelScroller = $().add($topPanelScrollerL).add($topPanelScrollerR);\r\n\r\n // append the top panel\r\n $topPanelL = $(\"<div class='slick-top-panel' style='width:10000px' />\").appendTo($topPanelScrollerL);\r\n $topPanelR = $(\"<div class='slick-top-panel' style='width:10000px' />\").appendTo($topPanelScrollerR);\r\n\r\n $topPanel = $().add($topPanelL).add($topPanelR);\r\n\r\n if (!options.showTopPanel) {\r\n $.each($topPanelScroller, function (idx, el) { el.style.display = \"none\"; });\r\n }\r\n\r\n if (!options.showHeaderRow) {\r\n $.each($headerRowScroller, function (idx, el) { el.style.display = \"none\"; });\r\n }\r\n\r\n // append the viewport containers\r\n $viewportTopL = $(\"<div class='slick-viewport slick-viewport-top slick-viewport-left' tabIndex='0' hideFocus />\").appendTo($paneTopL);\r\n $viewportTopR = $(\"<div class='slick-viewport slick-viewport-top slick-viewport-right' tabIndex='0' hideFocus />\").appendTo($paneTopR);\r\n $viewportBottomL = $(\"<div class='slick-viewport slick-viewport-bottom slick-viewport-left' tabIndex='0' hideFocus />\").appendTo($paneBottomL);\r\n $viewportBottomR = $(\"<div class='slick-viewport slick-viewport-bottom slick-viewport-right' tabIndex='0' hideFocus />\").appendTo($paneBottomR);\r\n\r\n // cache the viewports\r\n $viewport = $().add($viewportTopL).add($viewportTopR).add($viewportBottomL).add($viewportBottomR);\r\n\r\n\r\n // default the active viewport to the top left\r\n $activeViewportNode = $viewportTopL;\r\n\r\n // append the canvas containers\r\n $canvasTopL = $(\"<div class='grid-canvas grid-canvas-top grid-canvas-left' tabIndex='0' hideFocus />\").appendTo($viewportTopL);\r\n $canvasTopR = $(\"<div class='grid-canvas grid-canvas-top grid-canvas-right' tabIndex='0' hideFocus />\").appendTo($viewportTopR);\r\n $canvasBottomL = $(\"<div class='grid-canvas grid-canvas-bottom grid-canvas-left' tabIndex='0' hideFocus />\").appendTo($viewportBottomL);\r\n $canvasBottomR = $(\"<div class='grid-canvas grid-canvas-bottom grid-canvas-right' tabIndex='0' hideFocus />\").appendTo($viewportBottomR);\r\n if (options.viewportClass) { $viewport.toggleClass(options.viewportClass, true); }\r\n\r\n // cache the canvases\r\n $canvas = $().add($canvasTopL).add($canvasTopR).add($canvasBottomL).add($canvasBottomR);\r\n\r\n scrollbarDimensions = scrollbarDimensions || measureScrollbar();\r\n\r\n // default the active canvas to the top left\r\n $activeCanvasNode = $canvasTopL;\r\n\r\n // pre-header\r\n if ($preHeaderPanelSpacer) { $preHeaderPanelSpacer.css(\"width\", getCanvasWidth() + scrollbarDimensions.width + \"px\"); }\r\n $headers.width(getHeadersWidth());\r\n $headerRowSpacerL.css(\"width\", getCanvasWidth() + scrollbarDimensions.width + \"px\");\r\n $headerRowSpacerR.css(\"width\", getCanvasWidth() + scrollbarDimensions.width + \"px\");\r\n\r\n // footer Row\r\n if (options.createFooterRow) {\r\n $footerRowScrollerR = $(\"<div class='slick-footerrow ui-state-default' />\").appendTo($paneTopR);\r\n $footerRowScrollerL = $(\"<div class='slick-footerrow ui-state-default' />\").appendTo($paneTopL);\r\n\r\n $footerRowScroller = $().add($footerRowScrollerL).add($footerRowScrollerR);\r\n\r\n $footerRowSpacerL = $(\"<div style='display:block;height:1px;position:absolute;top:0;left:0;'></div>\")\r\n .css(\"width\", getCanvasWidth() + scrollbarDimensions.width + \"px\")\r\n .appendTo($footerRowScrollerL);\r\n $footerRowSpacerR = $(\"<div style='display:block;height:1px;position:absolute;top:0;left:0;'></div>\")\r\n .css(\"width\", getCanvasWidth() + scrollbarDimensions.width + \"px\")\r\n .appendTo($footerRowScrollerR);\r\n\r\n\r\n $footerRowL = $(\"<div class='slick-footerrow-columns slick-footerrow-columns-left' />\").appendTo($footerRowScrollerL);\r\n $footerRowR = $(\"<div class='slick-footerrow-columns slick-footerrow-columns-right' />\").appendTo($footerRowScrollerR);\r\n\r\n $footerRow = $().add($footerRowL).add($footerRowR);\r\n\r\n if (!options.showFooterRow) {\r\n $.each($footerRowScroller, function (idx, el) { el.style.display = \"none\"; });\r\n }\r\n }\r\n\r\n $focusSink2 = $($focusSink[0].cloneNode(true)).appendTo($container);\r\n\r\n if (!options.explicitInitialization) {\r\n finishInitialization();\r\n }\r\n }\r\n\r\n function finishInitialization() {\r\n if (!initialized) {\r\n initialized = true;\r\n\r\n getViewportWidth();\r\n getViewportHeight();\r\n\r\n // header columns and cells may have different padding/border skewing width calculations (box-sizing, hello?)\r\n // calculate the diff so we can set consistent sizes\r\n measureCellPaddingAndBorder();\r\n\r\n // for usability reasons, all text selection in SlickGrid is disabled\r\n // with the exception of input and textarea elements (selection must\r\n // be enabled there so that editors work as expected); note that\r\n // selection in grid cells (grid body) is already unavailable in\r\n // all browsers except IE\r\n disableSelection($headers); // disable all text selection in header (including input and textarea)\r\n\r\n if (!options.enableTextSelectionOnCells) {\r\n // disable text selection in grid cells except in input and textarea elements\r\n // (this is IE-specific, because selectstart event will only fire in IE)\r\n $viewport.on(\"selectstart\", function (event) {\r\n if (event.target.tagName !== \"INPUT\" && event.target.tagName !== \"TEXTAREA\") {\r\n event.preventDefault();\r\n }\r\n });\r\n }\r\n\r\n cacheRowPositions();\r\n\r\n setFrozenOptions();\r\n setPaneVisibility();\r\n setScroller();\r\n setOverflow();\r\n\r\n updateColumnCaches();\r\n createColumnHeaders();\r\n // createColumnGroupHeaders();\r\n createColumnFooter();\r\n setupColumnSort();\r\n setupColumnMoveAndResize();\r\n createCssRules();\r\n resizeCanvas();\r\n bindAncestorScrollEvents();\r\n\r\n $container.on(\"resize\", resizeCanvas);\r\n $viewport.on(\"scroll\", handleScroll);\r\n\r\n // tODO !!! TODOFIX\r\n // if (jQuery.fn.mousewheel) {\r\n // $viewport.on(\"mousewheel\", handleMouseWheel);\r\n // }\r\n\r\n $headerScroller\r\n .on(\"scroll\", preventScroll) // .on(\"scroll\", handleHeaderScroll)\r\n .on(\"contextmenu\", handleHeaderContextMenu)\r\n .on(\"click\", handleHeaderClick);\r\n\r\n $headerRowScroller\r\n .on(\"scroll\", preventScroll);\r\n\r\n if (options.createFooterRow) {\r\n $footerRowScroller\r\n .on(\"scroll\", preventScroll);\r\n }\r\n\r\n if (options.createPreHeaderPanel) {\r\n $preHeaderPanelScroller\r\n .on(\"scroll\", preventScroll);\r\n }\r\n\r\n\r\n // $headerRowScroller\r\n // .on(\"scroll\", handleHeaderRowScroll);\r\n\r\n // if (options.createFooterRow) {\r\n // $footerRowScroller\r\n // .on(\"scroll\", handleFooterRowScroll);\r\n // }\r\n\r\n // if (options.createPreHeaderPanel) {\r\n // $preHeaderPanelScroller\r\n // .on(\"scroll\", handlePreHeaderPanelScroll);\r\n // }\r\n\r\n $focusSink.add($focusSink2)\r\n .on(\"keydown\", handleKeyDown);\r\n $canvas\r\n .on(\"keydown\", handleKeyDown)\r\n .on(\"click\", handleClick)\r\n .on(\"dblclick\", handleDblClick)\r\n .on(\"contextmenu\", handleContextMenu);\r\n\r\n\r\n // ---- BEGIN\r\n\r\n\r\n let dragStartX;\r\n let dragStartY;\r\n let isDown;\r\n let dragStartedDD = null;\r\n const delta = 3;\r\n // $canvas.on(\"touchstart\", function (e, dd) {\r\n // handleDragInit(e, dd);\r\n // // TODO\r\n // });\r\n $canvas.on(\"mousedown\", function (e, dd) {\r\n const res = handleDragInit(e, dd); // TODO -> do something with result?\r\n dragStartX = e.pageX;\r\n dragStartY = e.pageY;\r\n isDown = true;\r\n document.addEventListener(\"mouseup\", handleMouseUp);\r\n });\r\n $canvas.on(\"mousemove\", function (e, _dd) {\r\n if (isDown) {\r\n if (Math.abs(dragStartX - e.pageX) < delta\r\n && Math.abs(dragStartY - e.pageY) < delta) {\r\n return;\r\n }\r\n if (dragStartedDD == null) {\r\n dragStartedDD = {};\r\n dragStartedDD.dragging = null;\r\n dragStartedDD.propagates = 1;\r\n dragStartedDD.target = e.target;\r\n dragStartedDD.pageX = e.pageX;\r\n dragStartedDD.pageY = e.pageY;\r\n dragStartedDD.startX = dragStartedDD.pageX;\r\n dragStartedDD.startY = dragStartedDD.pageY;\r\n const res = handleDragStart(e, dragStartedDD); // TODO -> do something with result?\r\n }\r\n dragStartedDD.pageX = e.pageX;\r\n dragStartedDD.pageY = e.pageY;\r\n dragStartedDD.startX = dragStartedDD.pageX;\r\n dragStartedDD.startY = dragStartedDD.pageY;\r\n handleDrag(e, dragStartedDD);\r\n }\r\n });\r\n\r\n const handleMouseUp = (e) => {\r\n if (isDown && dragStartedDD != null) {\r\n handleDragEnd(e, dragStartedDD);\r\n }\r\n isDown = false;\r\n dragStartedDD = null;\r\n document.removeEventListener(\"mouseup\", handleMouseUp);\r\n }\r\n\r\n // .on(\"draginit\", handleDragInit) //TODO TODOFIX\r\n // .on(\"dragstart\", {distance: 3}, handleDragStart) //TODO TODOFIX\r\n // .on(\"drag\", handleDrag) //TODO TODOFIX\r\n // .on(\"dragend\", handleDragEnd); //TODO TODOFIX\r\n // .on(\"mouseenter\", \".slick-cell\", handleMouseEnter) //TODO TODOFIX\r\n // .on(\"mouseleave\", \".slick-cell\", handleMouseLeave); //TODO TODOFIX\r\n\r\n restoreCssFromHiddenInit();\r\n }\r\n }\r\n\r\n function cacheCssForHiddenInit() {\r\n // handle display:none on container or container parents\r\n var all_parents = $().add($container).add($container[0].parentElement);\r\n var hiddenParents = [];\r\n $hiddenParents = $();\r\n for (var i = 0; i < all_parents.length; i++) {\r\n if ((all_parents[i].display || \"\").toLowerCase() === \"none\") {\r\n hiddenParents.push(all_parents[i]);\r\n $hiddenParents.add(all_parents[i]);\r\n }\r\n }\r\n hiddenParents.forEach(function (p) {\r\n var old = {};\r\n for (var name in cssShow) {\r\n old[name] = p.style[name];\r\n p.style[name] = cssShow[name];\r\n }\r\n oldProps.push(old);\r\n });\r\n }\r\n\r\n function restoreCssFromHiddenInit() {\r\n // finish handle display:none on container or container parents\r\n // - put values back the way they were\r\n $.each($hiddenParents, function (i) {\r\n var old = oldProps[i];\r\n for (var name in cssShow) {\r\n this.style[name] = old[name];\r\n }\r\n });\r\n }\r\n\r\n function hasFrozenColumns() {\r\n return options.frozenColumn > -1;\r\n }\r\n\r\n function registerPlugin(plugin) {\r\n plugins.unshift(plugin);\r\n plugin.init(self);\r\n }\r\n\r\n function unregisterPlugin(plugin) {\r\n for (var i = plugins.length; i >= 0; i--) {\r\n if (plugins[i] === plugin) {\r\n if (plugins[i].destroy) {\r\n plugins[i].destroy();\r\n }\r\n plugins.splice(i, 1);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n function getPluginByName(name) {\r\n for (var i = plugins.length - 1; i >= 0; i--) {\r\n if (plugins[i].pluginName === name) {\r\n return plugins[i];\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n function setSelectionModel(model) {\r\n if (selectionModel) {\r\n selectionModel.onSelectedRangesChanged.unsubscribe(handleSelectedRangesChanged);\r\n if (selectionModel.destroy) {\r\n selectionModel.destroy();\r\n }\r\n }\r\n\r\n selectionModel = model;\r\n if (selectionModel) {\r\n selectionModel.init(self);\r\n selectionModel.onSelectedRangesChanged.subscribe(handleSelectedRangesChanged);\r\n }\r\n }\r\n\r\n function getSelectionModel() {\r\n return selectionModel;\r\n }\r\n\r\n function getCanvasNode(columnIdOrIdx, rowIndex) {\r\n if (!columnIdOrIdx) { columnIdOrIdx = 0; }\r\n if (!rowIndex) { rowIndex = 0; }\r\n\r\n var idx = (typeof columnIdOrIdx === \"number\" ? columnIdOrIdx : getColumnIndex(columnIdOrIdx));\r\n\r\n return (hasFrozenRows && rowIndex >= actualFrozenRow + (options.frozenBottom ? 0 : 1))\r\n ? ((hasFrozenColumns() && idx > options.frozenColumn) ? $canvasBottomR[0] : $canvasBottomL[0])\r\n : ((hasFrozenColumns() && idx > options.frozenColumn) ? $canvasTopR[0] : $canvasTopL[0])\r\n ;\r\n }\r\n\r\n function getActiveCanvasNode(element) {\r\n setActiveCanvasNode(element);\r\n\r\n return $activeCanvasNode[0];\r\n }\r\n\r\n function getCanvases() {\r\n return $canvas;\r\n }\r\n\r\n function setActiveCanvasNode(element) {\r\n if (element) {\r\n $activeCanvasNode = $(element.target).closestClass(\"grid-canvas\");\r\n }\r\n }\r\n\r\n function getViewportNode() {\r\n return $viewport[0];\r\n }\r\n\r\n function getActiveViewportNode(element) {\r\n setActiveViewportNode(element);\r\n\r\n return $activeViewportNode[0];\r\n }\r\n\r\n function setActiveViewportNode(element) {\r\n if (element) {\r\n $activeViewportNode = $(element.target).closestClass(\"slick-viewport\");\r\n }\r\n }\r\n\r\n function measureScrollbar() {\r\n //var $outerdiv = $(\"<div style=\\\"position:absolute; top:-10000px; left:-10000px; overflow:auto; width:100px; height:100px;\\\"></div>\").appendTo($viewport);\r\n const $outerdiv = $(\"<div style=\\\"position:absolute; top:-10000px; left:-10000px; overflow:auto; width:100px; height:100px;\\\"></div>\").appendTo($(\"body\"));\r\n const $innerdiv = $(\"<div style=\\\"width:200px; height:200px; overflow:auto;\\\"></div>\").appendTo($outerdiv);\r\n const dim = {\r\n width: $outerdiv[0].offsetWidth - $outerdiv[0].clientWidth,\r\n height: $outerdiv[0].offsetHeight - $outerdiv[0].clientHeight\r\n };\r\n $innerdiv.remove();\r\n $outerdiv.remove();\r\n return dim;\r\n }\r\n\r\n function getHeadersWidth() {\r\n headersWidth = headersWidthL = headersWidthR = 0;\r\n var includeScrollbar = !options.autoHeight;\r\n\r\n for (var i = 0, ii = columns.length; i < ii; i++) {\r\n var width = columns[i].width;\r\n\r\n if ((options.frozenColumn) > -1 && (i > options.frozenColumn)) {\r\n headersWidthR += width;\r\n } else {\r\n headersWidthL += width;\r\n }\r\n }\r\n\r\n if (includeScrollbar) {\r\n if ((options.frozenColumn) > -1 && (i > options.frozenColumn)) {\r\n headersWidthR += scrollbarDimensions.width;\r\n } else {\r\n headersWidthL += scrollbarDimensions.width;\r\n }\r\n }\r\n\r\n if (hasFrozenColumns()) {\r\n headersWidthL = headersWidthL + 1000;\r\n\r\n headersWidthR = Math.max(headersWidthR, viewportW) + headersWidthL;\r\n headersWidthR += scrollbarDimensions.width;\r\n } else {\r\n headersWidthL += scrollbarDimensions.width;\r\n headersWidthL = Math.max(headersWidthL, viewportW) + 1000;\r\n }\r\n\r\n headersWidth = headersWidthL + headersWidthR;\r\n return Math.max(headersWidth, viewportW) + 1000;\r\n }\r\n\r\n // function getHeadersWidthL() {\r\n // headersWidthL = 0;\r\n\r\n // columns.forEach(function (column, i) {\r\n // if (!((options.frozenColumn) > -1 && (i > options.frozenColumn))) {\r\n // headersWidthL += column.width;\r\n // }\r\n // });\r\n\r\n // if (hasFrozenColumns()) {\r\n // headersWidthL += 1000;\r\n // } else {\r\n // headersWidthL += scrollbarDimensions.width;\r\n // headersWidthL = Math.max(headersWidthL, viewportW) + 1000;\r\n // }\r\n\r\n // return headersWidthL;\r\n // }\r\n\r\n // function getHeadersWidthR() {\r\n // headersWidthR = 0;\r\n\r\n // columns.forEach(function (column, i) {\r\n // if ((options.frozenColumn) > -1 && (i > options.frozenColumn)) {\r\n // headersWidthR += column.width;\r\n // }\r\n // });\r\n\r\n // if (hasFrozenColumns()) {\r\n // headersWidthR = Math.max(headersWidthR, viewportW) + getHeadersWidthL();\r\n // headersWidthR += scrollbarDimensions.width;\r\n // }\r\n\r\n // return headersWidthR;\r\n // }\r\n\r\n function getCanvasWidth() {\r\n var availableWidth = viewportHasVScroll ? viewportW - scrollbarDimensions.width : viewportW;\r\n var i = columns.length;\r\n\r\n canvasWidthL = canvasWidthR = 0;\r\n\r\n while (i--) {\r\n if (hasFrozenColumns() && (i > options.frozenColumn)) {\r\n canvasWidthR += columns[i].width;\r\n } else {\r\n canvasWidthL += columns[i].width;\r\n }\r\n }\r\n var totalRowWidth = canvasWidthL + canvasWidthR;\r\n return options.fullWidthRows ? Math.max(totalRowWidth, availableWidth) : totalRowWidth;\r\n }\r\n\r\n function updateCanvasWidth(forceColumnWidthsUpdate?: boolean) {\r\n var oldCanvasWidth = canvasWidth;\r\n var oldCanvasWidthL = canvasWidthL;\r\n var oldCanvasWidthR = canvasWidthR;\r\n var widthChanged;\r\n canvasWidth = getCanvasWidth();\r\n\r\n widthChanged = canvasWidth !== oldCanvasWidth || canvasWidthL !== oldCanvasWidthL || canvasWidthR !== oldCanvasWidthR;\r\n\r\n if (widthChanged || hasFrozenColumns() || hasFrozenRows) {\r\n $canvasTopL.width(canvasWidthL);\r\n\r\n getHeadersWidth();\r\n\r\n $headerL.width(headersWidthL);\r\n $headerR.width(headersWidthR);\r\n\r\n if (hasFrozenColumns()) {\r\n $canvasTopR.width(canvasWidthR);\r\n\r\n $paneHeaderL.width(canvasWidthL);\r\n $paneHeaderR.css(\"left\", canvasWidthL);\r\n // $paneHeaderR.css(\"width\", viewportW - canvasWidthL);\r\n $paneHeaderR.css(\"width\", \"calc(100% - \" + canvasWidthL + \"px)\");\r\n\r\n $paneTopL.width(canvasWidthL);\r\n $paneTopR.css(\"left\", canvasWidthL);\r\n //$paneTopR.css(\"width\", viewportW - canvasWidthL);\r\n $paneTopR.css(\"width\", \"calc(100% - \" + canvasWidthL + \"px)\");\r\n\r\n $headerRowScrollerL.width(canvasWidthL);\r\n // $headerRowScrollerR.width(viewportW - canvasWidthL);\r\n $headerRowScrollerR.css(\"width\", \"100%\");\r\n\r\n $headerRowL.width(canvasWidthL);\r\n $headerRowR.width(canvasWidthR);\r\n\r\n if (options.createFooterRow) {\r\n $footerRowScrollerL.width(canvasWidthL);\r\n //$footerRowScrollerR.width(viewportW - canvasWidthL);\r\n $footerRowScrollerR.css(\"width\", \"100%\");\r\n\r\n $footerRowL.width(canvasWidthL);\r\n $footerRowR.width(canvasWidthR);\r\n }\r\n if (options.createPreHeaderPanel) {\r\n $preHeaderPanel.width(canvasWidth);\r\n }\r\n $viewportTopL.width(canvasWidthL);\r\n //$viewportTopR.width(viewportW - canvasWidthL);\r\n $viewportTopR.css(\"width\", \"100%\");\r\n\r\n if (hasFrozenRows) {\r\n $paneBottomL.width(canvasWidthL);\r\n $paneBottomR.css(\"left\", canvasWidthL);\r\n\r\n $viewportBottomL.width(canvasWidthL);\r\n // $viewportBottomR.width(viewportW - canvasWidthL);\r\n $viewportBottomR.width(\"100%\");\r\n\r\n $canvasBottomL.width(canvasWidthL);\r\n $canvasBottomR.width(canvasWidthR);\r\n }\r\n } else {\r\n $paneHeaderL.width(\"100%\");\r\n $paneTopL.width(\"100%\");\r\n $headerRowScrollerL.width(\"100%\");\r\n $headerRowL.width(canvasWidth);\r\n\r\n if (options.createFooterRow) {\r\n $footerRowScrollerL.width(\"100%\");\r\n $footerRowL.width(canvasWidth);\r\n }\r\n\r\n if (options.createPreHeaderPanel) {\r\n $preHeaderPanel.width(\"100%\");\r\n $preHeaderPanel.width(canvasWidth);\r\n }\r\n $viewportTopL.width(\"100%\");\r\n\r\n if (hasFrozenRows) {\r\n $viewportBottomL.width(\"100%\");\r\n $canvasBottomL.width(canvasWidthL);\r\n }\r\n }\r\n\r\n viewportHasHScroll = options.alwaysShowHorizontalScroll || (canvasWidth > viewportW - scrollbarDimensions.width);\r\n }\r\n\r\n $headerRowSpacerL.width(canvasWidth + (viewportHasVScroll ? scrollbarDimensions.width : 0));\r\n $headerRowSpacerR.width(canvasWidth + (viewportHasVScroll ? scrollbarDimensions.width : 0));\r\n\r\n if (options.createFooterRow) {\r\n $footerRowSpacerL.width(canvasWidth + (viewportHasVScroll ? scrollbarDimensions.width : 0));\r\n $footerRowSpacerR.width(canvasWidth + (viewportHasVScroll ? scrollbarDimensions.width : 0));\r\n }\r\n\r\n if (widthChanged || forceColumnWidthsUpdate) {\r\n applyColumnWidths();\r\n }\r\n }\r\n\r\n function disableSelection($target) {\r\n if ($target && $target.jquery) {\r\n $target\r\n .attr(\"unselectable\", \"on\")\r\n .css(\"MozUserSelect\", \"none\")\r\n .on(\"selectstart.ui\", function () {\r\n return false;\r\n }); // from jquery:ui.core.js 1.7.2\r\n }\r\n }\r\n\r\n function getMaxSupportedCssHeight() {\r\n var supportedHeight = 1000000;\r\n // fF reports the height back but still renders blank after ~6M px\r\n var testUpTo = navigator.userAgent.toLowerCase().match(/firefox/) ? 6000000 : 1000000000;\r\n var div: IjQueryWrapper = $(\"<div />\");\r\n div.appendTo(document.body);\r\n\r\n while (true) {\r\n var test = supportedHeight * 2;\r\n div.height(test);\r\n if (test > testUpTo || div.height() !== test) {\r\n break;\r\n } else {\r\n supportedHeight = test;\r\n }\r\n }\r\n\r\n div.remove();\r\n return supportedHeight;\r\n }\r\n\r\n function getUID() {\r\n return uid;\r\n }\r\n\r\n function getHeaderColumnWidthDiff() {\r\n return headerColumnWidthDiff;\r\n }\r\n\r\n function getScrollbarDimensions() {\r\n return scrollbarDimensions;\r\n }\r\n\r\n // tODO: this is static. need to handle page mutation.\r\n function bindAncestorScrollEvents() {\r\n var elem = (hasFrozenRows && !options.frozenBottom) ? $canvasBottomL[0] : $canvasTopL[0];\r\n while ((elem = elem.parentNode) != document.body && elem != null) {\r\n // bind to scroll containers only\r\n if (elem == $viewportTopL[0] || elem.scrollWidth != elem.clientWidth || elem.scrollHeight != elem.clientHeight) {\r\n var $elem = $(elem);\r\n if (!$boundAncestors) {\r\n $boundAncestors = $elem;\r\n } else {\r\n $boundAncestors = $boundAncestors.add($elem);\r\n }\r\n scrollEventHandler = (elem as HTMLDivElement).addEventListener(\"scroll\", handleActiveCellPositionChange);\r\n //$elem.on(\"scroll.\" + uid, handleActiveCellPositionChange); //TODOFIX\r\n }\r\n }\r\n }\r\n\r\n function unbindAncestorScrollEvents() {\r\n if (!$boundAncestors) {\r\n return;\r\n }\r\n // $boundAncestors.off(\"scroll.\" + uid); //TODO TODOFIX\r\n if (scrollEventHandler) {\r\n $boundAncestors[0].removeEventListener(\"scroll\");\r\n }\r\n $boundAncestors = null;\r\n }\r\n\r\n function updateColumnHeader(columnId, title, toolTip) {\r\n if (!initialized) { return; }\r\n var idx = getColumnIndex(columnId);\r\n if (idx == null) {\r\n return;\r\n }\r\n\r\n var columnDef = columns[idx];\r\n var $header = $($headers.children()[idx]);\r\n if ($header) {\r\n if (title !== undefined) {\r\n columns[idx].name = title;\r\n }\r\n if (toolTip !== undefined) {\r\n columns[idx].toolTip = toolTip;\r\n }\r\n\r\n trigger(self.onBeforeHeaderCellDestroy, {\r\n \"node\": $header[0],\r\n \"column\": columnDef,\r\n \"grid\": self\r\n });\r\n\r\n (<IjQueryWrapper>$header\r\n .attr(\"title\", toolTip || \"\"))\r\n .children()[0].innerHTML = title;\r\n\r\n trigger(self.onHeaderCellRendered, {\r\n \"node\": $header[0],\r\n \"column\": columnDef,\r\n \"grid\": self\r\n });\r\n }\r\n }\r\n\r\n function getHeader(columnDef) {\r\n if (!columnDef) {\r\n return hasFrozenColumns() ? $headers : $headerL;\r\n }\r\n var idx = getColumnIndex(columnDef.id);\r\n return hasFrozenColumns() ? ((idx <= options.frozenColumn) ? $headerL : $headerR) : $headerL;\r\n }\r\n\r\n function getHeaderColumn(columnIdOrIdx) {\r\n var idx = (typeof columnIdOrIdx === \"number\" ? columnIdOrIdx : getColumnIndex(columnIdOrIdx));\r\n var targetHeader = hasFrozenColumns() ? ((idx <= options.frozenColumn) ? $headerL : $headerR) : $headerL;\r\n var targetIndex = hasFrozenColumns() ? ((idx <= options.frozenColumn) ? idx : idx - options.frozenColumn - 1) : idx;\r\n var $rtn = targetHeader.children()[targetIndex];\r\n return $rtn && $rtn[0];\r\n }\r\n\r\n function getHeaderRow() {\r\n return hasFrozenColumns() ? $headerRow : $headerRow[0];\r\n }\r\n\r\n function getFooterRow() {\r\n return hasFrozenColumns() ? $footerRow : $footerRow[0];\r\n }\r\n\r\n function getPreHeaderPanel(): Element {\r\n return $preHeaderPanel[0];\r\n }\r\n\r\n function getPreHeaderPanelRight() {\r\n return $preHeaderPanelR[0];\r\n }\r\n\r\n function getHeaderRowColumn(columnIdOrIdx) {\r\n var idx = (typeof columnIdOrIdx === \"number\" ? columnIdOrIdx : getColumnIndex(columnIdOrIdx));\r\n\r\n var $headerRowTarget;\r\n\r\n if (hasFrozenColumns()) {\r\n if (idx <= options.frozenColumn) {\r\n $headerRowTarget = $headerRowL;\r\n } else {\r\n $headerRowTarget = $headerRowR;\r\n idx -= options.frozenColumn + 1;\r\n }\r\n } else {\r\n $headerRowTarget = $headerRowL;\r\n }\r\n\r\n var $header = $headerRowTarget.children().eq(idx);\r\n return $header && $header[0];\r\n }\r\n\r\n function getFooterRowColumn(columnIdOrIdx) {\r\n var idx = (typeof columnIdOrIdx === \"number\" ? columnIdOrIdx : getColumnIndex(columnIdOrIdx));\r\n\r\n var $footerRowTarget;\r\n\r\n if (hasFrozenColumns()) {\r\n if (idx <= options.frozenColumn) {\r\n $footerRowTarget = $footerRowL;\r\n } else {\r\n $footerRowTarget = $footerRowR;\r\n\r\n idx -= options.frozenColumn + 1;\r\n }\r\n } else {\r\n $footerRowTarget = $footerRowL;\r\n }\r\n\r\n var $footer = $footerRowTarget.children().eq(idx);\r\n return $footer && $footer[0];\r\n }\r\n\r\n function createColumnFooter() {\r\n if (options.createFooterRow) {\r\n $.each($footerRow.find(\".slick-footerrow-column\")\r\n , function () {\r\n var columnDef = $(this).data(\"column\");\r\n if (columnDef) {\r\n trigger(self.onBeforeFooterRowCellDestroy, {\r\n \"node\": this,\r\n \"column\": columnDef,\r\n \"grid\": self\r\n });\r\n }\r\n });\r\n\r\n $footerRowL.empty();\r\n $footerRowR.empty();\r\n\r\n for (var i = 0; i < columns.length; i++) {\r\n var m = columns[i];\r\n\r\n var footerRowCell = $(\"<div class='ui-state-default slick-footerrow-column l\" + i + \" r\" + i + \"'></div>\")\r\n .data(\"column\", m)\r\n .addClass(hasFrozenColumns() && i <= options.frozenColumn ? \"frozen\" : \"\")\r\n .appendTo(hasFrozenColumns() && (i > options.frozenColumn) ? $footerRowR : $footerRowL);\r\n\r\n trigger(self.onFooterRowCellRendered, {\r\n \"node\": footerRowCell[0],\r\n \"column\": m,\r\n \"grid\": self\r\n });\r\n }\r\n }\r\n }\r\n\r\n // function createColumnGroupHeaders() {\r\n // var columnsLength = 0;\r\n // var frozenColumnsValid = false;\r\n\r\n // if (!treeColumns.hasDepth()) {\r\n // return;\r\n // }\r\n\r\n // for (var index = 0; index < $groupHeadersL.length; index++) {\r\n\r\n // $groupHeadersL[index].empty();\r\n // $groupHeadersR[index].empty();\r\n\r\n // var groupColumns = treeColumns.getColumnsInDepth(index);\r\n\r\n // for (var indexGroup in groupColumns) {\r\n // var m = groupColumns[indexGroup];\r\n\r\n // columnsLength += m.extractColumns().length;\r\n\r\n // if (hasFrozenColumns() && index == 0 && (columnsLength - 1) === options.frozenColumn) {\r\n // frozenColumnsValid = true;\r\n // }\r\n\r\n // var tmp = document.createElement(\"div\");\r\n // tmp.className = \"ui-state-default slick-group-header-column\";\r\n // tmp.innerHTML = \"<span class='slick-column-name'>\" + m.name + \"</span>\";\r\n // // tmp.innerHTML = m.name;\r\n // tmp.id = \"\" + uid + m.id;\r\n // tmp.title = m.toolTip || \"\";\r\n // if (m.headerCssClass) {\r\n // tmp.classList.add(m.headerCssClass);\r\n // }\r\n // if (hasFrozenColumns() && (columnsLength - 1) > options.frozenColumn) {\r\n // tmp.classList.add(\"frozen\");\r\n // }\r\n // var $tmp = $(tmp);\r\n // $tmp.data(\"column\", m);\r\n // if (hasFrozenColumns() && (columnsLength - 1) > options.frozenColumn) {\r\n // $tmp.appendTo($groupHeadersR[index]);\r\n // } else {\r\n // $tmp.appendTo($groupHeadersL[index]);\r\n // }\r\n // }\r\n\r\n // if (hasFrozenColumns() && index == 0 && !frozenColumnsValid) {\r\n // $groupHeadersL[index].empty();\r\n // $groupHeadersR[index].empty();\r\n // alert(\"All columns of group should to be grouped!\");\r\n // break;\r\n // }\r\n // }\r\n\r\n // applyColumnGroupHeaderWidths();\r\n // }\r\n\r\n function createColumnHeaders() {\r\n function onMouseEnter() {\r\n $(this).addClass(\"ui-state-hover\");\r\n }\r\n\r\n function onMouseLeave() {\r\n $(this).removeClass(\"ui-state-hover\");\r\n }\r\n\r\n $.each($headers.find(\".slick-header-column\"),\r\n function () {\r\n var columnDef = $(this).data(\"column\");\r\n if (columnDef) {\r\n trigger(self.onBeforeHeaderCellDestroy, {\r\n \"node\": this,\r\n \"column\": columnDef,\r\n \"grid\": self\r\n });\r\n }\r\n });\r\n\r\n $headerL.empty();\r\n $headerR.empty();\r\n\r\n getHeadersWidth();\r\n\r\n $headerL.width(headersWidthL);\r\n $headerR.width(headersWidthR);\r\n\r\n $.each($headerRow.find(\".slick-headerrow-column\"),\r\n function () {\r\n var columnDef = $(this).data(\"column\");\r\n if (columnDef) {\r\n trigger(self.onBeforeHeaderRowCellDestroy, {\r\n \"node\": this,\r\n \"column\": columnDef,\r\n \"grid\": self\r\n });\r\n }\r\n });\r\n\r\n $headerRowL.empty();\r\n $headerRowR.empty();\r\n\r\n if (options.createFooterRow) {\r\n $.each($footerRowL.find(\".slick-footerrow-column\"),\r\n function () {\r\n var columnDef = $(this).data(\"column\");\r\n if (columnDef) {\r\n trigger(self.onBeforeFooterRowCellDestroy, {\r\n \"node\": this,\r\n \"column\": columnDef,\r\n \"grid\": self\r\n });\r\n }\r\n });\r\n $footerRowL.empty();\r\n\r\n if (hasFrozenColumns()) {\r\n $.each($footerRowR.find(\".slick-footerrow-column\"),\r\n function () {\r\n var columnDef = $(this).data(\"column\");\r\n if (columnDef) {\r\n trigger(self.onBeforeFooterRowCellDestroy, {\r\n \"node\": this,\r\n \"column\": columnDef,\r\n \"grid\": self\r\n });\r\n }\r\n });\r\n $footerRowR.empty();\r\n }\r\n }\r\n\r\n for (var i = 0; i < columns.length; i++) {\r\n var m = columns[i];\r\n\r\n var $headerTarget = hasFrozenColumns() ? ((i <= options.frozenColumn) ? $headerL : $headerR) : $headerL;\r\n var $headerRowTarget = hasFrozenColumns() ? ((i <= options.frozenColumn) ? $headerRowL : $headerRowR) : $headerRowL;\r\n\r\n\r\n var div = document.createElement(\"div\");\r\n div.className = \"ui-state-default slick-header-column\";\r\n div.style.width = (m.width - headerColumnWidthDiff) + \"px\";\r\n div.id = \"\" + uid + m.id;\r\n div.title = m.toolTip || \"\";\r\n let html = \"<span class='slick-column-name'>\" + m.name + \"</span>\";\r\n if (m.resizable) {\r\n html += \"<span class='rs-r'\" + (options.resizeHandleWidth ? \"style='width:\" + options.resizeHandleWidth + \"'\" : \"\") + \"></span>\";\r\n div.className += \" resizable\";\r\n }\r\n div.innerHTML = html;\r\n if (m.headerCssClass) {\r\n div.className += \" \" + m.headerCssClass;\r\n }\r\n if (hasFrozenColumns() && i <= options.frozenColumn) {\r\n div.classList.add(\"frozen\");\r\n }\r\n var header = $(div);\r\n header.appendTo($headerTarget);\r\n header.data(\"column\", m);\r\n // var header = $(\"<div class='ui-state-default slick-header-column' />\")\r\n // .html(\"<span class='slick-column-name'>\" + m.name + \"</span>\")\r\n // .width(m.width - headerColumnWidthDiff)\r\n // .attr(\"id\", \"\" + uid + m.id)\r\n // .attr(\"title\", m.toolTip || \"\")\r\n // .data(\"column\", m)\r\n // .addClass(m.headerCssClass || \"\")\r\n // .addClass(hasFrozenColumns() && i <= options.frozenColumn? 'frozen': '')\r\n // .appendTo($headerTarget);\r\n\r\n if (options.enableColumnReorder || m.sortable) {\r\n header\r\n .on(\"mouseenter\", onMouseEnter)\r\n .on(\"mouseleave\", onMouseLeave);\r\n }\r\n\r\n if (m.sortable) {\r\n header.addClass(\"slick-header-sortable\");\r\n var sortIndicator = document.createElement(\"span\");\r\n sortIndicator.className = \"slick-sort-indicator\"\r\n + (options.numberedMultiColumnSort && !options.sortColNumberInSeparateSpan ? \" slick-sort-indicator-numbered\" : \"\");\r\n header.append(sortIndicator);\r\n if (options.numberedMultiColumnSort && options.sortColNumberInSeparateSpan) {\r\n var numIndicator = document.createElement(\"span\");\r\n numIndicator.className = \"slick-sort-indicator-numbered\";\r\n header.append(numIndicator);\r\n }\r\n }\r\n\r\n trigger(self.onHeaderCellRendered, {\r\n \"node\": header[0],\r\n \"column\": m,\r\n \"grid\": self\r\n });\r\n\r\n if (options.showHeaderRow) {\r\n var headerRowCell = $(\"<div class='ui-state-default slick-headerrow-column l\" + i + \" r\" + i + \"'></div>\")\r\n .data(\"column\", m)\r\n .addClass(hasFrozenColumns() && i <= options.frozenColumn ? \"frozen\" : \"\")\r\n .appendTo($headerRowTarget);\r\n\r\n trigger(self.onHeaderRowCellRendered, {\r\n \"node\": headerRowCell[0],\r\n \"column\": m,\r\n \"grid\": self\r\n });\r\n }\r\n if (options.createFooterRow && options.showFooterRow) {\r\n var footerRowCell = $(\"<div class='ui-state-default slick-footerrow-column l\" + i + \" r\" + i + \"'></div>\")\r\n .data(\"column\", m)\r\n .appendTo($footerRow);\r\n\r\n trigger(self.onFooterRowCellRendered, {\r\n \"node\": footerRowCell[0],\r\n \"column\": m,\r\n \"grid\": self\r\n });\r\n }\r\n }\r\n\r\n setSortColumns(sortColumns);\r\n // setupColumnResize();\r\n // if (options.enableColumnReorder) {\r\n // if (typeof options.enableColumnReorder == 'function') {\r\n // options.enableColumnReorder(self, $headers, headerColumnWidthDiff, setColumns, setupColumnResize, columns, getColumnIndex, uid, trigger);\r\n // } else {\r\n // setupColumnReorder();\r\n // }\r\n // }\r\n }\r\n\r\n function setupColumnSort() {\r\n $headers.on(\"click\", function (e) {\r\n\r\n let ctrlPressed: boolean = e.metaKey || e.ctrlKey;\r\n if ($(e.target).hasClass(\"rs-r\")) {\r\n return;\r\n }\r\n\r\n var $col = $(e.target).closestClass(\"slick-header-column\");\r\n if (!$col.length) {\r\n return;\r\n }\r\n\r\n var column = $col.data(\"column\");\r\n if (column.sortable) {\r\n if (!getEditorLock().commitCurrentEdit()) {\r\n return;\r\n }\r\n\r\n var sortColumn = null;\r\n var i = 0;\r\n for (; i < sortColumns.length; i++) {\r\n if (sortColumns[i].columnId == column.id) {\r\n sortColumn = sortColumns[i];\r\n sortColumn.sortAsc = !sortColumn.sortAsc;\r\n break;\r\n }\r\n }\r\n var hadSortCol = !!sortColumn;\r\n\r\n if (options.tristateMultiColumnSort) {\r\n if (!sortColumn) {\r\n sortColumn = { columnId: column.id, sortAsc: column.defaultSortAsc };\r\n }\r\n if (hadSortCol && sortColumn.sortAsc) {\r\n // three state: remove sort rather than go back to ASC\r\n sortColumns.splice(i, 1);\r\n sortColumn = null;\r\n }\r\n if (!options.multiColumnSort) { sortColumns = []; }\r\n if (sortColumn && (!hadSortCol || !options.multiColumnSort)) {\r\n sortColumns.push(sortColumn);\r\n }\r\n } else {\r\n // legacy behaviour\r\n if (ctrlPressed && options.multiColumnSort) {\r\n if (sortColumn) {\r\n sortColumns.splice(i, 1);\r\n }\r\n } else {\r\n if ((!e.shiftKey && !ctrlPressed) || !options.multiColumnSort) {\r\n sortColumns = [];\r\n }\r\n\r\n if (!sortColumn) {\r\n sortColumn = { columnId: column.id, sortAsc: column.defaultSortAsc };\r\n sortColumns.push(sortColumn);\r\n } else if (sortColumns.length == 0) {\r\n sortColumns.push(sortColumn);\r\n }\r\n }\r\n }\r\n\r\n setSortColumns(sortColumns);\r\n\r\n if (!options.multiColumnSort) {\r\n trigger(self.onSort, {\r\n multiColumnSort: false,\r\n columnId: (sortColumns.length > 0 ? column.id : null),\r\n sortCol: (sortColumns.length > 0 ? column : null),\r\n sortAsc: (sortColumns.length > 0 ? sortColumns[0].sortAsc : true)\r\n }, e);\r\n } else {\r\n trigger(self.onSort, {\r\n multiColumnSort: true,\r\n sortCols: sortColumns.map(function (col) {\r\n return { columnId: columns[getColumnIndex(col.columnId)].id, sortCol: columns[getColumnIndex(col.columnId)], sortAsc: col.sortAsc };\r\n })\r\n }, e);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function currentPositionInHeader(id) {\r\n var currentPosition = 0;\r\n $.each($headers.find(\".slick-header-column\"), function (i) {\r\n if (this.id == id) {\r\n currentPosition = i;\r\n return false;\r\n }\r\n });\r\n\r\n return currentPosition;\r\n }\r\n\r\n // function limitPositionInGroup(idColumn) {\r\n // var groupColumnOfPreviousPosition,\r\n // startLimit = 0,\r\n // endLimit = 0;\r\n\r\n // treeColumns\r\n // .getColumnsInDepth($groupHeadersL.length - 1)\r\n // .some(function (groupColumn) {\r\n // startLimit = endLimit;\r\n // endLimit += groupColumn.columns.length;\r\n\r\n // groupColumn.columns.some(function (column) {\r\n\r\n // if (column.id === idColumn) {\r\n // groupColumnOfPreviousPosition = groupColumn;\r\n // }\r\n\r\n // return groupColumnOfPreviousPosition;\r\n // });\r\n\r\n // return groupColumnOfPreviousPosition;\r\n // });\r\n\r\n // endLimit--;\r\n\r\n // return {\r\n // start: startLimit,\r\n // end: endLimit,\r\n // group: groupColumnOfPreviousPosition\r\n // };\r\n // }\r\n\r\n function remove(arr, elem) {\r\n var index = arr.lastIndexOf(elem);\r\n if (index > -1) {\r\n arr.splice(index, 1);\r\n remove(arr, elem);\r\n }\r\n }\r\n\r\n // function columnPositionValidInGroup($item: IjQueryWrapper) {\r\n // var currentPosition = currentPositionInHeader($item[0].id);\r\n // var limit = limitPositionInGroup($item.data(\"column\").id);\r\n // var positionValid = limit.start <= currentPosition && currentPosition <= limit.end;\r\n\r\n // return {\r\n // limit: limit,\r\n // valid: positionValid,\r\n // message: positionValid ? \"\" : \"Column \\\"\".concat($item[0].textContent, \"\\\" can be reordered only within the \\\"\", limit.group.name, \"\\\" group!\")\r\n // };\r\n // }\r\n\r\n function setupColumnReorder() {\r\n if (1) { return; }\r\n var columnScrollTimer = null;\r\n\r\n function scrollColumnsRight() {\r\n $viewportScrollContainerX[0].scrollLeft = $viewportScrollContainerX[0].scrollLeft + 10;\r\n }\r\n\r\n function scrollColumnsLeft() {\r\n $viewportScrollContainerX[0].scrollLeft = $viewportScrollContainerX[0].scrollLeft - 10;\r\n }\r\n\r\n var canDragScroll;\r\n // $headers.sortable({\r\n // containment: \"parent\",\r\n // distance: 3,\r\n // axis: \"x\",\r\n // cursor: \"default\",\r\n // tolerance: \"intersection\",\r\n // helper: \"clone\",\r\n // placeholder: \"slick-sortable-placeholder ui-state-default slick-header-column\",\r\n // start: function (e, ui) {\r\n // ui.placeholder.width(ui.helper.outerWidth() - headerColumnWidthDiff);\r\n // canDragScroll = !hasFrozenColumns() ||\r\n // (ui.placeholder.offset().left + ui.placeholder.width()) > $viewportScrollContainerX.offset().left;\r\n // $(ui.helper).addClass(\"slick-header-column-active\");\r\n // },\r\n // beforeStop: function (e, ui) {\r\n // $(ui.helper).removeClass(\"slick-header-column-active\");\r\n // },\r\n // sort: function (e, ui) {\r\n // if (canDragScroll && e.originalEvent.pageX > $container[0].clientWidth) {\r\n // if (!(columnScrollTimer)) {\r\n // columnScrollTimer = setInterval(\r\n // scrollColumnsRight, 100);\r\n // }\r\n // } else if (canDragScroll && e.originalEvent.pageX < $viewportScrollContainerX.offset().left) {\r\n // if (!(columnScrollTimer)) {\r\n // columnScrollTimer = setInterval(\r\n // scrollColumnsLeft, 100);\r\n // }\r\n // } else {\r\n // clearInterval(columnScrollTimer);\r\n // columnScrollTimer = null;\r\n // }\r\n // },\r\n // stop: function (e, ui) {\r\n // var cancel = false;\r\n // clearInterval(columnScrollTimer);\r\n // columnScrollTimer = null;\r\n // var limit = null;\r\n\r\n // if (treeColumns.hasDepth()) {\r\n // var validPositionInGroup = columnPositionValidInGroup(ui.item);\r\n // limit = validPositionInGroup.limit;\r\n\r\n // cancel = !validPositionInGroup.valid;\r\n\r\n // if (cancel)\r\n // alert(validPositionInGroup.message);\r\n // }\r\n\r\n // if (cancel || !getEditorLock().commitCurrentEdit()) {\r\n // //$(this).sortable(\"cancel\");\r\n // return;\r\n // }\r\n\r\n // var reorderedIds = $headerL.sortable(\"toArray\");\r\n // reorderedIds = reorderedIds.concat($headerR.sortable(\"toArray\"));\r\n\r\n // var reorderedColumns = [];\r\n // for (var i = 0; i < reorderedIds.length; i++) {\r\n // reorderedColumns.push(columns[getColumnIndex(reorderedIds[i].replace(uid, \"\"))]);\r\n // }\r\n // setColumns(reorderedColumns);\r\n\r\n // trigger(self.onColumnsReordered, { impactedColumns : getImpactedColumns( limit ) });\r\n // e.stopPropagation();\r\n // setupColumnResize();\r\n // }\r\n // });\r\n }\r\n\r\n function getImpactedColumns(limit) {\r\n var impactedColumns = [];\r\n\r\n if (limit != undefined) {\r\n\r\n for (var i = limit.start; i <= limit.end; i++) {\r\n impactedColumns.push(columns[i]);\r\n }\r\n } else {\r\n\r\n impactedColumns = columns;\r\n }\r\n\r\n return impactedColumns;\r\n }\r\n\r\n function setupColumnMoveAndResize() {\r\n\r\n for (const c of ($container.find(\".slick-header-columns\") as any)) {\r\n Resizable(c, {\r\n resizeDelta: options.resizeDelta,\r\n onResize: new EventHandler((evt) => {\r\n processColumnResize(evt.target, evt.x);\r\n }),\r\n onStart: new EventHandler((evt) => {\r\n startColumnResize(evt.target, evt.x);\r\n }),\r\n onStop: new EventHandler((evt) => {\r\n finishColumnResize();\r\n })\r\n });\r\n // c.addEventListener(\"js-rs-resize\", (evt) => {\r\n // processColumnResize(evt.detail.target, evt.detail.pageX);\r\n // });\r\n // c.addEventListener(\"js-rs-start\", (evt) => {\r\n // startColumnResize(evt.detail.target, evt.detail.pageX);\r\n // });\r\n // c.addEventListener(\"js-rs-stop\", (evt) => {\r\n // finishColumnResize();\r\n // });\r\n }\r\n\r\n const mouseDownFnc = function (e) {\r\n let arg: MouseEvent = e;\r\n let $target: IjQueryWrapper = $(e.target).closestClass(\"slick-header-column\");\r\n if ($target.length === 0) {\r\n // special case for last column\r\n if (e.target.classList.contains(\"slick-header-columns\")) {\r\n $target = $((e.target as HTMLDivElement).lastChild as HTMLElement);\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n const x: number = arg.pageX != null ? arg.pageX : ((arg as unknown) as TouchEvent).touches[0].pageX;\r\n let columnInfo: ISlickColumn = $target.data(\"column\");\r\n\r\n if (options.enableColumnReorder) {\r\n startColumnDragging($target, x);\r\n } else {\r\n //sort\r\n }\r\n };\r\n\r\n $headers.on(\"mousedown\", mouseDownFnc);\r\n $headers.on(\"touchstart\", mouseDownFnc);\r\n\r\n }\r\n\r\n var dragColStartX = 0;\r\n var draggedEl: HTMLElement;\r\n var dragGhost: HTMLElement;\r\n\r\n function startColumnDragging($target: IjQueryWrapper, x: number) {\r\n dragColStartX = x;\r\n draggedEl = $target[0];\r\n dragGhost = document.createElement(\"div\");\r\n dragGhost.className = \"slick-col-ghost\";\r\n dragGhost.style.left = draggedEl.offsetLeft + \"px\";\r\n dragGhost.style.height = draggedEl.clientHeight + \"px\";\r\n dragGhost.style.width = draggedEl.clientWidth + \"px\";\r\n let ghostContent = document.createElement(\"div\");\r\n ghostContent.className = \"slick-ghost-content\";\r\n ghostContent.style.height = draggedEl.clientHeight + \"px\";\r\n dragGhost.appendChild(ghostContent);\r\n draggedEl.classList.add(\"slick-header-column-active\");\r\n draggedEl.parentElement.appendChild(dragGhost);\r\n window.addEventListener(\"mousemove\", processColumnDrag);\r\n window.addEventListener(\"touchmove\", processColumnDrag);\r\n window.addEventListener(\"mouseup\", finishColumnDrag);\r\n window.addEventListener(\"touchend\", finishColumnDrag);\r\n }\r\n\r\n function processColumnDrag(evt: MouseEvent) {\r\n const x: number = evt.pageX != null ? evt.pageX : ((evt as unknown) as TouchEvent).touches[0].pageX;\r\n let prevEl: HTMLElement = draggedEl.previousElementSibling as HTMLElement;\r\n let nextEl: HTMLElement = draggedEl.nextElementSibling as HTMLElement;\r\n\r\n let prevWidth = prevEl != null ? prevEl.offsetWidth : -1;\r\n let nextWidth = nextEl != null ? nextEl.offsetWidth : -1;\r\n let draggedDistance = x - dragColStartX;\r\n dragGhost.style.left = (draggedEl.offsetLeft + draggedDistance) + \"px\";\r\n if (prevWidth >= 0 && draggedDistance < -prevWidth) {\r\n if (prevEl != null) {\r\n draggedEl.parentNode.insertBefore(draggedEl, prevEl);\r\n }\r\n } else if (nextWidth >= 0 && draggedDistance > nextWidth) {\r\n if (nextEl != null) {\r\n draggedEl.parentNode.insertBefore(nextEl, draggedEl);\r\n }\r\n } else {\r\n return;\r\n }\r\n dragColStartX = x;\r\n }\r\n\r\n function applyColumnResort(arg: any) {\r\n\r\n if (!getEditorLock().commitCurrentEdit()) {\r\n return;\r\n }\r\n\r\n let $colsL = $headerL.find(\".slick-header-column\");\r\n let $colsR = $headerR.find(\".slick-header-column\");\r\n let reorderedIds = (($colsL as unknown) as HTMLElement[]).map((e) => e.id);\r\n reorderedIds = reorderedIds.concat((($colsR as unknown) as HTMLElement[]).map((e) => e.id));\r\n\r\n let reorderedColumns = [];\r\n for (let i = 0; i < reorderedIds.length; i++) {\r\n reorderedColumns.push(columns[getColumnIndex(reorderedIds[i].replace(uid, \"\"))]);\r\n }\r\n setColumns(reorderedColumns);\r\n\r\n trigger(self.onColumnsReordered, { impactedColumns: getImpactedColumns(0 /*limit*/) }); // tODO limit\r\n }\r\n\r\n function finishColumnDrag(arg: any) {\r\n const x: number = arg.pageX != null ? arg.pageX : (arg.touches.length > 0 ? arg.touches : arg.changedTouches)[0].pageX;\r\n window.removeEventListener(\"mousemove\", processColumnDrag);\r\n window.removeEventListener(\"mouseup\", finishColumnDrag);\r\n window.removeEventListener(\"touchmove\", processColumnDrag);\r\n window.removeEventListener(\"touchend\", finishColumnDrag);\r\n $headers.find(\".slick-header-column-active\").removeClass(\"slick-header-column-active\");\r\n if (dragGhost != null) {\r\n dragGhost.parentElement.removeChild(dragGhost);\r\n }\r\n dragGhost = null;\r\n if (Math.abs(dragColStartX - x) > options.dragDelta) {\r\n applyColumnResort(arg);\r\n } else {\r\n //sort\r\n }\r\n }\r\n\r\n\r\n let pageX, minPageX, maxPageX;\r\n\r\n function startColumnResize(target: HTMLElement, x: number) {\r\n const $target = $(target);\r\n // columnResizeDragging = true;\r\n if (!getEditorLock().commitCurrentEdit()) {\r\n return false;\r\n }\r\n pageX = x;\r\n let colIdx = $target.index();\r\n let columnElements = $headers.children();\r\n let shrinkLeewayOnRight = null, stretchLeewayOnRight = null;\r\n $target.addClass(\"slick-header-column-active\");\r\n // lock each column's width option to current width\r\n $.each(columnElements, function (i, e) {\r\n if (i >= columns.length) { return; }\r\n columns[i].previousWidth = $(e).width() as number;\r\n });\r\n if (options.forceFitColumns) {\r\n shrinkLeewayOnRight = 0;\r\n stretchLeewayOnRight = 0;\r\n // colums on right affect maxPageX/minPageX\r\n for (let j = colIdx + 1; j < columns.length; j++) {\r\n let c = columns[j];\r\n if (c.resizable) {\r\n if (stretchLeewayOnRight !== null) {\r\n if (c.maxWidth) {\r\n stretchLeewayOnRight += c.maxWidth - c.previousWidth;\r\n } else {\r\n stretchLeewayOnRight = null;\r\n }\r\n }\r\n shrinkLeewayOnRight += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n }\r\n }\r\n }\r\n let shrinkLeewayOnLeft = 0, stretchLeewayOnLeft = 0;\r\n for (let j = 0; j <= colIdx; j++) {\r\n // columns on left only affect minPageX\r\n let c = columns[j];\r\n if (c.resizable) {\r\n if (stretchLeewayOnLeft !== null) {\r\n if (c.maxWidth) {\r\n stretchLeewayOnLeft += c.maxWidth - c.previousWidth;\r\n } else {\r\n stretchLeewayOnLeft = null;\r\n }\r\n }\r\n shrinkLeewayOnLeft += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n }\r\n }\r\n if (shrinkLeewayOnRight === null) {\r\n shrinkLeewayOnRight = 100000;\r\n }\r\n if (shrinkLeewayOnLeft === null) {\r\n shrinkLeewayOnLeft = 100000;\r\n }\r\n if (stretchLeewayOnRight === null) {\r\n stretchLeewayOnRight = 100000;\r\n }\r\n if (stretchLeewayOnLeft === null) {\r\n stretchLeewayOnLeft = 100000;\r\n }\r\n maxPageX = pageX + Math.min(shrinkLeewayOnRight, stretchLeewayOnLeft);\r\n minPageX = pageX - Math.min(shrinkLeewayOnLeft, stretchLeewayOnRight);\r\n // $current_resize_target = $target;\r\n }\r\n\r\n\r\n\r\n function processColumnResize(target: HTMLElement, currentX: number) {\r\n // if (options.resizeDelta && Math.abs(oldResizeX - newx) <= options.resizeDelta)\r\n // return;\r\n let $target = $(target);\r\n // const width = $target.width() as number;\r\n // oldResizeX = newx;\r\n let colIdx = $target.index();\r\n if (hasFrozenColumns() && $target.closestClass(\"slick-header-columns\").hasClass(\"slick-header-columns-right\")) {\r\n colIdx += options.frozenColumn + 1;\r\n }\r\n let actualMinWidth, d = Math.min(maxPageX, Math.max(minPageX, currentX)) - pageX, x;\r\n if (d < 0) { // shrink column\r\n x = d;\r\n\r\n var newCanvasWidthL = 0, newCanvasWidthR = 0;\r\n\r\n for (let j = colIdx; j >= 0; j--) {\r\n let c = columns[j];\r\n if (c.resizable) {\r\n actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n if (x && c.previousWidth + x < actualMinWidth) {\r\n x += c.previousWidth - actualMinWidth;\r\n c.width = actualMinWidth;\r\n } else {\r\n c.width = c.previousWidth + x;\r\n x = 0;\r\n }\r\n }\r\n }\r\n // return;\r\n\r\n for (let k = 0; k <= colIdx; k++) {\r\n let c = columns[k];\r\n\r\n if (hasFrozenColumns() && (k > options.frozenColumn)) {\r\n newCanvasWidthR += c.width;\r\n } else {\r\n newCanvasWidthL += c.width;\r\n }\r\n }\r\n\r\n if (options.forceFitColumns) {\r\n x = -d;\r\n for (let j = colIdx + 1; j < columns.length; j++) {\r\n let c = columns[j];\r\n if (c.resizable) {\r\n if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n x -= c.maxWidth - c.previousWidth;\r\n c.width = c.maxWidth;\r\n } else {\r\n c.width = c.previousWidth + x;\r\n x = 0;\r\n }\r\n\r\n if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n newCanvasWidthR += c.width;\r\n } else {\r\n newCanvasWidthL += c.width;\r\n }\r\n }\r\n }\r\n } else {\r\n for (let j = colIdx + 1; j < columns.length; j++) {\r\n let c = columns[j];\r\n\r\n if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n newCanvasWidthR += c.width;\r\n } else {\r\n newCanvasWidthL += c.width;\r\n }\r\n }\r\n }\r\n\r\n if (options.forceFitColumns) {\r\n x = -d;\r\n for (let j = colIdx + 1; j < columns.length; j++) {\r\n let c = columns[j];\r\n if (c.resizable) {\r\n if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n x -= c.maxWidth - c.previousWidth;\r\n c.width = c.maxWidth;\r\n } else {\r\n c.width = c.previousWidth + x;\r\n x = 0;\r\n }\r\n }\r\n }\r\n }\r\n } else { // stretch column\r\n x = d;\r\n\r\n var newCanvasWidthL = 0, newCanvasWidthR = 0;\r\n\r\n for (let j = colIdx; j >= 0; j--) {\r\n let c = columns[j];\r\n if (c.resizable) {\r\n if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n x -= c.maxWidth - c.previousWidth;\r\n c.width = c.maxWidth;\r\n } else {\r\n c.width = c.previousWidth + x;\r\n x = 0;\r\n }\r\n }\r\n }\r\n\r\n for (let k = 0; k <= colIdx; k++) {\r\n let c = columns[k];\r\n\r\n if (hasFrozenColumns() && (k > options.frozenColumn)) {\r\n newCanvasWidthR += c.width;\r\n } else {\r\n newCanvasWidthL += c.width;\r\n }\r\n }\r\n\r\n if (options.forceFitColumns) {\r\n x = -d;\r\n for (let j = colIdx + 1; j < columns.length; j++) {\r\n let c = columns[j];\r\n if (c.resizable) {\r\n actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n if (x && c.previousWidth + x < actualMinWidth) {\r\n x += c.previousWidth - actualMinWidth;\r\n c.width = actualMinWidth;\r\n } else {\r\n c.width = c.previousWidth + x;\r\n x = 0;\r\n }\r\n\r\n if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n newCanvasWidthR += c.width;\r\n } else {\r\n newCanvasWidthL += c.width;\r\n }\r\n }\r\n }\r\n } else {\r\n for (let j = colIdx + 1; j < columns.length; j++) {\r\n let c = columns[j];\r\n\r\n if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n newCanvasWidthR += c.width;\r\n } else {\r\n newCanvasWidthL += c.width;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (hasFrozenColumns() && newCanvasWidthL != canvasWidthL) {\r\n $headerL.width(newCanvasWidthL + 1000);\r\n $paneHeaderR.css(\"left\", newCanvasWidthL);\r\n }\r\n\r\n applyColumnHeaderWidths();\r\n // applyColumnGroupHeaderWidths();\r\n if (options.syncColumnCellResize) {\r\n applyColumnWidths();\r\n }\r\n\r\n }\r\n\r\n function finishColumnResize() {\r\n let newWidth: number;\r\n let columnElements = $headers.children();\r\n $headers.find(\".slick-header-column-active\").removeClass(\"slick-header-column-active\");\r\n for (let j = 0; j < columns.length; j++) {\r\n let c = columns[j];\r\n newWidth = $(columnElements[j]).width() as number;\r\n\r\n if (c.previousWidth !== newWidth && c.rerenderOnResize) {\r\n invalidateAllRows();\r\n break;\r\n }\r\n }\r\n updateCanvasWidth(true);\r\n resizeCanvas();\r\n handleScroll();\r\n\r\n trigger(self.onColumnsResized, {});\r\n }\r\n\r\n\r\n // function setupColumnResize() {\r\n // if (1) return;\r\n // var $col, j, k, c, pageX, columnElements: IjQueryWrapper, minPageX, maxPageX, firstResizable, lastResizable;\r\n // columnElements = $headers.children();\r\n // columnElements.find(\".slick-resizable-handle\").remove();\r\n // $.each(columnElements, function (i, e) {\r\n // if (i >= columns.length) { return; }\r\n // if (columns[i].resizable) {\r\n // if (firstResizable === undefined) {\r\n // firstResizable = i;\r\n // }\r\n // lastResizable = i;\r\n // }\r\n // });\r\n // if (firstResizable === undefined) {\r\n // return;\r\n // }\r\n // $.each(columnElements, function (i, e) {\r\n // if (i >= columns.length) { return; }\r\n // if (i < firstResizable || (options.forceFitColumns && i >= lastResizable)) {\r\n // return;\r\n // }\r\n // $col = $(e);\r\n // var resHandle = document.createElement(\"div\");\r\n // resHandle.className = \"slick-resizable-handle\";\r\n // e.appendChild(resHandle);\r\n // $(resHandle).on(\"dragstart\", function (e, dd) {\r\n // if (!getEditorLock().commitCurrentEdit()) {\r\n // return false;\r\n // }\r\n // pageX = e.pageX;\r\n // resHandle.parentElement.classList.add(\"slick-header-column-active\");\r\n // var shrinkLeewayOnRight = null, stretchLeewayOnRight = null;\r\n // // lock each column's width option to current width\r\n // $.each(columnElements, function (i, e) {\r\n // if (i >= columns.length) { return; }\r\n // columns[i].previousWidth = $(e).width(); //.outerWidth();\r\n // });\r\n // if (options.forceFitColumns) {\r\n // shrinkLeewayOnRight = 0;\r\n // stretchLeewayOnRight = 0;\r\n // // colums on right affect maxPageX/minPageX\r\n // for (j = i + 1; j < columns.length; j++) {\r\n // c = columns[j];\r\n // if (c.resizable) {\r\n // if (stretchLeewayOnRight !== null) {\r\n // if (c.maxWidth) {\r\n // stretchLeewayOnRight += c.maxWidth - c.previousWidth;\r\n // } else {\r\n // stretchLeewayOnRight = null;\r\n // }\r\n // }\r\n // shrinkLeewayOnRight += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n // }\r\n // }\r\n // }\r\n // var shrinkLeewayOnLeft = 0, stretchLeewayOnLeft = 0;\r\n // for (j = 0; j <= i; j++) {\r\n // // columns on left only affect minPageX\r\n // c = columns[j];\r\n // if (c.resizable) {\r\n // if (stretchLeewayOnLeft !== null) {\r\n // if (c.maxWidth) {\r\n // stretchLeewayOnLeft += c.maxWidth - c.previousWidth;\r\n // } else {\r\n // stretchLeewayOnLeft = null;\r\n // }\r\n // }\r\n // shrinkLeewayOnLeft += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n // }\r\n // }\r\n // if (shrinkLeewayOnRight === null) {\r\n // shrinkLeewayOnRight = 100000;\r\n // }\r\n // if (shrinkLeewayOnLeft === null) {\r\n // shrinkLeewayOnLeft = 100000;\r\n // }\r\n // if (stretchLeewayOnRight === null) {\r\n // stretchLeewayOnRight = 100000;\r\n // }\r\n // if (stretchLeewayOnLeft === null) {\r\n // stretchLeewayOnLeft = 100000;\r\n // }\r\n // maxPageX = pageX + Math.min(shrinkLeewayOnRight, stretchLeewayOnLeft);\r\n // minPageX = pageX - Math.min(shrinkLeewayOnLeft, stretchLeewayOnRight);\r\n // })\r\n // .on(\"drag\", function (e, dd) {\r\n // columnResizeDragging = true;\r\n // var actualMinWidth, d = Math.min(maxPageX, Math.max(minPageX, e.pageX)) - pageX, x;\r\n // if (d < 0) { // shrink column\r\n // x = d;\r\n\r\n // var newCanvasWidthL = 0, newCanvasWidthR = 0;\r\n\r\n // for (j = i; j >= 0; j--) {\r\n // c = columns[j];\r\n // if (c.resizable) {\r\n // actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n // if (x && c.previousWidth + x < actualMinWidth) {\r\n // x += c.previousWidth - actualMinWidth;\r\n // c.width = actualMinWidth;\r\n // } else {\r\n // c.width = c.previousWidth + x;\r\n // x = 0;\r\n // }\r\n // }\r\n // }\r\n\r\n // for (k = 0; k <= i; k++) {\r\n // c = columns[k];\r\n\r\n // if (hasFrozenColumns() && (k > options.frozenColumn)) {\r\n // newCanvasWidthR += c.width;\r\n // } else {\r\n // newCanvasWidthL += c.width;\r\n // }\r\n // }\r\n\r\n // if (options.forceFitColumns) {\r\n // x = -d;\r\n // for (j = i + 1; j < columns.length; j++) {\r\n // c = columns[j];\r\n // if (c.resizable) {\r\n // if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n // x -= c.maxWidth - c.previousWidth;\r\n // c.width = c.maxWidth;\r\n // } else {\r\n // c.width = c.previousWidth + x;\r\n // x = 0;\r\n // }\r\n\r\n // if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n // newCanvasWidthR += c.width;\r\n // } else {\r\n // newCanvasWidthL += c.width;\r\n // }\r\n // }\r\n // }\r\n // } else {\r\n // for (j = i + 1; j < columns.length; j++) {\r\n // c = columns[j];\r\n\r\n // if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n // newCanvasWidthR += c.width;\r\n // } else {\r\n // newCanvasWidthL += c.width;\r\n // }\r\n // }\r\n // }\r\n\r\n // if (options.forceFitColumns) {\r\n // x = -d;\r\n // for (j = i + 1; j < columns.length; j++) {\r\n // c = columns[j];\r\n // if (c.resizable) {\r\n // if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n // x -= c.maxWidth - c.previousWidth;\r\n // c.width = c.maxWidth;\r\n // } else {\r\n // c.width = c.previousWidth + x;\r\n // x = 0;\r\n // }\r\n // }\r\n // }\r\n // }\r\n // } else { // stretch column\r\n // x = d;\r\n\r\n // var newCanvasWidthL = 0, newCanvasWidthR = 0;\r\n\r\n // for (j = i; j >= 0; j--) {\r\n // c = columns[j];\r\n // if (c.resizable) {\r\n // if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n // x -= c.maxWidth - c.previousWidth;\r\n // c.width = c.maxWidth;\r\n // } else {\r\n // c.width = c.previousWidth + x;\r\n // x = 0;\r\n // }\r\n // }\r\n // }\r\n\r\n // for (k = 0; k <= i; k++) {\r\n // c = columns[k];\r\n\r\n // if (hasFrozenColumns() && (k > options.frozenColumn)) {\r\n // newCanvasWidthR += c.width;\r\n // } else {\r\n // newCanvasWidthL += c.width;\r\n // }\r\n // }\r\n\r\n // if (options.forceFitColumns) {\r\n // x = -d;\r\n // for (j = i + 1; j < columns.length; j++) {\r\n // c = columns[j];\r\n // if (c.resizable) {\r\n // actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n // if (x && c.previousWidth + x < actualMinWidth) {\r\n // x += c.previousWidth - actualMinWidth;\r\n // c.width = actualMinWidth;\r\n // } else {\r\n // c.width = c.previousWidth + x;\r\n // x = 0;\r\n // }\r\n\r\n // if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n // newCanvasWidthR += c.width;\r\n // } else {\r\n // newCanvasWidthL += c.width;\r\n // }\r\n // }\r\n // }\r\n // } else {\r\n // for (j = i + 1; j < columns.length; j++) {\r\n // c = columns[j];\r\n\r\n // if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n // newCanvasWidthR += c.width;\r\n // } else {\r\n // newCanvasWidthL += c.width;\r\n // }\r\n // }\r\n // }\r\n // }\r\n\r\n // if (hasFrozenColumns() && newCanvasWidthL != canvasWidthL) {\r\n // $headerL.width(newCanvasWidthL + 1000);\r\n // $paneHeaderR.css('left', newCanvasWidthL);\r\n // }\r\n\r\n // applyColumnHeaderWidths();\r\n // applyColumnGroupHeaderWidths();\r\n // if (options.syncColumnCellResize) {\r\n // applyColumnWidths();\r\n // }\r\n // })\r\n // .on(\"dragend\", function (e, dd) {\r\n // var newWidth;\r\n // resHandle.parentElement.classList.remove(\"slick-header-column-active\");\r\n // for (j = 0; j < columns.length; j++) {\r\n // c = columns[j];\r\n // newWidth = $(columnElements[j]).width(); //.outerWidth();\r\n\r\n // if (c.previousWidth !== newWidth && c.rerenderOnResize) {\r\n // invalidateAllRows();\r\n // }\r\n // }\r\n // updateCanvasWidth(true);\r\n // render();\r\n // trigger(self.onColumnsResized, {});\r\n // setTimeout(function () { columnResizeDragging = false; }, 300);\r\n // });\r\n // });\r\n // }\r\n\r\n function getVBoxDelta($el) {\r\n var p = [\"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\"];\r\n var delta = 0;\r\n $.each(p, function (n, val) {\r\n delta += parseFloat($el.css(val)) || 0;\r\n });\r\n return delta;\r\n }\r\n\r\n function setFrozenOptions() {\r\n options.frozenColumn = (options.frozenColumn >= 0 && options.frozenColumn < columns.length)\r\n ? options.frozenColumn\r\n : -1;\r\n\r\n if (options.frozenRow > -1) {\r\n hasFrozenRows = true;\r\n frozenRowsHeight = getRowTop(options.frozenRow);\r\n\r\n var dataLength = getDataLength();\r\n\r\n actualFrozenRow = (options.frozenBottom)\r\n ? (dataLength - options.frozenRow)\r\n : options.frozenRow;\r\n } else {\r\n hasFrozenRows = false;\r\n }\r\n }\r\n\r\n function setPaneVisibility() {\r\n if (hasFrozenColumns()) {\r\n $.each($paneHeaderR, function (idx, el) { el.style.display = \"\"; });\r\n $.each($paneTopR, function (idx, el) { el.style.display = \"\"; });\r\n\r\n if (hasFrozenRows) {\r\n $.each($paneBottomL, function (idx, el) { el.style.display = \"\"; });\r\n $.each($paneBottomR, function (idx, el) { el.style.display = \"\"; });\r\n } else {\r\n $.each($paneBottomR, function (idx, el) { el.style.display = \"none\"; });\r\n $.each($paneBottomL, function (idx, el) { el.style.display = \"none\"; });\r\n }\r\n } else {\r\n $.each($paneHeaderR, function (idx, el) { el.style.display = \"none\"; });\r\n $.each($paneTopR, function (idx, el) { el.style.display = \"none\"; });\r\n $.each($paneBottomR, function (idx, el) { el.style.display = \"none\"; });\r\n\r\n if (hasFrozenRows) {\r\n $.each($paneBottomL, function (idx, el) { el.style.display = \"\"; });\r\n } else {\r\n $.each($paneBottomR, function (idx, el) { el.style.display = \"none\"; });\r\n $.each($paneBottomL, function (idx, el) { el.style.display = \"none\"; });\r\n }\r\n }\r\n }\r\n\r\n function setOverflow() {\r\n $viewportTopL\r\n .css(\"overflow-x\", options.alwaysShowHorizontalScroll ? \"scroll\" : (hasFrozenColumns()) ? (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"hidden\" : \"scroll\") : (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"hidden\" : \"auto\"))\r\n .css(\"overflow-y\", options.alwaysShowVerticalScroll ? \"scroll\" : ((hasFrozenColumns()) ? (hasFrozenRows ? \"hidden\" : \"hidden\") : (hasFrozenRows ? \"scroll\" : \"auto\"))\r\n );\r\n\r\n $viewportTopR\r\n .css(\"overflow-x\", options.alwaysShowHorizontalScroll ? \"scroll\" : (hasFrozenColumns()) ? (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"hidden\" : \"scroll\") : (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"hidden\" : \"auto\"))\r\n .css(\"overflow-y\", options.alwaysShowVerticalScroll ? \"scroll\" : ((hasFrozenColumns()) ? (hasFrozenRows ? \"scroll\" : \"auto\") : (hasFrozenRows ? \"scroll\" : \"auto\"))\r\n );\r\n\r\n $viewportBottomL\r\n .css(\"overflow-x\", options.alwaysShowHorizontalScroll ? \"scroll\" : (hasFrozenColumns()) ? (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"scroll\" : \"auto\") : (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"auto\" : \"auto\"))\r\n .css(\"overflow-y\", options.alwaysShowVerticalScroll ? \"scroll\" : ((hasFrozenColumns()) ? (hasFrozenRows ? \"hidden\" : \"hidden\") : (hasFrozenRows ? \"scroll\" : \"auto\"))\r\n );\r\n\r\n $viewportBottomR\r\n .css(\"overflow-x\", options.alwaysShowHorizontalScroll ? \"scroll\" : (hasFrozenColumns()) ? (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"scroll\" : \"auto\") : (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"auto\" : \"auto\"))\r\n .css(\"overflow-y\", options.alwaysShowVerticalScroll ? \"scroll\" : ((hasFrozenColumns()) ? (hasFrozenRows ? \"auto\" : \"auto\") : (hasFrozenRows ? \"auto\" : \"auto\"))\r\n );\r\n if (options.viewportClass) {\r\n $viewportTopL.toggleClass(options.viewportClass, true);\r\n $viewportTopR.toggleClass(options.viewportClass, true);\r\n $viewportBottomL.toggleClass(options.viewportClass, true);\r\n $viewportBottomR.toggleClass(options.viewportClass, true);\r\n }\r\n }\r\n\r\n function setScroller() {\r\n if (hasFrozenColumns()) {\r\n $headerScrollContainer = $headerScrollerR;\r\n $headerRowScrollContainer = $headerRowScrollerR;\r\n $footerRowScrollContainer = $footerRowScrollerR;\r\n\r\n if (hasFrozenRows) {\r\n if (options.frozenBottom) {\r\n $viewportScrollContainerX = $viewportBottomR;\r\n $viewportScrollContainerY = $viewportTopR;\r\n } else {\r\n $viewportScrollContainerX = $viewportScrollContainerY = $viewportBottomR;\r\n }\r\n } else {\r\n $viewportScrollContainerX = $viewportScrollContainerY = $viewportTopR;\r\n }\r\n } else {\r\n $headerScrollContainer = $headerScrollerL;\r\n $headerRowScrollContainer = $headerRowScrollerL;\r\n $footerRowScrollContainer = $footerRowScrollerL;\r\n\r\n if (hasFrozenRows) {\r\n if (options.frozenBottom) {\r\n $viewportScrollContainerX = $viewportBottomL;\r\n $viewportScrollContainerY = $viewportTopL;\r\n } else {\r\n $viewportScrollContainerX = $viewportScrollContainerY = $viewportBottomL;\r\n }\r\n } else {\r\n $viewportScrollContainerX = $viewportScrollContainerY = $viewportTopL;\r\n }\r\n }\r\n }\r\n\r\n function measureCellPaddingAndBorder() {\r\n var el;\r\n var h = [\"borderLeftWidth\", \"borderRightWidth\", \"paddingLeft\", \"paddingRight\"];\r\n var v = [\"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\"];\r\n\r\n // jquery prior to version 1.8 handles .width setter/getter as a direct css write/read\r\n // jquery 1.8 changed .width to read the true inner element width if box-sizing is set to border-box, and introduced a setter for .outerWidth\r\n // so for equivalent functionality, prior to 1.8 use .width, and after use .outerWidth\r\n // var verArray = $.fn.jquery.split('.');\r\n jQueryNewWidthBehaviour = false; // (verArray[0]==1 && verArray[1]>=8) || verArray[0] >=2;\r\n\r\n el = $(\"<div class='ui-state-default slick-header-column' style='visibility:hidden'>-</div>\").appendTo($headers);\r\n headerColumnWidthDiff = headerColumnHeightDiff = 0;\r\n if (el.css(\"box-sizing\") != \"border-box\" && el.css(\"-moz-box-sizing\") != \"border-box\" && el.css(\"-webkit-box-sizing\") != \"border-box\") {\r\n $.each(h, function (n, val) {\r\n headerColumnWidthDiff += parseFloat(el.css(val)) || 0;\r\n });\r\n $.each(v, function (n, val) {\r\n headerColumnHeightDiff += parseFloat(el.css(val)) || 0;\r\n });\r\n }\r\n el.remove();\r\n\r\n var r = $(\"<div class='slick-row' />\").appendTo($canvas);\r\n el = $(\"<div class='slick-cell' id='' style='visibility:hidden'>-</div>\").appendTo(r);\r\n cellWidthDiff = cellHeightDiff = 0;\r\n if (el.css(\"box-sizing\") != \"border-box\" && el.css(\"-moz-box-sizing\") != \"border-box\" && el.css(\"-webkit-box-sizing\") != \"border-box\") {\r\n $.each(h, function (n, val) {\r\n cellWidthDiff += parseFloat(el.css(val)) || 0;\r\n });\r\n $.each(v, function (n, val) {\r\n cellHeightDiff += parseFloat(el.css(val)) || 0;\r\n });\r\n }\r\n r.remove();\r\n\r\n absoluteColumnMinWidth = Math.max(headerColumnWidthDiff, cellWidthDiff);\r\n }\r\n\r\n function createCssRules() {\r\n let style = document.createElement(\"style\");\r\n style.type = \"text/css\";\r\n $(\"head\").append(style);\r\n $style = $(style);\r\n // $style = $(\"<style type='text/css' rel='stylesheet' />\").appendTo($(\"head\"));\r\n var rowHeight = (options.rowHeight - cellHeightDiff);\r\n var rules = [\r\n \".\" + uid + \" .slick-group-header-column { left: 1000px; }\",\r\n \".\" + uid + \" .slick-header-column { left: 1000px; }\",\r\n \".\" + uid + \" .slick-top-panel { height:\" + options.topPanelHeight + \"px; }\",\r\n \".\" + uid + \" .slick-preheader-panel { height:\" + options.preHeaderPanelHeight + \"px; }\",\r\n \".\" + uid + \" .slick-headerrow-columns { height:\" + options.headerRowHeight + \"px; }\",\r\n \".\" + uid + \" .slick-footerrow-columns { height:\" + options.footerRowHeight + \"px; }\",\r\n \".\" + uid + \" .slick-cell { height:\" + rowHeight + \"px; }\",\r\n \".\" + uid + \" .slick-row { height:\" + options.rowHeight + \"px; }\"\r\n ];\r\n\r\n for (var i = 0; i < columns.length; i++) {\r\n rules.push(\".\" + uid + \" .l\" + i + \" { }\");\r\n rules.push(\".\" + uid + \" .r\" + i + \" { }\");\r\n }\r\n\r\n if ($style[0].styleSheet) { // iE\r\n $style[0].styleSheet.cssText = rules.join(\" \");\r\n } else {\r\n $style[0].appendChild(document.createTextNode(rules.join(\" \")));\r\n }\r\n }\r\n\r\n function getColumnCssRules(idx) {\r\n var i;\r\n if (!stylesheet) {\r\n var sheets = document.styleSheets;\r\n for (i = 0; i < sheets.length; i++) {\r\n if (sheets[i].ownerNode == $style[0]) {\r\n stylesheet = sheets[i];\r\n break;\r\n }\r\n }\r\n\r\n if (!stylesheet) {\r\n throw new Error(\"Cannot find stylesheet.\");\r\n }\r\n\r\n // find and cache column CSS rules\r\n columnCssRulesL = [];\r\n columnCssRulesR = [];\r\n var cssRules = (stylesheet.cssRules || stylesheet.rules);\r\n var matches, columnIdx;\r\n for (i = 0; i < cssRules.length; i++) {\r\n var selector = cssRules[i].selectorText;\r\n if (matches = /\\.l\\d+/.exec(selector)) {\r\n columnIdx = parseInt(matches[0].substr(2, matches[0].length - 2), 10);\r\n columnCssRulesL[columnIdx] = cssRules[i];\r\n } else if (matches = /\\.r\\d+/.exec(selector)) {\r\n columnIdx = parseInt(matches[0].substr(2, matches[0].length - 2), 10);\r\n columnCssRulesR[columnIdx] = cssRules[i];\r\n }\r\n }\r\n }\r\n\r\n return {\r\n \"left\": columnCssRulesL[idx],\r\n \"right\": columnCssRulesR[idx]\r\n };\r\n }\r\n\r\n function removeCssRules() {\r\n $style.remove();\r\n stylesheet = null;\r\n }\r\n\r\n function destroy() {\r\n getEditorLock().cancelCurrentEdit();\r\n\r\n trigger(self.onBeforeDestroy, {});\r\n\r\n var i = plugins.length;\r\n while (i--) {\r\n unregisterPlugin(plugins[i]);\r\n }\r\n\r\n unbindAncestorScrollEvents();\r\n // $container.off(\".slickgrid\"); //TODO TODOFIX\r\n removeCssRules();\r\n\r\n // $canvas.off(\"draginit dragstart dragend drag\"); //TODO TODOFIX\r\n $container.empty().removeClass(uid);\r\n }\r\n\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////\r\n // general\r\n\r\n function trigger(evt, args, e?: any) {\r\n // if (evt.countHandlers() === 0) {\r\n // return;\r\n // }\r\n e = e || new Slick.EventData();\r\n if (e.stopImmediatePropagation) {\r\n let tmp_fnc = e.stopImmediatePropagation;\r\n e.stopImmediatePropagation = function () {\r\n tmp_fnc.apply(e);\r\n e._isImmediatePropagationStopped = true;\r\n };\r\n if (!e.isImmediatePropagationStopped) {\r\n e.isImmediatePropagationStopped = function () {\r\n return e._isImmediatePropagationStopped;\r\n };\r\n }\r\n }\r\n if (e.stopPropagation) {\r\n let tmp_fnc = e.stopPropagation;\r\n e.stopPropagation = function () {\r\n tmp_fnc.apply(e);\r\n e._isPropagationStopped = true;\r\n };\r\n if (!e.isPropagationStopped) {\r\n e.isPropagationStopped = function () {\r\n return e._isPropagationStopped;\r\n };\r\n }\r\n }\r\n args = args || {};\r\n args.grid = self;\r\n return evt.notify(args, e, self);\r\n }\r\n\r\n function getEditorLock() {\r\n return options.editorLock;\r\n }\r\n\r\n function getEditController() {\r\n return editController;\r\n }\r\n\r\n function getColumnIndex(id: string): number {\r\n return columnsById[id];\r\n }\r\n\r\n function getColumnById(id: string): ISlickColumn {\r\n return columns[getColumnIndex(id)];\r\n }\r\n\r\n function autosizeColumns() {\r\n var i, c,\r\n widths = [],\r\n shrinkLeeway = 0,\r\n total = 0,\r\n prevTotal,\r\n availWidth = viewportHasVScroll ? viewportW - scrollbarDimensions.width : viewportW;\r\n\r\n for (i = 0; i < columns.length; i++) {\r\n c = columns[i];\r\n widths.push(c.width);\r\n total += c.width;\r\n if (c.resizable) {\r\n shrinkLeeway += c.width - Math.max(c.minWidth, absoluteColumnMinWidth);\r\n }\r\n }\r\n\r\n // shrink\r\n prevTotal = total;\r\n while (total > availWidth && shrinkLeeway) {\r\n var shrinkProportion = (total - availWidth) / shrinkLeeway;\r\n for (i = 0; i < columns.length && total > availWidth; i++) {\r\n c = columns[i];\r\n var width = widths[i];\r\n if (!c.resizable || width <= c.minWidth || width <= absoluteColumnMinWidth) {\r\n continue;\r\n }\r\n var absMinWidth = Math.max(c.minWidth, absoluteColumnMinWidth);\r\n var shrinkSize = Math.floor(shrinkProportion * (width - absMinWidth)) || 1;\r\n shrinkSize = Math.min(shrinkSize, width - absMinWidth);\r\n total -= shrinkSize;\r\n shrinkLeeway -= shrinkSize;\r\n widths[i] -= shrinkSize;\r\n }\r\n if (prevTotal <= total) { // avoid infinite loop\r\n break;\r\n }\r\n prevTotal = total;\r\n }\r\n\r\n // grow\r\n prevTotal = total;\r\n while (total < availWidth) {\r\n var growProportion = availWidth / total;\r\n for (i = 0; i < columns.length && total < availWidth; i++) {\r\n c = columns[i];\r\n var currentWidth = widths[i];\r\n var growSize;\r\n\r\n if (!c.resizable || c.maxWidth <= currentWidth) {\r\n growSize = 0;\r\n } else {\r\n growSize = Math.min(Math.floor(growProportion * currentWidth) - currentWidth, (c.maxWidth - currentWidth) || 1000000) || 1;\r\n }\r\n total += growSize;\r\n widths[i] += (total <= availWidth ? growSize : 0);\r\n }\r\n if (prevTotal >= total) { // avoid infinite loop\r\n break;\r\n }\r\n prevTotal = total;\r\n }\r\n\r\n var reRender = false;\r\n for (i = 0; i < columns.length; i++) {\r\n if (columns[i].rerenderOnResize && columns[i].width != widths[i]) {\r\n reRender = true;\r\n }\r\n columns[i].width = widths[i];\r\n }\r\n\r\n applyColumnHeaderWidths();\r\n // applyColumnGroupHeaderWidths();\r\n updateCanvasWidth(true);\r\n\r\n trigger(self.onAutosizeColumns, { \"columns\": columns });\r\n\r\n if (reRender) {\r\n invalidateAllRows();\r\n render();\r\n }\r\n }\r\n\r\n // function applyColumnGroupHeaderWidths() {\r\n // if (!treeColumns.hasDepth()) {\r\n // return;\r\n // }\r\n\r\n // for (var depth = $groupHeadersL.length - 1; depth >= 0; depth--) {\r\n\r\n // var groupColumns = treeColumns.getColumnsInDepth(depth);\r\n\r\n // $.each($().add($groupHeadersL[depth]).add($groupHeadersR[depth]), function (i, el) {\r\n // var $groupHeader = $(el),\r\n // currentColumnIndex = 0;\r\n\r\n // $groupHeader.width(i == 0 ? getHeadersWidthL() : getHeadersWidthR());\r\n\r\n // $.each($groupHeader.children(), function (idx2, el2) {\r\n // var $groupHeaderColumn = $(el2);\r\n\r\n // var m = $(this).data(\"column\");\r\n\r\n // m.width = 0;\r\n\r\n // m.columns.forEach(function () {\r\n // var headerColumn = <HTMLElement>(<HTMLElement>$groupHeader[0]).nextElementSibling.children[currentColumnIndex++];\r\n // m.width += headerColumn.offsetWidth;\r\n // });\r\n\r\n // $groupHeaderColumn.width(m.width - headerColumnWidthDiff);\r\n\r\n // });\r\n\r\n // });\r\n\r\n // }\r\n // }\r\n\r\n function applyColumnHeaderWidths() {\r\n if (!initialized) { return; }\r\n var h: IjQueryWrapper;\r\n\r\n for (var i = 0, headers = $headers.children(), ii = columns.length; i < ii; i++) {\r\n h = $(headers[i]);\r\n if (jQueryNewWidthBehaviour) {\r\n if (h.width() !== columns[i].width) {\r\n h.width(columns[i].width);\r\n }\r\n } else {\r\n // if (<number>h.width() !== <number>h.width() - headerColumnWidthDiff) {\r\n h.width(columns[i].width - headerColumnWidthDiff);\r\n // }\r\n }\r\n }\r\n\r\n updateColumnCaches();\r\n }\r\n\r\n function applyColumnWidths() {\r\n var x = 0, w, rule;\r\n for (var i = 0; i < columns.length; i++) {\r\n w = columns[i].width;\r\n\r\n rule = getColumnCssRules(i);\r\n rule.left.style.left = x + \"px\";\r\n rule.right.style.right = (((options.frozenColumn != -1 && i > options.frozenColumn) ? canvasWidthR : canvasWidthL) - x - w) + \"px\";\r\n\r\n // if this column is frozen, reset the css left value since the\r\n // column starts in a new viewport.\r\n if (options.frozenColumn == i) {\r\n x = 0;\r\n } else {\r\n x += columns[i].width;\r\n }\r\n }\r\n }\r\n\r\n function setSortColumn(columnId, ascending) {\r\n setSortColumns([{ columnId: columnId, sortAsc: ascending }]);\r\n }\r\n\r\n function setSortColumns(cols) {\r\n sortColumns = cols;\r\n var numberCols = options.numberedMultiColumnSort && sortColumns.length > 1;\r\n var headerColumnEls = $headers.children();\r\n headerColumnEls\r\n .removeClass(\"slick-header-column-sorted\")\r\n .find(\".slick-sort-indicator\")\r\n .removeClass(\"slick-sort-indicator-asc slick-sort-indicator-desc\");\r\n headerColumnEls\r\n .find(\".slick-sort-indicator-numbered\")\r\n .text(\"\");\r\n\r\n $.each(sortColumns, function (i, col) {\r\n if (col.sortAsc == null) {\r\n col.sortAsc = true;\r\n }\r\n var columnIndex = getColumnIndex(col.columnId);\r\n if (columnIndex != null) {\r\n $(headerColumnEls[columnIndex])\r\n .addClass(\"slick-header-column-sorted\")\r\n .find(\".slick-sort-indicator\")\r\n .addClass(col.sortAsc ? \"slick-sort-indicator-asc\" : \"slick-sort-indicator-desc\");\r\n if (numberCols) {\r\n $(headerColumnEls[columnIndex])\r\n .find(\".slick-sort-indicator-numbered\")\r\n .text((i + 1).toString());\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getSortColumns() {\r\n return sortColumns;\r\n }\r\n\r\n function handleSelectedRangesChanged(e, ranges) {\r\n var previousSelectedRows = selectedRows.slice(0); // shallow copy previously selected rows for later comparison\r\n selectedRows = [];\r\n var hash = {};\r\n for (var i = 0; i < ranges.length; i++) {\r\n for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {\r\n if (!hash[j]) { // prevent duplicates\r\n selectedRows.push(j);\r\n hash[j] = {};\r\n }\r\n for (var k = ranges[i].fromCell; k <= ranges[i].toCell; k++) {\r\n if (canCellBeSelected(j, k)) {\r\n hash[j][columns[k].id] = options.selectedCellCssClass;\r\n }\r\n }\r\n }\r\n }\r\n\r\n setCellCssStyles(options.selectedCellCssClass, hash);\r\n\r\n if (simpleArrayEquals(previousSelectedRows, selectedRows)) {\r\n trigger(self.onSelectedRowsChanged, { rows: getSelectedRows() }, e);\r\n }\r\n }\r\n\r\n // compare 2 simple arrays (integers or strings only, do not use to compare object arrays)\r\n function simpleArrayEquals(arr1, arr2) {\r\n return Array.isArray(arr1) && Array.isArray(arr2) && arr2.sort().toString() !== arr1.sort().toString();\r\n }\r\n\r\n function getColumns() {\r\n return columns;\r\n }\r\n\r\n function updateColumnCaches() {\r\n // pre-calculate cell boundaries.\r\n columnPosLeft = [];\r\n columnPosRight = [];\r\n var x = 0;\r\n for (var i = 0, ii = columns.length; i < ii; i++) {\r\n columnPosLeft[i] = x;\r\n columnPosRight[i] = x + columns[i].width;\r\n\r\n if (options.frozenColumn == i) {\r\n x = 0;\r\n } else {\r\n x += columns[i].width;\r\n }\r\n }\r\n }\r\n\r\n function updateColumnProps() {\r\n columnsById = {};\r\n for (var i = 0; i < columns.length; i++) {\r\n if (columns[i].width) { (<any>columns[i]).widthRequest = columns[i].width; }\r\n\r\n var m = columns[i] = $.shallowExtend({}, columnDefaults, columns[i]);\r\n columnsById[m.id] = i;\r\n if (m.minWidth && m.width < m.minWidth) {\r\n m.width = m.minWidth;\r\n }\r\n if (m.maxWidth && m.width > m.maxWidth) {\r\n m.width = m.maxWidth;\r\n }\r\n }\r\n }\r\n\r\n function setColumns(columnDefinitions) {\r\n // var _treeColumns = new Slick.TreeColumns(columnDefinitions);\r\n // if (_treeColumns.hasDepth()) {\r\n // treeColumns = _treeColumns;\r\n // columns = treeColumns.extractColumns();\r\n // } else {\r\n columns = columnDefinitions;\r\n // }\r\n\r\n updateColumnProps();\r\n updateColumnCaches();\r\n if (initialized) {\r\n setPaneVisibility();\r\n setOverflow();\r\n invalidateAllRows();\r\n createColumnHeaders();\r\n // createColumnGroupHeaders();\r\n createColumnFooter();\r\n removeCssRules();\r\n createCssRules();\r\n resizeCanvas(); // does not work when not visible\r\n updateCanvasWidth();\r\n applyColumnWidths();\r\n handleScroll();\r\n }\r\n }\r\n\r\n function getOptions() {\r\n return options;\r\n }\r\n\r\n function setOptions(args, suppressRender) {\r\n if (!getEditorLock().commitCurrentEdit()) {\r\n return;\r\n }\r\n\r\n makeActiveCellNormal();\r\n\r\n if (options.enableAddRow !== args.enableAddRow) {\r\n invalidateRow(getDataLength());\r\n }\r\n\r\n options = $.shallowExtend(options, args);\r\n validateAndEnforceOptions();\r\n\r\n $viewport.css(\"overflow-y\", options.autoHeight ? \"hidden\" : \"auto\");\r\n if (!suppressRender) { render(); }\r\n\r\n setFrozenOptions();\r\n setScroller();\r\n // zombieRowNodeFromLastMouseWheelEvent = null;\r\n\r\n setColumns(columns);\r\n }\r\n\r\n function validateAndEnforceOptions() {\r\n if (options.autoHeight) {\r\n options.leaveSpaceForNewRows = false;\r\n }\r\n }\r\n\r\n function setData(newData, scrollToTop) {\r\n data = newData;\r\n invalidateAllRows();\r\n updateRowCount();\r\n if (scrollToTop) {\r\n scrollTo(0);\r\n }\r\n }\r\n\r\n function getData() {\r\n return data;\r\n }\r\n\r\n function getDataLength(): number {\r\n if (data.getLength) {\r\n return data.getLength();\r\n } else {\r\n return data && data.length || 0;\r\n }\r\n }\r\n\r\n function getDataLengthIncludingAddNew() {\r\n return getDataLength() + (!options.enableAddRow ? 0\r\n : (!pagingActive || pagingIsLastPage ? 1 : 0)\r\n );\r\n }\r\n\r\n function getDataItem(i) {\r\n if (data.getItem) {\r\n return data.getItem(i);\r\n } else {\r\n return data[i];\r\n }\r\n }\r\n\r\n function getTopPanel() {\r\n return $topPanel[0];\r\n }\r\n\r\n function setTopPanelVisibility(visible) {\r\n if (options.showTopPanel != visible) {\r\n options.showTopPanel = visible;\r\n if (visible) {\r\n $topPanelScroller.slideDown(\"fast\", resizeCanvas);\r\n } else {\r\n $topPanelScroller.slideUp(\"fast\", resizeCanvas);\r\n }\r\n }\r\n }\r\n\r\n function setHeaderRowVisibility(visible) {\r\n if (options.showHeaderRow != visible) {\r\n options.showHeaderRow = visible;\r\n if (visible) {\r\n $headerRowScroller.slideDown(\"fast\", resizeCanvas);\r\n } else {\r\n $headerRowScroller.slideUp(\"fast\", resizeCanvas);\r\n }\r\n }\r\n }\r\n\r\n function setFooterRowVisibility(visible) {\r\n if (options.showFooterRow != visible) {\r\n options.showFooterRow = visible;\r\n if (visible) {\r\n $footerRowScroller.slideDown(\"fast\", resizeCanvas);\r\n } else {\r\n $footerRowScroller.slideUp(\"fast\", resizeCanvas);\r\n }\r\n }\r\n }\r\n\r\n function setPreHeaderPanelVisibility(visible) {\r\n if (options.showPreHeaderPanel != visible) {\r\n options.showPreHeaderPanel = visible;\r\n if (visible) {\r\n $preHeaderPanelScroller.slideDown(\"fast\", resizeCanvas);\r\n } else {\r\n $preHeaderPanelScroller.slideUp(\"fast\", resizeCanvas);\r\n }\r\n }\r\n }\r\n\r\n function getContainerNode() {\r\n return $container[0];\r\n }\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////\r\n // rendering / Scrolling\r\n\r\n function getRowTop(row) {\r\n let result;\r\n if (options.variableRowHeight) {\r\n result = rowPositionCache[row].top - offset;\r\n } else {\r\n result = options.rowHeight * row - offset;\r\n }\r\n if (hasFrozenRows && row < actualFrozenRow) {\r\n result += offset;\r\n }\r\n return result;\r\n }\r\n\r\n function getRowBottom(row) {\r\n if (options.variableRowHeight) {\r\n return rowPositionCache[row].bottom - offset;\r\n }\r\n return options.rowHeight * (row + 1) - offset;\r\n }\r\n\r\n function getRowFromPosition(y) {\r\n if (!options.variableRowHeight) {\r\n return Math.floor((y + offset) / options.rowHeight);\r\n }\r\n\r\n let rowsInPosCache = getDataLength();\r\n\r\n if (!rowsInPosCache) {\r\n return 0;\r\n }\r\n\r\n // loop through the row position cache and break when\r\n // the row is found\r\n let row = Math.max(0,\r\n binarySearch(rowPositionCache, y + offset, function (pos, cacheEntry) {\r\n if (cacheEntry.top <= pos) {\r\n if (cacheEntry.bottom > pos) {\r\n return 0;\r\n } else {\r\n return 1;\r\n }\r\n } else {\r\n return -1;\r\n }\r\n })\r\n );\r\n\r\n // for ( var i = 0; i < rowsInPosCache; i++ ) {\r\n // if ( rowPositionCache[i].top <= y + offset\r\n // && rowPositionCache[i].bottom >= y + offset\r\n // ) {\r\n // row = i;\r\n // continue;\r\n // }\r\n // }\r\n\r\n // return the last row in the grid\r\n if (y + offset > rowPositionCache[rowsInPosCache - 1].bottom) {\r\n row = rowsInPosCache - 1;\r\n }\r\n\r\n return row;\r\n }\r\n\r\n function binarySearch(ar, el, compare_fn) {\r\n var m = 0;\r\n var n = ar.length - 1;\r\n while (m <= n) {\r\n var k = (n + m) >> 1;\r\n var cmp = compare_fn(el, ar[k]);\r\n if (cmp > 0) {\r\n m = k + 1;\r\n } else if (cmp < 0) {\r\n n = k - 1;\r\n } else {\r\n return k;\r\n }\r\n }\r\n return -m - 1;\r\n }\r\n\r\n function scrollTo(y) {\r\n y = Math.max(y, 0);\r\n y = Math.min(y, th - <number>$viewportScrollContainerY.height() + ((viewportHasHScroll || hasFrozenColumns()) ? scrollbarDimensions.height : 0));\r\n\r\n var oldOffset = offset;\r\n\r\n page = Math.min(n - 1, Math.floor(y / ph));\r\n offset = Math.round(page * cj);\r\n var newScrollTop = y - offset;\r\n\r\n if (offset != oldOffset) {\r\n var range = getVisibleRange(newScrollTop);\r\n cleanupRows(range);\r\n updateRowPositions();\r\n }\r\n\r\n if (prevScrollTop != newScrollTop) {\r\n vScrollDir = (prevScrollTop + oldOffset < newScrollTop + offset) ? 1 : -1;\r\n lastRenderedScrollTop = (scrollTop = prevScrollTop = newScrollTop);\r\n\r\n if (hasFrozenColumns()) {\r\n $viewportTopL[0].scrollTop = newScrollTop;\r\n }\r\n\r\n if (hasFrozenRows) {\r\n $viewportBottomL[0].scrollTop = $viewportBottomR[0].scrollTop = newScrollTop;\r\n }\r\n\r\n $viewportScrollContainerY[0].scrollTop = newScrollTop;\r\n\r\n trigger(self.onViewportChanged, {});\r\n }\r\n }\r\n\r\n function defaultFormatter(row: number, cell: number, value: any, columnDef: ISlickColumn, dataContext: any): string {\r\n if (value == null) {\r\n return \"\";\r\n } else {\r\n return (value + \"\").replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\r\n }\r\n }\r\n\r\n function getFormatter(row, column) {\r\n var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n\r\n // look up by id, then index\r\n var columnOverrides = rowMetadata &&\r\n rowMetadata.columns &&\r\n (rowMetadata.columns[column.id] || rowMetadata.columns[getColumnIndex(column.id)]);\r\n\r\n return (columnOverrides && columnOverrides.formatter) ||\r\n (rowMetadata && rowMetadata.formatter) ||\r\n column.formatter ||\r\n (options.formatterFactory && options.formatterFactory.getFormatter(column, row)) ||\r\n options.defaultFormatter;\r\n }\r\n\r\n function callFormatter(row, cell, value, m, item, grid) {\r\n\r\n var result;\r\n\r\n // pass metadata to formatter\r\n var metadata = data.getItemMetadata && data.getItemMetadata(row);\r\n metadata = metadata && metadata.columns;\r\n\r\n if (metadata) {\r\n var columnData = metadata[m.id] || metadata[cell];\r\n result = getFormatter(row, m)(row, cell, value, m, item, columnData);\r\n } else {\r\n result = getFormatter(row, m)(row, cell, value, m, item);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function getEditor(row, cell) {\r\n var column = columns[cell];\r\n var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n var columnMetadata = rowMetadata && rowMetadata.columns;\r\n\r\n if (columnMetadata && columnMetadata[column.id] && columnMetadata[column.id].editor !== undefined) {\r\n return columnMetadata[column.id].editor;\r\n }\r\n if (columnMetadata && columnMetadata[cell] && columnMetadata[cell].editor !== undefined) {\r\n return columnMetadata[cell].editor;\r\n }\r\n\r\n return column.editor || (options.editorFactory && options.editorFactory.getEditor(column, row));\r\n }\r\n\r\n function getDataItemValueForColumn(item, columnDef) {\r\n if (options.dataItemColumnValueExtractor) {\r\n return options.dataItemColumnValueExtractor(item, columnDef);\r\n }\r\n if (item == null) {\r\n return undefined;\r\n }\r\n if (columnDef.field.indexOf(\".\") > 0) {\r\n const fields = columnDef.field.split(\".\");\r\n let result = item;\r\n for (let i = 0; i < fields.length; i++) {\r\n result = result[fields[i]];\r\n }\r\n return result;\r\n }\r\n return item[columnDef.field];\r\n }\r\n\r\n function appendRowHtml(html: { L: string, R: string }, row, range, dataLength) {\r\n var d = getDataItem(row);\r\n var dataLoading = row < dataLength && !d;\r\n var rowCss = \"slick-row\" +\r\n (hasFrozenRows && row <= options.frozenRow ? \" frozen\" : \"\") +\r\n (dataLoading ? \" loading\" : \"\") +\r\n (row === activeRow && options.showCellSelection ? \" active\" : \"\") +\r\n (row % 2 === 1 ? \" odd\" : \" even\");\r\n\r\n if (!d && row >= dataLength) {\r\n rowCss += \" \" + options.addNewRowCssClass;\r\n }\r\n\r\n var metadata = data.getItemMetadata && data.getItemMetadata(row);\r\n\r\n if (metadata && metadata.cssClasses) {\r\n rowCss += \" \" + metadata.cssClasses;\r\n }\r\n\r\n rowCss += \" \" + (trigger(self.onAppendRow, { row: row, item: d }) || \"\");\r\n\r\n var frozenRowOffset = getFrozenRowOffset(row);\r\n\r\n var top = getRowTop(row) - frozenRowOffset;\r\n\r\n var rowHtml = \"<div class='ui-widget-content \" + rowCss + \"' style='top:\"\r\n + top + \"px\";\r\n if (getRowHeight(row) !== options.rowHeight) {\r\n rowHtml += \";height:\" + getRowHeight(row) + \"px\";\r\n }\r\n rowHtml += \"'>\";\r\n\r\n html.L += rowHtml;\r\n\r\n if (hasFrozenColumns()) {\r\n html.R += rowHtml;\r\n }\r\n\r\n var colspan, m;\r\n for (var i = 0, ii = columns.length; i < ii; i++) {\r\n m = columns[i];\r\n colspan = 1;\r\n if (metadata && metadata.columns) {\r\n var columnData = metadata.columns[m.id] || metadata.columns[i];\r\n colspan = (columnData && columnData.colspan) || 1;\r\n if (colspan === \"*\") {\r\n colspan = ii - i;\r\n }\r\n }\r\n\r\n // do not render cells outside of the viewport.\r\n if (columnPosRight[Math.min(ii - 1, i + colspan - 1)] > range.leftPx) {\r\n if (!m.alwaysRenderColumn && columnPosLeft[i] > range.rightPx) {\r\n // all columns to the right are outside the range.\r\n break;\r\n }\r\n\r\n if (hasFrozenColumns() && (i > options.frozenColumn)) {\r\n html.R += appendCellHtml(row, i, colspan, d);\r\n } else {\r\n html.L += appendCellHtml(row, i, colspan, d);\r\n }\r\n } else if (m.alwaysRenderColumn || (hasFrozenColumns() && i <= options.frozenColumn)) {\r\n html.L += appendCellHtml(row, i, colspan, d);\r\n }\r\n\r\n if (colspan > 1) {\r\n i += (colspan - 1);\r\n }\r\n }\r\n\r\n html.L += \"</div>\";\r\n\r\n if (hasFrozenColumns()) {\r\n html.R += \"</div>\";\r\n }\r\n }\r\n\r\n function appendCellHtml(row: number, cell: number, colspan: number, item: any): string {\r\n // result: string containing the HTML parts\r\n // row, cell: row and column index\r\n // colspan: HTML colspan\r\n // item: grid data for row\r\n var stringResult = \"\";\r\n\r\n var m: ISlickColumn = columns[cell];\r\n var cellCss = \"slick-cell l\" + cell + \" r\" + Math.min(columns.length - 1, cell + colspan - 1) +\r\n (m.cssClass ? \" \" + m.cssClass : \"\");\r\n\r\n if (hasFrozenColumns() && cell <= options.frozenColumn) {\r\n cellCss += (\" frozen\");\r\n }\r\n\r\n if (row === activeRow && cell === activeCell && options.showCellSelection) {\r\n cellCss += (\" active\");\r\n }\r\n\r\n for (var key in cellCssClasses) {\r\n if (cellCssClasses[key][row] && cellCssClasses[key][row][m.id]) {\r\n cellCss += (\" \" + cellCssClasses[key][row][m.id]);\r\n }\r\n }\r\n\r\n var value = null, formatterResult: ISlickFormatterResult | string = \"\";\r\n if (item) {\r\n value = getDataItemValueForColumn(item, m);\r\n formatterResult = getFormatter(row, m)(row, cell, value, m, item, self);\r\n if (formatterResult === null || formatterResult === undefined) { formatterResult = \"\"; }\r\n }\r\n\r\n // get addl css class names from object type formatter return\r\n var addlCssClasses = (formatterResult && (<ISlickFormatterResult>formatterResult).addClasses ? (addlCssClasses ? \" \" : \"\") + (<ISlickFormatterResult>formatterResult).addClasses : \"\");\r\n var toolTip = formatterResult && (<ISlickFormatterResult>formatterResult).toolTip ? \"title='\" + (<ISlickFormatterResult>formatterResult).toolTip + \"'\" : \"\";\r\n\r\n stringResult += \"<div class='\" +\r\n cellCss + (addlCssClasses ? \" \" + addlCssClasses : \"\") + \"' \" +\r\n toolTip +\r\n ((getRowHeight(row) !== options.rowHeight)\r\n ? \"style='height:\" + (getRowHeight(row) - cellHeightDiff) + \"px'>\"\r\n : \">\");\r\n\r\n // if there is a corresponding row (if not, this is the Add New row or this data hasn't been loaded yet)\r\n if (item) {\r\n stringResult += (Object.prototype.toString.call(formatterResult) !== \"[object Object]\" ? (<string>formatterResult) : (<ISlickFormatterResult>formatterResult).text);\r\n }\r\n\r\n stringResult += \"</div>\";\r\n\r\n rowsCache[row].cellRenderQueue.push(cell);\r\n rowsCache[row].cellColSpans[cell] = colspan;\r\n return stringResult;\r\n }\r\n\r\n\r\n function cleanupRows(rangeToKeep: { top: number, bottom: number }) {\r\n for (var i in rowsCache) {\r\n let idx = parseInt(i, 10);\r\n var removeFrozenRow = true;\r\n\r\n if (hasFrozenRows\r\n && ((options.frozenBottom && idx >= actualFrozenRow) // frozen bottom rows\r\n || (!options.frozenBottom && idx <= actualFrozenRow) // frozen top rows\r\n )\r\n ) {\r\n removeFrozenRow = false;\r\n }\r\n\r\n if ((idx !== activeRow)\r\n && (idx < rangeToKeep.top || idx > rangeToKeep.bottom)\r\n && (removeFrozenRow)\r\n ) {\r\n removeRowFromCache(i);\r\n }\r\n }\r\n if (options.enableAsyncPostRenderCleanup) { startPostProcessingCleanup(); }\r\n }\r\n\r\n function invalidate() {\r\n let currentActiveCell = null;\r\n if (currentEditor) {\r\n currentActiveCell = getActiveCell();\r\n }\r\n updateRowCount();\r\n invalidateAllRows();\r\n render();\r\n if (currentActiveCell) {\r\n makeActiveCellEditable(null, null, {});\r\n }\r\n }\r\n\r\n function invalidateAllRows() {\r\n if (currentEditor) {\r\n makeActiveCellNormal();\r\n }\r\n for (var row in rowsCache) {\r\n removeRowFromCache(row);\r\n }\r\n if (options.enableAsyncPostRenderCleanup) { startPostProcessingCleanup(); }\r\n }\r\n\r\n function queuePostProcessedRowForCleanup(cacheEntry, postProcessedRow, rowIdx) {\r\n postProcessgroupId++;\r\n\r\n // store and detach node for later async cleanup\r\n for (var column in postProcessedRow) {\r\n if (postProcessedRow.hasOwnProperty(column)) {\r\n let columnIdx = parseInt(column, 10) | 0;\r\n postProcessedCleanupQueue.push({\r\n actionType: \"C\",\r\n groupId: postProcessgroupId,\r\n node: cacheEntry.cellNodesByColumnIdx[columnIdx],\r\n columnIdx: columnIdx,\r\n rowIdx: rowIdx\r\n });\r\n }\r\n }\r\n postProcessedCleanupQueue.push({\r\n actionType: \"R\",\r\n groupId: postProcessgroupId,\r\n node: cacheEntry.rowNode\r\n });\r\n cacheEntry.rowNode.forEach(x => x.parent.removeChild(x)); // $(cacheEntry.rowNode).detach();\r\n }\r\n\r\n function initializeRowPositions() {\r\n rowPositionCache = [{\r\n top: 0\r\n , height: options.rowHeight\r\n , bottom: options.rowHeight\r\n }];\r\n }\r\n\r\n function cacheRowPositions() {\r\n if (!options.variableRowHeight) {\r\n return;\r\n }\r\n\r\n initializeRowPositions();\r\n\r\n for (var i = 0, l = getDataLength(); i <= l; i++) {\r\n var metadata = data.getItemMetadata && data.getItemMetadata(i);\r\n\r\n rowPositionCache[i] = {\r\n top: (rowPositionCache[i - 1])\r\n ? (rowPositionCache[i - 1].bottom/* - offset */)\r\n : 0\r\n , height: (metadata && metadata.height !== undefined)\r\n ? metadata.height\r\n : options.rowHeight\r\n };\r\n\r\n rowPositionCache[i].bottom = rowPositionCache[i].top + rowPositionCache[i].height;\r\n }\r\n }\r\n\r\n function removeRowFromCache(row) {\r\n var cacheEntry = rowsCache[row];\r\n if (!cacheEntry) {\r\n return;\r\n }\r\n\r\n trigger(self.onBeforeRemoveRow, { row: row, dom: cacheEntry.rowNode });\r\n\r\n cacheEntry.rowNode.forEach(x => {\r\n x.parentElement.removeChild(x);\r\n });\r\n\r\n delete rowsCache[row];\r\n delete postProcessedRows[row];\r\n }\r\n\r\n function invalidateRows(rows) {\r\n var i, rl;\r\n if (!rows || !rows.length) {\r\n return;\r\n }\r\n vScrollDir = 0;\r\n rl = rows.length;\r\n for (i = 0; i < rl; i++) {\r\n if (currentEditor && activeRow === rows[i]) {\r\n makeActiveCellNormal();\r\n }\r\n if (rowsCache[rows[i]]) {\r\n removeRowFromCache(rows[i]);\r\n }\r\n }\r\n if (options.enableAsyncPostRenderCleanup) { startPostProcessingCleanup(); }\r\n }\r\n\r\n function invalidateRow(row) {\r\n if (!row && row !== 0) { return; }\r\n invalidateRows([row]);\r\n }\r\n\r\n function applyFormatResultToCellNode(formatterResult, cellNode, suppressRemove?: boolean) {\r\n if (formatterResult === null || formatterResult === undefined) { formatterResult = \"\"; }\r\n if (Object.prototype.toString.call(formatterResult) !== \"[object Object]\") {\r\n cellNode.innerHTML = formatterResult;\r\n } else {\r\n cellNode.innerHTML = formatterResult.text;\r\n if (formatterResult.removeClasses && !suppressRemove) {\r\n $(cellNode).removeClass(formatterResult.removeClasses);\r\n }\r\n if (formatterResult.addClasses) {\r\n $(cellNode).addClass(formatterResult.addClasses);\r\n }\r\n if (formatterResult.toolTip) {\r\n $(cellNode).attr(\"title\", formatterResult.toolTip);\r\n }\r\n }\r\n }\r\n\r\n function updateCell(row, cell) {\r\n var cellNode = getCellNode(row, cell);\r\n if (!cellNode) {\r\n return;\r\n }\r\n\r\n var m = columns[cell], d = getDataItem(row);\r\n if (currentEditor && activeRow === row && activeCell === cell) {\r\n currentEditor.loadValue(d);\r\n } else {\r\n var formatterResult = d ? getFormatter(row, m)(row, cell, getDataItemValueForColumn(d, m), m, d, self) : \"\";\r\n applyFormatResultToCellNode(formatterResult, cellNode);\r\n if (self.onAppendCell.countHandlers() > 0) {\r\n let item = getDataItem(activeRow);\r\n let value = getDataItemValueForColumn(item, columns[activeCell]);\r\n trigger(self.onAppendCell,\r\n {\r\n row: row, cell: cell,\r\n value: value, item: item,\r\n column: m, dom: cellNode\r\n });\r\n }\r\n invalidatePostProcessingResults(row);\r\n }\r\n }\r\n\r\n function updateRow(row) {\r\n var cacheEntry = rowsCache[row];\r\n if (!cacheEntry) {\r\n return;\r\n }\r\n\r\n ensureCellNodesInRowsCache(row);\r\n\r\n var formatterResult, d = getDataItem(row);\r\n\r\n // if (d) {\r\n // for (let cacheRow of cacheEntry.rowNode) {\r\n // cacheRow.classList.remove(\"loading\");\r\n // }\r\n // }\r\n\r\n for (var column in cacheEntry.cellNodesByColumnIdx) {\r\n if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(column)) {\r\n continue;\r\n }\r\n\r\n let columnIdx = parseInt(column, 10) | 0;\r\n var m = columns[columnIdx],\r\n node = cacheEntry.cellNodesByColumnIdx[columnIdx];\r\n\r\n if (row === activeRow && columnIdx === activeCell && currentEditor) {\r\n currentEditor.loadValue(d);\r\n } else if (d) {\r\n formatterResult = getFormatter(row, m)(row, columnIdx, getDataItemValueForColumn(d, m), m, d, self);\r\n applyFormatResultToCellNode(formatterResult, node);\r\n if (self.onAppendCell.countHandlers() > 0) {\r\n let item = getDataItem(row);\r\n let value = getDataItemValueForColumn(item, columns[columnIdx]);\r\n trigger(self.onAppendCell,\r\n {\r\n row: row, cell: columnIdx,\r\n value: value, item: item,\r\n column: columns[columnIdx], dom: node\r\n });\r\n }\r\n } else {\r\n node.innerHTML = \"\";\r\n }\r\n }\r\n\r\n invalidatePostProcessingResults(row);\r\n }\r\n\r\n function getViewportHeight() {\r\n if (options.autoHeight) {\r\n let fullHeight: number = <number>$paneHeaderL.height();\r\n fullHeight += (options.showHeaderRow) ? options.headerRowHeight + getVBoxDelta($headerRowScroller) : 0;\r\n fullHeight += (options.showFooterRow) ? options.footerRowHeight + getVBoxDelta($footerRowScroller) : 0;\r\n fullHeight += (getCanvasWidth() > viewportW) ? scrollbarDimensions.height : 0;\r\n\r\n if (options.variableRowHeight) {\r\n viewportH = rowPositionCache[getDataLengthIncludingAddNew()].bottom; // tODO Test this (also with frozen columns)\r\n } else {\r\n viewportH = options.rowHeight\r\n * getDataLengthIncludingAddNew()\r\n + ((options.frozenColumn == -1) ? <number>fullHeight : 0);\r\n }\r\n\r\n } else {\r\n topPanelH = (options.showTopPanel) ? options.topPanelHeight + getVBoxDelta($topPanelScroller) : 0;\r\n headerRowH = (options.showHeaderRow) ? options.headerRowHeight + getVBoxDelta($headerRowScroller) : 0;\r\n footerRowH = (options.showFooterRow) ? options.footerRowHeight + getVBoxDelta($footerRowScroller) : 0;\r\n let preHeaderH = (options.createPreHeaderPanel && options.showPreHeaderPanel) ? options.preHeaderPanelHeight + getVBoxDelta($preHeaderPanelScroller) : 0;\r\n\r\n viewportH = $container[0].clientHeight\r\n - $headerScroller[0].clientHeight\r\n - getVBoxDelta($headerScroller)\r\n - topPanelH\r\n - headerRowH\r\n - footerRowH\r\n - preHeaderH;\r\n }\r\n\r\n numVisibleRows = Math.ceil(viewportH / options.rowHeight); // tODO -> variable Row height\r\n return viewportH;\r\n }\r\n\r\n function getViewportWidth() {\r\n viewportW = $container.width() as number - 2; // 2 for border\r\n }\r\n\r\n function resizeCanvas() {\r\n if (!initialized) { return; }\r\n paneTopH = 0;\r\n paneBottomH = 0;\r\n viewportTopH = 0;\r\n viewportBottomH = 0;\r\n\r\n getViewportWidth();\r\n getViewportHeight();\r\n\r\n // account for Frozen Rows\r\n if (hasFrozenRows) {\r\n if (options.frozenBottom) {\r\n paneTopH = viewportH - frozenRowsHeight - scrollbarDimensions.height;\r\n paneBottomH = frozenRowsHeight + scrollbarDimensions.height;\r\n } else {\r\n paneTopH = frozenRowsHeight;\r\n paneBottomH = viewportH - frozenRowsHeight;\r\n }\r\n } else {\r\n paneTopH = viewportH;\r\n }\r\n\r\n // the top pane includes the top panel and the header row\r\n paneTopH += topPanelH + headerRowH + footerRowH;\r\n\r\n if (hasFrozenColumns() && options.autoHeight) {\r\n paneTopH += scrollbarDimensions.height;\r\n }\r\n\r\n // the top viewport does not contain the top panel or header row\r\n viewportTopH = paneTopH - topPanelH - headerRowH - footerRowH;\r\n\r\n if (options.autoHeight) {\r\n if (hasFrozenColumns()) {\r\n $container.height(\r\n paneTopH + $headerScrollerL[0].offsetHeight\r\n );\r\n }\r\n\r\n $paneTopL.css(\"position\", \"relative\");\r\n }\r\n\r\n $paneTopL.css(\"top\", $paneHeaderL.height()).css(\"height\", paneTopH);\r\n var paneBottomTop = $paneTopL[0].offsetTop + paneTopH;\r\n\r\n if (!options.autoHeight) {\r\n $viewportTopL.height(viewportTopH);\r\n }\r\n\r\n if (hasFrozenColumns()) {\r\n $paneTopR.css(\"top\", $paneHeaderL.height()).css(\"height\", paneTopH);\r\n\r\n $viewportTopR.height(viewportTopH);\r\n\r\n if (hasFrozenRows) {\r\n $paneBottomL.css(\"top\", paneBottomTop).css(\"height\", paneBottomH);\r\n\r\n $paneBottomR.css(\"top\", paneBottomTop).css(\"height\", paneBottomH);\r\n\r\n $viewportBottomR.height(paneBottomH);\r\n }\r\n } else {\r\n if (hasFrozenRows) {\r\n $paneBottomL.css(\"width\", \"100%\").css(\"height\", paneBottomH);\r\n\r\n $paneBottomL.css(\"top\", paneBottomTop);\r\n }\r\n }\r\n\r\n if (hasFrozenRows) {\r\n $viewportBottomL.height(paneBottomH);\r\n\r\n if (options.frozenBottom) {\r\n $canvasBottomL.height(frozenRowsHeight);\r\n\r\n if (hasFrozenColumns()) {\r\n $canvasBottomR.height(frozenRowsHeight);\r\n }\r\n } else {\r\n $canvasTopL.height(frozenRowsHeight);\r\n\r\n if (hasFrozenColumns()) {\r\n $canvasTopR.height(frozenRowsHeight);\r\n }\r\n }\r\n } else {\r\n $viewportTopR.height(viewportTopH);\r\n }\r\n\r\n if (!scrollbarDimensions || !scrollbarDimensions.width) {\r\n scrollbarDimensions = measureScrollbar();\r\n }\r\n\r\n if (options.forceFitColumns) {\r\n autosizeColumns();\r\n }\r\n\r\n updateRowCount();\r\n handleScroll();\r\n\r\n\r\n // since the width has changed, force the render() to reevaluate virtually rendered cells.\r\n lastRenderedScrollLeft = -1;\r\n render();\r\n }\r\n\r\n function updatePagingStatusFromView(pagingInfo) {\r\n pagingActive = (pagingInfo.pageSize !== 0);\r\n pagingIsLastPage = (pagingInfo.pageNum == pagingInfo.totalPages - 1);\r\n }\r\n\r\n function updateRowCount() {\r\n if (!initialized) { return; }\r\n cacheRowPositions();\r\n\r\n var dataLength = getDataLength();\r\n var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n var numberOfRows = 0;\r\n var oldH = (hasFrozenRows && !options.frozenBottom) ? parseInt($canvasBottomL[0].style.height) : parseInt($canvasTopL[0].style.height);\r\n if (hasFrozenRows) {\r\n numberOfRows = getDataLength() - options.frozenRow;\r\n } else {\r\n numberOfRows = dataLengthIncludingAddNew + (options.leaveSpaceForNewRows ? numVisibleRows - 1 : 0);\r\n }\r\n\r\n var tempViewportH = <number>$viewportScrollContainerY.height();\r\n var oldViewportHasVScroll = viewportHasVScroll;\r\n // with autoHeight, we do not need to accommodate the vertical scroll bar\r\n viewportHasVScroll = options.alwaysShowVerticalScroll || !options.autoHeight &&\r\n (options.variableRowHeight ?\r\n (rowPositionCache[numberOfRows - 1] && (rowPositionCache[numberOfRows - 1].bottom > viewportH)) :\r\n (numberOfRows * options.rowHeight > tempViewportH));\r\n makeActiveCellNormal();\r\n\r\n // remove the rows that are now outside of the data range\r\n // this helps avoid redundant calls to .removeRow() when the size of the data decreased by thousands of rows\r\n var r1 = dataLength - 1;\r\n for (var i in rowsCache) {\r\n if (parseInt(i, 10) > r1) {\r\n removeRowFromCache(i);\r\n }\r\n }\r\n if (options.enableAsyncPostRenderCleanup) { startPostProcessingCleanup(); }\r\n\r\n if (activeCellNode && activeRow > r1) {\r\n resetActiveCell();\r\n }\r\n\r\n oldH = h;\r\n\r\n var rowH = options.variableRowHeight ? (options.enableAddRow\r\n ? rowPositionCache[getDataLength()].bottom\r\n : rowPositionCache[getDataLength()].top) : options.rowHeight * numberOfRows;\r\n\r\n if (options.autoHeight) {\r\n h = rowH;\r\n } else {\r\n th = Math.max(rowH, tempViewportH - scrollbarDimensions.height);\r\n if (th < maxSupportedCssHeight) {\r\n // just one page\r\n h = ph = th;\r\n n = 1;\r\n cj = 0;\r\n } else {\r\n // break into pages\r\n h = maxSupportedCssHeight;\r\n ph = h / 100;\r\n n = Math.floor(th / ph);\r\n cj = (th - h) / (n - 1);\r\n }\r\n }\r\n\r\n if (h !== oldH) {\r\n if (hasFrozenRows && !options.frozenBottom) {\r\n $canvasBottomL.css(\"height\", h);\r\n\r\n if (hasFrozenColumns()) {\r\n $canvasBottomR.css(\"height\", h);\r\n }\r\n } else {\r\n $canvasTopL.css(\"height\", h);\r\n $canvasTopR.css(\"height\", h);\r\n }\r\n\r\n scrollTop = $viewportScrollContainerY[0].scrollTop;\r\n }\r\n\r\n var oldScrollTopInRange = (scrollTop + offset <= th - tempViewportH);\r\n\r\n if (th == 0 || scrollTop == 0) {\r\n page = offset = 0;\r\n } else if (oldScrollTopInRange) {\r\n // maintain virtual position\r\n scrollTo(scrollTop + offset);\r\n } else {\r\n // scroll to bottom\r\n scrollTo(th - tempViewportH);\r\n }\r\n\r\n if (h != oldH && options.autoHeight) {\r\n resizeCanvas();\r\n }\r\n\r\n if (options.forceFitColumns && oldViewportHasVScroll != viewportHasVScroll) {\r\n autosizeColumns();\r\n }\r\n updateCanvasWidth(false);\r\n }\r\n\r\n function getVisibleRange(viewportTop?: number, viewportLeft?: number) {\r\n if (viewportTop == null) {\r\n viewportTop = scrollTop;\r\n }\r\n if (viewportLeft == null) {\r\n viewportLeft = scrollLeft;\r\n }\r\n\r\n return {\r\n top: getRowFromPosition(viewportTop),\r\n bottom: getRowFromPosition(viewportTop + viewportH) + 1,\r\n leftPx: viewportLeft,\r\n rightPx: viewportLeft + viewportW\r\n };\r\n }\r\n\r\n function getRenderedRangeFromVisibleRange(range) {\r\n var buffer = Math.round(viewportH / options.rowHeight); // TODO -> probably not correct for variableRowHeight\r\n var minBuffer = options.minRowBuffer;\r\n\r\n if (vScrollDir === -1) {\r\n range.top -= buffer;\r\n range.bottom += minBuffer;\r\n } else if (vScrollDir === 1) {\r\n range.top -= minBuffer;\r\n range.bottom += buffer;\r\n } else {\r\n range.top -= minBuffer;\r\n range.bottom += minBuffer;\r\n }\r\n\r\n range.top = Math.max(0, range.top);\r\n range.bottom = Math.min(getDataLengthIncludingAddNew() - 1, range.bottom);\r\n\r\n range.leftPx -= viewportW;\r\n range.rightPx += viewportW;\r\n\r\n range.leftPx = Math.max(0, range.leftPx);\r\n range.rightPx = Math.min(canvasWidth, range.rightPx);\r\n\r\n return range;\r\n }\r\n\r\n function getRenderedRange(viewportTop?: number, viewportLeft?: number) {\r\n var range = getVisibleRange(viewportTop, viewportLeft);\r\n return getRenderedRangeFromVisibleRange(range);\r\n }\r\n\r\n function ensureCellNodesInRowsCache(row) {\r\n var cacheEntry = rowsCache[row];\r\n if (cacheEntry) {\r\n if (cacheEntry.cellRenderQueue.length) {\r\n var lastNode = <HTMLElement>cacheEntry.rowNode[cacheEntry.rowNode.length - 1].lastElementChild;// cacheEntry.rowNode.children().last();\r\n while (lastNode && cacheEntry.cellRenderQueue.length) {\r\n var columnIdx = cacheEntry.cellRenderQueue.pop();\r\n cacheEntry.cellNodesByColumnIdx[columnIdx] = lastNode;\r\n lastNode = <HTMLElement>lastNode.previousElementSibling;\r\n // hack to retrieve the frozen columns because\r\n if (!lastNode) {\r\n lastNode = <HTMLElement>cacheEntry.rowNode[0].lastElementChild;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n function cleanUpCells(range, row) {\r\n // ignore frozen rows\r\n if (hasFrozenRows\r\n && ((options.frozenBottom && row > actualFrozenRow) // frozen bottom rows\r\n || (row <= actualFrozenRow) // frozen top rows\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n var totalCellsRemoved = 0;\r\n var cacheEntry = rowsCache[row];\r\n\r\n // remove cells outside the range.\r\n var cellsToRemove = [];\r\n for (var idx in cacheEntry.cellNodesByColumnIdx) {\r\n // i really hate it when people mess with Array.prototype.\r\n if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(idx)) {\r\n continue;\r\n }\r\n\r\n // this is a string, so it needs to be cast back to a number.\r\n let i = parseInt(idx, 10) | 0;\r\n\r\n // ignore frozen columns\r\n if (i <= options.frozenColumn) {\r\n continue;\r\n }\r\n\r\n // ignore alwaysRenderedColumns\r\n if (Array.isArray(columns) && columns[i] && columns[i].alwaysRenderColumn) {\r\n continue;\r\n }\r\n\r\n var colspan = cacheEntry.cellColSpans[i];\r\n if (columnPosLeft[i] > range.rightPx ||\r\n columnPosRight[Math.min(columns.length - 1, i + colspan - 1)] < range.leftPx) {\r\n if (!(row == activeRow && i == activeCell)) {\r\n cellsToRemove.push(i);\r\n }\r\n }\r\n }\r\n\r\n var cellToRemove;\r\n while ((cellToRemove = cellsToRemove.pop()) != null) {\r\n cacheEntry.cellNodesByColumnIdx[cellToRemove].parentElement.removeChild(cacheEntry.cellNodesByColumnIdx[cellToRemove]);\r\n\r\n delete cacheEntry.cellColSpans[cellToRemove];\r\n delete cacheEntry.cellNodesByColumnIdx[cellToRemove];\r\n if (postProcessedRows[row]) {\r\n delete postProcessedRows[row][cellToRemove];\r\n }\r\n totalCellsRemoved++;\r\n }\r\n }\r\n\r\n function cleanUpAndRenderCells(range) {\r\n\r\n var cacheEntry: ICacheEntry;\r\n var stringArray = \"\";\r\n var processedRows = [];\r\n var cellsAdded;\r\n var totalCellsAdded = 0;\r\n var colspan;\r\n\r\n for (var row = range.top, btm = range.bottom; row <= btm; row++) {\r\n cacheEntry = rowsCache[row];\r\n if (!cacheEntry) {\r\n continue;\r\n }\r\n\r\n // cellRenderQueue populated in renderRows() needs to be cleared first\r\n ensureCellNodesInRowsCache(row);\r\n\r\n cleanUpCells(range, row);\r\n\r\n // render missing cells.\r\n cellsAdded = 0;\r\n\r\n var metadata = data.getItemMetadata && data.getItemMetadata(row);\r\n metadata = metadata && metadata.columns;\r\n\r\n var d = getDataItem(row);\r\n\r\n for (var i = 0, ii = columns.length; i < ii; i++) {\r\n // cells to the right are outside the range.\r\n if (columnPosLeft[i] > range.rightPx) {\r\n break;\r\n }\r\n\r\n // already rendered.\r\n if ((colspan = cacheEntry.cellColSpans[i]) != null) {\r\n i += (colspan > 1 ? colspan - 1 : 0);\r\n continue;\r\n }\r\n\r\n colspan = 1;\r\n if (metadata) {\r\n var columnData = metadata[columns[i].id] || metadata[i];\r\n colspan = (columnData && columnData.colspan) || 1;\r\n if (colspan === \"*\") {\r\n colspan = ii - i;\r\n }\r\n }\r\n\r\n if (columnPosRight[Math.min(ii - 1, i + colspan - 1)] > range.leftPx) {\r\n stringArray += appendCellHtml(row, i, colspan, d);\r\n cellsAdded++;\r\n }\r\n\r\n i += (colspan > 1 ? colspan - 1 : 0);\r\n }\r\n\r\n if (cellsAdded) {\r\n totalCellsAdded += cellsAdded;\r\n processedRows.push(row);\r\n }\r\n }\r\n\r\n if (!stringArray.length) {\r\n return;\r\n }\r\n\r\n var x = document.createElement(\"div\");\r\n x.innerHTML = stringArray;\r\n // tODO TODOFIX -> call var addlCssClasses = trigger(self.onAppendCell, { row: row, cell: cell, value: value, dataContext: item, column: m }) || '';\r\n\r\n var processedRow;\r\n while ((processedRow = processedRows.pop()) != null) {\r\n cacheEntry = rowsCache[processedRow];\r\n var columnIdx;\r\n while ((columnIdx = cacheEntry.cellRenderQueue.pop()) != null) {\r\n var node = <HTMLElement>x.lastElementChild;\r\n\r\n if (hasFrozenColumns() && (columnIdx > options.frozenColumn)) {\r\n cacheEntry.rowNode[1].appendChild(node);\r\n } else {\r\n cacheEntry.rowNode[0].appendChild(node);\r\n }\r\n\r\n if (self.onAppendCell.countHandlers() > 0) {\r\n let item = getDataItem(processedRow);\r\n let value = getDataItemValueForColumn(item, columns[columnIdx]);\r\n trigger(self.onAppendCell,\r\n {\r\n row: processedRow, cell: columnIdx,\r\n value: value, item: item,\r\n column: columns[columnIdx], dom: node\r\n });\r\n }\r\n\r\n cacheEntry.cellNodesByColumnIdx[columnIdx] = node;\r\n }\r\n }\r\n }\r\n\r\n function renderRows(range) {\r\n var html = { L: \"\", R: \"\" },\r\n rows = [],\r\n needToReselectCell = false,\r\n dataLength = getDataLength();\r\n\r\n for (let i = range.top, ii = range.bottom; i <= ii; i++) {\r\n if (rowsCache[i] || (hasFrozenRows && options.frozenBottom && i == getDataLength())) {\r\n continue;\r\n }\r\n renderedRows++;\r\n rows.push(i);\r\n\r\n // create an entry right away so that appendRowHtml() can\r\n // start populatating it.\r\n rowsCache[i] = {\r\n rowNode: null,\r\n\r\n // colSpans of rendered cells (by column idx).\r\n // can also be used for checking whether a cell has been rendered.\r\n cellColSpans: [],\r\n\r\n // cell nodes (by column idx). Lazy-populated by ensureCellNodesInRowsCache().\r\n cellNodesByColumnIdx: [],\r\n\r\n // column indices of cell nodes that have been rendered, but not yet indexed in\r\n // cellNodesByColumnIdx. These are in the same order as cell nodes added at the\r\n // end of the row.\r\n cellRenderQueue: []\r\n };\r\n\r\n appendRowHtml(html, i, range, dataLength);\r\n if (activeCellNode && activeRow === i) {\r\n needToReselectCell = true;\r\n }\r\n }\r\n\r\n if (!rows.length) { return; }\r\n\r\n\r\n let x;\r\n if (html.L.length > 0) {\r\n x = document.createElement(\"div\");\r\n x.innerHTML = html.L;\r\n }\r\n let xRight;\r\n if (html.R.length > 0) {\r\n xRight = document.createElement(\"div\");\r\n xRight.innerHTML = html.R;\r\n }\r\n\r\n\r\n for (let i = 0, ii = rows.length; i < ii; i++) {\r\n let xChild: HTMLDivElement;\r\n let xChildRight: HTMLDivElement;\r\n rowsCache[rows[i]].rowNode = [];\r\n if (x && x.children.length > 0) {\r\n xChild = x.children[0];\r\n rowsCache[rows[i]].rowNode.push(xChild);\r\n }\r\n if (xRight && xRight.children.length > 0) {\r\n xChildRight = xRight.children[0];\r\n rowsCache[rows[i]].rowNode.push(xChildRight);\r\n }\r\n\r\n if ((hasFrozenRows) && (rows[i] >= actualFrozenRow)) {\r\n $canvasBottomL[0].appendChild(xChild);\r\n if (hasFrozenColumns()) {\r\n $canvasBottomR[0].appendChild(xChildRight);\r\n }\r\n } else if (hasFrozenColumns()) {\r\n $canvasTopL[0].appendChild(xChild);\r\n $canvasTopR[0].appendChild(xChildRight);\r\n } else {\r\n $canvasTopL[0].appendChild(xChild);\r\n }\r\n\r\n if (self.onAppendCell.countHandlers() > 0) {\r\n const nodes: HTMLDivElement[] = [];\r\n for (let idx = 0; idx < xChild.childNodes.length; idx++) {\r\n nodes.push(xChild.childNodes[idx] as HTMLDivElement);\r\n }\r\n if (xChildRight) {\r\n for (let idx = 0; idx < xChildRight.childNodes.length; idx++) {\r\n nodes.push(xChildRight.childNodes[idx] as HTMLDivElement);\r\n }\r\n }\r\n for (let cIdx = 0; cIdx < nodes.length; cIdx++) {\r\n let item = getDataItem(rows[i]);\r\n let value = getDataItemValueForColumn(item, columns[cIdx]);\r\n trigger(self.onAppendCell,\r\n {\r\n row: rows[i], cell: cIdx,\r\n value: value, item: item,\r\n column: columns[cIdx], dom: nodes[cIdx]\r\n });\r\n }\r\n }\r\n\r\n }\r\n\r\n if (needToReselectCell) {\r\n activeCellNode = getCellNode(activeRow, activeCell);\r\n }\r\n }\r\n\r\n\r\n function startPostProcessing() {\r\n if (!options.enableAsyncPostRender) {\r\n return;\r\n }\r\n clearTimeout(h_postrender);\r\n h_postrender = setTimeout(asyncPostProcessRows, options.asyncPostRenderDelay);\r\n }\r\n\r\n function startPostProcessingCleanup() {\r\n if (!options.enableAsyncPostRenderCleanup) {\r\n return;\r\n }\r\n clearTimeout(h_postrenderCleanup);\r\n h_postrenderCleanup = setTimeout(asyncPostProcessCleanupRows, options.asyncPostRenderCleanupDelay);\r\n }\r\n\r\n function invalidatePostProcessingResults(row) {\r\n // change status of columns to be re-rendered\r\n for (var columnIdx in postProcessedRows[row]) {\r\n if (postProcessedRows[row].hasOwnProperty(columnIdx)) {\r\n postProcessedRows[row][columnIdx] = \"C\";\r\n }\r\n }\r\n postProcessFromRow = Math.min(postProcessFromRow, row);\r\n postProcessToRow = Math.max(postProcessToRow, row);\r\n startPostProcessing();\r\n }\r\n\r\n function updateRowPositions() {\r\n for (var row in rowsCache) {\r\n rowsCache[row].rowNode.forEach(x => x.style.top = getRowTop(row) + \"px\");\r\n }\r\n }\r\n\r\n function render() {\r\n if (!initialized) { return; }\r\n\r\n scrollThrottle.dequeue();\r\n\r\n var visible = getVisibleRange();\r\n var rendered = getRenderedRangeFromVisibleRange(visible);// getRenderedRange();\r\n\r\n // remove rows no longer in the viewport\r\n cleanupRows(rendered);\r\n\r\n // add new rows & missing cells in existing rows\r\n if (lastRenderedScrollLeft != scrollLeft) {\r\n\r\n if (hasFrozenRows) {\r\n\r\n var renderedFrozenRows = $.deepExtend({}, rendered);\r\n\r\n if (options.frozenBottom) {\r\n\r\n renderedFrozenRows.top = actualFrozenRow;\r\n renderedFrozenRows.bottom = getDataLength();\r\n } else {\r\n\r\n renderedFrozenRows.top = 0;\r\n renderedFrozenRows.bottom = options.frozenRow;\r\n }\r\n\r\n cleanUpAndRenderCells(renderedFrozenRows);\r\n }\r\n\r\n cleanUpAndRenderCells(rendered);\r\n }\r\n\r\n // render missing rows\r\n renderRows(rendered);\r\n\r\n // render frozen rows\r\n if (hasFrozenRows) {\r\n if (options.frozenBottom) {\r\n renderRows({\r\n top: actualFrozenRow, bottom: getDataLength() - 1, leftPx: rendered.leftPx, rightPx: rendered.rightPx\r\n });\r\n } else {\r\n renderRows({\r\n top: 0, bottom: options.frozenRow - 1, leftPx: rendered.leftPx, rightPx: rendered.rightPx\r\n });\r\n }\r\n }\r\n\r\n postProcessFromRow = visible.top;\r\n postProcessToRow = Math.min(getDataLengthIncludingAddNew() - 1, visible.bottom);\r\n startPostProcessing();\r\n\r\n lastRenderedScrollTop = scrollTop;\r\n lastRenderedScrollLeft = scrollLeft;\r\n h_render = null;\r\n trigger(self.onRendered, { startRow: visible.top, endRow: visible.bottom, grid: self });\r\n }\r\n\r\n function preventScroll(e) {\r\n e.preventDefault();\r\n }\r\n\r\n // function handleHeaderScroll() {\r\n // handleElementScroll($headerScrollContainer[0]);\r\n // }\r\n\r\n //function handleHeaderRowScroll() {\r\n // if (programmaticScrollingTimeout) {\r\n // return;\r\n // }\r\n // var scrollLeft = $headerRowScrollContainer[0].scrollLeft;\r\n // if (scrollLeft != $viewportScrollContainerX[0].scrollLeft) {\r\n // $viewportScrollContainerX[0].scrollLeft = scrollLeft;\r\n // }\r\n // }\r\n\r\n // function handleFooterRowScroll(e) {\r\n // if (programmaticScrollingTimeout) {\r\n // return;\r\n // }\r\n // var scrollLeft = $footerRowScrollContainer[0].scrollLeft;\r\n // if (scrollLeft != $viewportScrollContainerX[0].scrollLeft) {\r\n // $viewportScrollContainerX[0].scrollLeft = scrollLeft;\r\n // }\r\n //}\r\n\r\n // function handlePreHeaderPanelScroll() {\r\n // handleElementScroll($preHeaderPanelScroller[0]);\r\n // }\r\n\r\n //function handleElementScroll(element) {\r\n // if (programmaticScrollingTimeout) {\r\n // return;\r\n // }\r\n // var scrollLeft = element.scrollLeft;\r\n // if (scrollLeft != $viewportScrollContainerX[0].scrollLeft) {\r\n // $viewportScrollContainerX[0].scrollLeft = scrollLeft;\r\n // }\r\n // }\r\n\r\n function handleScroll() {\r\n scrollTop = $viewportScrollContainerY[0].scrollTop;\r\n scrollLeft = $viewportScrollContainerX[0].scrollLeft;\r\n return _handleScroll(false);\r\n }\r\n\r\n function _handleScroll(isMouseWheel) {\r\n // if (programmaticScrollingTimeout) {\r\n // clearTimeout(programmaticScrollingTimeout);\r\n // }\r\n // programmaticScrollingTimeout = setTimeout(() => {\r\n // programmaticScrollingTimeout = null;\r\n // }, 600);\r\n\r\n // ceiling the max scroll values\r\n let vScrollDist = 0;\r\n if (!options.autoHeight) {\r\n let maxScrollDistanceY = $viewportScrollContainerY[0].scrollHeight - $viewportScrollContainerY[0].clientHeight;\r\n if (scrollTop > maxScrollDistanceY) {\r\n scrollTop = maxScrollDistanceY;\r\n }\r\n vScrollDist = Math.abs(scrollTop - prevScrollTop);\r\n }\r\n\r\n let maxScrollDistanceX = $viewportScrollContainerY[0].scrollWidth - $viewportScrollContainerY[0].clientWidth;\r\n if (scrollLeft > maxScrollDistanceX) {\r\n scrollLeft = maxScrollDistanceX;\r\n }\r\n let hScrollDist = Math.abs(scrollLeft - prevScrollLeft);\r\n\r\n\r\n if (hScrollDist) {\r\n prevScrollLeft = scrollLeft;\r\n\r\n $viewportScrollContainerX[0].scrollLeft = scrollLeft;\r\n $headerScrollContainer[0].scrollLeft = scrollLeft;\r\n $topPanelScroller[0].scrollLeft = scrollLeft;\r\n $headerRowScrollContainer[0].scrollLeft = scrollLeft;\r\n if (options.createFooterRow) {\r\n $footerRowScrollContainer[0].scrollLeft = scrollLeft;\r\n }\r\n if (options.createPreHeaderPanel) {\r\n if (hasFrozenColumns()) {\r\n $preHeaderPanelScrollerR[0].scrollLeft = scrollLeft;\r\n } else {\r\n $preHeaderPanelScroller[0].scrollLeft = scrollLeft;\r\n }\r\n }\r\n if (hasFrozenColumns()) {\r\n if (hasFrozenRows) {\r\n $viewportTopR[0].scrollLeft = scrollLeft;\r\n }\r\n } else {\r\n if (hasFrozenRows) {\r\n $viewportTopL[0].scrollLeft = scrollLeft;\r\n }\r\n }\r\n }\r\n\r\n if (vScrollDist) {\r\n vScrollDir = prevScrollTop < scrollTop ? 1 : -1;\r\n prevScrollTop = scrollTop;\r\n\r\n if (isMouseWheel) {\r\n $viewportScrollContainerY[0].scrollTop = scrollTop;\r\n }\r\n\r\n if (hasFrozenColumns()) {\r\n if (hasFrozenRows && !options.frozenBottom) {\r\n $viewportBottomL[0].scrollTop = scrollTop;\r\n } else {\r\n $viewportTopL[0].scrollTop = scrollTop;\r\n }\r\n }\r\n\r\n // switch virtual pages if needed\r\n if (vScrollDist < viewportH) {\r\n scrollTo(scrollTop + offset);\r\n } else {\r\n var oldOffset = offset;\r\n if (h == viewportH) {\r\n page = 0;\r\n } else {\r\n page = Math.min(n - 1, Math.floor(scrollTop * ((th - viewportH) / (h - viewportH)) * (1 / ph)));\r\n }\r\n offset = Math.round(page * cj);\r\n if (oldOffset != offset) {\r\n invalidateAllRows();\r\n }\r\n\r\n }\r\n }\r\n\r\n if (hScrollDist || vScrollDist) {\r\n var dx = Math.abs(lastRenderedScrollLeft - scrollLeft);\r\n var dy = Math.abs(lastRenderedScrollTop - scrollTop);\r\n if (dx > 20 || dy > 20) {\r\n // if rendering is forced or scrolling is small enough to be \"easy\", just render\r\n if (options.forceSyncScrolling || (dy < viewportH && dx < viewportW)) {\r\n render();\r\n } else {\r\n // otherwise, perform \"difficult\" renders at a capped frequency\r\n scrollThrottle.enqueue();\r\n }\r\n\r\n trigger(self.onViewportChanged, {});\r\n }\r\n }\r\n\r\n trigger(self.onScroll, { scrollLeft: scrollLeft, scrollTop: scrollTop });\r\n\r\n if (hScrollDist || vScrollDist) { return true; }\r\n return false;\r\n }\r\n\r\n /*\r\n limits the frequency at which the provided action is executed.\r\n call enqueue to execute the action - it will execute either immediately or, if it was executed less than minPeriod_ms in the past, as soon as minPeriod_ms has expired.\r\n call dequeue to cancel any pending action.\r\n */\r\n function ActionThrottle(action, minPeriod_ms) {\r\n\r\n var blocked = false;\r\n var queued = false;\r\n\r\n function enqueue() {\r\n if (!blocked) {\r\n blockAndExecute();\r\n } else {\r\n queued = true;\r\n }\r\n }\r\n\r\n function dequeue() {\r\n queued = false;\r\n }\r\n\r\n function blockAndExecute() {\r\n blocked = true;\r\n setTimeout(unblock, minPeriod_ms);\r\n action();\r\n }\r\n\r\n function unblock() {\r\n if (queued) {\r\n dequeue();\r\n blockAndExecute();\r\n } else {\r\n blocked = false;\r\n }\r\n }\r\n\r\n return {\r\n enqueue: enqueue,\r\n dequeue: dequeue\r\n };\r\n }\r\n\r\n function asyncPostProcessRows() {\r\n var dataLength = getDataLength();\r\n while (postProcessFromRow <= postProcessToRow) {\r\n var row = (vScrollDir >= 0) ? postProcessFromRow++ : postProcessToRow--;\r\n var cacheEntry = rowsCache[row];\r\n if (!cacheEntry || row >= dataLength) {\r\n continue;\r\n }\r\n\r\n if (!postProcessedRows[row]) {\r\n postProcessedRows[row] = {};\r\n }\r\n\r\n ensureCellNodesInRowsCache(row);\r\n for (var column in cacheEntry.cellNodesByColumnIdx) {\r\n if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(column)) {\r\n continue;\r\n }\r\n\r\n let columnIdx = parseInt(column, 10) | 0;\r\n\r\n var m = columns[columnIdx];\r\n var processedStatus = postProcessedRows[row][columnIdx]; // c=cleanup and re-render, R=rendered\r\n if (m.asyncPostRender && processedStatus !== \"R\") {\r\n var node = cacheEntry.cellNodesByColumnIdx[columnIdx];\r\n if (node) {\r\n m.asyncPostRender(node, row, getDataItem(row), m, (processedStatus === \"C\"));\r\n }\r\n postProcessedRows[row][columnIdx] = \"R\";\r\n }\r\n }\r\n\r\n h_postrender = setTimeout(asyncPostProcessRows, options.asyncPostRenderDelay);\r\n return;\r\n }\r\n }\r\n\r\n function asyncPostProcessCleanupRows() {\r\n if (postProcessedCleanupQueue.length > 0) {\r\n var groupId = postProcessedCleanupQueue[0].groupId;\r\n\r\n // loop through all queue members with this groupID\r\n while (postProcessedCleanupQueue.length > 0 && postProcessedCleanupQueue[0].groupId == groupId) {\r\n var entry = postProcessedCleanupQueue.shift();\r\n if (entry.actionType == \"R\") {\r\n $(entry.node).remove();\r\n }\r\n if (entry.actionType == \"C\") {\r\n var column = columns[entry.columnIdx];\r\n if (column.asyncPostRenderCleanup && entry.node) {\r\n // cleanup must also remove element\r\n column.asyncPostRenderCleanup(entry.node, entry.rowIdx, column);\r\n }\r\n }\r\n }\r\n\r\n // call this function again after the specified delay\r\n h_postrenderCleanup = setTimeout(asyncPostProcessCleanupRows, options.asyncPostRenderCleanupDelay);\r\n }\r\n }\r\n\r\n function updateCellCssStylesOnRenderedRows(addedHash, removedHash) {\r\n var node, columnId, addedRowHash, removedRowHash;\r\n for (var row in rowsCache) {\r\n removedRowHash = removedHash && removedHash[row];\r\n addedRowHash = addedHash && addedHash[row];\r\n\r\n if (removedRowHash) {\r\n for (columnId in removedRowHash) {\r\n if (!addedRowHash || removedRowHash[columnId] != addedRowHash[columnId]) {\r\n node = getCellNode(row, getColumnIndex(columnId));\r\n if (node) {\r\n $(node).removeClass(removedRowHash[columnId]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (addedRowHash) {\r\n for (columnId in addedRowHash) {\r\n if (!removedRowHash || removedRowHash[columnId] != addedRowHash[columnId]) {\r\n node = getCellNode(row, getColumnIndex(columnId));\r\n if (node) {\r\n $(node).addClass(addedRowHash[columnId]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n function addCellCssStyles(key, hash) {\r\n if (cellCssClasses[key]) {\r\n throw new Error(\"addCellCssStyles: cell CSS hash with key '\" + key + \"' already exists.\");\r\n }\r\n\r\n cellCssClasses[key] = hash;\r\n updateCellCssStylesOnRenderedRows(hash, null);\r\n\r\n trigger(self.onCellCssStylesChanged, { \"key\": key, \"hash\": hash, \"grid\": self });\r\n }\r\n\r\n function removeCellCssStyles(key) {\r\n if (!cellCssClasses[key]) {\r\n return;\r\n }\r\n\r\n updateCellCssStylesOnRenderedRows(null, cellCssClasses[key]);\r\n delete cellCssClasses[key];\r\n\r\n trigger(self.onCellCssStylesChanged, { \"key\": key, \"hash\": null, \"grid\": self });\r\n }\r\n\r\n function setCellCssStyles(key, hash) {\r\n var prevHash = cellCssClasses[key];\r\n\r\n cellCssClasses[key] = hash;\r\n updateCellCssStylesOnRenderedRows(hash, prevHash);\r\n\r\n trigger(self.onCellCssStylesChanged, { \"key\": key, \"hash\": hash, \"grid\": self });\r\n }\r\n\r\n function getCellCssStyles(key) {\r\n return cellCssClasses[key];\r\n }\r\n\r\n function flashCell(row, cell, speed, times) {\r\n speed = speed || 100;\r\n if (rowsCache[row]) {\r\n let $cell = $(getCellNode(row, cell));\r\n\r\n let toggleCellClass = (remaining) => {\r\n if (!remaining) { return; }\r\n $cell.toggleClass(options.cellFlashingCssClass);\r\n setTimeout(() => {\r\n toggleCellClass(remaining - 1);\r\n }, speed);\r\n };\r\n toggleCellClass((times || 4) * 2);\r\n }\r\n\r\n }\r\n\r\n\r\n function handleDragInit(e, dd) {\r\n var cell = getCellFromEvent(e);\r\n if (!cell || !cellExists(cell.row, cell.cell)) {\r\n return false;\r\n }\r\n\r\n var retval = trigger(self.onDragInit, dd, e);\r\n if (e.isImmediatePropagationStopped()) {\r\n return retval;\r\n }\r\n\r\n // if nobody claims to be handling drag'n'drop by stopping immediate propagation,\r\n // cancel out of it\r\n return false;\r\n }\r\n\r\n function handleDragStart(e, dd) {\r\n var cell = getCellFromEvent(e);\r\n if (!cell || !cellExists(cell.row, cell.cell)) {\r\n return false;\r\n }\r\n\r\n var retval = trigger(self.onDragStart, dd, e);\r\n if (e.isImmediatePropagationStopped()) {\r\n return retval;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function handleDrag(e, dd) {\r\n return trigger(self.onDrag, dd, e);\r\n }\r\n\r\n function handleDragEnd(e, dd) {\r\n trigger(self.onDragEnd, dd, e);\r\n }\r\n\r\n function handleKeyDown(e) {\r\n trigger(self.onKeyDown, { row: activeRow, cell: activeCell }, e);\r\n var handled = e.isImmediatePropagationStopped();\r\n var keyCode = Slick.keyCode;\r\n\r\n if (!handled) {\r\n if (!e.shiftKey && !e.altKey) {\r\n if (options.editable && currentEditor && currentEditor.keyCaptureList) {\r\n if (typeof currentEditor.keyCaptureList === \"function\") {\r\n if (currentEditor.keyCaptureList(e.which) === false) {\r\n return;\r\n }\r\n } else if (currentEditor.keyCaptureList.indexOf(e.which) > -1) {\r\n return;\r\n }\r\n }\r\n if (e.which == keyCode.HOME) {\r\n handled = (e.ctrlKey) ? navigateTop() : navigateRowStart();\r\n } else if (e.which == keyCode.END) {\r\n handled = (e.ctrlKey) ? navigateBottom() : navigateRowEnd();\r\n }\r\n }\r\n }\r\n if (!handled) {\r\n if (!e.shiftKey && !e.altKey && !e.ctrlKey) {\r\n // editor may specify an array of keys to bubble\r\n if (options.editable && currentEditor && currentEditor.keyCaptureList) {\r\n if (typeof currentEditor.keyCaptureList === \"function\") {\r\n if (currentEditor.keyCaptureList(e.which) === false) {\r\n return;\r\n }\r\n } else if (currentEditor.keyCaptureList.indexOf(e.which) > -1) {\r\n return;\r\n }\r\n }\r\n if (e.which == keyCode.ESCAPE) {\r\n if (!getEditorLock().isActive()) {\r\n return; // no editing mode to cancel, allow bubbling and default processing (exit without cancelling the event)\r\n }\r\n cancelEditAndSetFocus();\r\n } else if (e.which == keyCode.PAGE_DOWN) {\r\n navigatePageDown();\r\n handled = true;\r\n } else if (e.which == keyCode.PAGE_UP) {\r\n navigatePageUp();\r\n handled = true;\r\n } else if (e.which == keyCode.LEFT) {\r\n handled = navigateLeft();\r\n } else if (e.which == keyCode.RIGHT) {\r\n handled = navigateRight();\r\n } else if (e.which == keyCode.UP) {\r\n handled = navigateUp();\r\n } else if (e.which == keyCode.DOWN) {\r\n handled = navigateDown();\r\n } else if (e.which == keyCode.TAB) {\r\n handled = navigateNext();\r\n } else if (e.which == keyCode.ENTER) {\r\n if (options.editable) {\r\n if (currentEditor) {\r\n // adding new row\r\n if (activeRow === getDataLength()) {\r\n navigateDown();\r\n } else {\r\n commitEditAndNavDown();\r\n }\r\n } else {\r\n if (getEditorLock().commitCurrentEdit()) {\r\n makeActiveCellEditable(undefined, undefined, e);\r\n }\r\n }\r\n }\r\n handled = true;\r\n }\r\n } else if (e.which == keyCode.TAB && e.shiftKey && !e.ctrlKey && !e.altKey) {\r\n handled = navigatePrev();\r\n }\r\n }\r\n\r\n if (handled) {\r\n // the event has been handled so don't let parent element (bubbling/propagation) or browser (default) handle it\r\n e.stopPropagation();\r\n e.preventDefault();\r\n try {\r\n e.originalEvent.keyCode = 0; // prevent default behaviour for special keys in IE browsers (F3, F5, etc.)\r\n } catch (error) {\r\n }\r\n }\r\n }\r\n\r\n function handleClick(e) {\r\n if (!currentEditor) {\r\n // if this click resulted in some cell child node getting focus,\r\n // don't steal it back - keyboard events will still bubble up\r\n // iE9+ seems to default DIVs to tabIndex=0 instead of -1, so check for cell clicks directly.\r\n if (e.target != document.activeElement || $(e.target).hasClass(\"slick-cell\")) {\r\n setFocus();\r\n }\r\n }\r\n\r\n var cell = getCellFromEvent(e);\r\n if (!cell || (currentEditor !== null && activeRow == cell.row && activeCell == cell.cell)) {\r\n return;\r\n }\r\n\r\n trigger(self.onClick, { row: cell.row, cell: cell.cell }, e);\r\n if (e.isImmediatePropagationStopped()) {\r\n return;\r\n }\r\n\r\n // this optimisation causes trouble - MLeibman #329\r\n // if ((activeCell != cell.cell || activeRow != cell.row) && canCellBeActive(cell.row, cell.cell)) {\r\n if (canCellBeActive(cell.row, cell.cell)) {\r\n if (!getEditorLock().isActive() || getEditorLock().commitCurrentEdit()) {\r\n scrollRowIntoView(cell.row, false);\r\n\r\n var preClickModeOn = (e.target && e.target.className === Slick.preClickClassName);\r\n var column = columns[cell.cell];\r\n var suppressActiveCellChangedEvent = (options.editable && column && column.editor && options.suppressActiveCellChangeOnEdit) ? true : false;\r\n setActiveCellInternal(getCellNode(cell.row, cell.cell), null, preClickModeOn, suppressActiveCellChangedEvent, e);\r\n }\r\n }\r\n }\r\n\r\n function handleContextMenu(e) {\r\n var $cell = $(e.target).closestClass(\"slick-cell\", \"grid-canvas\");\r\n if ($cell.length === 0) {\r\n return;\r\n }\r\n\r\n // are we editing this cell?\r\n if (activeCellNode === $cell[0] && currentEditor !== null) {\r\n return;\r\n }\r\n\r\n trigger(self.onContextMenu, {}, e);\r\n }\r\n\r\n function handleDblClick(e) {\r\n var cell = getCellFromEvent(e);\r\n if (!cell || (currentEditor !== null && activeRow == cell.row && activeCell == cell.cell)) {\r\n return;\r\n }\r\n trigger(self.onDblClick, { row: cell.row, cell: cell.cell }, e);\r\n if (e.isImmediatePropagationStopped()) {\r\n return;\r\n }\r\n\r\n if (options.editable) {\r\n gotoCell(cell.row, cell.cell, true, e);\r\n }\r\n }\r\n\r\n // function handleHeaderMouseEnter(e) {\r\n // trigger(self.onHeaderMouseEnter, {\r\n // \"column\": $(this).data(\"column\"),\r\n // \"grid\": self\r\n // }, e);\r\n // }\r\n\r\n // function handleHeaderMouseLeave(e) {\r\n // trigger(self.onHeaderMouseLeave, {\r\n // \"column\": $(this).data(\"column\"),\r\n // \"grid\": self\r\n // }, e);\r\n // }\r\n\r\n function handleHeaderContextMenu(e) {\r\n var $header = $(e.target).closestClass(\"slick-header-column\", \"slick-header-columns\");\r\n var column = $header && $header.data(\"column\");\r\n trigger(self.onHeaderContextMenu, { column: column }, e);\r\n }\r\n\r\n function handleHeaderClick(e) {\r\n // if (columnResizeDragging) return;\r\n var $header = $(e.target).closestClass(\"slick-header-column\", \"slick-header-columns\");\r\n var column = $header && $header.data(\"column\");\r\n if (column) {\r\n trigger(self.onHeaderClick, { column: column }, e);\r\n }\r\n }\r\n\r\n function handleMouseEnter(e) {\r\n trigger(self.onMouseEnter, {}, e);\r\n }\r\n\r\n function handleMouseLeave(e) {\r\n trigger(self.onMouseLeave, {}, e);\r\n }\r\n\r\n function cellExists(row, cell) {\r\n return !(row < 0 || row >= getDataLength() || cell < 0 || cell >= columns.length);\r\n }\r\n\r\n function getCellFromPoint(x, y) {\r\n var row = getRowFromPosition(y);\r\n\r\n // tODO TODOFIX -> frozen rows at bottom\r\n if (hasFrozenRows && y <= getFrozenRowOffset(actualFrozenRow)) {\r\n row = getRowFromPosition(y - offset);\r\n }\r\n\r\n var cell = 0;\r\n\r\n var w = 0;\r\n for (var i = 0; i < columns.length && w < x; i++) {\r\n w += columns[i].width;\r\n cell++;\r\n }\r\n\r\n if (cell < 0) {\r\n cell = 0;\r\n }\r\n\r\n return { row: row, cell: cell - 1 };\r\n }\r\n\r\n function getCellFromNode(cellNode) {\r\n // read column number from .l<columnNumber> CSS class\r\n var cls = /l\\d+/.exec(cellNode.className);\r\n if (!cls) {\r\n throw new Error(\"getCellFromNode: cannot get cell - \" + cellNode.className);\r\n }\r\n return parseInt(cls[0].substr(1, cls[0].length - 1), 10);\r\n }\r\n\r\n function getRowFromNode(rowNode) {\r\n for (var row in rowsCache) {\r\n for (var i in rowsCache[row].rowNode) {\r\n if (rowsCache[row].rowNode[i] === rowNode) {\r\n return parseInt(row, 10) | 0;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n function getFrozenRowOffset(row) {\r\n var offset =\r\n (hasFrozenRows)\r\n ? (options.frozenBottom)\r\n ? (row >= actualFrozenRow)\r\n ? (h < viewportTopH)\r\n ? (getRowBottom(actualFrozenRow))// (options.rowHeight * (row+1) - offset)\r\n : h\r\n : 0\r\n : (row >= actualFrozenRow)\r\n ? frozenRowsHeight\r\n : 0\r\n : 0;\r\n\r\n return offset;\r\n }\r\n\r\n function getCellFromEvent(e) {\r\n var row, cell;\r\n var $cell = $(e.target).closestClass(\"slick-cell\", \"grid-canvas\");\r\n if (!$cell.length) {\r\n return null;\r\n }\r\n\r\n row = getRowFromNode($cell[0].parentNode);\r\n\r\n if (hasFrozenRows) {\r\n\r\n var c = $cell.closestClass(\"grid-canvas\").offset();\r\n\r\n var rowOffset = 0;\r\n var isBottom = $cell.closestClass(\"grid-canvas-bottom\").length;\r\n\r\n if (isBottom) {\r\n rowOffset = (options.frozenBottom) ? <number>$canvasTopL.height() : frozenRowsHeight;\r\n }\r\n\r\n row = getCellFromPoint(e.clientX - c.left, e.clientY - c.top + rowOffset /* + document.documentElement.scrollTop*/).row;\r\n }\r\n\r\n cell = getCellFromNode($cell[0]);\r\n\r\n if (row == null || cell == null) {\r\n return null;\r\n } else {\r\n return {\r\n \"row\": row,\r\n \"cell\": cell\r\n };\r\n }\r\n }\r\n\r\n function getCellNodeBox(row, cell) {\r\n if (!cellExists(row, cell)) {\r\n return null;\r\n }\r\n\r\n var frozenRowOffset = getFrozenRowOffset(row);\r\n\r\n\r\n\r\n var y1 = getRowTop(row) - frozenRowOffset;\r\n var y2 = y1 + getRowHeight(row) - 1;\r\n var x1 = 0;\r\n for (var i = 0; i < cell; i++) {\r\n x1 += columns[i].width;\r\n\r\n if (options.frozenColumn == i) {\r\n x1 = 0;\r\n }\r\n }\r\n var x2 = x1 + columns[cell].width;\r\n\r\n return {\r\n top: y1,\r\n left: x1,\r\n bottom: y2,\r\n right: x2\r\n };\r\n }\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////\r\n // cell switching\r\n\r\n function getRowHeight(row: number) {\r\n if (!options.variableRowHeight) {\r\n return options.rowHeight;\r\n }\r\n return rowPositionCache[row].height;\r\n }\r\n\r\n function resetActiveCell() {\r\n setActiveCellInternal(null, false);\r\n }\r\n\r\n function setFocus() {\r\n if (tabbingDirection == -1) {\r\n $focusSink[0].focus();\r\n } else {\r\n $focusSink2[0].focus();\r\n }\r\n }\r\n\r\n function scrollCellIntoView(row, cell, doPaging) {\r\n scrollRowIntoView(row, doPaging);\r\n\r\n if (cell <= options.frozenColumn) {\r\n return;\r\n }\r\n\r\n var colspan = getColspan(row, cell);\r\n internalScrollColumnIntoView(columnPosLeft[cell], columnPosRight[cell + (colspan > 1 ? colspan - 1 : 0)]);\r\n }\r\n\r\n function internalScrollColumnIntoView(left, right) {\r\n var scrollRight = scrollLeft + <number>$viewportScrollContainerX.width();\r\n\r\n if (left < scrollLeft) {\r\n $.each($viewportScrollContainerX, function (idx, el) { el.scrollLeft = left; });\r\n handleScroll();\r\n render();\r\n } else if (right > scrollRight) {\r\n $.each($viewportScrollContainerX, function (idx, el) { el.scrollLeft = Math.min(left, right - $viewportScrollContainerX[0].clientWidth); });\r\n handleScroll();\r\n render();\r\n }\r\n }\r\n\r\n function scrollColumnIntoView(cell) {\r\n internalScrollColumnIntoView(columnPosLeft[cell], columnPosRight[cell]);\r\n }\r\n\r\n function setActiveCellInternal(newCell, opt_editMode?, preClickModeOn?, suppressActiveCellChangedEvent?, e?) {\r\n if (activeCellNode !== null) {\r\n makeActiveCellNormal();\r\n $(activeCellNode).removeClass(\"active\");\r\n if (rowsCache[activeRow]) {\r\n rowsCache[activeRow].rowNode.forEach(x => x.classList.remove(\"active\")); // $(rowsCache[activeRow].rowNode).removeClass(\"active\");\r\n }\r\n }\r\n\r\n var activeCellChanged = (activeCellNode !== newCell);\r\n activeCellNode = newCell;\r\n\r\n if (activeCellNode != null) {\r\n var $activeCellNode = $(activeCellNode);\r\n var $activeCellOffset = $activeCellNode.offset();\r\n\r\n var rowOffset = Math.floor($activeCellNode.closestClass(\"grid-canvas\").offset().top);\r\n var isBottom = $activeCellNode.closestClass(\"grid-canvas-bottom\").length;\r\n\r\n if (hasFrozenRows && isBottom) {\r\n rowOffset -= (options.frozenBottom)\r\n ? <number>$canvasTopL.height()\r\n : frozenRowsHeight;\r\n }\r\n\r\n let cell = getCellFromPoint($activeCellOffset.left, Math.ceil($activeCellOffset.top) - rowOffset);\r\n\r\n activeRow = cell.row;\r\n activeCell = activePosX = activeCell = activePosX = getCellFromNode(activeCellNode);\r\n\r\n $activeCellNode.addClass(\"active\");\r\n if (rowsCache[activeRow]) {\r\n rowsCache[activeRow].rowNode.forEach(x => x.classList.add(\"active\"));// $(rowsCache[activeRow].rowNode).addClass('active');\r\n }\r\n\r\n if (opt_editMode == null) {\r\n opt_editMode = (activeRow == getDataLength()) || options.autoEdit;\r\n }\r\n\r\n if (options.showCellSelection) {\r\n $(activeCellNode).addClass(\"active\");\r\n rowsCache[activeRow].rowNode.forEach(x => x.classList.add(\"active\")); // $(rowsCache[activeRow].rowNode).addClass(\"active\");\r\n }\r\n\r\n if (options.editable && opt_editMode && isCellPotentiallyEditable(activeRow, activeCell)) {\r\n clearTimeout(h_editorLoader);\r\n\r\n if (options.asyncEditorLoading) {\r\n h_editorLoader = setTimeout(function () {\r\n makeActiveCellEditable(undefined, preClickModeOn, e);\r\n }, options.asyncEditorLoadDelay);\r\n } else {\r\n makeActiveCellEditable(undefined, preClickModeOn, e);\r\n }\r\n }\r\n } else {\r\n activeRow = activeCell = null;\r\n }\r\n\r\n // this optimisation causes trouble - MLeibman #329\r\n // if (activeCellChanged) {\r\n if (!suppressActiveCellChangedEvent) { trigger(self.onActiveCellChanged, getActiveCell(), e); }\r\n // }\r\n }\r\n\r\n function clearTextSelection() {\r\n if ((<any>document).selection && (<any>document).selection.empty) {\r\n try {\r\n // iE fails here if selected element is not in dom\r\n (<any>document).selection.empty();\r\n } catch (e) { }\r\n } else if (window.getSelection) {\r\n var sel = window.getSelection();\r\n if (sel && sel.removeAllRanges) {\r\n sel.removeAllRanges();\r\n }\r\n }\r\n }\r\n\r\n function isCellPotentiallyEditable(row, cell) {\r\n var dataLength = getDataLength();\r\n // is the data for this row loaded?\r\n if (row < dataLength && !getDataItem(row)) {\r\n return false;\r\n }\r\n\r\n // are we in the Add New row? can we create new from this cell?\r\n if (columns[cell].cannotTriggerInsert && row >= dataLength) {\r\n return false;\r\n }\r\n\r\n // does this cell have an editor?\r\n if (!getEditor(row, cell) || columns[cell].readonly) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function makeActiveCellNormal() {\r\n if (!currentEditor) {\r\n return;\r\n }\r\n trigger(self.onBeforeCellEditorDestroy, { editor: currentEditor });\r\n currentEditor.destroy();\r\n currentEditor = null;\r\n\r\n if (activeCellNode) {\r\n var d = getDataItem(activeRow);\r\n $(activeCellNode).removeClass(\"editable invalid\");\r\n if (d) {\r\n var column = columns[activeCell];\r\n var formatter = getFormatter(activeRow, column);\r\n var formatterResult = formatter(activeRow, activeCell, getDataItemValueForColumn(d, column), column, d, self);\r\n applyFormatResultToCellNode(formatterResult, activeCellNode);\r\n if (self.onAppendCell.countHandlers() > 0) {\r\n let item = getDataItem(activeRow);\r\n let value = getDataItemValueForColumn(item, columns[activeCell]);\r\n trigger(self.onAppendCell,\r\n {\r\n row: activeRow, cell: activeCell,\r\n value: value, item: item,\r\n column: column, dom: activeCellNode\r\n });\r\n }\r\n invalidatePostProcessingResults(activeRow);\r\n }\r\n }\r\n\r\n // if there previously was text selected on a page (such as selected text in the edit cell just removed),\r\n // iE can't set focus to anything else correctly\r\n if (navigator.userAgent.toLowerCase().match(/msie/)) {\r\n clearTextSelection();\r\n }\r\n\r\n getEditorLock().deactivate(editController);\r\n }\r\n\r\n function makeActiveCellEditable(editor, preClickModeOn, e) {\r\n if (!activeCellNode) {\r\n return;\r\n }\r\n if (!options.editable) {\r\n throw new Error(\"Grid : makeActiveCellEditable : should never get called when options.editable is false\");\r\n }\r\n\r\n // cancel pending async call if there is one\r\n clearTimeout(h_editorLoader);\r\n\r\n if (!isCellPotentiallyEditable(activeRow, activeCell)) {\r\n return;\r\n }\r\n\r\n var columnDef = columns[activeCell];\r\n var item = getDataItem(activeRow);\r\n\r\n if (trigger(self.onBeforeEditCell, { row: activeRow, cell: activeCell, item: item, column: columnDef }) === false) {\r\n setFocus();\r\n return;\r\n }\r\n\r\n getEditorLock().activate(editController);\r\n $(activeCellNode).addClass(\"editable\");\r\n\r\n var useEditor = editor || getEditor(activeRow, activeCell);\r\n\r\n // don't clear the cell if a custom editor is passed through\r\n if (!editor && !useEditor.suppressClearOnEdit) {\r\n activeCellNode.innerHTML = \"\";\r\n }\r\n\r\n var metadata = data.getItemMetadata && data.getItemMetadata(activeRow);\r\n metadata = metadata && metadata.columns;\r\n var columnMetaData = metadata && (metadata[columnDef.id] || metadata[activeCell]);\r\n\r\n currentEditor = new useEditor({\r\n grid: self,\r\n gridPosition: absBox($container[0]),\r\n position: absBox(activeCellNode),\r\n container: activeCellNode,\r\n column: columnDef,\r\n columnMetaData: columnMetaData,\r\n item: item || {},\r\n event: e,\r\n commitChanges: commitEditAndNavDown,\r\n commitChangesOnly: commitEditAndSetFocus,\r\n cancelChanges: cancelEditAndSetFocus\r\n });\r\n\r\n if (item) {\r\n currentEditor.loadValue(item);\r\n if (preClickModeOn && currentEditor.preClick) {\r\n currentEditor.preClick();\r\n }\r\n }\r\n\r\n serializedEditorValue = currentEditor.serializeValue();\r\n\r\n if (currentEditor.position) {\r\n handleActiveCellPositionChange();\r\n }\r\n }\r\n\r\n function commitEditAndNavDown() {\r\n // if the commit fails, it would do so due to a validation error\r\n // if so, do not steal the focus from the editor\r\n if (getEditorLock().commitCurrentEdit()) {\r\n setFocus();\r\n if (options.autoEdit) {\r\n navigateDown();\r\n }\r\n }\r\n }\r\n\r\n function commitEditAndSetFocus() {\r\n // if the commit fails, it would do so due to a validation error\r\n // if so, do not steal the focus from the editor\r\n if (getEditorLock().commitCurrentEdit()) {\r\n setFocus();\r\n }\r\n }\r\n\r\n function cancelEditAndSetFocus() {\r\n if (getEditorLock().cancelCurrentEdit()) {\r\n setFocus();\r\n }\r\n }\r\n\r\n function absBox(elem) {\r\n var box = {\r\n top: elem.offsetTop,\r\n left: elem.offsetLeft,\r\n bottom: 0,\r\n right: 0,\r\n width: $(elem).width(), // outerWidth(),\r\n height: $(elem).height(), // outerHeight(),\r\n visible: true\r\n };\r\n box.bottom = box.top + box.height;\r\n box.right = box.left + box.width;\r\n\r\n // walk up the tree\r\n var offsetParent = elem.offsetParent;\r\n while ((elem = elem.parentNode) != document.body) {\r\n if (elem == null) { break; }\r\n\r\n if (box.visible && elem.scrollHeight != elem.offsetHeight && $(elem).css(\"overflowY\") != \"visible\") {\r\n box.visible = box.bottom > elem.scrollTop && box.top < elem.scrollTop + elem.clientHeight;\r\n }\r\n\r\n if (box.visible && elem.scrollWidth != elem.offsetWidth && $(elem).css(\"overflowX\") != \"visible\") {\r\n box.visible = box.right > elem.scrollLeft && box.left < elem.scrollLeft + elem.clientWidth;\r\n }\r\n\r\n box.left -= elem.scrollLeft;\r\n box.top -= elem.scrollTop;\r\n\r\n if (elem === offsetParent) {\r\n box.left += elem.offsetLeft;\r\n box.top += elem.offsetTop;\r\n offsetParent = elem.offsetParent;\r\n }\r\n\r\n box.bottom = box.top + box.height;\r\n box.right = box.left + box.width;\r\n }\r\n\r\n return box;\r\n }\r\n\r\n function getActiveCellPosition() {\r\n return absBox(activeCellNode);\r\n }\r\n\r\n function getGridPosition() {\r\n return absBox($container[0]);\r\n }\r\n\r\n function handleActiveCellPositionChange() {\r\n if (!activeCellNode) {\r\n return;\r\n }\r\n\r\n trigger(self.onActiveCellPositionChanged, {});\r\n\r\n if (currentEditor) {\r\n var cellBox = getActiveCellPosition();\r\n if (currentEditor.show && currentEditor.hide) {\r\n if (!cellBox.visible) {\r\n currentEditor.hide();\r\n } else {\r\n currentEditor.show();\r\n }\r\n }\r\n\r\n if (currentEditor.position) {\r\n currentEditor.position(cellBox);\r\n }\r\n }\r\n }\r\n\r\n function getCellEditor() {\r\n return currentEditor;\r\n }\r\n\r\n function getActiveCell() {\r\n if (!activeCellNode) {\r\n return null;\r\n } else {\r\n return { row: activeRow, cell: activeCell };\r\n }\r\n }\r\n\r\n function getActiveCellNode() {\r\n return activeCellNode;\r\n }\r\n\r\n function scrollRowIntoView(row, doPaging) {\r\n if (!hasFrozenRows ||\r\n (!options.frozenBottom && row > actualFrozenRow - 1) ||\r\n (options.frozenBottom && row < actualFrozenRow - 1)) {\r\n\r\n var viewportScrollH = <number>$viewportScrollContainerY.height();\r\n\r\n // if frozen row on top\r\n // subtract number of frozen row\r\n var rowNumber = (hasFrozenRows && !options.frozenBottom ? row - options.frozenRow : row);\r\n\r\n var rowBottom = options.variableRowHeight ? rowPositionCache[row].bottom : ((rowNumber + 1) * options.rowHeight);\r\n\r\n var rowAtTop = options.variableRowHeight ? rowPositionCache[row].top : (rowNumber * options.rowHeight);\r\n var rowAtBottom = rowBottom - viewportScrollH + (viewportHasHScroll ? scrollbarDimensions.height : 0);\r\n\r\n // need to page down?\r\n if (rowBottom > scrollTop + viewportScrollH + offset) {\r\n scrollTo(doPaging ? rowAtTop : rowAtBottom);\r\n render();\r\n } else if (rowAtTop < scrollTop + offset) {\r\n scrollTo(doPaging ? rowAtBottom : rowAtTop);\r\n render();\r\n }\r\n }\r\n }\r\n\r\n function scrollRowToTop(row: number) {\r\n scrollTo(options.variableRowHeight ? rowPositionCache[row].top : (row * options.rowHeight));\r\n render();\r\n }\r\n\r\n function scrollPage(dir) {\r\n var deltaRows = dir * numVisibleRows;\r\n /// first fully visible row crosses the line with\r\n /// y == bottomOfTopmostFullyVisibleRow\r\n var bottomOfTopmostFullyVisibleRow = scrollTop + options.rowHeight - 1; // tODO\r\n scrollTo((getRowFromPosition(bottomOfTopmostFullyVisibleRow) + deltaRows) * options.rowHeight); // tODO\r\n render();\r\n\r\n if (options.enableCellNavigation && activeRow != null) {\r\n var row = activeRow + deltaRows;\r\n var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n if (row >= dataLengthIncludingAddNew) {\r\n row = dataLengthIncludingAddNew - 1;\r\n }\r\n if (row < 0) {\r\n row = 0;\r\n }\r\n\r\n var cell = 0, prevCell = null;\r\n var prevActivePosX = activePosX;\r\n while (cell <= activePosX) {\r\n if (canCellBeActive(row, cell)) {\r\n prevCell = cell;\r\n }\r\n cell += getColspan(row, cell);\r\n }\r\n\r\n if (prevCell !== null) {\r\n setActiveCellInternal(getCellNode(row, prevCell));\r\n activePosX = prevActivePosX;\r\n } else {\r\n resetActiveCell();\r\n }\r\n }\r\n }\r\n\r\n function navigatePageDown() {\r\n scrollPage(1);\r\n }\r\n\r\n function navigatePageUp() {\r\n scrollPage(-1);\r\n }\r\n\r\n function navigateTop() {\r\n navigateToRow(0);\r\n }\r\n\r\n function navigateBottom() {\r\n navigateToRow(getDataLength() - 1);\r\n }\r\n\r\n function navigateToRow(row) {\r\n var num_rows = getDataLength();\r\n if (!num_rows) { return true; }\r\n\r\n if (row < 0) { row = 0; } else if (row >= num_rows) { row = num_rows - 1; }\r\n\r\n scrollCellIntoView(row, 0, true);\r\n if (options.enableCellNavigation && activeRow != null) {\r\n var cell = 0, prevCell = null;\r\n var prevActivePosX = activePosX;\r\n while (cell <= activePosX) {\r\n if (canCellBeActive(row, cell)) {\r\n prevCell = cell;\r\n }\r\n cell += getColspan(row, cell);\r\n }\r\n\r\n if (prevCell !== null) {\r\n setActiveCellInternal(getCellNode(row, prevCell));\r\n activePosX = prevActivePosX;\r\n } else {\r\n resetActiveCell();\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n function getColspan(row, cell) {\r\n var metadata = data.getItemMetadata && data.getItemMetadata(row);\r\n if (!metadata || !metadata.columns) {\r\n return 1;\r\n }\r\n\r\n var columnData = metadata.columns[columns[cell].id] || metadata.columns[cell];\r\n var colspan = (columnData && columnData.colspan);\r\n if (colspan === \"*\") {\r\n colspan = columns.length - cell;\r\n } else {\r\n colspan = colspan || 1;\r\n }\r\n\r\n return colspan;\r\n }\r\n\r\n function findFirstFocusableCell(row) {\r\n var cell = 0;\r\n while (cell < columns.length) {\r\n if (canCellBeActive(row, cell)) {\r\n return cell;\r\n }\r\n cell += getColspan(row, cell);\r\n }\r\n return null;\r\n }\r\n\r\n function findLastFocusableCell(row) {\r\n var cell = 0;\r\n var lastFocusableCell = null;\r\n while (cell < columns.length) {\r\n if (canCellBeActive(row, cell)) {\r\n lastFocusableCell = cell;\r\n }\r\n cell += getColspan(row, cell);\r\n }\r\n return lastFocusableCell;\r\n }\r\n\r\n function gotoRight(row, cell, posX) {\r\n if (cell >= columns.length) {\r\n return null;\r\n }\r\n\r\n do {\r\n cell += getColspan(row, cell);\r\n }\r\n while (cell < columns.length && !canCellBeActive(row, cell));\r\n\r\n if (cell < columns.length) {\r\n return {\r\n \"row\": row,\r\n \"cell\": cell,\r\n \"posX\": cell\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n function gotoLeft(row, cell, posX) {\r\n if (cell <= 0) {\r\n return null;\r\n }\r\n\r\n var firstFocusableCell = findFirstFocusableCell(row);\r\n if (firstFocusableCell === null || firstFocusableCell >= cell) {\r\n return null;\r\n }\r\n\r\n var prev = {\r\n \"row\": row,\r\n \"cell\": firstFocusableCell,\r\n \"posX\": firstFocusableCell\r\n };\r\n var pos;\r\n while (true) {\r\n pos = gotoRight(prev.row, prev.cell, prev.posX);\r\n if (!pos) {\r\n return null;\r\n }\r\n if (pos.cell >= cell) {\r\n return prev;\r\n }\r\n prev = pos;\r\n }\r\n }\r\n\r\n function gotoDown(row, cell, posX) {\r\n var prevCell;\r\n var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n while (true) {\r\n if (++row >= dataLengthIncludingAddNew) {\r\n return null;\r\n }\r\n\r\n prevCell = cell = 0;\r\n while (cell <= posX) {\r\n prevCell = cell;\r\n cell += getColspan(row, cell);\r\n }\r\n\r\n if (canCellBeActive(row, prevCell)) {\r\n return {\r\n \"row\": row,\r\n \"cell\": prevCell,\r\n \"posX\": posX\r\n };\r\n }\r\n }\r\n }\r\n\r\n function gotoUp(row, cell, posX) {\r\n var prevCell;\r\n while (true) {\r\n if (--row < 0) {\r\n return null;\r\n }\r\n\r\n prevCell = cell = 0;\r\n while (cell <= posX) {\r\n prevCell = cell;\r\n cell += getColspan(row, cell);\r\n }\r\n\r\n if (canCellBeActive(row, prevCell)) {\r\n return {\r\n \"row\": row,\r\n \"cell\": prevCell,\r\n \"posX\": posX\r\n };\r\n }\r\n }\r\n }\r\n\r\n function gotoNext(row, cell, posX) {\r\n if (row == null && cell == null) {\r\n row = cell = posX = 0;\r\n if (canCellBeActive(row, cell)) {\r\n return {\r\n \"row\": row,\r\n \"cell\": cell,\r\n \"posX\": cell\r\n };\r\n }\r\n }\r\n\r\n var pos = gotoRight(row, cell, posX);\r\n if (pos) {\r\n return pos;\r\n }\r\n\r\n var firstFocusableCell = null;\r\n var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n\r\n // if at last row, cycle through columns rather than get stuck in the last one\r\n if (row === dataLengthIncludingAddNew - 1) { row--; }\r\n\r\n while (++row < dataLengthIncludingAddNew) {\r\n firstFocusableCell = findFirstFocusableCell(row);\r\n if (firstFocusableCell !== null) {\r\n return {\r\n \"row\": row,\r\n \"cell\": firstFocusableCell,\r\n \"posX\": firstFocusableCell\r\n };\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n function gotoPrev(row, cell, posX) {\r\n if (row == null && cell == null) {\r\n row = getDataLengthIncludingAddNew() - 1;\r\n cell = posX = columns.length - 1;\r\n if (canCellBeActive(row, cell)) {\r\n return {\r\n \"row\": row,\r\n \"cell\": cell,\r\n \"posX\": cell\r\n };\r\n }\r\n }\r\n\r\n var pos;\r\n var lastSelectableCell;\r\n while (!pos) {\r\n pos = gotoLeft(row, cell, posX);\r\n if (pos) {\r\n break;\r\n }\r\n if (--row < 0) {\r\n return null;\r\n }\r\n\r\n cell = 0;\r\n lastSelectableCell = findLastFocusableCell(row);\r\n if (lastSelectableCell !== null) {\r\n pos = {\r\n \"row\": row,\r\n \"cell\": lastSelectableCell,\r\n \"posX\": lastSelectableCell\r\n };\r\n }\r\n }\r\n return pos;\r\n }\r\n\r\n function gotoRowStart(row, cell, posX) {\r\n var newCell = findFirstFocusableCell(row);\r\n if (newCell === null) { return null; }\r\n\r\n return {\r\n \"row\": row,\r\n \"cell\": newCell,\r\n \"posX\": newCell\r\n };\r\n }\r\n\r\n function gotoRowEnd(row, cell, posX) {\r\n var newCell = findLastFocusableCell(row);\r\n if (newCell === null) { return null; }\r\n\r\n return {\r\n \"row\": row,\r\n \"cell\": newCell,\r\n \"posX\": newCell\r\n };\r\n }\r\n\r\n function navigateRight() {\r\n return navigate(\"right\");\r\n }\r\n\r\n function navigateLeft() {\r\n return navigate(\"left\");\r\n }\r\n\r\n function navigateDown() {\r\n return navigate(\"down\");\r\n }\r\n\r\n function navigateUp() {\r\n return navigate(\"up\");\r\n }\r\n\r\n function navigateNext() {\r\n return navigate(\"next\");\r\n }\r\n\r\n function navigatePrev() {\r\n return navigate(\"prev\");\r\n }\r\n\r\n function navigateRowStart() {\r\n return navigate(\"home\");\r\n }\r\n\r\n function navigateRowEnd() {\r\n return navigate(\"end\");\r\n }\r\n\r\n /**\r\n * @param {string} dir Navigation direction.\r\n * @return {boolean} Whether navigation resulted in a change of active cell.\r\n */\r\n function navigate(dir) {\r\n if (!options.enableCellNavigation) {\r\n return false;\r\n }\r\n\r\n if (!activeCellNode && dir != \"prev\" && dir != \"next\") {\r\n return false;\r\n }\r\n\r\n if (!getEditorLock().commitCurrentEdit()) {\r\n return true;\r\n }\r\n setFocus();\r\n\r\n var tabbingDirections = {\r\n \"up\": -1,\r\n \"down\": 1,\r\n \"left\": -1,\r\n \"right\": 1,\r\n \"prev\": -1,\r\n \"next\": 1,\r\n \"home\": -1,\r\n \"end\": 1\r\n };\r\n tabbingDirection = tabbingDirections[dir];\r\n\r\n var stepFunctions = {\r\n \"up\": gotoUp,\r\n \"down\": gotoDown,\r\n \"left\": gotoLeft,\r\n \"right\": gotoRight,\r\n \"prev\": gotoPrev,\r\n \"next\": gotoNext,\r\n \"home\": gotoRowStart,\r\n \"end\": gotoRowEnd\r\n };\r\n var stepFn = stepFunctions[dir];\r\n var pos = stepFn(activeRow, activeCell, activePosX);\r\n if (pos) {\r\n if (hasFrozenRows && options.frozenBottom && pos.row == getDataLength()) { // tODO correct?\r\n return;\r\n }\r\n\r\n var isAddNewRow = (pos.row == getDataLength());\r\n\r\n if ((!options.frozenBottom && pos.row >= actualFrozenRow)\r\n || (options.frozenBottom && pos.row < actualFrozenRow)\r\n ) {\r\n scrollCellIntoView(pos.row, pos.cell, !isAddNewRow && options.emulatePagingWhenScrolling);\r\n }\r\n setActiveCellInternal(getCellNode(pos.row, pos.cell));\r\n activePosX = pos.posX;\r\n return true;\r\n } else {\r\n setActiveCellInternal(getCellNode(activeRow, activeCell));\r\n return false;\r\n }\r\n }\r\n\r\n function getCellNode(row, cell) {\r\n if (rowsCache[row]) {\r\n ensureCellNodesInRowsCache(row);\r\n // try {\r\n // return rowsCache[row].cellNodesByColumnIdx[cell][0];\r\n // } catch (e) {\r\n return rowsCache[row].cellNodesByColumnIdx[cell];\r\n // }\r\n }\r\n return null;\r\n }\r\n\r\n function setActiveCell(row, cell, opt_editMode, preClickModeOn, suppressActiveCellChangedEvent) {\r\n if (!initialized) { return; }\r\n if (row > getDataLength() || row < 0 || cell >= columns.length || cell < 0) {\r\n return;\r\n }\r\n\r\n if (!options.enableCellNavigation) {\r\n return;\r\n }\r\n\r\n scrollCellIntoView(row, cell, false);\r\n setActiveCellInternal(getCellNode(row, cell), opt_editMode, preClickModeOn, suppressActiveCellChangedEvent);\r\n }\r\n\r\n function canCellBeActive(row, cell) {\r\n if (!options.enableCellNavigation || row >= getDataLengthIncludingAddNew() ||\r\n row < 0 || cell >= columns.length || cell < 0) {\r\n return false;\r\n }\r\n\r\n var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n if (rowMetadata && typeof rowMetadata.focusable !== \"undefined\") {\r\n return !!rowMetadata.focusable;\r\n }\r\n\r\n var columnMetadata = rowMetadata && rowMetadata.columns;\r\n if (columnMetadata && columnMetadata[columns[cell].id] && typeof columnMetadata[columns[cell].id].focusable !== \"undefined\") {\r\n return !!columnMetadata[columns[cell].id].focusable;\r\n }\r\n if (columnMetadata && columnMetadata[cell] && typeof columnMetadata[cell].focusable !== \"undefined\") {\r\n return !!columnMetadata[cell].focusable;\r\n }\r\n\r\n return !!columns[cell].focusable;\r\n }\r\n\r\n function canCellBeSelected(row, cell) {\r\n if (row >= getDataLength() || row < 0 || cell >= columns.length || cell < 0) {\r\n return false;\r\n }\r\n\r\n var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n if (rowMetadata && typeof rowMetadata.selectable !== \"undefined\") {\r\n return !!rowMetadata.selectable;\r\n }\r\n\r\n var columnMetadata = rowMetadata && rowMetadata.columns && (rowMetadata.columns[columns[cell].id] || rowMetadata.columns[cell]);\r\n if (columnMetadata && typeof columnMetadata.selectable !== \"undefined\") {\r\n return !!columnMetadata.selectable;\r\n }\r\n\r\n return !!columns[cell].selectable;\r\n }\r\n\r\n function gotoCell(row, cell, forceEdit?, e?) {\r\n if (!initialized) { return; }\r\n if (!canCellBeActive(row, cell)) {\r\n return;\r\n }\r\n\r\n if (!getEditorLock().commitCurrentEdit()) {\r\n return;\r\n }\r\n\r\n scrollCellIntoView(row, cell, false);\r\n\r\n var newCell = getCellNode(row, cell);\r\n\r\n // if selecting the 'add new' row, start editing right away\r\n var column = columns[cell];\r\n var suppressActiveCellChangedEvent = !!(options.editable && column && column.editor && options.suppressActiveCellChangeOnEdit);\r\n setActiveCellInternal(newCell, (forceEdit || (row === getDataLength()) || options.autoEdit), null, suppressActiveCellChangedEvent, e);\r\n\r\n // if no editor was created, set the focus back on the grid\r\n if (!currentEditor) {\r\n setFocus();\r\n }\r\n }\r\n\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////\r\n // iEditor implementation for the editor lock\r\n\r\n function commitCurrentEdit() {\r\n var item = getDataItem(activeRow);\r\n var column = columns[activeCell];\r\n\r\n if (currentEditor) {\r\n if (currentEditor.isValueChanged()) {\r\n var validationResults = currentEditor.validate();\r\n\r\n if (validationResults.valid) {\r\n if (activeRow < getDataLength()) {\r\n var editCommand = {\r\n row: activeRow,\r\n cell: activeCell,\r\n editor: currentEditor,\r\n serializedValue: currentEditor.serializeValue(),\r\n prevSerializedValue: serializedEditorValue,\r\n execute: function () {\r\n this.editor.applyValue(item, this.serializedValue);\r\n updateRow(this.row);\r\n trigger(self.onCellChange, {\r\n row: this.row,\r\n cell: this.cell,\r\n item: item,\r\n value: this.serializedValue\r\n });\r\n },\r\n undo: function () {\r\n this.editor.applyValue(item, this.prevSerializedValue);\r\n updateRow(this.row);\r\n trigger(self.onCellChange, {\r\n row: this.row,\r\n cell: this.cell,\r\n item: item,\r\n value: this.prevSerializedValue\r\n });\r\n }\r\n };\r\n\r\n if (options.editCommandHandler) {\r\n makeActiveCellNormal();\r\n options.editCommandHandler(item, column, editCommand);\r\n } else {\r\n editCommand.execute();\r\n makeActiveCellNormal();\r\n }\r\n\r\n } else {\r\n var newItem = {};\r\n currentEditor.applyValue(newItem, currentEditor.serializeValue());\r\n makeActiveCellNormal();\r\n trigger(self.onAddNewRow, { item: newItem, column: column });\r\n }\r\n\r\n // check whether the lock has been re-acquired by event handlers\r\n return !getEditorLock().isActive();\r\n } else {\r\n // re-add the CSS class to trigger transitions, if any.\r\n $(activeCellNode).removeClass(\"invalid\");\r\n $(activeCellNode).width(); // force layout\r\n $(activeCellNode).addClass(\"invalid\");\r\n\r\n trigger(self.onValidationError, {\r\n editor: currentEditor,\r\n cellNode: activeCellNode,\r\n validationResults: validationResults,\r\n row: activeRow,\r\n cell: activeCell,\r\n column: column\r\n });\r\n\r\n currentEditor.focus();\r\n return false;\r\n }\r\n }\r\n\r\n makeActiveCellNormal();\r\n }\r\n return true;\r\n }\r\n\r\n function cancelCurrentEdit() {\r\n makeActiveCellNormal();\r\n return true;\r\n }\r\n\r\n function rowsToRanges(rows) {\r\n var ranges = [];\r\n var lastCell = columns.length - 1;\r\n for (var i = 0; i < rows.length; i++) {\r\n ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell));\r\n }\r\n return ranges;\r\n }\r\n\r\n function getSelectedRows() {\r\n if (!selectionModel) {\r\n throw new Error(\"Selection model is not set\");\r\n }\r\n return selectedRows;\r\n }\r\n\r\n function setSelectedRows(rows) {\r\n if (!selectionModel) {\r\n throw new Error(\"Selection model is not set\");\r\n }\r\n // if (self && self.getEditorLock && !self.getEditorLock().isActive()) {\r\n selectionModel.setSelectedRanges(rowsToRanges(rows));\r\n // }\r\n }\r\n\r\n\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////\r\n // public API\r\n\r\n $.shallowExtend(this, {\r\n \"slickGridVersion\": \"2.4.7\",\r\n\r\n // events\r\n \"onScroll\": new Slick.Event(),\r\n \"onSort\": new Slick.Event(),\r\n // \"onHeaderMouseEnter\": new Slick.Event(),\r\n // \"onHeaderMouseLeave\": new Slick.Event(),\r\n \"onHeaderContextMenu\": new Slick.Event(),\r\n \"onHeaderClick\": new Slick.Event(),\r\n \"onHeaderCellRendered\": new Slick.Event(),\r\n \"onBeforeHeaderCellDestroy\": new Slick.Event(),\r\n \"onHeaderRowCellRendered\": new Slick.Event(),\r\n \"onFooterRowCellRendered\": new Slick.Event(),\r\n \"onBeforeHeaderRowCellDestroy\": new Slick.Event(),\r\n \"onBeforeFooterRowCellDestroy\": new Slick.Event(),\r\n \"onMouseEnter\": new Slick.Event(),\r\n \"onMouseLeave\": new Slick.Event(),\r\n \"onClick\": new Slick.Event(),\r\n \"onDblClick\": new Slick.Event(),\r\n \"onContextMenu\": new Slick.Event(),\r\n \"onKeyDown\": new Slick.Event(),\r\n \"onAddNewRow\": new Slick.Event(),\r\n \"onAppendCell\": new Slick.Event(),\r\n \"onValidationError\": new Slick.Event(),\r\n \"onViewportChanged\": new Slick.Event(),\r\n \"onColumnsReordered\": new Slick.Event(),\r\n \"onColumnsResized\": new Slick.Event(),\r\n \"onCellChange\": new Slick.Event(),\r\n \"onBeforeEditCell\": new Slick.Event(),\r\n \"onBeforeCellEditorDestroy\": new Slick.Event(),\r\n \"onBeforeDestroy\": new Slick.Event(),\r\n \"onActiveCellChanged\": new Slick.Event(),\r\n \"onActiveCellPositionChanged\": new Slick.Event(),\r\n \"onDragInit\": new Slick.Event(),\r\n \"onDragStart\": new Slick.Event(),\r\n \"onDrag\": new Slick.Event(),\r\n \"onDragEnd\": new Slick.Event(),\r\n \"onSelectedRowsChanged\": new Slick.Event(),\r\n \"onCellCssStylesChanged\": new Slick.Event(),\r\n \"onAutosizeColumns\": new Slick.Event(),\r\n \"onRendered\": new Slick.Event(),\r\n \"onAppendRow\": new Slick.Event(), // added NEW\r\n \"onBeforeRemoveRow\": new Slick.Event(), // added NEW\r\n\r\n // methods\r\n \"registerPlugin\": registerPlugin,\r\n \"unregisterPlugin\": unregisterPlugin,\r\n \"getPluginByName\": getPluginByName,\r\n \"getColumns\": getColumns,\r\n \"setColumns\": setColumns,\r\n \"getColumnIndex\": getColumnIndex,\r\n \"getColumnById\": getColumnById,\r\n \"updateColumnHeader\": updateColumnHeader,\r\n \"setSortColumn\": setSortColumn,\r\n \"setSortColumns\": setSortColumns,\r\n \"getSortColumns\": getSortColumns,\r\n \"autosizeColumns\": autosizeColumns,\r\n \"getOptions\": getOptions,\r\n \"setOptions\": setOptions,\r\n \"getData\": getData,\r\n \"getDataLength\": getDataLength,\r\n \"getDataItem\": getDataItem,\r\n \"setData\": setData,\r\n \"getSelectionModel\": getSelectionModel,\r\n \"setSelectionModel\": setSelectionModel,\r\n \"getSelectedRows\": getSelectedRows,\r\n \"setSelectedRows\": setSelectedRows,\r\n \"getContainerNode\": getContainerNode,\r\n \"updatePagingStatusFromView\": updatePagingStatusFromView,\r\n \"applyFormatResultToCellNode\": applyFormatResultToCellNode,\r\n\r\n \"render\": render,\r\n \"invalidate\": invalidate,\r\n \"invalidateRow\": invalidateRow,\r\n \"invalidateRows\": invalidateRows,\r\n \"invalidateAllRows\": invalidateAllRows,\r\n \"updateCell\": updateCell,\r\n \"updateRow\": updateRow,\r\n \"getViewport\": getVisibleRange,\r\n \"getRenderedRange\": getRenderedRange,\r\n \"resizeCanvas\": resizeCanvas,\r\n \"updateRowCount\": updateRowCount,\r\n \"scrollRowIntoView\": scrollRowIntoView,\r\n \"scrollRowToTop\": scrollRowToTop,\r\n \"scrollCellIntoView\": scrollCellIntoView,\r\n \"scrollColumnIntoView\": scrollColumnIntoView,\r\n \"getCanvasNode\": getCanvasNode,\r\n \"getUID\": getUID,\r\n \"getHeaderColumnWidthDiff\": getHeaderColumnWidthDiff,\r\n \"getScrollbarDimensions\": getScrollbarDimensions,\r\n \"getHeadersWidth\": getHeadersWidth,\r\n \"getCanvasWidth\": getCanvasWidth,\r\n \"getCanvases\": getCanvases,\r\n \"getActiveCanvasNode\": getActiveCanvasNode,\r\n \"setActiveCanvasNode\": setActiveCanvasNode,\r\n \"getViewportNode\": getViewportNode,\r\n \"getActiveViewportNode\": getActiveViewportNode,\r\n \"setActiveViewportNode\": setActiveViewportNode,\r\n \"focus\": setFocus,\r\n \"scrollTo\": scrollTo,\r\n\r\n \"getCellFromPoint\": getCellFromPoint,\r\n \"getCellFromEvent\": getCellFromEvent,\r\n \"getActiveCell\": getActiveCell,\r\n \"setActiveCell\": setActiveCell,\r\n \"getActiveCellNode\": getActiveCellNode,\r\n \"getActiveCellPosition\": getActiveCellPosition,\r\n \"resetActiveCell\": resetActiveCell,\r\n \"editActiveCell\": makeActiveCellEditable,\r\n \"getCellEditor\": getCellEditor,\r\n \"getCellNode\": getCellNode,\r\n \"getCellNodeBox\": getCellNodeBox,\r\n \"canCellBeSelected\": canCellBeSelected,\r\n \"canCellBeActive\": canCellBeActive,\r\n \"navigatePrev\": navigatePrev,\r\n \"navigateNext\": navigateNext,\r\n \"navigateUp\": navigateUp,\r\n \"navigateDown\": navigateDown,\r\n \"navigateLeft\": navigateLeft,\r\n \"navigateRight\": navigateRight,\r\n \"navigatePageUp\": navigatePageUp,\r\n \"navigatePageDown\": navigatePageDown,\r\n \"navigateTop\": navigateTop,\r\n \"navigateBottom\": navigateBottom,\r\n \"navigateRowStart\": navigateRowStart,\r\n \"navigateRowEnd\": navigateRowEnd,\r\n \"gotoCell\": gotoCell,\r\n \"getTopPanel\": getTopPanel,\r\n \"setTopPanelVisibility\": setTopPanelVisibility,\r\n \"getPreHeaderPanel\": getPreHeaderPanel,\r\n \"getPreHeaderPanelRight\": getPreHeaderPanelRight,\r\n \"setPreHeaderPanelVisibility\": setPreHeaderPanelVisibility,\r\n \"getHeader\": getHeader,\r\n \"getHeaderColumn\": getHeaderColumn,\r\n \"setHeaderRowVisibility\": setHeaderRowVisibility,\r\n \"getHeaderRow\": getHeaderRow,\r\n \"getHeaderRowColumn\": getHeaderRowColumn,\r\n \"setFooterRowVisibility\": setFooterRowVisibility,\r\n \"getFooterRow\": getFooterRow,\r\n \"getFooterRowColumn\": getFooterRowColumn,\r\n \"getGridPosition\": getGridPosition,\r\n \"flashCell\": flashCell,\r\n \"addCellCssStyles\": addCellCssStyles,\r\n \"setCellCssStyles\": setCellCssStyles,\r\n \"removeCellCssStyles\": removeCellCssStyles,\r\n \"getCellCssStyles\": getCellCssStyles,\r\n \"getFrozenRowOffset\": getFrozenRowOffset,\r\n \"getDataItemValueForColumn\": getDataItemValueForColumn,\r\n\r\n \"init\": finishInitialization,\r\n \"destroy\": destroy,\r\n\r\n // iEditor implementation\r\n \"getEditorLock\": getEditorLock,\r\n \"getEditController\": getEditController\r\n });\r\n\r\n init();\r\n}\r\n","import \"./resizable.css\";\r\nimport \"../core/polyfills\";\r\nimport { EventHandler } from \"./eventhandler\";\r\n\r\nexport interface IResizeEventArg {\r\n x: number;\r\n y: number;\r\n target: HTMLElement;\r\n evt: MouseEvent;\r\n}\r\n\r\nexport interface IResizeOptions {\r\n minWidth?: number;\r\n maxWidth?: number;\r\n minHeight?: number;\r\n maxHeight?: number;\r\n resizeDelta?: number;\r\n resizeHandlePrefix?: string;\r\n onStart?: EventHandler<IResizeEventArg>;\r\n onStop?: EventHandler<IResizeEventArg>;\r\n onResize?: EventHandler<IResizeEventArg>;\r\n gridX?: number;\r\n gridY?: number;\r\n}\r\n\r\nconst defaultOptions: IResizeOptions = {\r\n resizeHandlePrefix: \"rs-\",\r\n onStart: new EventHandler<IResizeEventArg>(),\r\n onStop: new EventHandler<IResizeEventArg>(),\r\n onResize: new EventHandler<IResizeEventArg>(),\r\n resizeDelta: 0\r\n};\r\n\r\nexport class ResizeContainer {\r\n\r\n private element: HTMLElement;\r\n\r\n private resizeX: boolean;\r\n private resizeY: boolean;\r\n\r\n private startSize: { x: number, y: number } = { x: null, y: null };\r\n\r\n constructor(private container: HTMLElement,\r\n private options: IResizeOptions) {\r\n this.init();\r\n }\r\n\r\n private init(): void {\r\n this.container.classList.add(\"resizable\");\r\n this.container.addEventListener(\"mousedown\", this.mouseDownContainer, false);\r\n this.container.addEventListener(\"touchstart\", this.mouseDownContainer, false);\r\n }\r\n\r\n private mouseDownContainer = (evt: MouseEvent) => {\r\n const target: HTMLElement = evt.target as HTMLElement;\r\n if ((\" \" + target.className).indexOf(\" \" + this.options.resizeHandlePrefix) < 0) {\r\n return; // not a resize handle\r\n }\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n evt.stopImmediatePropagation();\r\n this.resizeX = target.classList.contains(this.options.resizeHandlePrefix + \"r\") ||\r\n target.classList.contains(this.options.resizeHandlePrefix + \"l\");\r\n this.resizeY = target.classList.contains(this.options.resizeHandlePrefix + \"t\") ||\r\n target.classList.contains(this.options.resizeHandlePrefix + \"b\");\r\n\r\n this.element = target.parentElement; // TODO change to closest class\r\n this.options.onStart.notify({evt, target: this.element, x: this.extractArg<number>(evt, \"pageX\"), y: this.extractArg<number>(evt, \"pageY\")});\r\n\r\n // register event listeners\r\n window.addEventListener(\"mousemove\", this.mouseMove, false);\r\n window.addEventListener(\"mouseup\", this.mouseUp, false);\r\n window.addEventListener(\"touchmove\", this.mouseMove, false);\r\n window.addEventListener(\"touchend\", this.mouseUp, false);\r\n }\r\n\r\n private mouseMove = (evt: MouseEvent) => {\r\n let raiseEvt = false;\r\n\r\n if (this.resizeX) {\r\n let val: number = this.extractArg<number>(evt, \"clientX\") - this.element.getBoundingClientRect().left;\r\n if (this.options.minWidth && val < this.options.minWidth) {\r\n val = this.options.minWidth;\r\n } else if (this.options.maxWidth && val > this.options.maxWidth) {\r\n val = this.options.maxWidth;\r\n }\r\n if (this.startSize != null && this.startSize.x == null) {\r\n this.startSize.x = val;\r\n }\r\n if (this.startSize == null || Math.abs(this.startSize.x - val) >= this.options.resizeDelta) {\r\n // if (!this.options.gridX || Math.round(val) % this.options.gridX === 0) {\r\n if (this.options.gridX) {\r\n val = Math.round(val / this.options.gridX) * this.options.gridX;\r\n }\r\n this.element.style.width = Math.round(val) + \"px\";\r\n raiseEvt = true;\r\n this.startSize = null;\r\n // }\r\n }\r\n }\r\n if (this.resizeY) {\r\n let val: number = this.extractArg<number>(evt, \"clientY\") - this.element.getBoundingClientRect().top;\r\n if (this.options.minHeight && val < this.options.minHeight) {\r\n val = this.options.minHeight;\r\n } else if (this.options.maxHeight && val > this.options.maxHeight) {\r\n val = this.options.maxHeight;\r\n }\r\n if (this.startSize != null && this.startSize.y == null) {\r\n this.startSize.y = val;\r\n }\r\n if (this.startSize == null || Math.abs(this.startSize.y - val) >= this.options.resizeDelta) {\r\n // if (!this.options.gridY || Math.round(val) % this.options.gridY === 0) {\r\n if (this.options.gridY) {\r\n val = Math.round(val / this.options.gridY) * this.options.gridY;\r\n }\r\n this.element.style.height = Math.round(val) + \"px\";\r\n raiseEvt = true;\r\n this.startSize = null;\r\n // }\r\n }\r\n }\r\n if (raiseEvt) {\r\n this.options.onResize.notify({evt, target: this.element, x: this.extractArg<number>(evt, \"pageX\"), y: this.extractArg<number>(evt, \"pageY\")});\r\n }\r\n }\r\n\r\n private mouseUp = (evt: MouseEvent) => {\r\n window.removeEventListener(\"mousemove\", this.mouseMove, false);\r\n window.removeEventListener(\"mouseup\", this.mouseUp, false);\r\n window.removeEventListener(\"touchmove\", this.mouseMove, false);\r\n window.removeEventListener(\"touchend\", this.mouseUp, false);\r\n this.options.onStop.notify({evt, target: this.element, x: this.extractArg<number>(evt, \"pageX\"), y: this.extractArg<number>(evt, \"pageY\")});\r\n this.startSize = { x: null, y: null };\r\n }\r\n\r\n private extractArg<T>(evt: any, key: string): T {\r\n return evt[key] != null ? evt[key] : (evt.touches.length > 0 ? evt.touches : evt.changedTouches)[0][key];\r\n }\r\n\r\n}\r\n\r\nexport function Resizable(selector: HTMLElement | string, options?: IResizeOptions): ResizeContainer {\r\n return new ResizeContainer(typeof selector === \"string\" ?\r\n document.querySelector(selector) :\r\n selector,\r\n { ...defaultOptions, ...options });\r\n}\r\n","// source: https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\r\n(function () {\r\n if (typeof window.CustomEvent === \"function\") { return false };\r\n\r\n function CustomEvent(event, params) {\r\n params = params || { bubbles: false, cancelable: false, detail: undefined };\r\n var evt = document.createEvent(\"CustomEvent\");\r\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\r\n return evt;\r\n }\r\n\r\n CustomEvent.prototype = window.Event.prototype;\r\n\r\n (window as any).CustomEvent = CustomEvent;\r\n\r\n if (!(\"remove\" in Element.prototype)) {\r\n (Element.prototype as any).remove = function() {\r\n if (this.parentNode) {\r\n this.parentNode.removeChild(this);\r\n }\r\n };\r\n }\r\n\r\n})();\r\n","export interface IEvent<T, T2 = void> {\r\n subscribe(fnc: (args?: T, args2?: T2) => any);\r\n notify(val?: T);\r\n}\r\n\r\nexport class EventHandler<T, T2 = void> implements IEvent<T, T2> {\r\n\r\n public static Create(click: (EventHandler<any, any> | ((p?: any, p2?: any) => any))) {\r\n if (click == null) {\r\n return new EventHandler<any, any>();\r\n }\r\n if (typeof click === \"function\") {\r\n const res = new EventHandler<any, any>();\r\n res.subscribe(click);\r\n return res;\r\n }\r\n return click;\r\n }\r\n\r\n private handlers = [];\r\n\r\n constructor(fnc?: (args?: T, args2?: T2) => any) {\r\n if (fnc != null) {\r\n this.handlers.push(fnc);\r\n }\r\n }\r\n\r\n public subscribe(fnc: (args?: T, args2?: T2) => any) {\r\n this.handlers.push(fnc);\r\n }\r\n\r\n public notify(val?: T, val2?: T2) {\r\n for (const h of this.handlers) {\r\n h(val, val2);\r\n }\r\n }\r\n\r\n public count(): number {\r\n return this.handlers.length;\r\n }\r\n\r\n public unSubscribe(fnc: (args?: T, args2?: T2) => any) {\r\n if (this.handlers.indexOf(fnc) >= 0) {\r\n this.handlers.splice(this.handlers.indexOf(fnc), 1);\r\n } else {\r\n // TODO? throw exception?\r\n console.warn(\"handler not found in EventHandler.unSubscribe\");\r\n }\r\n }\r\n}\r\n","import { jQueryReplacement } from '../../core/jq'\r\nimport { Slick } from '../slick.core'\r\n\r\n\r\nlet $ = jQueryReplacement;\r\n\r\n// register namespace\r\n$.deepExtend(window, {\r\n\"Slick\": {\r\n \"RowSelectionModel\": RowSelectionModel\r\n}\r\n});\r\n\r\n export function RowSelectionModel(options?: any) {\r\n var _grid;\r\n var _ranges = [];\r\n var _self = this;\r\n var _handler = new Slick.EventHandler();\r\n var _inHandler;\r\n var _options;\r\n var _defaults = {\r\n selectActiveRow: true\r\n };\r\n\r\n function init(grid) {\r\n _options = $.deepExtend({}, _defaults, options);\r\n _grid = grid;\r\n _handler.subscribe(_grid.onActiveCellChanged,\r\n wrapHandler(handleActiveCellChange));\r\n _handler.subscribe(_grid.onKeyDown,\r\n wrapHandler(handleKeyDown));\r\n _handler.subscribe(_grid.onClick,\r\n wrapHandler(handleClick));\r\n }\r\n\r\n function destroy() {\r\n _handler.unsubscribeAll();\r\n }\r\n\r\n function wrapHandler(handler) {\r\n return function () {\r\n if (!_inHandler) {\r\n _inHandler = true;\r\n handler.apply(this, arguments);\r\n _inHandler = false;\r\n }\r\n };\r\n }\r\n\r\n function rangesToRows(ranges) {\r\n var rows = [];\r\n for (var i = 0; i < ranges.length; i++) {\r\n for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {\r\n rows.push(j);\r\n }\r\n }\r\n return rows;\r\n }\r\n\r\n function rowsToRanges(rows) {\r\n var ranges = [];\r\n var lastCell = _grid.getColumns().length - 1;\r\n for (var i = 0; i < rows.length; i++) {\r\n ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell));\r\n }\r\n return ranges;\r\n }\r\n\r\n function getRowsRange(from, to) {\r\n var i, rows = [];\r\n for (i = from; i <= to; i++) {\r\n rows.push(i);\r\n }\r\n for (i = to; i < from; i++) {\r\n rows.push(i);\r\n }\r\n return rows;\r\n }\r\n\r\n function getSelectedRows() {\r\n return rangesToRows(_ranges);\r\n }\r\n\r\n function setSelectedRows(rows) {\r\n setSelectedRanges(rowsToRanges(rows));\r\n }\r\n\r\n function setSelectedRanges(ranges) {\r\n // simple check for: empty selection didn't change, prevent firing onSelectedRangesChanged\r\n if ((!_ranges || _ranges.length === 0) && (!ranges || ranges.length === 0)) { return; }\r\n _ranges = ranges;\r\n _self.onSelectedRangesChanged.notify(_ranges);\r\n }\r\n\r\n function getSelectedRanges() {\r\n return _ranges;\r\n }\r\n\r\n function handleActiveCellChange(e, data) {\r\n if (_options.selectActiveRow && data.row != null) {\r\n setSelectedRanges([new Slick.Range(data.row, 0, data.row, _grid.getColumns().length - 1)]);\r\n }\r\n }\r\n\r\n function handleKeyDown(e) {\r\n var activeRow = _grid.getActiveCell();\r\n if (_grid.getOptions().multiSelect && activeRow \r\n && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey \r\n && (e.which == Slick.keyCode.UP || e.which == Slick.keyCode.DOWN)) {\r\n var selectedRows = getSelectedRows();\r\n selectedRows.sort(function (x, y) {\r\n return x - y\r\n });\r\n\r\n if (!selectedRows.length) {\r\n selectedRows = [activeRow.row];\r\n }\r\n\r\n var top = selectedRows[0];\r\n var bottom = selectedRows[selectedRows.length - 1];\r\n var active;\r\n\r\n if (e.which == Slick.keyCode.DOWN) {\r\n active = activeRow.row < bottom || top == bottom ? ++bottom : ++top;\r\n } else {\r\n active = activeRow.row < bottom ? --bottom : --top;\r\n }\r\n\r\n if (active >= 0 && active < _grid.getDataLength()) {\r\n _grid.scrollRowIntoView(active);\r\n var tempRanges = rowsToRanges(getRowsRange(top, bottom));\r\n setSelectedRanges(tempRanges);\r\n }\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n }\r\n\r\n function handleClick(e) {\r\n var cell = _grid.getCellFromEvent(e);\r\n if (!cell || !_grid.canCellBeActive(cell.row, cell.cell)) {\r\n return false;\r\n }\r\n\r\n if (!_grid.getOptions().multiSelect || (\r\n !e.ctrlKey && !e.shiftKey && !e.metaKey)) {\r\n return false;\r\n }\r\n\r\n var selection = rangesToRows(_ranges);\r\n var idx = selection.indexOf(cell.row);\r\n //var idx = $.inArray(cell.row, selection);\r\n\r\n if (idx === -1 && (e.ctrlKey || e.metaKey)) {\r\n selection.push(cell.row);\r\n _grid.setActiveCell(cell.row, cell.cell);\r\n } else if (idx !== -1 && (e.ctrlKey || e.metaKey)) {\r\n selection = selection.filter(function (o, i) {\r\n return (o !== cell.row);\r\n });\r\n _grid.setActiveCell(cell.row, cell.cell);\r\n } else if (selection.length && e.shiftKey) {\r\n var last = selection.pop();\r\n var from = Math.min(cell.row, last);\r\n var to = Math.max(cell.row, last);\r\n selection = [];\r\n for (var i = from; i <= to; i++) {\r\n if (i !== last) {\r\n selection.push(i);\r\n }\r\n }\r\n selection.push(last);\r\n _grid.setActiveCell(cell.row, cell.cell);\r\n }\r\n\r\n var tempRanges = rowsToRanges(selection);\r\n setSelectedRanges(tempRanges);\r\n e.stopImmediatePropagation();\r\n\r\n return true;\r\n }\r\n\r\n $.shallowExtend(this, {\r\n \"getSelectedRows\": getSelectedRows,\r\n \"setSelectedRows\": setSelectedRows,\r\n\r\n \"getSelectedRanges\": getSelectedRanges,\r\n \"setSelectedRanges\": setSelectedRanges,\r\n\r\n \"init\": init,\r\n \"destroy\": destroy,\r\n \"pluginName\": \"RowSelectionModel\",\r\n\r\n \"onSelectedRangesChanged\": new Slick.Event()\r\n });\r\n }\r\n","import { jQueryReplacement } from \"../core/jq\";\r\nimport { Slick, ISlickEvent } from \"./slick.core\";\r\n\r\nexport interface IRefreshHint {\r\n isFilterNarrowing?: boolean;\r\n isFilterExpanding?: boolean;\r\n isFilterUnchanged?: boolean;\r\n ignoreDiffsBefore?: number;\r\n ignoreDiffsAfter?: number;\r\n}\r\n\r\nexport interface IGroupInfo {\r\n value: any;\r\n count: number;\r\n rows: any[];\r\n selectChecked: boolean;\r\n groupingKey: string;\r\n level: number;\r\n}\r\n\r\nexport interface IGroupingInfo {\r\n getter: string;\r\n formatter: (g: IGroupInfo) => string;\r\n comparer?: (a, b) => number;\r\n predefinedValues?: any[];\r\n aggregators: any[];\r\n aggregateEmpty?: boolean;\r\n aggregateCollapsed?: boolean;\r\n aggregateChildGroups?: boolean;\r\n collapsed?: boolean;\r\n displayTotalsRow?: boolean;\r\n lazyTotalsCalculation?: boolean;\r\n}\r\n\r\n\r\nconst $ = jQueryReplacement;\r\n\r\nexport interface ISlickDataView<T> {\r\n onRowsChanged: ISlickEvent<any>; // TODO\r\n onRowCountChanged: ISlickEvent<any>;\r\n setGrouping: (groupInfo: IGroupingInfo | IGroupingInfo[]) => void;\r\n getGrouping: () => IGroupingInfo;\r\n refresh: () => void;\r\n sort: (comparer, ascending: boolean) => void;\r\n updateItem: (id: any, item: T) => void;\r\n getRowByItem: (item: T) => number;\r\n getRowById: (id: any) => number;\r\n getItemById: (id: any) => T;\r\n getIdxById: (id: any) => number;\r\n getIdxByItem: (item: T) => number;\r\n getItemByIdx: (idx: number) => T;\r\n getItem: (row: number) => T;\r\n setFilterArgs: (args: any) => void;\r\n setFilter: (filter: (item: T, args: any) => boolean) => void;\r\n beginUpdate(): void;\r\n endUpdate(): void;\r\n setItems(data, objectIdProperty?): void;\r\n\r\n addItem(item: T): void;\r\n collapseAllGroups: (level?: number) => void;\r\n expandAllGroups: (level?: number) => void;\r\n collapseGroup: (...params: string[]) => void;\r\n expandGroup: (...params: string[]) => void;\r\n getFilteredItems: () => T[];\r\n getGroups: () => any; //TODO: type\r\n syncGridSelection: (grid: any, preserveHidden?: boolean, preserveHiddenOnSelectionChange?: boolean) => ISlickEvent<any>;\r\n insertItem: (insertBefore: number, item: T) => void;\r\n deleteItem: (id: any) => void;\r\n\r\n // // methods\r\n // \"setPagingOptions\": setPagingOptions,\r\n // \"getPagingInfo\": getPagingInfo,\r\n // \"getItems\": getItems,\r\n // \"setFilter\": setFilter,\r\n // \"getFilter\": getFilter,\r\n // \"reSort\": reSort,\r\n // \"groupBy\": groupBy,\r\n // \"setAggregators\": setAggregators,\r\n\r\n\r\n // \"mapItemsToRows\": mapItemsToRows,\r\n // \"mapRowsToIds\": mapRowsToIds,\r\n // \"mapIdsToRows\": mapIdsToRows,\r\n // \"setRefreshHints\": setRefreshHints,\r\n // \"setFilterArgs\": setFilterArgs,\r\n // \"refresh\": refresh,\r\n // \"sortedAddItem\": sortedAddItem,\r\n // \"sortedUpdateItem\": sortedUpdateItem,\r\n // \"syncGridSelection\": syncGridSelection,\r\n // \"syncGridCellCssStyles\": syncGridCellCssStyles,\r\n\r\n // // data provider methods\r\n // \"getLength\": getLength,\r\n // \"getItemMetadata\": getItemMetadata,\r\n\r\n // // events\r\n // \"onRowsOrCountChanged\": onRowsOrCountChanged,\r\n // \"onPagingInfoChanged\": onPagingInfoChanged\r\n}\r\n\r\n\r\n/***\r\n * A sample Model implementation.\r\n * Provides a filtered view of the underlying data.\r\n *\r\n * Relies on the data item having an \"id\" property uniquely identifying it.\r\n */\r\nexport function DataView(options?) {\r\n let self = this;\r\n\r\n let defaults = {\r\n groupItemMetadataProvider: null,\r\n inlineFilters: false\r\n };\r\n\r\n\r\n // private\r\n let idProperty = \"id\"; // property holding a unique row id\r\n let items = []; // data by index\r\n let rows = []; // data by row\r\n let idxById = {}; // indexes by id\r\n let rowsById = null; // rows by id; lazy-calculated\r\n let filter = null; // filter function\r\n let updated = null; // updated item ids\r\n let suspend = false; // suspends the recalculation\r\n let sortAsc = true;\r\n // var fastSortField;\r\n let sortComparer;\r\n let refreshHints: IRefreshHint = {};\r\n let prevRefreshHints: IRefreshHint = {};\r\n let filterArgs;\r\n let filteredItems = [];\r\n // let compiledFilter;\r\n // let compiledFilterWithCaching;\r\n let filterCache = [];\r\n\r\n // grouping\r\n let groupingInfoDefaults = {\r\n getter: null,\r\n formatter: null,\r\n comparer (a, b) {\r\n return (a.value === b.value ? 0 :\r\n (a.value > b.value ? 1 : -1)\r\n );\r\n },\r\n predefinedValues: [],\r\n aggregators: [],\r\n aggregateEmpty: false,\r\n aggregateCollapsed: false,\r\n aggregateChildGroups: false,\r\n collapsed: false,\r\n displayTotalsRow: true,\r\n lazyTotalsCalculation: false\r\n };\r\n let groupingInfos = [];\r\n let groups = [];\r\n let toggledGroupsByLevel = [];\r\n let groupingDelimiter = \":|:\";\r\n\r\n let pagesize = 0;\r\n let pagenum = 0;\r\n let totalRows = 0;\r\n\r\n // events\r\n let onRowCountChanged = new Slick.Event();\r\n let onRowsChanged = new Slick.Event();\r\n let onRowsOrCountChanged = new Slick.Event();\r\n let onPagingInfoChanged = new Slick.Event();\r\n\r\n options = $.deepExtend({}, defaults, options);\r\n\r\n\r\n function beginUpdate() {\r\n suspend = true;\r\n }\r\n\r\n function endUpdate() {\r\n suspend = false;\r\n refresh();\r\n }\r\n\r\n function setRefreshHints(hints) {\r\n refreshHints = hints;\r\n }\r\n\r\n function setFilterArgs(args) {\r\n filterArgs = args;\r\n }\r\n\r\n function updateIdxById(startingIndex?: number) {\r\n startingIndex = startingIndex || 0;\r\n let id;\r\n for (let i = startingIndex, l = items.length; i < l; i++) {\r\n id = items[i][idProperty];\r\n if (id === undefined) {\r\n // throw new Error(\"Each data element must implement a unique 'id' property\");\r\n throw new Error(\"Id (\" + idProperty + \") of element at index \" + i + \" was undefined\");\r\n }\r\n idxById[id] = i;\r\n }\r\n }\r\n\r\n function ensureIdUniqueness() {\r\n let id;\r\n for (let i = 0, l = items.length; i < l; i++) {\r\n id = items[i][idProperty];\r\n if (id === undefined) {\r\n throw new Error(\"Id (\" + idProperty + \") of element at index \" + i + \" was undefined\");\r\n } else if (idxById[id] !== i) {\r\n throw new Error(\"Duplicate id (\" + idProperty + \") for \" + id + \" found at index (\" + idxById[id] + \", \" + i + \")\");\r\n }\r\n }\r\n }\r\n\r\n function getItems() {\r\n return items;\r\n }\r\n\r\n function setItems(data, objectIdProperty) {\r\n if (objectIdProperty !== undefined) {\r\n idProperty = objectIdProperty;\r\n }\r\n items = filteredItems = data;\r\n idxById = {};\r\n updateIdxById();\r\n ensureIdUniqueness();\r\n refresh();\r\n }\r\n\r\n function setPagingOptions(args) {\r\n if (args.pageSize != undefined) {\r\n pagesize = args.pageSize;\r\n pagenum = pagesize ? Math.min(pagenum, Math.max(0, Math.ceil(totalRows / pagesize) - 1)) : 0;\r\n }\r\n\r\n if (args.pageNum != undefined) {\r\n pagenum = Math.min(args.pageNum, Math.max(0, Math.ceil(totalRows / pagesize) - 1));\r\n }\r\n\r\n onPagingInfoChanged.notify(getPagingInfo(), null, self);\r\n\r\n refresh();\r\n }\r\n\r\n function getPagingInfo() {\r\n let totalPages = pagesize ? Math.max(1, Math.ceil(totalRows / pagesize)) : 1;\r\n return { pageSize: pagesize, pageNum: pagenum, totalRows, totalPages, dataView: self };\r\n }\r\n\r\n function sort(comparer, ascending) {\r\n sortAsc = ascending;\r\n sortComparer = comparer;\r\n // fastSortField = null;\r\n if (ascending === false) {\r\n items.reverse();\r\n }\r\n items.sort(comparer);\r\n if (ascending === false) {\r\n items.reverse();\r\n }\r\n idxById = {};\r\n updateIdxById();\r\n refresh();\r\n }\r\n\r\n\r\n function reSort() {\r\n if (sortComparer) {\r\n sort(sortComparer, sortAsc);\r\n }\r\n }\r\n\r\n function getFilteredItems() {\r\n return filteredItems;\r\n }\r\n\r\n\r\n function getFilter() {\r\n return filter;\r\n }\r\n\r\n function setFilter(filterFn) {\r\n filter = filterFn;\r\n // if (options.inlineFilters) {\r\n // compiledFilter = compileFilter();\r\n // compiledFilterWithCaching = compileFilterWithCaching();\r\n // }\r\n refresh();\r\n }\r\n\r\n function getGrouping() {\r\n return groupingInfos;\r\n }\r\n\r\n function setGrouping(groupingInfo) {\r\n if (!options.groupItemMetadataProvider) {\r\n options.groupItemMetadataProvider = new ( Slick as any).Data.GroupItemMetadataProvider();\r\n }\r\n\r\n groups = [];\r\n toggledGroupsByLevel = [];\r\n groupingInfo = groupingInfo || [];\r\n groupingInfos = (groupingInfo instanceof Array) ? groupingInfo : [groupingInfo];\r\n\r\n for (let i = 0; i < groupingInfos.length; i++) {\r\n const gi = groupingInfos[i] = $.deepExtend({}, groupingInfoDefaults, groupingInfos[i]);\r\n gi.getterIsAFn = typeof gi.getter === \"function\";\r\n\r\n // pre-compile accumulator loops\r\n gi.compiledAccumulators = [];\r\n let idx = gi.aggregators.length;\r\n while (idx--) {\r\n gi.compiledAccumulators[idx] = compileAccumulatorLoop(gi.aggregators[idx]);\r\n }\r\n\r\n toggledGroupsByLevel[i] = {};\r\n }\r\n\r\n refresh();\r\n }\r\n\r\n /**\r\n * @deprecated Please use {@link setGrouping}.\r\n */\r\n function groupBy(valueGetter, valueFormatter, sortComparer) {\r\n if (valueGetter == null) {\r\n setGrouping([]);\r\n return;\r\n }\r\n\r\n setGrouping({\r\n getter: valueGetter,\r\n formatter: valueFormatter,\r\n comparer: sortComparer\r\n });\r\n }\r\n\r\n /**\r\n * @deprecated Please use {@link setGrouping}.\r\n */\r\n function setAggregators(groupAggregators, includeCollapsed) {\r\n if (!groupingInfos.length) {\r\n throw new Error(\"At least one grouping must be specified before calling setAggregators().\");\r\n }\r\n\r\n groupingInfos[0].aggregators = groupAggregators;\r\n groupingInfos[0].aggregateCollapsed = includeCollapsed;\r\n\r\n setGrouping(groupingInfos);\r\n }\r\n\r\n function getItemByIdx(i) {\r\n return items[i];\r\n }\r\n\r\n function getIdxById(id) {\r\n return idxById[id];\r\n }\r\n\r\n function getIdxByItem(item) {\r\n return idxById[item[idProperty]];\r\n }\r\n\r\n function ensureRowsByIdCache() {\r\n if (!rowsById) {\r\n rowsById = {};\r\n for (let i = 0, l = rows.length; i < l; i++) {\r\n rowsById[rows[i][idProperty]] = i;\r\n }\r\n }\r\n }\r\n\r\n function getRowByItem(item) {\r\n ensureRowsByIdCache();\r\n return rowsById[item[idProperty]];\r\n }\r\n\r\n function getRowById(id) {\r\n ensureRowsByIdCache();\r\n return rowsById[id];\r\n }\r\n\r\n function getItemById(id) {\r\n return items[idxById[id]];\r\n }\r\n\r\n function mapItemsToRows(itemArray) {\r\n let rows = [];\r\n ensureRowsByIdCache();\r\n for (let i = 0, l = itemArray.length; i < l; i++) {\r\n let row = rowsById[itemArray[i][idProperty]];\r\n if (row != null) {\r\n rows[rows.length] = row;\r\n }\r\n }\r\n return rows;\r\n }\r\n\r\n function mapIdsToRows(idArray) {\r\n let rows = [];\r\n ensureRowsByIdCache();\r\n for (let i = 0, l = idArray.length; i < l; i++) {\r\n let row = rowsById[idArray[i]];\r\n if (row != null) {\r\n rows[rows.length] = row;\r\n }\r\n }\r\n return rows;\r\n }\r\n\r\n function mapRowsToIds(rowArray) {\r\n let ids = [];\r\n for (let i = 0, l = rowArray.length; i < l; i++) {\r\n if (rowArray[i] < rows.length) {\r\n ids[ids.length] = rows[rowArray[i]][idProperty];\r\n }\r\n }\r\n return ids;\r\n }\r\n\r\n function updateItem(id, item) {\r\n // see also https://github.com/mleibman/SlickGrid/issues/1082\r\n if (idxById[id] === undefined) {\r\n throw new Error(\"Invalid id\");\r\n }\r\n\r\n // what if the specified item also has an updated idProperty?\r\n // then we'll have to update the index as well, and possibly the `updated` cache too.\r\n if (id !== item[idProperty]) {\r\n // make sure the new id is unique:\r\n let newId = item[idProperty];\r\n if (newId == null) {\r\n throw new Error(\"Cannot update item to associate with a null id\");\r\n }\r\n if (idxById[newId] !== undefined) {\r\n throw new Error(\"Cannot update item to associate with a non-unique id\");\r\n }\r\n idxById[newId] = idxById[id];\r\n delete idxById[id];\r\n\r\n // also update the `updated` hashtable/markercache? Yes, `recalc()` inside `refresh()` needs that one!\r\n if (updated && updated[id]) {\r\n delete updated[id];\r\n }\r\n\r\n // also update the row indexes? no need since the `refresh()`, further down, blows away the `rowsById[]` cache!\r\n\r\n id = newId;\r\n }\r\n items[idxById[id]] = item;\r\n\r\n // also update the rows? no need since the `refresh()`, further down, blows away the `rows[]` cache and recalculates it via `recalc()`!\r\n\r\n if (!updated) {\r\n updated = {};\r\n }\r\n updated[id] = true;\r\n refresh();\r\n }\r\n\r\n function insertItem(insertBefore, item) {\r\n items.splice(insertBefore, 0, item);\r\n updateIdxById(insertBefore);\r\n refresh();\r\n }\r\n\r\n function addItem(item) {\r\n items.push(item);\r\n updateIdxById(items.length - 1);\r\n refresh();\r\n }\r\n\r\n function deleteItem(id) {\r\n let idx = idxById[id];\r\n if (idx === undefined) {\r\n throw new Error(\"Invalid id\");\r\n }\r\n delete idxById[id];\r\n items.splice(idx, 1);\r\n updateIdxById(idx);\r\n refresh();\r\n }\r\n\r\n function sortedAddItem(item) {\r\n if (!sortComparer) {\r\n throw new Error(\"sortedAddItem() requires a sort comparer, use sort()\");\r\n }\r\n insertItem(sortedIndex(item), item);\r\n }\r\n\r\n function sortedUpdateItem(id, item) {\r\n if (idxById[id] === undefined || id !== item[idProperty]) {\r\n throw new Error(\"Invalid or non-matching id \" + idxById[id]);\r\n }\r\n if (!sortComparer) {\r\n throw new Error(\"sortedUpdateItem() requires a sort comparer, use sort()\");\r\n }\r\n let oldItem = getItemById(id);\r\n if (sortComparer(oldItem, item) !== 0) {\r\n // item affects sorting -> must use sorted add\r\n deleteItem(id);\r\n sortedAddItem(item);\r\n } else { // update does not affect sorting -> regular update works fine\r\n updateItem(id, item);\r\n }\r\n }\r\n\r\n function sortedIndex(searchItem) {\r\n let low = 0, high = items.length;\r\n\r\n while (low < high) {\r\n let mid = low + high >>> 1;\r\n if (sortComparer(items[mid], searchItem) === -1) {\r\n low = mid + 1;\r\n } else {\r\n high = mid;\r\n }\r\n }\r\n return low;\r\n }\r\n\r\n function getLength() {\r\n return rows.length;\r\n }\r\n\r\n function getItem(i) {\r\n let item = rows[i];\r\n\r\n // if this is a group row, make sure totals are calculated and update the title\r\n if (item && item.__group && item.totals && !item.totals.initialized) {\r\n let gi = groupingInfos[item.level];\r\n if (!gi.displayTotalsRow) {\r\n calculateTotals(item.totals);\r\n item.title = gi.formatter ? gi.formatter(item) : item.value;\r\n }\r\n } else if (item && item.__groupTotals && !item.initialized) {\r\n calculateTotals(item);\r\n }\r\n\r\n return item;\r\n }\r\n\r\n function getItemMetadata(i) {\r\n let item = rows[i];\r\n if (item === undefined) {\r\n return null;\r\n }\r\n\r\n // overrides for grouping rows\r\n if (item.__group) {\r\n return options.groupItemMetadataProvider.getGroupRowMetadata(item);\r\n }\r\n\r\n // overrides for totals rows\r\n if (item.__groupTotals) {\r\n return options.groupItemMetadataProvider.getTotalsRowMetadata(item);\r\n }\r\n\r\n if (item.__height) {\r\n if (item.getItemMetadata != null) {\r\n return {height: item.__height, ...(item.getItemMetadata || {})};\r\n }\r\n return { height: item.__height };\r\n }\r\n\r\n return item.getItemMetadata != null ? item.getItemMetadata(i, item) : null;\r\n }\r\n\r\n function expandCollapseAllGroups(level, collapse) {\r\n if (level == null) {\r\n for (let i = 0; i < groupingInfos.length; i++) {\r\n toggledGroupsByLevel[i] = {};\r\n groupingInfos[i].collapsed = collapse;\r\n }\r\n } else {\r\n toggledGroupsByLevel[level] = {};\r\n groupingInfos[level].collapsed = collapse;\r\n }\r\n refresh();\r\n }\r\n\r\n /**\r\n * @param level {Number} Optional level to collapse. If not specified, applies to all levels.\r\n */\r\n function collapseAllGroups(level) {\r\n expandCollapseAllGroups(level, true);\r\n }\r\n\r\n /**\r\n * @param level {Number} Optional level to expand. If not specified, applies to all levels.\r\n */\r\n function expandAllGroups(level) {\r\n expandCollapseAllGroups(level, false);\r\n }\r\n\r\n function expandCollapseGroup(level, groupingKey, collapse) {\r\n toggledGroupsByLevel[level][groupingKey] = groupingInfos[level].collapsed ^ collapse;\r\n refresh();\r\n }\r\n\r\n /**\r\n * @param varArgs Either a Slick.Group's \"groupingKey\" property, or a\r\n * variable argument list of grouping values denoting a unique path to the row. For\r\n * example, calling collapseGroup('high', '10%') will collapse the '10%' subgroup of\r\n * the 'high' group.\r\n */\r\n function collapseGroup(varArgs) {\r\n let args = Array.prototype.slice.call(arguments);\r\n let arg0 = args[0];\r\n if (args.length == 1 && arg0.indexOf(groupingDelimiter) != -1) {\r\n expandCollapseGroup(arg0.split(groupingDelimiter).length - 1, arg0, true);\r\n } else {\r\n expandCollapseGroup(args.length - 1, args.join(groupingDelimiter), true);\r\n }\r\n }\r\n\r\n /**\r\n * @param varArgs Either a Slick.Group's \"groupingKey\" property, or a\r\n * variable argument list of grouping values denoting a unique path to the row. For\r\n * example, calling expandGroup('high', '10%') will expand the '10%' subgroup of\r\n * the 'high' group.\r\n */\r\n function expandGroup(varArgs) {\r\n let args = Array.prototype.slice.call(arguments);\r\n let arg0 = args[0];\r\n if (args.length == 1 && arg0.indexOf(groupingDelimiter) != -1) {\r\n expandCollapseGroup(arg0.split(groupingDelimiter).length - 1, arg0, false);\r\n } else {\r\n expandCollapseGroup(args.length - 1, args.join(groupingDelimiter), false);\r\n }\r\n }\r\n\r\n function getGroups() {\r\n return groups;\r\n }\r\n\r\n function extractGroups(rows, parentGroup?) {\r\n let group;\r\n let val;\r\n let groups = [];\r\n let groupsByVal = {};\r\n let r;\r\n let level = parentGroup ? parentGroup.level + 1 : 0;\r\n let gi = groupingInfos[level];\r\n\r\n for (let i = 0, l = gi.predefinedValues.length; i < l; i++) {\r\n val = gi.predefinedValues[i];\r\n group = groupsByVal[val];\r\n if (!group) {\r\n group = new Slick.Group();\r\n group.value = val;\r\n group.level = level;\r\n group.groupingKey = (parentGroup ? parentGroup.groupingKey + groupingDelimiter : \"\") + val;\r\n groups[groups.length] = group;\r\n groupsByVal[val] = group;\r\n }\r\n }\r\n\r\n for (let i = 0, l = rows.length; i < l; i++) {\r\n r = rows[i];\r\n val = gi.getterIsAFn ? gi.getter(r) : r[gi.getter];\r\n group = groupsByVal[val];\r\n if (!group) {\r\n group = new Slick.Group();\r\n group.value = val;\r\n group.level = level;\r\n group.groupingKey = (parentGroup ? parentGroup.groupingKey + groupingDelimiter : \"\") + val;\r\n groups[groups.length] = group;\r\n groupsByVal[val] = group;\r\n }\r\n\r\n group.rows[group.count++] = r;\r\n }\r\n\r\n if (level < groupingInfos.length - 1) {\r\n for (let i = 0; i < groups.length; i++) {\r\n group = groups[i];\r\n group.groups = extractGroups(group.rows, group);\r\n }\r\n }\r\n\r\n groups.sort(groupingInfos[level].comparer);\r\n\r\n return groups;\r\n }\r\n\r\n function calculateTotals(totals) {\r\n let group = totals.group;\r\n let gi = groupingInfos[group.level];\r\n let isLeafLevel = (group.level == groupingInfos.length);\r\n let agg, idx = gi.aggregators.length;\r\n\r\n if (!isLeafLevel && gi.aggregateChildGroups) {\r\n // make sure all the subgroups are calculated\r\n let i = group.groups.length;\r\n while (i--) {\r\n if (!group.groups[i].totals.initialized) {\r\n calculateTotals(group.groups[i].totals);\r\n }\r\n }\r\n }\r\n\r\n while (idx--) {\r\n agg = gi.aggregators[idx];\r\n agg.init();\r\n if (!isLeafLevel && gi.aggregateChildGroups) {\r\n gi.compiledAccumulators[idx].call(agg, group.groups);\r\n } else {\r\n gi.compiledAccumulators[idx].call(agg, group.rows);\r\n }\r\n agg.storeResult(totals);\r\n }\r\n totals.initialized = true;\r\n }\r\n\r\n function addGroupTotals(group) {\r\n let gi = groupingInfos[group.level];\r\n let totals = new Slick.GroupTotals();\r\n totals.group = group;\r\n group.totals = totals;\r\n if (!gi.lazyTotalsCalculation) {\r\n calculateTotals(totals);\r\n }\r\n }\r\n\r\n function addTotals(groups, level?: number) {\r\n level = level || 0;\r\n let gi = groupingInfos[level];\r\n let groupCollapsed = gi.collapsed;\r\n let toggledGroups = toggledGroupsByLevel[level];\r\n let idx = groups.length, g;\r\n while (idx--) {\r\n g = groups[idx];\r\n\r\n if (g.collapsed && !gi.aggregateCollapsed) {\r\n continue;\r\n }\r\n\r\n // do a depth-first aggregation so that parent group aggregators can access subgroup totals.\r\n if (g.groups) {\r\n addTotals(g.groups, level + 1);\r\n }\r\n\r\n if (gi.aggregators.length && (\r\n gi.aggregateEmpty || g.rows.length || (g.groups && g.groups.length))) {\r\n addGroupTotals(g);\r\n }\r\n\r\n g.collapsed = groupCollapsed ^ toggledGroups[g.groupingKey];\r\n g.title = gi.formatter ? gi.formatter(g) : g.value;\r\n }\r\n }\r\n\r\n function flattenGroupedRows(groups, level?: number) {\r\n level = level || 0;\r\n let gi = groupingInfos[level];\r\n let groupedRows = [], rows, gl = 0, g;\r\n for (let i = 0, l = groups.length; i < l; i++) {\r\n g = groups[i];\r\n groupedRows[gl++] = g;\r\n\r\n if (!g.collapsed) {\r\n rows = g.groups ? flattenGroupedRows(g.groups, level + 1) : g.rows;\r\n for (let j = 0, jj = rows.length; j < jj; j++) {\r\n groupedRows[gl++] = rows[j];\r\n }\r\n }\r\n\r\n if (g.totals && gi.displayTotalsRow && (!g.collapsed || gi.aggregateCollapsed)) {\r\n groupedRows[gl++] = g.totals;\r\n }\r\n }\r\n return groupedRows;\r\n }\r\n\r\n function getFunctionInfo(fn) {\r\n let fnRegex = /^function[^(]*\\(([^)]*)\\)\\s*{([\\s\\S]*)}$/;\r\n let matches = fn.toString().match(fnRegex);\r\n return {\r\n params: matches[1].split(\",\"),\r\n body: matches[2]\r\n };\r\n }\r\n\r\n function compileAccumulatorLoop(aggregator) {\r\n let accumulatorInfo = getFunctionInfo(aggregator.accumulate);\r\n let fn: any = new Function(\r\n \"_items\",\r\n \"for (var \" + accumulatorInfo.params[0] + \", _i=0, _il=_items.length; _i<_il; _i++) {\" +\r\n accumulatorInfo.params[0] + \" = _items[_i]; \" +\r\n accumulatorInfo.body +\r\n \"}\"\r\n );\r\n fn.displayName /*= fn.name*/ = \"compiledAccumulatorLoop\";\r\n return fn;\r\n }\r\n\r\n // function compileFilter() {\r\n // let filterInfo = getFunctionInfo(filter);\r\n\r\n // let filterPath1 = \"{ continue _coreloop; }$1\";\r\n // let filterPath2 = \"{ _retval[_idx++] = $item$; continue _coreloop; }$1\";\r\n // // make some allowances for minification - there's only so far we can go with RegEx\r\n // let filterBody = filterInfo.body\r\n // .replace(/return false\\s*([;}]|\\}|$)/gi, filterPath1)\r\n // .replace(/return!1([;}]|\\}|$)/gi, filterPath1)\r\n // .replace(/return true\\s*([;}]|\\}|$)/gi, filterPath2)\r\n // .replace(/return!0([;}]|\\}|$)/gi, filterPath2)\r\n // .replace(/return ([^;}]+?)\\s*([;}]|$)/gi,\r\n // \"{ if ($1) { _retval[_idx++] = $item$; }; continue _coreloop; }$2\");\r\n\r\n // // This preserves the function template code after JS compression,\r\n // // so that replace() commands still work as expected.\r\n // let tpl = [\r\n // // \"function(_items, _args) { \",\r\n // \"var _retval = [], _idx = 0; \",\r\n // \"var $item$, $args$ = _args; \",\r\n // \"_coreloop: \",\r\n // \"for (var _i = 0, _il = _items.length; _i < _il; _i++) { \",\r\n // \"$item$ = _items[_i]; \",\r\n // \"$filter$; \",\r\n // \"} \",\r\n // \"return _retval; \"\r\n // // \"}\"\r\n // ].join(\"\");\r\n // tpl = tpl.replace(/\\$filter\\$/gi, filterBody);\r\n // tpl = tpl.replace(/\\$item\\$/gi, filterInfo.params[0]);\r\n // tpl = tpl.replace(/\\$args\\$/gi, filterInfo.params[1]);\r\n\r\n // let fn: any = new Function(\"_items,_args\", tpl);\r\n // fn.displayName = /*fn.name =*/ \"compiledFilter\";\r\n // return fn;\r\n // }\r\n\r\n // function compileFilterWithCaching() {\r\n // let filterInfo = getFunctionInfo(filter);\r\n\r\n // let filterPath1 = \"{ continue _coreloop; }$1\";\r\n // let filterPath2 = \"{ _cache[_i] = true;_retval[_idx++] = $item$; continue _coreloop; }$1\";\r\n // // make some allowances for minification - there's only so far we can go with RegEx\r\n // let filterBody = filterInfo.body\r\n // .replace(/return false\\s*([;}]|\\}|$)/gi, filterPath1)\r\n // .replace(/return!1([;}]|\\}|$)/gi, filterPath1)\r\n // .replace(/return true\\s*([;}]|\\}|$)/gi, filterPath2)\r\n // .replace(/return!0([;}]|\\}|$)/gi, filterPath2)\r\n // .replace(/return ([^;}]+?)\\s*([;}]|$)/gi,\r\n // \"{ if ((_cache[_i] = $1)) { _retval[_idx++] = $item$; }; continue _coreloop; }$2\");\r\n\r\n // // This preserves the function template code after JS compression,\r\n // // so that replace() commands still work as expected.\r\n // let tpl = [\r\n // // \"function(_items, _args, _cache) { \",\r\n // \"var _retval = [], _idx = 0; \",\r\n // \"var $item$, $args$ = _args; \",\r\n // \"_coreloop: \",\r\n // \"for (var _i = 0, _il = _items.length; _i < _il; _i++) { \",\r\n // \"$item$ = _items[_i]; \",\r\n // \"if (_cache[_i]) { \",\r\n // \"_retval[_idx++] = $item$; \",\r\n // \"continue _coreloop; \",\r\n // \"} \",\r\n // \"$filter$; \",\r\n // \"} \",\r\n // \"return _retval; \"\r\n // // \"}\"\r\n // ].join(\"\");\r\n // tpl = tpl.replace(/\\$filter\\$/gi, filterBody);\r\n // tpl = tpl.replace(/\\$item\\$/gi, filterInfo.params[0]);\r\n // tpl = tpl.replace(/\\$args\\$/gi, filterInfo.params[1]);\r\n\r\n // let fn: any = new Function(\"_items,_args,_cache\", tpl);\r\n // fn.displayName /*= fn.name*/ = \"compiledFilterWithCaching\";\r\n // return fn;\r\n // }\r\n\r\n function uncompiledFilter(items, args) {\r\n let retval = [], idx = 0;\r\n\r\n for (let i = 0, ii = items.length; i < ii; i++) {\r\n if (filter(items[i], args)) {\r\n retval[idx++] = items[i];\r\n }\r\n }\r\n\r\n return retval;\r\n }\r\n\r\n function uncompiledFilterWithCaching(items, args, cache) {\r\n let retval = [], idx = 0, item;\r\n\r\n for (let i = 0, ii = items.length; i < ii; i++) {\r\n item = items[i];\r\n if (cache[i]) {\r\n retval[idx++] = item;\r\n } else if (filter(item, args)) {\r\n retval[idx++] = item;\r\n cache[i] = true;\r\n }\r\n }\r\n\r\n return retval;\r\n }\r\n\r\n function getFilteredAndPagedItems(items) {\r\n if (filter) {\r\n let batchFilter = uncompiledFilter; // options.inlineFilters ? compiledFilter : uncompiledFilter;\r\n let batchFilterWithCaching = uncompiledFilterWithCaching; // options.inlineFilters ? compiledFilterWithCaching : uncompiledFilterWithCaching;\r\n\r\n if (refreshHints.isFilterNarrowing) {\r\n filteredItems = batchFilter(filteredItems, filterArgs);\r\n } else if (refreshHints.isFilterExpanding) {\r\n filteredItems = batchFilterWithCaching(items, filterArgs, filterCache);\r\n } else if (!refreshHints.isFilterUnchanged) {\r\n filteredItems = batchFilter(items, filterArgs);\r\n }\r\n } else {\r\n // special case: if not filtering and not paging, the resulting\r\n // rows collection needs to be a copy so that changes due to sort\r\n // can be caught\r\n filteredItems = pagesize ? items : items.concat();\r\n }\r\n\r\n // get the current page\r\n let paged;\r\n if (pagesize) {\r\n if (filteredItems.length <= pagenum * pagesize) {\r\n if (filteredItems.length === 0) {\r\n pagenum = 0;\r\n } else {\r\n pagenum = Math.floor((filteredItems.length - 1) / pagesize);\r\n }\r\n }\r\n paged = filteredItems.slice(pagesize * pagenum, pagesize * pagenum + pagesize);\r\n } else {\r\n paged = filteredItems;\r\n }\r\n return { totalRows: filteredItems.length, rows: paged };\r\n }\r\n\r\n function getRowDiffs(rows, newRows) {\r\n let item, r, eitherIsNonData, diff = [];\r\n let from = 0, to = newRows.length;\r\n\r\n if (refreshHints && refreshHints.ignoreDiffsBefore) {\r\n from = Math.max(0,\r\n Math.min(newRows.length, refreshHints.ignoreDiffsBefore));\r\n }\r\n\r\n if (refreshHints && refreshHints.ignoreDiffsAfter) {\r\n to = Math.min(newRows.length,\r\n Math.max(0, refreshHints.ignoreDiffsAfter));\r\n }\r\n\r\n for (let i = from, rl = rows.length; i < to; i++) {\r\n if (i >= rl) {\r\n diff[diff.length] = i;\r\n } else {\r\n item = newRows[i];\r\n r = rows[i];\r\n\r\n if ((groupingInfos.length && (eitherIsNonData = (item.__nonDataRow) || (r.__nonDataRow)) &&\r\n item.__group !== r.__group ||\r\n item.__group && !item.equals(r))\r\n || (eitherIsNonData &&\r\n // no good way to compare totals since they are arbitrary DTOs\r\n // deep object comparison is pretty expensive\r\n // always considering them 'dirty' seems easier for the time being\r\n (item.__groupTotals || r.__groupTotals))\r\n || item[idProperty] != r[idProperty]\r\n || (updated && updated[item[idProperty]])\r\n ) {\r\n diff[diff.length] = i;\r\n }\r\n }\r\n }\r\n return diff;\r\n }\r\n\r\n function recalc(_items, second?) {\r\n rowsById = null;\r\n\r\n if (refreshHints.isFilterNarrowing != prevRefreshHints.isFilterNarrowing ||\r\n refreshHints.isFilterExpanding != prevRefreshHints.isFilterExpanding) {\r\n filterCache = [];\r\n }\r\n\r\n let filteredItems = getFilteredAndPagedItems(_items);\r\n totalRows = filteredItems.totalRows;\r\n let newRows = filteredItems.rows;\r\n\r\n groups = [];\r\n if (groupingInfos.length) {\r\n groups = extractGroups(newRows);\r\n if (groups.length) {\r\n addTotals(groups);\r\n newRows = flattenGroupedRows(groups);\r\n }\r\n }\r\n\r\n let diff = getRowDiffs(rows, newRows);\r\n\r\n rows = newRows;\r\n\r\n return diff;\r\n }\r\n\r\n function refresh() {\r\n if (suspend) {\r\n return;\r\n }\r\n\r\n let countBefore = rows.length;\r\n let totalRowsBefore = totalRows;\r\n\r\n let diff = recalc(items, filter); // pass as direct refs to avoid closure perf hit\r\n\r\n // if the current page is no longer valid, go to last page and recalc\r\n // we suffer a performance penalty here, but the main loop (recalc) remains highly optimized\r\n if (pagesize && totalRows < pagenum * pagesize) {\r\n pagenum = Math.max(0, Math.ceil(totalRows / pagesize) - 1);\r\n diff = recalc(items, filter);\r\n }\r\n\r\n updated = null;\r\n prevRefreshHints = refreshHints;\r\n refreshHints = {};\r\n\r\n if (totalRowsBefore !== totalRows) {\r\n onPagingInfoChanged.notify(getPagingInfo(), null, self);\r\n }\r\n if (countBefore !== rows.length) {\r\n onRowCountChanged.notify({ previous: countBefore, current: rows.length, dataView: self, callingOnRowsChanged: (diff.length > 0) }, null, self);\r\n }\r\n if (diff.length > 0) {\r\n onRowsChanged.notify({ rows: diff, dataView: self, calledOnRowCountChanged: (countBefore !== rows.length) }, null, self);\r\n }\r\n if (countBefore !== rows.length || diff.length > 0) {\r\n onRowsOrCountChanged.notify({\r\n rowsDiff: diff, previousRowCount: countBefore, currentRowCount: rows.length,\r\n rowCountChanged: countBefore !== rows.length, rowsChanged: diff.length > 0, dataView: self\r\n }, null, self);\r\n }\r\n }\r\n\r\n /***\r\n * Wires the grid and the DataView together to keep row selection tied to item ids.\r\n * This is useful since, without it, the grid only knows about rows, so if the items\r\n * move around, the same rows stay selected instead of the selection moving along\r\n * with the items.\r\n *\r\n * NOTE: This doesn't work with cell selection model.\r\n *\r\n * @param grid {Slick.Grid} The grid to sync selection with.\r\n * @param preserveHidden {Boolean} Whether to keep selected items that go out of the\r\n * view due to them getting filtered out.\r\n * @param preserveHiddenOnSelectionChange {Boolean} Whether to keep selected items\r\n * that are currently out of the view (see preserveHidden) as selected when selection\r\n * changes.\r\n * @return {Slick.Event} An event that notifies when an internal list of selected row ids\r\n * changes. This is useful since, in combination with the above two options, it allows\r\n * access to the full list selected row ids, and not just the ones visible to the grid.\r\n * @method syncGridSelection\r\n */\r\n function syncGridSelection(grid, preserveHidden, preserveHiddenOnSelectionChange) {\r\n let self = this;\r\n let inHandler;\r\n let selectedRowIds = self.mapRowsToIds(grid.getSelectedRows());\r\n let onSelectedRowIdsChanged = new Slick.Event();\r\n\r\n function setSelectedRowIds(rowIds) {\r\n if (selectedRowIds.join(\",\") == rowIds.join(\",\")) {\r\n return;\r\n }\r\n\r\n selectedRowIds = rowIds;\r\n\r\n onSelectedRowIdsChanged.notify({\r\n grid: grid,\r\n ids: selectedRowIds,\r\n dataView: self\r\n }, new Slick.EventData(), self);\r\n }\r\n\r\n function update() {\r\n if (selectedRowIds.length > 0) {\r\n inHandler = true;\r\n let selectedRows = self.mapIdsToRows(selectedRowIds);\r\n if (!preserveHidden) {\r\n setSelectedRowIds(self.mapRowsToIds(selectedRows));\r\n }\r\n grid.setSelectedRows(selectedRows);\r\n inHandler = false;\r\n }\r\n }\r\n\r\n grid.onSelectedRowsChanged.subscribe(function(e, args) {\r\n if (inHandler) { return; }\r\n let newSelectedRowIds = self.mapRowsToIds(grid.getSelectedRows());\r\n if (!preserveHiddenOnSelectionChange || !grid.getOptions().multiSelect) {\r\n setSelectedRowIds(newSelectedRowIds);\r\n } else {\r\n // keep the ones that are hidden\r\n let existing = [];\r\n for (let i = 0; i < selectedRowIds.length; i++) {\r\n if (self.getRowById(selectedRowIds[i]) === undefined) {\r\n existing.push(selectedRowIds[i]);\r\n }\r\n }\r\n // $.grep(selectedRowIds, function(id) { return self.getRowById(id) === undefined; });\r\n // add the newly selected ones\r\n setSelectedRowIds(existing.concat(newSelectedRowIds));\r\n }\r\n });\r\n\r\n this.onRowsOrCountChanged.subscribe(update);\r\n\r\n return onSelectedRowIdsChanged;\r\n }\r\n\r\n function syncGridCellCssStyles(grid, key) {\r\n let hashById;\r\n let inHandler;\r\n\r\n // since this method can be called after the cell styles have been set,\r\n // get the existing ones right away\r\n storeCellCssStyles(grid.getCellCssStyles(key));\r\n\r\n function storeCellCssStyles(hash) {\r\n hashById = {};\r\n for (let row in hash) {\r\n let id = rows[row][idProperty];\r\n hashById[id] = hash[row];\r\n }\r\n }\r\n\r\n function update() {\r\n if (hashById) {\r\n inHandler = true;\r\n ensureRowsByIdCache();\r\n let newHash = {};\r\n for (let id in hashById) {\r\n let row = rowsById[id];\r\n if (row != undefined) {\r\n newHash[row] = hashById[id];\r\n }\r\n }\r\n grid.setCellCssStyles(key, newHash);\r\n inHandler = false;\r\n }\r\n }\r\n\r\n grid.onCellCssStylesChanged.subscribe(function(e, args) {\r\n if (inHandler) { return; }\r\n if (key != args.key) { return; }\r\n if (args.hash) {\r\n storeCellCssStyles(args.hash);\r\n } else {\r\n // grid.onCellCssStylesChanged.unsubscribe(styleChanged); //styleChanged not declared\r\n self.onRowsOrCountChanged.unsubscribe(update);\r\n }\r\n });\r\n\r\n this.onRowsOrCountChanged.subscribe(update);\r\n }\r\n\r\n $.shallowExtend(this, {\r\n // methods\r\n beginUpdate: beginUpdate,\r\n endUpdate: endUpdate,\r\n setPagingOptions: setPagingOptions,\r\n getPagingInfo: getPagingInfo,\r\n getItems: getItems,\r\n setItems: setItems,\r\n setFilter: setFilter,\r\n getFilter: getFilter,\r\n getFilteredItems: getFilteredItems,\r\n sort: sort,\r\n // \"fastSort\": fastSort,\r\n reSort: reSort,\r\n setGrouping: setGrouping,\r\n getGrouping: getGrouping,\r\n groupBy: groupBy,\r\n setAggregators: setAggregators,\r\n collapseAllGroups: collapseAllGroups,\r\n expandAllGroups: expandAllGroups,\r\n collapseGroup: collapseGroup,\r\n expandGroup: expandGroup,\r\n getGroups: getGroups,\r\n getIdxById: getIdxById,\r\n getIdxByItem: getIdxByItem,\r\n getRowByItem: getRowByItem,\r\n getRowById: getRowById,\r\n getItemById: getItemById,\r\n getItemByIdx: getItemByIdx,\r\n mapItemsToRows: mapItemsToRows,\r\n mapRowsToIds: mapRowsToIds,\r\n mapIdsToRows: mapIdsToRows,\r\n setRefreshHints: setRefreshHints,\r\n setFilterArgs: setFilterArgs,\r\n refresh: refresh,\r\n updateItem: updateItem,\r\n insertItem: insertItem,\r\n addItem: addItem,\r\n deleteItem: deleteItem,\r\n sortedAddItem: sortedAddItem,\r\n sortedUpdateItem: sortedUpdateItem,\r\n syncGridSelection: syncGridSelection,\r\n syncGridCellCssStyles: syncGridCellCssStyles,\r\n\r\n // data provider methods\r\n getLength: getLength,\r\n getItem: getItem,\r\n getItemMetadata: getItemMetadata,\r\n\r\n // events\r\n onRowCountChanged: onRowCountChanged,\r\n onRowsChanged: onRowsChanged,\r\n onRowsOrCountChanged: onRowsOrCountChanged,\r\n onPagingInfoChanged: onPagingInfoChanged\r\n });\r\n}\r\n\r\nexport function AvgAggregator(field) {\r\n this.field_ = field;\r\n\r\n this.init = function() {\r\n this.count_ = 0;\r\n this.nonNullCount_ = 0;\r\n this.sum_ = 0;\r\n };\r\n\r\n this.accumulate = function(item) {\r\n let val = item[this.field_];\r\n this.count_++;\r\n if (val != null && val !== \"\" && !isNaN(val)) {\r\n this.nonNullCount_++;\r\n this.sum_ += parseFloat(val);\r\n }\r\n };\r\n\r\n this.storeResult = function(groupTotals) {\r\n if (!groupTotals.avg) {\r\n groupTotals.avg = {};\r\n }\r\n if (this.nonNullCount_ != 0) {\r\n groupTotals.avg[this.field_] = this.sum_ / this.nonNullCount_;\r\n }\r\n };\r\n}\r\n\r\nexport function MinAggregator(field) {\r\n this.field_ = field;\r\n\r\n this.init = function() {\r\n this.min_ = null;\r\n };\r\n\r\n this.accumulate = function(item) {\r\n let val = item[this.field_];\r\n if (val != null && val !== \"\" && !isNaN(val)) {\r\n if (this.min_ == null || val < this.min_) {\r\n this.min_ = val;\r\n }\r\n }\r\n };\r\n\r\n this.storeResult = function(groupTotals) {\r\n if (!groupTotals.min) {\r\n groupTotals.min = {};\r\n }\r\n groupTotals.min[this.field_] = this.min_;\r\n };\r\n}\r\n\r\nexport function MaxAggregator(field) {\r\n this.field_ = field;\r\n\r\n this.init = function() {\r\n this.max_ = null;\r\n };\r\n\r\n this.accumulate = function(item) {\r\n let val = item[this.field_];\r\n if (val != null && val !== \"\" && !isNaN(val)) {\r\n if (this.max_ == null || val > this.max_) {\r\n this.max_ = val;\r\n }\r\n }\r\n };\r\n\r\n this.storeResult = function(groupTotals) {\r\n if (!groupTotals.max) {\r\n groupTotals.max = {};\r\n }\r\n groupTotals.max[this.field_] = this.max_;\r\n };\r\n}\r\n\r\nexport function SumAggregator(field) {\r\n this.field_ = field;\r\n\r\n this.init = function() {\r\n this.sum_ = null;\r\n };\r\n\r\n this.accumulate = function(item) {\r\n let val = item[this.field_];\r\n if (val != null && val !== \"\" && !isNaN(val)) {\r\n this.sum_ += parseFloat(val);\r\n }\r\n };\r\n\r\n this.storeResult = function(groupTotals) {\r\n if (!groupTotals.sum) {\r\n groupTotals.sum = {};\r\n }\r\n groupTotals.sum[this.field_] = this.sum_;\r\n };\r\n}\r\n\r\n // tODO: add more built-in aggregators\r\n // tODO: merge common aggregators in one to prevent needles iterating\r\n\r\n","import { jQueryReplacement } from \"../core/jq\";\r\nimport { Slick, ISlickColumn, ISlickFormatterResult} from \"./slick.core\";\r\n\r\n\r\nlet $ = jQueryReplacement;\r\n\r\n$.deepExtend(Slick, {\r\n Data: {\r\n GroupItemMetadataProvider: GroupItemMetadataProvider\r\n }\r\n});\r\n\r\n\r\n /***\r\n * Provides item metadata for group (Slick.Group) and totals (Slick.Totals) rows produced by the DataView.\r\n * This metadata overrides the default behavior and formatting of those rows so that they appear and function\r\n * correctly when processed by the grid.\r\n *\r\n * This class also acts as a grid plugin providing event handlers to expand & collapse groups.\r\n * If \"grid.registerPlugin(...)\" is not called, expand & collapse will not work.\r\n *\r\n * @class GroupItemMetadataProvider\r\n * @module Data\r\n * @namespace Slick.Data\r\n * @constructor\r\n * @param options\r\n */\r\n export function GroupItemMetadataProvider(options?) {\r\n var _grid;\r\n var _defaults = {\r\n checkboxSelect: false,\r\n checkboxSelectCssClass: \"slick-group-select-checkbox\",\r\n checkboxSelectPlugin: null,\r\n groupCssClass: \"slick-group\",\r\n groupTitleCssClass: \"slick-group-title\",\r\n totalsCssClass: \"slick-group-totals\",\r\n groupFocusable: true,\r\n totalsFocusable: false,\r\n toggleCssClass: \"slick-group-toggle\",\r\n toggleExpandedCssClass: \"expanded\",\r\n toggleCollapsedCssClass: \"collapsed\",\r\n enableExpandCollapse: true,\r\n groupFormatter: defaultGroupCellFormatter,\r\n totalsFormatter: defaultTotalsCellFormatter\r\n };\r\n\r\n options = $.deepExtend({}, _defaults, options);\r\n\r\n\r\n function defaultGroupCellFormatter(row, cell, value, columnDef, item, grid) {\r\n if (!options.enableExpandCollapse) {\r\n return item.title;\r\n }\r\n\r\n let indentation = item.level * 15 + \"px\";\r\n\r\n return (options.checkboxSelect ? '<span class=\"' + options.checkboxSelectCssClass +\r\n ' ' + (item.selectChecked ? 'checked' : 'unchecked') + '\"></span>' : '') +\r\n \"<span class='\" + options.toggleCssClass + \" \" +\r\n (item.collapsed ? options.toggleCollapsedCssClass : options.toggleExpandedCssClass) +\r\n \"' style='margin-left:\" + indentation +\"'>\" +\r\n \"</span>\" +\r\n \"<span class='\" + options.groupTitleCssClass + \"' level='\" + item.level + \"'>\" +\r\n item.title +\r\n \"</span>\";\r\n }\r\n\r\n function defaultTotalsCellFormatter(row, cell, value, columnDef: ISlickColumn, item, grid) {\r\n let formatter_res;\r\n if (columnDef.groupTotalsFormatter) {\r\n formatter_res = columnDef.groupTotalsFormatter(item, columnDef, grid) || \"\";\r\n } else {\r\n let res = (item.avg && item.avg[columnDef.field]) \r\n || (item.sum && item.sum[columnDef.field])\r\n || (item.max && item.max[columnDef.field])\r\n || (item.min && item.min[columnDef.field]);\r\n\r\n formatter_res = (columnDef.formatter ? columnDef.formatter(row, cell, res, columnDef, item) : \"\");\r\n }\r\n return formatter_res;\r\n //return (Object.prototype.toString.call(formatter_res) !== '[object Object]' ? (<string>formatter_res) : (<ISlickFormatterResult>formatter_res).text);\r\n }\r\n\r\n\r\n function init(grid) {\r\n _grid = grid;\r\n _grid.onClick.subscribe(handleGridClick);\r\n _grid.onKeyDown.subscribe(handleGridKeyDown);\r\n\r\n }\r\n\r\n function destroy() {\r\n if (_grid) {\r\n _grid.onClick.unsubscribe(handleGridClick);\r\n _grid.onKeyDown.unsubscribe(handleGridKeyDown);\r\n }\r\n }\r\n\r\n function handleGridClick(e, args) {\r\n var $target = $(e.target);\r\n var item = this.getDataItem(args.row);\r\n if (item && item instanceof Slick.Group && $target.hasClass(options.toggleCssClass)) {\r\n var range = _grid.getRenderedRange();\r\n this.dataView.setRefreshHints({\r\n ignoreDiffsBefore: range.top,\r\n ignoreDiffsAfter: range.bottom + 1\r\n });\r\n\r\n if ((<any>item).collapsed) {\r\n this.dataView.expandGroup((<any>item).groupingKey);\r\n } else {\r\n this.dataView.collapseGroup((<any>item).groupingKey);\r\n }\r\n\r\n e.stopImmediatePropagation();\r\n e.preventDefault();\r\n }\r\n if (item && item instanceof Slick.Group && $target.hasClass(options.checkboxSelectCssClass)) {\r\n (<any>item).selectChecked = !(<any>item).selectChecked;\r\n $target.removeClass(((<any>item).selectChecked ? \"unchecked\" : \"checked\"));\r\n $target.addClass(((<any>item).selectChecked ? \"checked\" : \"unchecked\"));\r\n // get rowIndexes array\r\n var rowIndexes = _grid.dataView.mapItemsToRows((<any>item).rows);\r\n ((<any>item).selectChecked ? options.checkboxSelectPlugin.selectRows : options.checkboxSelectPlugin.deSelectRows)(rowIndexes);\r\n }\r\n }\r\n\r\n // TODO: add -/+ handling\r\n function handleGridKeyDown(e, args) {\r\n if (options.enableExpandCollapse && (e.which == Slick.keyCode.SPACE)) {\r\n var activeCell = this.getActiveCell();\r\n if (activeCell) {\r\n var item = this.getDataItem(activeCell.row);\r\n if (item && item instanceof Slick.Group) {\r\n var range = _grid.getRenderedRange();\r\n this.dataView.setRefreshHints({\r\n ignoreDiffsBefore: range.top,\r\n ignoreDiffsAfter: range.bottom + 1\r\n });\r\n\r\n if ((<any>item).collapsed) {\r\n this.dataView.expandGroup((<any>item).groupingKey);\r\n } else {\r\n this.dataView.collapseGroup((<any>item).groupingKey);\r\n }\r\n\r\n e.stopImmediatePropagation();\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n }\r\n\r\n function getGroupRowMetadata(item) {\r\n return {\r\n selectable: false,\r\n focusable: options.groupFocusable,\r\n cssClasses: options.groupCssClass,\r\n columns: {\r\n 0: {\r\n colspan: \"*\",\r\n formatter: options.groupFormatter,\r\n editor: null\r\n }\r\n },\r\n height: options.calcGroupHeight ? options.calcGroupHeight(item) : undefined\r\n };\r\n }\r\n\r\n function getTotalsRowMetadata(item) {\r\n return {\r\n selectable: false,\r\n focusable: options.totalsFocusable,\r\n cssClasses: options.totalsCssClass,\r\n formatter: options.totalsFormatter,\r\n editor: null,\r\n height: options.calcTotalsHeight ? options.calcTotalsHeight(item) : undefined\r\n };\r\n }\r\n\r\n\r\n return {\r\n \"init\": init,\r\n \"destroy\": destroy,\r\n \"getGroupRowMetadata\": getGroupRowMetadata,\r\n \"getTotalsRowMetadata\": getTotalsRowMetadata\r\n };\r\n }\r\n","import { jQueryReplacement, IjQueryWrapper } from \"../../core/jq\";\r\nimport { Slick } from \"../slick.core\";\r\nimport './slick.headermenu.css'\r\n\r\n\r\nlet $ = jQueryReplacement;\r\n\r\n // register namespace\r\n $.deepExtend(window, {\r\n \"Slick\": {\r\n \"Plugins\": {\r\n \"HeaderMenu\": HeaderMenu\r\n }\r\n }\r\n });\r\n\r\n /***\r\n * A plugin to add drop-down menus to column headers.\r\n *\r\n * USAGE:\r\n *\r\n * Add the plugin .js & .css files and register it with the grid.\r\n *\r\n * To specify a menu in a column header, extend the column definition like so:\r\n *\r\n * var columns = [\r\n * {\r\n * id: 'myColumn',\r\n * name: 'My column',\r\n *\r\n * // This is the relevant part\r\n * header: {\r\n * menu: {\r\n * items: [\r\n * {\r\n * // menu item options\r\n * },\r\n * {\r\n * // menu item options\r\n * }\r\n * ]\r\n * }\r\n * }\r\n * }\r\n * ];\r\n *\r\n *\r\n * Available menu options:\r\n * tooltip: Menu button tooltip.\r\n *\r\n *\r\n * Available menu item options:\r\n * title: Menu item text.\r\n * divider: Whether the current item is a divider, not an actual command.\r\n * disabled: Whether the item is disabled.\r\n * tooltip: Item tooltip.\r\n * command: A command identifier to be passed to the onCommand event handlers.\r\n * iconCssClass: A CSS class to be added to the menu item icon.\r\n * iconImage: A url to the icon image.\r\n * minWidth: Minimum width that the drop menu will have\r\n * autoAlign: Auto-align drop menu to the left when not enough viewport space to show on the right\r\n * autoAlignOffset: When drop menu is aligned to the left, it might not be perfectly aligned with the header menu icon, if that is the case you can add an offset (positive/negative number to move right/left)\r\n *\r\n *\r\n * The plugin exposes the following events:\r\n * onBeforeMenuShow: Fired before the menu is shown. You can customize the menu or dismiss it by returning false.\r\n * Event args:\r\n * grid: Reference to the grid.\r\n * column: Column definition.\r\n * menu: Menu options. Note that you can change the menu items here.\r\n *\r\n * onCommand: Fired on menu item click for buttons with 'command' specified.\r\n * Event args:\r\n * grid: Reference to the grid.\r\n * column: Column definition.\r\n * command: Button command identified.\r\n * button: Button options. Note that you can change the button options in your\r\n * event handler, and the column header will be automatically updated to\r\n * reflect them. This is useful if you want to implement something like a\r\n * toggle button.\r\n *\r\n *\r\n * @param options {Object} Options:\r\n * buttonCssClass: an extra CSS class to add to the menu button\r\n * buttonImage: a url to the menu button image (default '../images/down.gif')\r\n * @class Slick.Plugins.HeaderButtons\r\n * @constructor\r\n */\r\n export function HeaderMenu(options) {\r\n var _grid;\r\n var _self = this;\r\n var _handler = new Slick.EventHandler();\r\n var _defaults = {\r\n buttonCssClass: null,\r\n buttonImage: null,\r\n minWidth: 100,\r\n autoAlign: true,\r\n autoAlignOffset: 0\r\n };\r\n var $menu: IjQueryWrapper;\r\n var $activeHeaderColumn: IjQueryWrapper;\r\n\r\n\r\n function init(grid) {\r\n options = $.deepExtend({}, _defaults, options);\r\n _grid = grid;\r\n _handler\r\n .subscribe(_grid.onHeaderCellRendered, handleHeaderCellRendered)\r\n .subscribe(_grid.onBeforeHeaderCellDestroy, handleBeforeHeaderCellDestroy);\r\n\r\n // Force the grid to re-render the header now that the events are hooked up.\r\n //_grid.setColumns(_grid.getColumns()); //TODO TODOFIX try to optimize this\r\n\r\n // Hide the menu on outside click.\r\n $(document.body).on(\"mousedown\", handleBodyMouseDown);\r\n }\r\n\r\n function setOptions(newOptions) {\r\n options = $.deepExtend({}, options, newOptions);\r\n }\r\n\r\n\r\n function destroy() {\r\n _handler.unsubscribeAll();\r\n document.body.removeEventListener(\"mousedown\", handleBodyMouseDown);\r\n //$(document.body).off(\"mousedown\", handleBodyMouseDown);\r\n }\r\n\r\n\r\n function handleBodyMouseDown(e) {\r\n if ($menu && $(e.target).closestClass(\"slick-header-menu\").length === 0) { //!$.contains($menu[0], e.target)) {\r\n hideMenu();\r\n }\r\n }\r\n\r\n\r\n function hideMenu() {\r\n if ($menu) {\r\n $menu.remove();\r\n $menu = null;\r\n $activeHeaderColumn\r\n .removeClass(\"slick-header-column-active\");\r\n }\r\n }\r\n\r\n function handleHeaderCellRendered(e, args) {\r\n var column = args.column;\r\n var menu = $.deepExtend({}, (column.header && column.header.menu) || {items:[]});\r\n\r\n if (!column.hideMenu) {\r\n var $el:IjQueryWrapper = $(\"<div></div>\")\r\n .addClass(\"slick-header-menubutton\")\r\n .data(\"column\", column)\r\n .data(\"menu\", menu);\r\n if (column.resizable) {\r\n $el.addClass(\"resize-offset\");\r\n }\r\n\r\n if (options.buttonCssClass) {\r\n $el.addClass(options.buttonCssClass);\r\n }\r\n\r\n if (options.buttonImage) {\r\n $el.css(\"background-image\", \"url(\" + options.buttonImage + \")\");\r\n }\r\n\r\n if (menu.tooltip) {\r\n $el.attr(\"title\", menu.tooltip);\r\n }\r\n\r\n $el\r\n .on(\"click\", showMenu)\r\n .appendTo(args.node);\r\n }\r\n }\r\n\r\n\r\n function handleBeforeHeaderCellDestroy(e, args) {\r\n var column = args.column;\r\n\r\n if (column.header && column.header.menu) {\r\n $(args.node).find(\".slick-header-menubutton\").remove();\r\n }\r\n }\r\n\r\n\r\n function showMenu(e) {\r\n var $menuButton: IjQueryWrapper = $(e.target);\r\n var menu = $.deepExtend({}, $menuButton.data(\"menu\"));\r\n var columnDef = $menuButton.data(\"column\");\r\n\r\n // Let the user modify the menu or cancel altogether,\r\n // or provide alternative menu implementation.\r\n if (_self.onBeforeMenuShow.notify({\r\n \"grid\": _grid,\r\n \"column\": columnDef,\r\n \"menu\": menu\r\n }, e, _self) == false) {\r\n return;\r\n }\r\n\r\n\r\n if (!$menu) {\r\n $menu = $(\"<div class='slick-header-menu' style='min-width: \" + options.minWidth + \"px'></div>\")\r\n .appendTo(_grid.getContainerNode());\r\n }\r\n $menu.empty();\r\n\r\n\r\n // Construct the menu items.\r\n for (var i = 0; i < menu.items.length; i++) {\r\n var item = menu.items[i];\r\n\r\n var $li = $(\"<div class='slick-header-menuitem'></div>\")\r\n .data(\"command\", item.command || '')\r\n .data(\"column\", columnDef)\r\n .data(\"item\", item)\r\n .on(\"click\", handleMenuItemClick)\r\n .appendTo($menu);\r\n\r\n if (item.disabled) {\r\n $li.addClass(\"slick-header-menuitem-disabled\");\r\n }\r\n\r\n if (item.divider) {\r\n $li.addClass(\"slick-header-menuitem-divider\");\r\n continue;\r\n }\r\n\r\n if (item.tooltip) {\r\n $li.attr(\"title\", item.tooltip);\r\n }\r\n\r\n var $icon = $(\"<div class='slick-header-menuicon'></div>\")\r\n .appendTo($li);\r\n\r\n if (item.iconCssClass) {\r\n $icon.addClass(item.iconCssClass);\r\n }\r\n\r\n if (item.iconImage) {\r\n $icon.css(\"background-image\", \"url(\" + item.iconImage + \")\");\r\n }\r\n\r\n $(\"<span class='slick-header-menucontent'></span>\")\r\n .text(item.title)\r\n .appendTo($li);\r\n }\r\n\r\n var leftPos = $menuButton.offset().left;\r\n\r\n // when auto-align is set, it will calculate whether it has enough space in the viewport to show the drop menu on the right (default)\r\n // if there isn't enough space on the right, it will automatically align the drop menu to the left\r\n // to simulate an align left, we actually need to know the width of the drop menu\r\n if (options.autoAlign) {\r\n var gridPos = _grid.getGridPosition();\r\n if ((leftPos + options.minWidth) >= gridPos.width) {\r\n leftPos = leftPos - options.minWidth + options.autoAlignOffset;\r\n }\r\n }\r\n\r\n //$menu\r\n // .offset({ top: $menuButton.offset().top + $menuButton.height(), left: leftPos });\r\n $menu[0].style.top = (/*$menuButton.offset().top +*/ $menuButton.height() as number) + \"px\";\r\n $menu[0].style.left = (leftPos - $(_grid.getContainerNode()).offset().left) + \"px\";\r\n\r\n // Mark the header as active to keep the highlighting.\r\n $activeHeaderColumn = $menuButton.closestClass(\".slick-header-column\");\r\n $activeHeaderColumn\r\n .addClass(\"slick-header-column-active\");\r\n\r\n // Stop propagation so that it doesn't register as a header click event.\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n\r\n\r\n function handleMenuItemClick(e) {\r\n var command = $(e.currentTarget).data(\"command\");\r\n var columnDef = $(e.currentTarget).data(\"column\");\r\n var item = $(e.currentTarget).data(\"item\");\r\n\r\n if (item.disabled || item.divider) {\r\n return;\r\n }\r\n\r\n hideMenu();\r\n\r\n if (command != null && command != '') {\r\n _self.onCommand.notify({\r\n \"grid\": _grid,\r\n \"column\": columnDef,\r\n \"command\": command,\r\n \"item\": item\r\n }, e, _self);\r\n }\r\n\r\n // Stop propagation so that it doesn't register as a header click event.\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n\r\n $.shallowExtend(this, {\r\n \"init\": init,\r\n \"destroy\": destroy,\r\n \"pluginName\": \"HeaderMenu\",\r\n \"setOptions\": setOptions,\r\n\r\n \"onBeforeMenuShow\": new Slick.Event(),\r\n \"onCommand\": new Slick.Event()\r\n });\r\n }\r\n","import \"./slick.headerbuttons.css\";\r\nimport { Slick } from \"../slick.core\";\r\nimport { jQueryReplacement } from \"../../core/jq\";\r\n\r\nlet $ = jQueryReplacement;\r\n\r\n// register namespace\r\n$.deepExtend(window, {\r\n \"Slick\": {\r\n \"Plugins\": {\r\n \"HeaderButtons\": HeaderButtons\r\n }\r\n }\r\n});\r\n\r\n\r\n/***\r\n * A plugin to add custom buttons to column headers.\r\n *\r\n * USAGE:\r\n *\r\n * Add the plugin .js & .css files and register it with the grid.\r\n *\r\n * To specify a custom button in a column header, extend the column definition like so:\r\n *\r\n * var columns = [\r\n * {\r\n * id: 'myColumn',\r\n * name: 'My column',\r\n *\r\n * // This is the relevant part\r\n * header: {\r\n * buttons: [\r\n * {\r\n * // button options\r\n * },\r\n * {\r\n * // button options\r\n * }\r\n * ]\r\n * }\r\n * }\r\n * ];\r\n *\r\n * Available button options:\r\n * cssClass: CSS class to add to the button.\r\n * image: Relative button image path.\r\n * tooltip: Button tooltip.\r\n * showOnHover: Only show the button on hover.\r\n * handler: Button click handler.\r\n * command: A command identifier to be passed to the onCommand event handlers.\r\n *\r\n * The plugin exposes the following events:\r\n * onCommand: Fired on button click for buttons with 'command' specified.\r\n * Event args:\r\n * grid: Reference to the grid.\r\n * column: Column definition.\r\n * command: Button command identified.\r\n * button: Button options. Note that you can change the button options in your\r\n * event handler, and the column header will be automatically updated to\r\n * reflect them. This is useful if you want to implement something like a\r\n * toggle button.\r\n *\r\n *\r\n * @param options {Object} Options:\r\n * buttonCssClass: a CSS class to use for buttons (default 'slick-header-button')\r\n * @class Slick.Plugins.HeaderButtons\r\n * @constructor\r\n */\r\nexport function HeaderButtons(options) {\r\n var _grid;\r\n var _self = this;\r\n var _handler = new Slick.EventHandler();\r\n var _defaults = {\r\n buttonCssClass: \"slick-header-button\"\r\n };\r\n\r\n\r\n function init(grid) {\r\n options = $.deepExtend({}, _defaults, options);\r\n _grid = grid;\r\n _handler\r\n .subscribe(_grid.onHeaderCellRendered, handleHeaderCellRendered)\r\n .subscribe(_grid.onBeforeHeaderCellDestroy, handleBeforeHeaderCellDestroy);\r\n\r\n // Force the grid to re-render the header now that the events are hooked up.\r\n _grid.setColumns(_grid.getColumns());\r\n }\r\n\r\n\r\n function destroy() {\r\n _handler.unsubscribeAll();\r\n }\r\n\r\n\r\n function handleHeaderCellRendered(e, args) {\r\n var column = args.column;\r\n\r\n if (column.header && column.header.buttons) {\r\n // Append buttons in reverse order since they are floated to the right.\r\n var i = column.header.buttons.length;\r\n while (i--) {\r\n var button = column.header.buttons[i];\r\n var btn = $(\"<div></div>\")\r\n .addClass(options.buttonCssClass)\r\n .data(\"column\", column)\r\n .data(\"button\", button);\r\n\r\n if (button.showOnHover) {\r\n btn.addClass(\"slick-header-button-hidden\");\r\n }\r\n\r\n if (button.image) {\r\n btn.css(\"backgroundImage\", \"url(\" + button.image + \")\");\r\n }\r\n if (button.html) {\r\n btn.html(button.html);\r\n }\r\n\r\n if (button.cssClass) {\r\n btn.addClass(button.cssClass);\r\n }\r\n\r\n if (button.tooltip) {\r\n btn.attr(\"title\", button.tooltip);\r\n }\r\n\r\n if (button.command) {\r\n btn.data(\"command\", button.command);\r\n }\r\n\r\n if (button.handler) {\r\n btn.on(\"click\", button.handler);\r\n }\r\n\r\n btn\r\n .on(\"click\", handleButtonClick)\r\n .appendTo(args.node);\r\n }\r\n }\r\n }\r\n\r\n\r\n function handleBeforeHeaderCellDestroy(e, args) {\r\n var column = args.column;\r\n\r\n if (column.header && column.header.buttons) {\r\n // Removing buttons via jQuery will also clean up any event handlers and data.\r\n // NOTE: If you attach event handlers directly or using a different framework,\r\n // you must also clean them up here to avoid memory leaks.\r\n $(args.node).find(\".\" + options.buttonCssClass).remove();\r\n }\r\n }\r\n\r\n\r\n function handleButtonClick(e) {\r\n var command = $(this).data(\"command\");\r\n var columnDef = $(this).data(\"column\");\r\n var button = $(this).data(\"button\");\r\n\r\n if (command != null) {\r\n _self.onCommand.notify({\r\n \"grid\": _grid,\r\n \"column\": columnDef,\r\n \"command\": command,\r\n \"button\": button\r\n }, e, _self);\r\n\r\n // Update the header in case the user updated the button definition in the handler.\r\n _grid.updateColumnHeader(columnDef.id);\r\n }\r\n\r\n // Stop propagation so that it doesn't register as a header click event.\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n\r\n $.shallowExtend(this, {\r\n \"init\": init,\r\n \"destroy\": destroy,\r\n \"pluginName\": \"HeaderButtons\",\r\n\r\n \"onCommand\": new Slick.Event()\r\n });\r\n}\r\n","/*\r\n * Contains basic SlickGrid formatters.\r\n * \r\n * NOTE: These are merely examples. You will most likely need to implement something more\r\n * robust/extensible/localizable/etc. for your use!\r\n */\r\n\r\nimport { ISlickFormatter, ISlickFormatterResult } from './slick.core'\r\nimport { numeric } from '../core/numeric';\r\nimport { date } from '../core/date';\r\n\r\nfunction escapeHTMLChars(text: string): string {\r\n if (text == null) {\r\n return \"\";\r\n }\r\n if (typeof text.replace !== \"function\") {\r\n return text;\r\n }\r\n return text.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\r\n}\r\n\r\nexport let EmptyFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return \"\";\r\n};\r\n\r\nexport let ComponentFormatter = EmptyFormatter;\r\n\r\nexport let YesNoFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return value ? \"Yes\" : \"No\";\r\n};\r\n\r\nexport let CheckboxFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return '<div style=\"text-align:center\">' + (value ? \"✔\" : \"-\") + '</div>'; // ❌\r\n};\r\n\r\nexport let CheckmarkFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return value ? \"✔\" : \"\";\r\n};\r\n\r\nexport let NumericFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): ISlickFormatterResult {\r\n return {\r\n addClasses: [\"right\"],\r\n text: numeric.format(value, columnDef.format)\r\n };\r\n};\r\n\r\nexport let DateFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return date.format(value, columnDef.format);\r\n};\r\n\r\nexport let HtmlFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return value || \"\";\r\n};\r\n\r\nexport let LookupFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n let vl = columnDef.valueList;\r\n if (vl) {\r\n if (Array.isArray(vl)) {\r\n if (vl.length > 0) {\r\n if (typeof (vl[0]) === \"string\") {\r\n return escapeHTMLChars(vl.indexOf(value) >= 0 ? value : \"\"); //TODO: desired?\r\n } else {\r\n const vlList = vl as Array<{ text: string, value: any }>;\r\n return escapeHTMLChars(vlList.filter((x) => x.value === value)[0]?.text);\r\n }\r\n } else {\r\n return \"\";\r\n }\r\n } else {\r\n return escapeHTMLChars(vl[value]);\r\n }\r\n } else {\r\n console.warn(\"No values list found for column \" + columnDef.id);\r\n }\r\n return escapeHTMLChars(value);\r\n};\r\n\r\nexport let MultiLookupFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n if (value == null || value.length === 0) {\r\n return \"\";\r\n }\r\n const vl = columnDef.valueList;\r\n let result = \"\";\r\n if (vl == null) {\r\n console.warn(\"No values list found for column \" + columnDef.id);\r\n return result;\r\n }\r\n if (Array.isArray(vl)) {\r\n if (vl.length > 0) {\r\n if (typeof (vl[0]) === \"string\") {\r\n result = value.filter((v) => vl.indexOf(v) >= 0).join(\", \");\r\n } else {\r\n const vlList = vl as Array<{ text: string, value: any }>;\r\n result = vlList.filter((x) => value.indexOf(x.value) >= 0).map((x) => x.text ?? \"\").join(\", \");\r\n }\r\n }\r\n } else {\r\n result = value.map((v) => vl[v]).filter((v) => v != null).join(\", \");\r\n }\r\n return result || \"\";\r\n};\r\n\r\nexport let TextFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n if (value == null) {\r\n return \"\";\r\n } else {\r\n return escapeHTMLChars(value + \"\");\r\n }\r\n};\r\n\r\nexport let TooltipFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string | ISlickFormatterResult {\r\n if (value == null) {\r\n return \"\";\r\n } else {\r\n const result = escapeHTMLChars(value + \"\");\r\n return {text: result, toolTip: result};\r\n }\r\n};\r\n\r\nexport let MultiLineTextFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): ISlickFormatterResult {\r\n var txt = \"\";\r\n if (value != null) {\r\n txt = escapeHTMLChars(value + \"\");\r\n }\r\n return { text: txt, addClasses: [\"slick-wrap\"] };\r\n};\r\n\r\nfunction pad(nr: number): string {\r\n if (nr < 10) {\r\n return \"0\" + nr.toString();\r\n } else {\r\n return nr.toString();\r\n }\r\n}\r\n\r\nexport let TimeFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return value ? (pad(value.getHours()) + \":\" + pad(value.getMinutes())) : \"\";\r\n};\r\n\r\nexport let DateTimeFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return DateFormatter(row, cell, value, columnDef, dataContext) + \" \" +\r\n TimeFormatter(row, cell, value, columnDef, dataContext);\r\n};\r\n\r\nexport let ButtonFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return \"<button class='grid-btn'>...</button>\";\r\n};\r\n","import culture from \"./culture\";\r\n\r\n/*\r\n * contains function to parse and format numeric values\r\n */\r\n\r\ninterface IFormatInfo {\r\n min_comma_places: number;\r\n max_comma_places: number;\r\n min_length: number;\r\n show_sep: boolean;\r\n prefix: string;\r\n suffix: string;\r\n}\r\n\r\n\r\nexport abstract class numeric {\r\n\r\n public static parse(nrAsString: string): number {\r\n if (nrAsString === \"\" || nrAsString === undefined || nrAsString === null) {\r\n return undefined;\r\n }\r\n if (!nrAsString) {\r\n return undefined;\r\n }\r\n if (culture.info.decimalSep && culture.info.decimalSep.length > 1) {\r\n throw \"DecimalSep cannot be more than one character\";\r\n }\r\n if (culture.info.thousandSep && culture.info.thousandSep.length > 1) {\r\n throw \"ThousandSep cannot be more than one character\";\r\n }\r\n var str = \"\";\r\n var comma_sep = culture.info.decimalSep;\r\n for (var i = 0; i < nrAsString.length; i++) {\r\n var c = nrAsString.charAt(i);\r\n if (c === comma_sep) {\r\n str += '.';\r\n }\r\n else if (c === '0' || c === '1' || c === '2' || c === '3' || c === '4' || c === '5' || c === '6' || c === '7' || c === '8' || c === '9' || (c === '-' && str === \"\")) {\r\n str += c;\r\n }\r\n }\r\n return parseFloat(str);\r\n }\r\n\r\n public static format(nr: number, format?: string): string {\r\n if (isNaN(nr) || nr === null || nr === undefined) {\r\n return \"\";\r\n }\r\n if (culture.info.decimalSep && culture.info.decimalSep.length > 1) {\r\n throw \"DecimalSep cannot be more than one character\";\r\n }\r\n if (culture.info.thousandSep && culture.info.thousandSep.length > 1) {\r\n throw \"ThousandSep cannot be more than one character\";\r\n }\r\n\r\n const f = format || culture.info.numberFormat;\r\n let cacheEntry = numeric.formatCache[f];\r\n if (!cacheEntry) {\r\n numeric.formatCache[f] = cacheEntry = numeric.parseNrFormat(f);\r\n }\r\n return numeric.formatNumber(nr, cacheEntry);\r\n }\r\n\r\n private static formatCache: { [_key: string]: IFormatInfo } = {};\r\n\r\n private static parseNrFormat(format: string): IFormatInfo {\r\n let prefix = \"\";\r\n let suffix = \"\";\r\n let show_sep = format.indexOf(',#') > 0 || format.indexOf(',0') > 0;\r\n let min_length = 0;\r\n for (let i = 0; i < format.length; i++) {\r\n if (format.charAt(i) === '.') {\r\n break;\r\n }\r\n if (format.charAt(i) === '0') {\r\n min_length++;\r\n }\r\n if (min_length === 0 && format.charAt(i) !== ',' && format.charAt(i) !== '0' && format.charAt(i) !== '.' && format.charAt(i) !== '#') {\r\n prefix += format.charAt(i);\r\n }\r\n }\r\n let max_comma_places = 0;\r\n let min_comma_places = 0;\r\n let comma_pos = format.indexOf('.');\r\n if (comma_pos >= 0) {\r\n for (let j = comma_pos + 1; j < format.length; j++) {\r\n if (format.charAt(j) === '0') {\r\n min_comma_places++;\r\n }\r\n else if (format.charAt(j) === '#') {\r\n max_comma_places++;\r\n }\r\n else if (format.charAt(j) !== ',' && format.charAt(j) !== '.') {\r\n suffix += format.charAt(j);\r\n }\r\n }\r\n }\r\n max_comma_places += min_comma_places;\r\n return { max_comma_places, min_comma_places, min_length, prefix, suffix, show_sep };\r\n }\r\n\r\n private static formatNumber(nr, format: IFormatInfo) {\r\n //defaults\r\n let comma_separator = culture.info.decimalSep;\r\n let thousand_separator = culture.info.thousandSep;\r\n let cp_min = format.min_comma_places || 0;\r\n let cp_max = format.max_comma_places || 0;\r\n let ml = format.min_length || 0;\r\n //check if number is negative\r\n let negative = nr < 0;\r\n if (negative) {\r\n nr = -nr;\r\n }\r\n //convert number to a string and round\r\n let nr_str_raw = nr.toFixed(cp_max);\r\n let cp = cp_max;\r\n //remove comma-places which are not necessary\r\n let end = nr_str_raw.indexOf('.') + cp_min;\r\n if (end >= 0) {\r\n let x = nr_str_raw.length - 1;\r\n while (x > end) {\r\n if (nr_str_raw.charAt(x) === '0') {\r\n cp--;\r\n nr_str_raw = nr_str_raw.slice(0, -1);\r\n } else {\r\n break;\r\n }\r\n x--;\r\n }\r\n if (nr_str_raw.charAt(x) === '.') {\r\n nr_str_raw = nr_str_raw.slice(0, -1);\r\n }\r\n }\r\n let nr_str = comma_separator !== \".\" ? nr_str_raw.replace(\".\", comma_separator) : nr_str_raw;\r\n let t = cp ? cp + 1 : 0;\r\n // add \"0\" at the front if necessary\r\n while (nr_str.length < ml + t) {\r\n nr_str = \"0\" + nr_str;\r\n }\r\n // insert thousand-separator if necessary\r\n t += 3;\r\n while (nr_str.length > t && format.show_sep) {\r\n nr_str = nr_str.substr(0, nr_str.length - t) + thousand_separator + nr_str.substr(nr_str.length - t);\r\n t += 4;\r\n }\r\n //remove first 0 if necessary\r\n if (ml === 0 && nr_str.charAt(0) === '0') {\r\n nr_str = nr_str.slice(1);\r\n }\r\n //return number\r\n if (negative && parseFloat(nr_str_raw) !== 0) {\r\n return (format.prefix || \"\") + \"-\" + nr_str + (format.suffix || \"\");\r\n }\r\n else {\r\n return (format.prefix || \"\") + nr_str + (format.suffix || \"\");\r\n }\r\n }\r\n}\r\n","let _w: any = window;\r\n\r\n_w._current_culture = \"\";\r\n\r\nlet culture = _w._culture ?? {\r\n\r\n info: { thousandSep: \",\", decimalSep: \".\", dateFormat: \"yy-mm-dd\", numberFormat: \"#,0.####\" },\r\n\r\n /**\r\n * sets a culture\r\n * @param c culture as string for example 'de' or 'en-us'\r\n */\r\n set: function(c: string): void {\r\n var cult_vals = culture.cultures[c.toLowerCase()];\r\n if (cult_vals === undefined)\r\n throw \"unknown culture '\"+c+\"'\";\r\n culture.info.decimalSep = cult_vals[0];\r\n culture.info.thousandSep = cult_vals[1];\r\n culture.info.dateFormat = cult_vals[2];\r\n _w.current_culture = c;\r\n },\r\n\r\n /**\r\n * returns current culture\r\n */\r\n get: function(): string {\r\n return _w.current_culture;\r\n },\r\n cultures: {\r\n// 'ar':['.',',','dd/mm/y'],\r\n// 'bg':[',',' ','d.m.yy \\'г.\\''],\r\n// 'ca':[',','.','dd/mm/yy'],\r\n// 'zh-hans':['.',',','yy/m/d'],\r\n// 'cs':[',',' ','d.m.yy'],\r\n// 'da':[',','.','dd-mm-yy'],\r\n'de':[',','.','dd.mm.yy'],\r\n// 'el':[',','.','d/m/yy'],\r\n// 'es':[',','.','dd/mm/yy'],\r\n// 'fi':[',',' ','d.m.yy'],\r\n// 'fr':[',',' ','dd/mm/yy'],\r\n// 'he':['.',',','dd/mm/yy'],\r\n// 'hu':[',',' ','yy.mm.dd.'],\r\n// 'is':[',','.','d.m.yy'],\r\n// 'it':[',','.','dd/mm/yy'],\r\n// 'ja':['.',',','yy/mm/dd'],\r\n// 'ko':['.',',','yy-mm-dd'],\r\n// 'nl':[',','.','d-m-yy'],\r\n// 'no':[',',' ','dd.mm.yy'],\r\n// 'pl':[',',' ','yy-mm-dd'],\r\n// 'pt':[',','.','dd/mm/yy'],\r\n// 'rm':['.','\\'','dd/mm/yy'],\r\n// 'ro':[',','.','dd.mm.yy'],\r\n// 'ru':[',',' ','dd.mm.yy'],\r\n// 'hr':[',','.','d.m.yy.'],\r\n// 'sk':[',',' ','d. m. yy'],\r\n// 'sq':[',','.','yy-mm-dd'],\r\n// 'sv':[',',' ','yy-mm-dd'],\r\n// 'th':['.',',','d/m/yy'],\r\n// 'tr':[',','.','dd.mm.yy'],\r\n// 'ur':['.',',','dd/mm/yy'],\r\n// 'id':[',','.','dd/mm/yy'],\r\n// 'uk':[',',' ','dd.mm.yy'],\r\n// 'be':[',',' ','dd.mm.yy'],\r\n// 'sl':[',','.','d.m.yy'],\r\n// 'et':[',',' ','d.mm.yy'],\r\n// 'lv':[',',' ','yy.mm.dd.'],\r\n// 'lt':[',','.','yy.mm.dd'],\r\n// 'tg':[',',' ','dd.mm.y'],\r\n// 'fa':['.',',','mm/dd/yy'],\r\n// 'vi':[',','.','dd/mm/yy'],\r\n// 'hy':['.',',','dd.mm.yy'],\r\n// 'az':[',',' ','dd.mm.yy'],\r\n// 'eu':[',','.','yy/mm/dd'],\r\n// 'hsb':[',','.','d. m. yy'],\r\n// 'mk':[',','.','dd.mm.yy'],\r\n// 'tn':['.',',','yy/mm/dd'],\r\n// 'xh':['.',',','yy/mm/dd'],\r\n// 'zu':['.',',','yy/mm/dd'],\r\n// 'af':['.',',','yy/mm/dd'],\r\n// 'ka':[',',' ','dd.mm.yy'],\r\n// 'fo':[',','.','dd-mm-yy'],\r\n// 'hi':['.',',','dd-mm-yy'],\r\n// 'mt':['.',',','dd/mm/yy'],\r\n// 'se':[',',' ','dd.mm.yy'],\r\n// 'ga':['.',',','dd/mm/yy'],\r\n// 'ms':['.',',','dd/mm/yy'],\r\n// 'kk':[',',' ','dd.mm.yy'],\r\n// 'ky':[',',' ','dd.mm.y'],\r\n// 'sw':['.',',','m/d/yy'],\r\n// 'tk':[',',' ','dd.mm.y'],\r\n// 'uz':[',',' ','dd/mm yy'],\r\n// 'tt':[',',' ','dd.mm.yy'],\r\n// 'bn':['.',',','dd-mm-y'],\r\n// 'pa':['.',',','dd-mm-y'],\r\n// 'gu':['.',',','dd-mm-y'],\r\n// 'or':['.',',','dd-mm-y'],\r\n// 'ta':['.',',','dd-mm-yy'],\r\n// 'te':['.',',','dd-mm-y'],\r\n// 'kn':['.',',','dd-mm-y'],\r\n// 'ml':['.',',','dd-mm-y'],\r\n// 'as':['.',',','dd-mm-yy'],\r\n// 'mr':['.',',','dd-mm-yy'],\r\n// 'sa':['.',',','dd-mm-yy'],\r\n// 'mn':[',',' ','y.mm.dd'],\r\n// 'bo':['.',',','yy/m/d'],\r\n// 'cy':['.',',','dd/mm/yy'],\r\n// 'km':['.',',','yy-mm-dd'],\r\n// 'lo':['.',',','dd/mm/yy'],\r\n// 'gl':[',','.','dd/mm/yy'],\r\n// 'kok':['.',',','dd-mm-yy'],\r\n// 'syr':['.',',','dd/mm/yy'],\r\n// 'si':['.',',','yy-mm-dd'],\r\n// 'iu':['.',',','d/mm/yy'],\r\n// 'am':['.',',','d/m/yy'],\r\n// 'tzm':[',','.','dd-mm-yy'],\r\n// 'ne':['.',',','m/d/yy'],\r\n// 'fy':[',','.','d-m-yy'],\r\n// 'ps':[',','،','dd/mm/y'],\r\n// 'fil':['.',',','m/d/yy'],\r\n// 'dv':['.',',','dd/mm/y'],\r\n// 'ha':['.',',','d/m/yy'],\r\n// 'yo':['.',',','d/m/yy'],\r\n// 'quz':[',','.','dd/mm/yy'],\r\n// 'nso':['.',',','yy/mm/dd'],\r\n// 'ba':[',',' ','dd.mm.y'],\r\n// 'lb':[',',' ','dd/mm/yy'],\r\n// 'kl':[',','.','dd-mm-yy'],\r\n// 'ig':['.',',','d/m/yy'],\r\n// 'ii':['.',',','yy/m/d'],\r\n// 'arn':[',','.','dd-mm-yy'],\r\n// 'moh':['.',',','m/d/yy'],\r\n// 'br':[',',' ','dd/mm/yy'],\r\n// 'ug':['.',',','yy-m-d'],\r\n// 'mi':['.',',','dd/mm/yy'],\r\n// 'oc':[',',' ','dd/mm/yy'],\r\n// 'co':[',',' ','dd/mm/yy'],\r\n// 'gsw':[',',' ','dd/mm/yy'],\r\n// 'sah':[',',' ','mm.dd.yy'],\r\n// 'qut':['.',',','dd/mm/yy'],\r\n// 'rw':[',',' ','m/d/yy'],\r\n// 'wo':[',',' ','dd/mm/yy'],\r\n// 'prs':[',','.','dd/mm/y'],\r\n// 'gd':['.',',','dd/mm/yy'],\r\n// 'ar-sa':['.',',','dd/mm/y'],\r\n// 'bg-bg':[',',' ','d.m.yy \\'г.\\''],\r\n// 'ca-es':[',','.','dd/mm/yy'],\r\n// 'zh-tw':['.',',','yy/m/d'],\r\n// 'cs-cz':[',',' ','d.m.yy'],\r\n// 'da-dk':[',','.','dd-mm-yy'],\r\n// 'de-de':[',','.','dd.mm.yy'],\r\n// 'el-gr':[',','.','d/m/yy'],\r\n'en-us':['.',',','m/d/yy'],\r\n// 'fi-fi':[',',' ','d.m.yy'],\r\n// 'fr-fr':[',',' ','dd/mm/yy'],\r\n// 'he-il':['.',',','dd/mm/yy'],\r\n// 'hu-hu':[',',' ','yy.mm.dd.'],\r\n// 'is-is':[',','.','d.m.yy'],\r\n// 'it-it':[',','.','dd/mm/yy'],\r\n// 'ja-jp':['.',',','yy/mm/dd'],\r\n// 'ko-kr':['.',',','yy-mm-dd'],\r\n// 'nl-nl':[',','.','d-m-yy'],\r\n// 'nb-no':[',',' ','dd.mm.yy'],\r\n// 'pl-pl':[',',' ','yy-mm-dd'],\r\n// 'pt-br':[',','.','dd/mm/yy'],\r\n// 'rm-ch':['.','\\'','dd/mm/yy'],\r\n// 'ro-ro':[',','.','dd.mm.yy'],\r\n// 'ru-ru':[',',' ','dd.mm.yy'],\r\n// 'hr-hr':[',','.','d.m.yy.'],\r\n// 'sk-sk':[',',' ','d. m. yy'],\r\n// 'sq-al':[',','.','yy-mm-dd'],\r\n// 'sv-se':[',',' ','yy-mm-dd'],\r\n// 'th-th':['.',',','d/m/yy'],\r\n// 'tr-tr':[',','.','dd.mm.yy'],\r\n// 'ur-pk':['.',',','dd/mm/yy'],\r\n// 'id-id':[',','.','dd/mm/yy'],\r\n// 'uk-ua':[',',' ','dd.mm.yy'],\r\n// 'be-by':[',',' ','dd.mm.yy'],\r\n// 'sl-si':[',','.','d.m.yy'],\r\n// 'et-ee':[',',' ','d.mm.yy'],\r\n// 'lv-lv':[',',' ','yy.mm.dd.'],\r\n// 'lt-lt':[',','.','yy.mm.dd'],\r\n// 'tg-cyrl-tj':[',',' ','dd.mm.y'],\r\n// 'fa-ir':['.',',','mm/dd/yy'],\r\n// 'vi-vn':[',','.','dd/mm/yy'],\r\n// 'hy-am':['.',',','dd.mm.yy'],\r\n// 'az-latn-az':[',',' ','dd.mm.yy'],\r\n// 'eu-es':[',','.','yy/mm/dd'],\r\n// 'hsb-de':[',','.','d. m. yy'],\r\n// 'mk-mk':[',','.','dd.mm.yy'],\r\n// 'tn-za':['.',',','yy/mm/dd'],\r\n// 'xh-za':['.',',','yy/mm/dd'],\r\n// 'zu-za':['.',',','yy/mm/dd'],\r\n// 'af-za':['.',',','yy/mm/dd'],\r\n// 'ka-ge':[',',' ','dd.mm.yy'],\r\n// 'fo-fo':[',','.','dd-mm-yy'],\r\n// 'hi-in':['.',',','dd-mm-yy'],\r\n// 'mt-mt':['.',',','dd/mm/yy'],\r\n// 'se-no':[',',' ','dd.mm.yy'],\r\n// 'ms-my':['.',',','dd/mm/yy'],\r\n// 'kk-kz':[',',' ','dd.mm.yy'],\r\n// 'ky-kg':[',',' ','dd.mm.y'],\r\n// 'sw-ke':['.',',','m/d/yy'],\r\n// 'tk-tm':[',',' ','dd.mm.y'],\r\n// 'uz-latn-uz':[',',' ','dd/mm yy'],\r\n// 'tt-ru':[',',' ','dd.mm.yy'],\r\n// 'bn-in':['.',',','dd-mm-y'],\r\n// 'pa-in':['.',',','dd-mm-y'],\r\n// 'gu-in':['.',',','dd-mm-y'],\r\n// 'or-in':['.',',','dd-mm-y'],\r\n// 'ta-in':['.',',','dd-mm-yy'],\r\n// 'te-in':['.',',','dd-mm-y'],\r\n// 'kn-in':['.',',','dd-mm-y'],\r\n// 'ml-in':['.',',','dd-mm-y'],\r\n// 'as-in':['.',',','dd-mm-yy'],\r\n// 'mr-in':['.',',','dd-mm-yy'],\r\n// 'sa-in':['.',',','dd-mm-yy'],\r\n// 'mn-mn':[',',' ','y.mm.dd'],\r\n// 'bo-cn':['.',',','yy/m/d'],\r\n// 'cy-gb':['.',',','dd/mm/yy'],\r\n// 'km-kh':['.',',','yy-mm-dd'],\r\n// 'lo-la':['.',',','dd/mm/yy'],\r\n// 'gl-es':[',','.','dd/mm/yy'],\r\n// 'kok-in':['.',',','dd-mm-yy'],\r\n// 'syr-sy':['.',',','dd/mm/yy'],\r\n// 'si-lk':['.',',','yy-mm-dd'],\r\n// 'iu-cans-ca':['.',',','d/m/yy'],\r\n// 'am-et':['.',',','d/m/yy'],\r\n// 'ne-np':['.',',','m/d/yy'],\r\n// 'fy-nl':[',','.','d-m-yy'],\r\n// 'ps-af':[',','،','dd/mm/y'],\r\n// 'fil-ph':['.',',','m/d/yy'],\r\n// 'dv-mv':['.',',','dd/mm/y'],\r\n// 'ha-latn-ng':['.',',','d/m/yy'],\r\n// 'yo-ng':['.',',','d/m/yy'],\r\n// 'quz-bo':[',','.','dd/mm/yy'],\r\n// 'nso-za':['.',',','yy/mm/dd'],\r\n// 'ba-ru':[',',' ','dd.mm.y'],\r\n// 'lb-lu':[',',' ','dd/mm/yy'],\r\n// 'kl-gl':[',','.','dd-mm-yy'],\r\n// 'ig-ng':['.',',','d/m/yy'],\r\n// 'ii-cn':['.',',','yy/m/d'],\r\n// 'arn-cl':[',','.','dd-mm-yy'],\r\n// 'moh-ca':['.',',','m/d/yy'],\r\n// 'br-fr':[',',' ','dd/mm/yy'],\r\n// 'ug-cn':['.',',','yy-m-d'],\r\n// 'mi-nz':['.',',','dd/mm/yy'],\r\n// 'oc-fr':[',',' ','dd/mm/yy'],\r\n// 'co-fr':[',',' ','dd/mm/yy'],\r\n// 'gsw-fr':[',',' ','dd/mm/yy'],\r\n// 'sah-ru':[',',' ','mm.dd.yy'],\r\n// 'qut-gt':['.',',','dd/mm/yy'],\r\n// 'rw-rw':[',',' ','m/d/yy'],\r\n// 'wo-sn':[',',' ','dd/mm/yy'],\r\n// 'prs-af':[',','.','dd/mm/y'],\r\n// 'gd-gb':['.',',','dd/mm/yy'],\r\n// 'ar-iq':['.',',','dd/mm/yy'],\r\n// 'zh-cn':['.',',','yy/m/d'],\r\n// 'de-ch':['.','\\'','dd.mm.yy'],\r\n'en-gb':['.',',','dd/mm/yy'],\r\n// 'es-mx':['.',',','dd/mm/yy'],\r\n// 'fr-be':[',','.','d/mm/yy'],\r\n// 'it-ch':['.','\\'','dd.mm.yy'],\r\n// 'nl-be':[',','.','d/mm/yy'],\r\n// 'nn-no':[',',' ','dd.mm.yy'],\r\n// 'pt-pt':[',','.','dd-mm-yy'],\r\n// 'sr-latn-cs':[',','.','d.m.yy'],\r\n// 'sv-fi':[',',' ','d.m.yy'],\r\n// 'az-cyrl-az':[',',' ','dd.mm.yy'],\r\n// 'dsb-de':[',','.','d. m. yy'],\r\n// 'se-se':[',',' ','yy-mm-dd'],\r\n// 'ga-ie':['.',',','dd/mm/yy'],\r\n// 'ms-bn':[',','.','dd/mm/yy'],\r\n// 'uz-cyrl-uz':[',',' ','dd.mm.yy'],\r\n// 'bn-bd':['.',',','dd-mm-y'],\r\n// 'mn-mong-cn':['.',',','yy/m/d'],\r\n// 'iu-latn-ca':['.',',','d/mm/yy'],\r\n// 'tzm-latn-dz':[',','.','dd-mm-yy'],\r\n// 'quz-ec':[',','.','dd/mm/yy'],\r\n// 'ar-eg':['.',',','dd/mm/yy'],\r\n// 'zh-hk':['.',',','d/m/yy'],\r\n// 'de-at':[',','.','dd.mm.yy'],\r\n// 'en-au':['.',',','d/mm/yy'],\r\n// 'es-es':[',','.','dd/mm/yy'],\r\n// 'fr-ca':[',',' ','yy-mm-dd'],\r\n// 'sr-cyrl-cs':[',','.','d.m.yy'],\r\n// 'se-fi':[',',' ','d.m.yy'],\r\n// 'quz-pe':['.',',','dd/mm/yy'],\r\n// 'ar-ly':['.',',','dd/mm/yy'],\r\n// 'zh-sg':['.',',','d/m/yy'],\r\n// 'de-lu':[',','.','dd.mm.yy'],\r\n// 'en-ca':['.',',','dd/mm/yy'],\r\n// 'es-gt':['.',',','dd/mm/yy'],\r\n// 'fr-ch':['.','\\'','dd.mm.yy'],\r\n// 'hr-ba':[',','.','d.m.yy.'],\r\n// 'smj-no':[',',' ','dd.mm.yy'],\r\n// 'ar-dz':['.',',','dd-mm-yy'],\r\n// 'zh-mo':['.',',','d/m/yy'],\r\n// 'de-li':['.','\\'','dd.mm.yy'],\r\n// 'en-nz':['.',',','d/mm/yy'],\r\n// 'es-cr':[',','.','dd/mm/yy'],\r\n// 'fr-lu':[',',' ','dd/mm/yy'],\r\n// 'bs-latn-ba':[',','.','d.m.yy'],\r\n// 'smj-se':[',',' ','yy-mm-dd'],\r\n// 'ar-ma':['.',',','dd-mm-yy'],\r\n// 'en-ie':['.',',','dd/mm/yy'],\r\n// 'es-pa':['.',',','mm/dd/yy'],\r\n// 'fr-mc':[',',' ','dd/mm/yy'],\r\n// 'sr-latn-ba':[',','.','d.m.yy'],\r\n// 'sma-no':[',',' ','dd.mm.yy'],\r\n// 'ar-tn':['.',',','dd-mm-yy'],\r\n// 'en-za':['.',' ','yy/mm/dd'],\r\n// 'es-do':['.',',','dd/mm/yy'],\r\n// 'sr-cyrl-ba':[',','.','d.m.yy'],\r\n// 'sma-se':[',',' ','yy-mm-dd'],\r\n// 'ar-om':['.',',','dd/mm/yy'],\r\n// 'en-jm':['.',',','dd/mm/yy'],\r\n// 'es-ve':[',','.','dd/mm/yy'],\r\n// 'bs-cyrl-ba':[',','.','d.m.yy'],\r\n// 'sms-fi':[',',' ','d.m.yy'],\r\n// 'ar-ye':['.',',','dd/mm/yy'],\r\n// 'en-029':['.',',','mm/dd/yy'],\r\n// 'es-co':[',','.','dd/mm/yy'],\r\n// 'sr-latn-rs':[',','.','d.m.yy'],\r\n// 'smn-fi':[',',' ','d.m.yy'],\r\n// 'ar-sy':['.',',','dd/mm/yy'],\r\n// 'en-bz':['.',',','dd/mm/yy'],\r\n// 'es-pe':['.',',','dd/mm/yy'],\r\n// 'sr-cyrl-rs':[',','.','d.m.yy'],\r\n// 'ar-jo':['.',',','dd/mm/yy'],\r\n// 'en-tt':['.',',','dd/mm/yy'],\r\n// 'es-ar':[',','.','dd/mm/yy'],\r\n// 'sr-latn-me':[',','.','d.m.yy'],\r\n// 'ar-lb':['.',',','dd/mm/yy'],\r\n// 'en-zw':['.',',','m/d/yy'],\r\n// 'es-ec':[',','.','dd/mm/yy'],\r\n// 'sr-cyrl-me':[',','.','d.m.yy'],\r\n// 'ar-kw':['.',',','dd/mm/yy'],\r\n// 'en-ph':['.',',','m/d/yy'],\r\n// 'es-cl':[',','.','dd-mm-yy'],\r\n// 'ar-ae':['.',',','dd/mm/yy'],\r\n// 'es-uy':[',','.','dd/mm/yy'],\r\n// 'ar-bh':['.',',','dd/mm/yy'],\r\n// 'es-py':[',','.','dd/mm/yy'],\r\n// 'ar-qa':['.',',','dd/mm/yy'],\r\n// 'en-in':['.',',','dd-mm-yy'],\r\n// 'es-bo':[',','.','dd/mm/yy'],\r\n// 'en-my':['.',',','d/m/yy'],\r\n// 'es-sv':['.',',','dd/mm/yy'],\r\n// 'en-sg':['.',',','d/m/yy'],\r\n// 'es-hn':['.',',','dd/mm/yy'],\r\n// 'es-ni':['.',',','dd/mm/yy'],\r\n// 'es-pr':['.',',','dd/mm/yy'],\r\n// 'es-us':['.',',','m/d/yy'],\r\n// 'bs-cyrl':[',','.','d.m.yy'],\r\n// 'bs-latn':[',','.','d.m.yy'],\r\n// 'sr-cyrl':[',','.','d.m.yy'],\r\n// 'sr-latn':[',','.','d.m.yy'],\r\n// 'smn':[',',' ','d.m.yy'],\r\n// 'az-cyrl':[',',' ','dd.mm.yy'],\r\n// 'sms':[',',' ','d.m.yy'],\r\n// 'zh':['.',',','yy/m/d'],\r\n// 'nn':[',',' ','dd.mm.yy'],\r\n// 'bs':[',','.','d.m.yy'],\r\n// 'az-latn':[',',' ','dd.mm.yy'],\r\n// 'sma':[',',' ','yy-mm-dd'],\r\n// 'uz-cyrl':[',',' ','dd.mm.yy'],\r\n// 'mn-cyrl':[',',' ','y.mm.dd'],\r\n// 'iu-cans':['.',',','d/m/yy'],\r\n// 'zh-hant':['.',',','d/m/yy'],\r\n// 'nb':[',',' ','dd.mm.yy'],\r\n// 'sr':[',','.','d.m.yy'],\r\n// 'tg-cyrl':[',',' ','dd.mm.y'],\r\n// 'dsb':[',','.','d. m. yy'],\r\n// 'smj':[',',' ','yy-mm-dd'],\r\n// 'uz-latn':[',',' ','dd/mm yy'],\r\n// 'mn-mong':['.',',','yy/m/d'],\r\n// 'iu-latn':['.',',','d/mm/yy'],\r\n// 'tzm-latn':[',','.','dd-mm-yy'],\r\n// 'ha-latn':['.',',','d/m/yy'],\r\n// 'zh-chs':['.',',','yy/m/d'],\r\n// 'zh-cht':['.',',','d/m/yy'],\r\n'':['.',',','yy-mm-dd'] }\r\n};\r\n\r\n_w._culture = culture;\r\n\r\n/**\r\n * culture info for date and number formatting and parsing\r\n */\r\nexport default culture;\r\n","import culture from \"./culture\";\r\n\r\n/*\r\n * contains function to parse and format numeric values\r\n */\r\n\r\n\r\n//*** all following parts are extracted out of jquery-ui library (GPL/MIT license) ***/\r\n\r\nvar _helper = {\r\n _defaults: { shortYearCutoff: \"+10\", dayNames: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"], monthNames: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"], dayNamesShort: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"], monthNamesShort: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"] },\r\n _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),\r\n _daylightSavingAdjust(date) {\r\n if (!date) { return null; }\r\n date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);\r\n return date;\r\n },\r\n _getDaysInMonth(year, month) {\r\n return 32 - _helper._daylightSavingAdjust(new Date(year, month, 32)).getDate();\r\n }\r\n};\r\n\r\n\r\n\r\nexport abstract class date {\r\n\r\n\r\n /* Parse a string value into a date object.\r\nSee formatDate below for the possible formats.\r\n\r\n@param format string - the expected format of the date\r\n@param value string - the date in the above format\r\n@param settings Object - attributes include:\r\nshortYearCutoff number - the cutoff year for determining the century (optional)\r\ndayNamesShort string[7] - abbreviated names of the days from Sunday (optional)\r\ndayNames string[7] - names of the days from Sunday (optional)\r\nmonthNamesShort string[12] - abbreviated names of the months (optional)\r\nmonthNames string[12] - names of the months (optional)\r\n@return Date - the extracted date value or null if value is blank */\r\n public static parse(value: string, format?: string, settings?): Date {\r\n if (value === null) {\r\n return null;\r\n }\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n if (value == \"\") {\r\n return null;\r\n }\r\n format = format || culture.info.dateFormat;\r\n //value = (typeof value == 'object' ? value.toString() : value + '');\r\n let shortYearCutoff = (settings ? settings.shortYearCutoff : null) || _helper._defaults.shortYearCutoff;\r\n shortYearCutoff = (typeof shortYearCutoff != \"string\" ? shortYearCutoff :\r\n new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));\r\n let dayNamesShort = (settings ? settings.dayNamesShort : null) || _helper._defaults.dayNamesShort;\r\n let dayNames = (settings ? settings.dayNames : null) || _helper._defaults.dayNames;\r\n let monthNamesShort = (settings ? settings.monthNamesShort : null) || _helper._defaults.monthNamesShort;\r\n let monthNames = (settings ? settings.monthNames : null) || _helper._defaults.monthNames;\r\n let year = -1;\r\n let month = -1;\r\n let day = -1;\r\n let doy = -1;\r\n let literal = false;\r\n // Check whether a format character is doubled\r\n let lookAhead = function (match) {\r\n let matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);\r\n if (matches) {\r\n iFormat++;\r\n }\r\n return matches;\r\n };\r\n // Extract a number from the string value\r\n let getNumber = function (match) {\r\n let isDoubled = lookAhead(match);\r\n let size = (match == \"@\" ? 14 : (match == \"!\" ? 20 :\r\n (match == \"y\" && isDoubled ? 4 : (match == \"o\" ? 3 : 2))));\r\n let digits = new RegExp(\"^\\\\d{1,\" + size + \"}\");\r\n let num = value.substring(iValue).match(digits);\r\n if (!num) {\r\n throw \"Missing number at position \" + iValue;\r\n }\r\n iValue += num[0].length;\r\n return parseInt(num[0], 10);\r\n };\r\n // Extract a name from the string value and convert to an index\r\n let getName = function (match, shortNames, longNames) {\r\n let names = (lookAhead(match) ? longNames : shortNames);\r\n for (let i = 0; i < names.length; i++) {\r\n if (value.substr(iValue, names[i].length).toLowerCase() == names[i].toLowerCase()) {\r\n iValue += names[i].length;\r\n return i + 1;\r\n }\r\n }\r\n throw new Error(\"Unknown name at position \" + iValue);\r\n };\r\n // Confirm that a literal character matches the string value\r\n let checkLiteral = function () {\r\n if (value.charAt(iValue) != format.charAt(iFormat)) {\r\n throw \"Unexpected literal at position \" + iValue;\r\n }\r\n iValue++;\r\n };\r\n let iValue = 0;\r\n for (var iFormat = 0; iFormat < format.length; iFormat++) {\r\n if (literal) {\r\n if (format.charAt(iFormat) == \"'\" && !lookAhead(\"'\")) {\r\n literal = false;\r\n } else {\r\n checkLiteral();\r\n }\r\n } else {\r\n switch (format.charAt(iFormat)) {\r\n case \"d\":\r\n day = getNumber(\"d\");\r\n break;\r\n case \"D\":\r\n getName(\"D\", dayNamesShort, dayNames);\r\n break;\r\n case \"o\":\r\n doy = getNumber(\"o\");\r\n break;\r\n case \"m\":\r\n month = getNumber(\"m\");\r\n break;\r\n case \"M\":\r\n month = getName(\"M\", monthNamesShort, monthNames);\r\n break;\r\n case \"y\":\r\n year = getNumber(\"y\");\r\n break;\r\n case \"@\":\r\n var date = new Date(getNumber(\"@\"));\r\n year = date.getFullYear();\r\n month = date.getMonth() + 1;\r\n day = date.getDate();\r\n break;\r\n case \"!\":\r\n var date = new Date((getNumber(\"!\") - _helper._ticksTo1970) / 10000);\r\n year = date.getFullYear();\r\n month = date.getMonth() + 1;\r\n day = date.getDate();\r\n break;\r\n case \"'\":\r\n if (lookAhead(\"'\")) {\r\n checkLiteral();\r\n } else {\r\n literal = true;\r\n }\r\n break;\r\n default:\r\n checkLiteral();\r\n }\r\n }\r\n }\r\n if (year == -1) {\r\n year = new Date().getFullYear();\r\n } else if (year < 100) {\r\n year += new Date().getFullYear() - new Date().getFullYear() % 100 +\r\n (year <= shortYearCutoff ? 0 : -100);\r\n }\r\n if (doy > -1) {\r\n month = 1;\r\n day = doy;\r\n do {\r\n let dim = _helper._getDaysInMonth(year, month - 1);\r\n if (day <= dim) {\r\n break;\r\n }\r\n month++;\r\n day -= dim;\r\n } while (true);\r\n }\r\n let result = _helper._daylightSavingAdjust(new Date(year, month - 1, day));\r\n if (result.getFullYear() != year || result.getMonth() + 1 != month || result.getDate() != day) {\r\n throw new Error(\"Invalid date\");\r\n } // E.g. 31/02/*\r\n return result;\r\n }\r\n\r\n /* Format a date object into a string value.\r\nThe format can be combinations of the following:\r\nd - day of month (no leading zero)\r\ndd - day of month (two digit)\r\no - day of year (no leading zeros)\r\noo - day of year (three digit)\r\nD - day name short\r\nDD - day name long\r\nm - month of year (no leading zero)\r\nmm - month of year (two digit)\r\nM - month name short\r\nMM - month name long\r\ny - year (two digit)\r\nyy - year (four digit)\r\n@ - Unix timestamp (ms since 01/01/1970)\r\n! - Windows ticks (100ns since 01/01/0001)\r\n'...' - literal text\r\n'' - single quote\r\n\r\n@param format string - the desired format of the date\r\n@param date Date - the date value to format\r\n@param settings Object - attributes include:\r\ndayNamesShort string[7] - abbreviated names of the days from Sunday (optional)\r\ndayNames string[7] - names of the days from Sunday (optional)\r\nmonthNamesShort string[12] - abbreviated names of the months (optional)\r\nmonthNames string[12] - names of the months (optional)\r\n@return string - the date in the above format */\r\n public static format(date: Date, format?: string, settings?): string {\r\n if (!date || isNaN(date as any)) {\r\n return \"\";\r\n }\r\n format = format || culture.info.dateFormat;\r\n let dayNamesShort = (settings ? settings.dayNamesShort : null) || _helper._defaults.dayNamesShort;\r\n let dayNames = (settings ? settings.dayNames : null) || _helper._defaults.dayNames;\r\n let monthNamesShort = (settings ? settings.monthNamesShort : null) || _helper._defaults.monthNamesShort;\r\n let monthNames = (settings ? settings.monthNames : null) || _helper._defaults.monthNames;\r\n // Check whether a format character is doubled\r\n let lookAhead = function (match) {\r\n let matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);\r\n if (matches) {\r\n iFormat++;\r\n }\r\n return matches;\r\n };\r\n // Format a number, with leading zero if necessary\r\n let formatNumber = function (match, value, len) {\r\n let num = \"\" + value;\r\n if (lookAhead(match)) {\r\n while (num.length < len) {\r\n num = \"0\" + num;\r\n }\r\n }\r\n return num;\r\n };\r\n // Format a name, short or long as requested\r\n let formatName = function (match, value, shortNames, longNames) {\r\n return (lookAhead(match) ? longNames[value] : shortNames[value]);\r\n };\r\n let output = \"\";\r\n let literal = false;\r\n if (date) {\r\n for (var iFormat = 0; iFormat < format.length; iFormat++) {\r\n if (literal) {\r\n if (format.charAt(iFormat) == \"'\" && !lookAhead(\"'\")) {\r\n literal = false;\r\n } else {\r\n output += format.charAt(iFormat);\r\n }\r\n } else {\r\n switch (format.charAt(iFormat)) {\r\n case \"d\":\r\n output += formatNumber(\"d\", date.getDate(), 2);\r\n break;\r\n case \"D\":\r\n output += formatName(\"D\", date.getDay(), dayNamesShort, dayNames);\r\n break;\r\n case \"o\":\r\n output += formatNumber(\"o\",\r\n (date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000, 3);\r\n break;\r\n case \"m\":\r\n output += formatNumber(\"m\", date.getMonth() + 1, 2);\r\n break;\r\n case \"M\":\r\n output += formatName(\"M\", date.getMonth(), monthNamesShort, monthNames);\r\n break;\r\n case \"y\":\r\n output += (lookAhead(\"y\") ? date.getFullYear() :\r\n (date.getFullYear() % 100 < 10 ? \"0\" : \"\") + date.getFullYear() % 100);\r\n break;\r\n case \"@\":\r\n output += date.getTime();\r\n break;\r\n case \"!\":\r\n output += date.getTime() * 10000 + _helper._ticksTo1970;\r\n break;\r\n case \"'\":\r\n if (lookAhead(\"'\")) {\r\n output += \"'\";\r\n } else {\r\n literal = true;\r\n }\r\n break;\r\n default:\r\n output += format.charAt(iFormat);\r\n }\r\n }\r\n }\r\n }\r\n return output;\r\n }\r\n\r\n public static formatTime(value: Date, inputMode: \"HourMinute\" | \"HourMinuteSecond\"): string {\r\n if (inputMode === \"HourMinute\") {\r\n return value ? (pad(value.getHours()) + \":\" + pad(value.getMinutes())) : \"\";\r\n } else if (inputMode === \"HourMinuteSecond\") {\r\n return value ? (pad(value.getHours()) + \":\" + pad(value.getMinutes()) + \":\" + pad(value.getSeconds())) : \"\";\r\n }\r\n return \"\";\r\n }\r\n\r\n public static now(): Date {\r\n return new Date();\r\n }\r\n\r\n public static addSeconds(d, seconds): Date {\r\n const future = new Date(d);\r\n future.setSeconds(d.getSeconds() + seconds);\r\n return future;\r\n }\r\n\r\n public static addMinutes(d, minutes): Date {\r\n const future = new Date(d);\r\n future.setMinutes(d.getMinutes() + minutes);\r\n return future;\r\n }\r\n\r\n public static addHours(d, hours): Date {\r\n const future = new Date(d);\r\n future.setHours(d.getHours() + hours);\r\n return future;\r\n }\r\n\r\n public static addDays(d, days) {\r\n const future = new Date(d);\r\n future.setDate(d.getDate() + days);\r\n return future;\r\n }\r\n\r\n public static getDaysBetween(startDate, endDate): number {\r\n return Math.round((endDate - startDate) / (1000.0 * 3600.0 * 24.0));\r\n }\r\n\r\n public static getMsBetween(startDate, endDate): number {\r\n return endDate.getTime() - startDate.getTime();\r\n }\r\n\r\n public static onlyDate(d: Date): Date {\r\n if (d == null) {\r\n return d;\r\n }\r\n const result = new Date(d);\r\n result.setHours(0, 0, 0, 0);\r\n return result;\r\n }\r\n\r\n public static equal(date1: Date, date2: Date): boolean {\r\n return (date1 && date1.getTime()) === (date2 && date2.getTime());\r\n }\r\n\r\n}\r\n\r\nfunction pad(nr: number): string {\r\n if (nr < 10) {\r\n return \"0\" + nr.toString();\r\n } else {\r\n return nr.toString();\r\n }\r\n}\r\n","import { ISlickColumn } from \"../slick.core\";\r\nimport { UILang } from \"../../core/lang\";\r\nimport { helper } from \"../../core/helper\";\r\nimport { Dialog } from \"../../ui/dialog\";\r\nimport { IJSLGrid, ISlickCreatorOptions } from \"../../index\";\r\nimport { VirtualRenderComponent } from \"../../components/virtual-render/VirtualRenderComponent\";\r\nimport { JSLRender } from \"jsl-render\";\r\n\r\nexport class ExcelFilter {\r\n\r\n private static convertRemToPixels(rem: number) {\r\n return rem * parseFloat(getComputedStyle(document.documentElement).fontSize);\r\n }\r\n\r\n public constructor(private grid: IJSLGrid<any>) {\r\n }\r\n\r\n public async show(col: ISlickColumn): Promise<void> {\r\n let values: { [key: string]: any[] } | string[];\r\n const filters = this.grid.getFilters();\r\n const currentFilters = filters.filter((f) => f.columnId === col.id);\r\n const mode = (this.grid.getOptions() as ISlickCreatorOptions).mode;\r\n if (mode === \"client\") {\r\n // remove any filters for this column\r\n if (currentFilters.length > 0) {\r\n this.grid.clearFilter(col.id);\r\n }\r\n values = this.getDistinctValues(col);\r\n } else {\r\n const filterOptions = (this.grid.getOptions() as ISlickCreatorOptions).getFilterValues;\r\n if (filterOptions == null) {\r\n throw new Error(\"getFilterValues option has to be set when filter mode = server\");\r\n }\r\n values = await filterOptions(col);\r\n }\r\n\r\n let oldCheckedValues = {};\r\n if (currentFilters.length > 0) {\r\n for (const f of currentFilters) {\r\n if ((f as any)._checkedValues) {\r\n oldCheckedValues = (f as any)._checkedValues;\r\n }\r\n if (mode === \"client\") {\r\n filters.push(f);\r\n }\r\n }\r\n if (mode === \"client\") {\r\n this.grid.refreshFilters();\r\n }\r\n }\r\n\r\n const dlg = document.createElement(\"div\");\r\n dlg.classList.add(\"jsl-dialog-overlay\");\r\n dlg.innerHTML = '<div class=\"jsl-dialog\" style=\"width:50vw;min-height:50vh;\"><div class=\"dlg-header\">' + UILang.grid.Filter + '</div><div class=\"dlg-body\" style=\"max-height:calc(100vh - 7.5rem)\"></div>' +\r\n '<div class=\"dlg-footer\">' +\r\n '<button class=\"jsl-button ok-button\">' + UILang.core.Ok + \"</button>\" +\r\n (currentFilters.length > 0 ? ('<button class=\"jsl-button clear-button\">' + UILang.grid.ClearFilter + '</button>') : \"\") +\r\n '<button class=\"jsl-button close-button\">' + UILang.core.Cancel + \"</button>\" +\r\n \"</div></div>\";\r\n const dlgBody = dlg.querySelector(\".dlg-body\") as HTMLElement;\r\n\r\n const id = helper.newDomGuid();\r\n\r\n const search = document.createElement(\"div\");\r\n search.innerHTML = \"<input type='text' placeholder='\" + UILang.grid.Search + \"' />\";\r\n dlgBody.appendChild(search);\r\n\r\n const cbAllContainer = document.createElement(\"div\");\r\n const cbAll: HTMLInputElement = document.createElement(\"input\");\r\n cbAll.type = \"checkbox\";\r\n cbAll.id = id;\r\n cbAllContainer.appendChild(cbAll);\r\n const cbAllLabel: HTMLLabelElement = document.createElement(\"label\");\r\n cbAllLabel.setAttribute(\"for\", id);\r\n cbAllLabel.textContent = UILang.core.All;\r\n cbAllLabel.style.cursor = \"pointer\";\r\n cbAllLabel.style.marginLeft = \"0.2rem\";\r\n cbAllContainer.appendChild(cbAllLabel);\r\n dlgBody.appendChild(cbAllContainer);\r\n\r\n const sortedValues = [];\r\n if (Array.isArray(values)) {\r\n for (const x of values) {\r\n sortedValues.push({ id: [x], txt: x ?? \"\" });\r\n }\r\n } else {\r\n for (const o in values) {\r\n if (values.hasOwnProperty(o)) {\r\n sortedValues.push({ id: values[o], txt: o ?? \"\" });\r\n }\r\n }\r\n }\r\n // TODO: use custom comparer when available\r\n sortedValues.sort((a, b) => a.txt.toLocaleLowerCase() < b.txt.toLocaleLowerCase() ? -1 : (a.txt.toLocaleLowerCase() > b.txt.toLocaleLowerCase() ? 1 : 0));\r\n\r\n let visibleValues = sortedValues;\r\n const checkedValues = { ...oldCheckedValues };\r\n\r\n const cbContainer = document.createElement(\"div\");\r\n dlgBody.appendChild(cbContainer);\r\n const rowHeight = Math.round(ExcelFilter.convertRemToPixels(1.4));\r\n let height = sortedValues.length * rowHeight;\r\n height = Math.min(height, Math.round(window.innerHeight - ExcelFilter.convertRemToPixels(13)));\r\n const vr = new VirtualRenderComponent({\r\n data: visibleValues,\r\n renderRow: (args) => {\r\n args.container.attr.style[\"padding-left\"] = \"1rem\";\r\n args.container.children.push({\r\n tag: \"input\",\r\n attr: {\r\n id: id + \"_\" + args.index,\r\n checked: checkedValues[args.rowData.id[0]] ? \"checked\" : undefined,\r\n change: (_, node) => {\r\n if (node.dom.checked) {\r\n for (const selId of args.rowData.id) {\r\n checkedValues[selId] = true;\r\n }\r\n } else {\r\n for (const selId of args.rowData.id) {\r\n delete checkedValues[selId];\r\n }\r\n }\r\n // check if all values or none are checked\r\n const allChecked = Object.getOwnPropertyNames(checkedValues).length === sortedValues.length;\r\n const allCb: HTMLInputElement = dlgBody.querySelector(\"#\" + id) as HTMLInputElement;\r\n allCb.checked = allChecked;\r\n },\r\n type: \"checkbox\"\r\n }\r\n });\r\n args.container.children.push({\r\n tag: \"label\",\r\n attr: {\r\n for: id + \"_\" + args.index,\r\n style: \"margin-left:0.2rem;cursor:pointer\"\r\n },\r\n raw: true,\r\n content: args.rowData.txt\r\n });\r\n }\r\n ,\r\n rowHeight,\r\n style: \"height:\" + height + \"px\"\r\n });\r\n\r\n const renderer = new JSLRender(cbContainer, false);\r\n renderer.render(vr);\r\n\r\n search.addEventListener(\"input\", (evt) => {\r\n const term = ((evt.target as HTMLInputElement).value ?? \"\").toLowerCase();\r\n if (term) {\r\n visibleValues = sortedValues.filter((x) =>\r\n (x.txt ?? \"\").toLowerCase().indexOf(term) >= 0);\r\n } else {\r\n visibleValues = sortedValues;\r\n }\r\n vr.setData(visibleValues);\r\n renderer.refresh();\r\n });\r\n\r\n cbAll.addEventListener(\"change\", () => {\r\n for (let i = 0; i < visibleValues.length; i++) {\r\n // if (cbAll.checked) {\r\n // checkedValues[visibleValues[i].id] = true;\r\n // } else {\r\n // delete checkedValues[visibleValues[i].id];\r\n // }\r\n if (cbAll.checked) {\r\n for (const selId of visibleValues[i].id) {\r\n checkedValues[selId] = true;\r\n }\r\n } else {\r\n for (const selId of visibleValues[i].id) {\r\n delete checkedValues[selId];\r\n }\r\n }\r\n }\r\n renderer.refresh();\r\n });\r\n\r\n document.body.appendChild(dlg);\r\n const dlgObj = Dialog(dlg, {\r\n autoOpen: true, onClose: () => {\r\n dlg.innerHTML = \"\";\r\n dlg.parentElement.removeChild(dlg);\r\n }\r\n });\r\n\r\n const dlgOkButton = dlg.querySelector(\".dlg-footer .ok-button\");\r\n dlgOkButton.addEventListener(\"click\", (evt) => {\r\n\r\n const selLength = Object.getOwnPropertyNames(checkedValues).length;\r\n const allChecked = selLength === sortedValues.length;\r\n const anyChecked = selLength > 0;\r\n this.grid.clearFilter(col.id, true);\r\n if (!allChecked && anyChecked) {\r\n // something (but not everything) was selected -> filter\r\n const filterObject = {\r\n field: col.field, columnId: col.id, match: mode === \"server\" ? () => true : (item, field) => {\r\n return !!checkedValues[this.grid.getDataItemValueForColumn(item, col)];\r\n }\r\n };\r\n (filterObject as any)._checkedValues = checkedValues;\r\n this.grid.addFilter(filterObject, true);\r\n }\r\n this.grid.refreshFilters();\r\n dlgObj.close();\r\n });\r\n\r\n const dlgCancelButton = dlg.querySelector(\".dlg-footer .close-button\");\r\n dlgCancelButton.addEventListener(\"click\", (evt) => {\r\n dlgObj.close();\r\n });\r\n\r\n const dlgClearButton = dlg.querySelector(\".dlg-footer .clear-button\");\r\n if (dlgClearButton != null) {\r\n dlgClearButton.addEventListener(\"click\", (evt) => {\r\n this.grid.clearFilter(col.id);\r\n dlgObj.close();\r\n });\r\n }\r\n }\r\n\r\n // private updateStateOfAllCheckebox(dlgBody: HTMLElement, id: string) {\r\n // let counter = 0;\r\n // let el: HTMLInputElement;\r\n // const allCb: HTMLInputElement = dlgBody.querySelector(\"#\" + id) as HTMLInputElement;\r\n // // tslint:disable-next-line: no-conditional-assignment\r\n // while (null != (el = dlgBody.querySelector(\"#\" + id + \"_\" + counter) as HTMLInputElement)) {\r\n // if (el.parentElement.style.display !== \"none\" && !el.checked) {\r\n // allCb.checked = false;\r\n // return;\r\n // }\r\n // counter++;\r\n // }\r\n // allCb.checked = true;\r\n // }\r\n\r\n // private checkAllVisibleBoxes(el: HTMLElement, state: boolean) {\r\n // const checkboxes = el.querySelectorAll(\"input\");\r\n // for (let i = 0; i < checkboxes.length; i++) {\r\n // if (checkboxes[i].type === \"checkbox\" &&\r\n // checkboxes[i].parentElement.style.display !== \"none\") {\r\n // checkboxes[i].checked = state;\r\n // }\r\n // }\r\n // }\r\n\r\n private getDistinctValues(col: ISlickColumn): any {\r\n const textToValues = {};\r\n for (let idx = 0, len = this.grid.getDataLength(); idx < len; idx++) {\r\n const item = this.grid.getDataItem(idx);\r\n const value = this.grid.getDataItemValueForColumn(item, col);\r\n const text = this.grid.getFormattedValue(col, value, item);\r\n let valueList = textToValues[text];\r\n if (valueList == null) {\r\n valueList = textToValues[text] = [];\r\n }\r\n if (valueList.indexOf(value) < 0) {\r\n valueList.push(value);\r\n }\r\n }\r\n return textToValues;\r\n }\r\n\r\n\r\n}\r\n","\r\nexport class UILang {\r\n public static core = {\r\n All: \"All\",\r\n Ok: \"Ok\",\r\n Cancel: \"Cancel\"\r\n };\r\n\r\n public static grid = {\r\n Sort: \"Sort\",\r\n Asc: \"Ascending\",\r\n Desc: \"Descending\",\r\n Filter: \"Filter\",\r\n ClearFilter: \"Clear Filter\",\r\n Search: \"Search\"\r\n };\r\n\r\n public static dropDown = {\r\n SelectOption: \"Select an option...\",\r\n SelectOptionMultiple: \"Enter options...\",\r\n NoResults: \"No results\",\r\n NoOptions: \"No options available\",\r\n MaxSelection: \"A maximum of {max} items can be selected\",\r\n AlreadyInUse: \"That tag is already in use\",\r\n Search: \"Search ...\"\r\n };\r\n}\r\n","export abstract class helper {\r\n\r\n public static emptyGuid = \"00000000-0000-0000-0000-000000000000\";\r\n\r\n public static random() {\r\n return (Math.random() * (new Date().getTime() || 1)) % 1;\r\n }\r\n\r\n public static newGuid() {\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) { const r = helper.random() * 16 | 0, v = c == \"x\" ? r : r & 0x3 | 0x8; return v.toString(16); });\r\n }\r\n\r\n public static newSeqGuid() {\r\n let d = new Date().getTime().toString(16);\r\n while (d.length < 12) {\r\n d = \"0\" + d;\r\n }\r\n if (d.length > 12) {\r\n d = d.substring(0, 12);\r\n }\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-\".replace(/[xy]/g, function (c) { var r = helper.random() * 16 | 0, v = c == \"x\" ? r : r & 0x3 | 0x8; return v.toString(16); })\r\n + d;\r\n }\r\n\r\n public static newDomGuid() {\r\n return \"axxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) { const r = helper.random() * 16 | 0, v = c == \"x\" ? r : r & 0x3 | 0x8; return v.toString(16); });\r\n }\r\n\r\n public static isObject(obj) {\r\n return obj ? Object.prototype.toString.call(obj) === \"[object Object]\" : false;\r\n }\r\n\r\n public static isGuid(id) {\r\n if (!id) {\r\n return false;\r\n }\r\n return /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(id);\r\n }\r\n\r\n public static getParams(): any {\r\n var match,\r\n pl = /\\+/g, // Regex for replacing addition symbol with a space\r\n search = /([^&=]+)=?([^&]*)/g,\r\n decode = function (s) { return decodeURIComponent(s.replace(pl, \" \")); },\r\n query = window.location.search.substring(1);\r\n\r\n var urlParams = {};\r\n while (match = search.exec(query))\r\n urlParams[decode(match[1])] = decode(match[2]);\r\n return urlParams;\r\n }\r\n\r\n public static isCyclic(o): boolean {\r\n const seenObjects = [];\r\n\r\n function detect(obj) {\r\n if (obj && typeof obj === 'object') {\r\n if (seenObjects.indexOf(obj) !== -1) {\r\n return true;\r\n }\r\n seenObjects.push(obj);\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key) && detect(obj[key])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n return detect(o);\r\n }\r\n\r\n public static correctDates(data: any): any {\r\n for (let key in data) {\r\n if (data[key] && typeof data[key] === \"object\")\r\n data[key] = helper.correctDates(data[key]);\r\n //else if (data[key] && data[key].toString().substring(0, 6) === \"/Date\\(\")\r\n // data[key] = new Date(parseInt(data[key].substr(6))+ timezone_offset);\r\n else if (data[key] && dateISO.test(data[key].toString())) {\r\n let x = (Date as any).fromString(data[key]);\r\n data[key] = new Date(x.getTime() + (x.getTimezoneOffset() * 60000));\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n}\r\n\r\nvar dateISO = /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.*/i;\r\n\r\n(function () {\r\n\r\n var d = window.Date as any;\r\n var regexIso8601 = /^(\\d{4})-(\\d{2})-(\\d{2})((T)(\\d{2}):(\\d{2})(:(\\d{2})(\\.\\d*)?)?)?(Z)?$/;\r\n\r\n\r\n d._myparse = function (v) {\r\n\r\n if (v.charAt(v.length - 1) !== \"Z\")\r\n v += \"Z\";\r\n var m = regexIso8601.exec(v);\r\n\r\n if (m) {\r\n return new Date(Date.UTC(+m[1], +m[2] - 1, +m[3], +m[6] || 0, +m[7] || 0, +m[9] || 0, parseInt((+m[10]) * 1000 as any) || 0));\r\n //return Date.UTC(\r\n // m[1],\r\n // (m[2] || 1) - 1,\r\n // m[3] || 1,\r\n // m[4] - (m[8] ? m[8] + m[9] : 0) || 0,\r\n // m[5] - (m[8] ? m[8] + m[10] : 0) || 0,\r\n // m[6] || 0,\r\n // ((m[7] || 0) + '00').substr(0, 3)\r\n //);\r\n }\r\n\r\n return d.parse.apply(this, arguments);\r\n };\r\n\r\n\r\n d.fromString = function (v) {\r\n return d._myparse(v);\r\n };\r\n\r\n})();\r\n","import \"./dialog.css\";\r\n\r\nexport interface IDialogOptions {\r\n autoOpen?: boolean;\r\n autoFocus?: string;\r\n modal?: boolean;\r\n closeOnEscape?: boolean;\r\n closeOnOverlayClick?: boolean;\r\n onClose?: () => void | boolean;\r\n onOpen?: () => void;\r\n}\r\n\r\nconst defaultOptions: IDialogOptions = {\r\n autoOpen: false,\r\n autoFocus: \"input,button,textarea\",\r\n closeOnOverlayClick: true,\r\n modal: true,\r\n closeOnEscape: true\r\n};\r\n\r\nexport class JSLDialog {\r\n\r\n private overlay: HTMLElement;\r\n private el: HTMLElement;\r\n\r\n private onKeydownEvent: (args: any) => void;\r\n\r\n constructor(el: HTMLElement, private options: IDialogOptions) {\r\n this.overlay = el;\r\n this.el = el.firstElementChild as HTMLElement;\r\n if (this.options.closeOnOverlayClick) {\r\n this.overlay.addEventListener(\"mousedown\", (evt) => {\r\n if (evt.target === this.overlay) {\r\n this.close();\r\n }\r\n });\r\n this.overlay.addEventListener(\"touchstart\", (evt) => {\r\n if (evt.target === this.overlay) {\r\n this.close();\r\n }\r\n });\r\n }\r\n }\r\n\r\n public open(modal?: boolean) {\r\n\r\n if ((modal !== undefined && !modal) || !this.options.modal) {\r\n this.overlay.style.background = \"transparent\";\r\n this.overlay.style.pointerEvents = \"none\";\r\n }\r\n\r\n this.overlay.style.display = \"block\";\r\n\r\n const $footer = this.el.querySelector(\".dlg-footer\");\r\n const $body = this.el.querySelector(\".dlg-body\");\r\n if ($footer != null && $body != null) {\r\n // TODO ?\r\n }\r\n if (this.options.autoFocus) {\r\n setTimeout(() => {\r\n const firstInput = this.el.querySelector(this.options.autoFocus) as HTMLInputElement;\r\n if (firstInput != null) {\r\n firstInput.focus();\r\n }\r\n }, 0);\r\n }\r\n\r\n if (this.options.closeOnEscape) {\r\n this.onKeydownEvent = (args) => {\r\n if (args.keyCode === 27) { // escape\r\n this.close();\r\n }\r\n };\r\n document.addEventListener(\"keydown\", this.onKeydownEvent);\r\n }\r\n\r\n if (this.options.onOpen) {\r\n this.options.onOpen();\r\n }\r\n }\r\n\r\n public close() {\r\n if (this.options.onClose) {\r\n if (this.options.onClose() === false) {\r\n return;\r\n }\r\n }\r\n this.overlay.style.display = \"none\";\r\n\r\n if (this.onKeydownEvent != null) {\r\n document.removeEventListener(\"keydown\", this.onKeydownEvent);\r\n }\r\n }\r\n\r\n public getOverlay() {\r\n return this.overlay;\r\n }\r\n\r\n}\r\n\r\nexport function Dialog(input: HTMLElement | string, options?: IDialogOptions): JSLDialog {\r\n\r\n const o = { ...defaultOptions, ...options };\r\n\r\n let el: HTMLElement;\r\n\r\n if (typeof input === \"string\") {\r\n el = document.querySelector(input);\r\n } else {\r\n el = input;\r\n }\r\n\r\n const result = new JSLDialog(el, o);\r\n\r\n if (!o.autoOpen) {\r\n el.style.display = \"none\";\r\n } else {\r\n result.open();\r\n }\r\n return result;\r\n\r\n}\r\n","import \"./VirtualRenderStyle.scss\";\r\nimport { IJSLComponent, IJSLVNode, JSLRender } from \"jsl-render\";\r\n\r\nexport interface IVirtualArg {\r\n index: number;\r\n rowData: any;\r\n container: IJSLVNode;\r\n}\r\n\r\nexport interface IVirtualRenderOptions {\r\n data: any[];\r\n renderRow: (args: IVirtualArg) => string | IJSLVNode | IJSLComponent | void;\r\n rowHeight?: number;\r\n rowTag?: string;\r\n bufferSizeInPx?: number;\r\n viewportSizeInPX?: number;\r\n class?: string;\r\n style?: string;\r\n}\r\n\r\nexport class VirtualRenderComponent implements IJSLComponent {\r\n\r\n public State: {scrollPos: number, renderer?: JSLRender} = { scrollPos: 0};\r\n\r\n private options: IVirtualRenderOptions;\r\n\r\n constructor(options: IVirtualRenderOptions) {\r\n const defaultOptions: IVirtualRenderOptions = {\r\n data: null,\r\n renderRow: null,\r\n bufferSizeInPx: 200,\r\n rowHeight: 20,\r\n rowTag: \"div\",\r\n viewportSizeInPX: window.innerHeight\r\n };\r\n this.options = { ...defaultOptions, ...options };\r\n }\r\n\r\n public isEqual(node: IJSLComponent): boolean {\r\n return (this as any).__proto__ === (node as any).__proto__;\r\n }\r\n\r\n public setData(data: any[]) {\r\n this.options.data = data;\r\n }\r\n\r\n public onInit(renderer: JSLRender) {\r\n this.State.renderer = renderer;\r\n }\r\n\r\n public render(): IJSLVNode {\r\n const o = this.options;\r\n const vrBody = {\r\n tag: \"div\",\r\n attr: { class: \"v-r-child\", style: \"height:\" + (o.data.length * o.rowHeight) + \"px;position:relative\" },\r\n children: this.getChildren()\r\n };\r\n const vrContainer = {\r\n tag: \"div\", attr: {\r\n class: \"v-r-comp \" + (o.class ?? \"\"),\r\n style: \"overflow-y:auto;\" + (o.style ?? \"\"),\r\n scroll: (e, node: IJSLVNode) => {\r\n const newScrollPos = node.dom.scrollTop;\r\n if (Math.abs(this.State.scrollPos - newScrollPos) < o.bufferSizeInPx) {\r\n return false;\r\n }\r\n this.State.scrollPos = newScrollPos;\r\n vrBody.children = this.getChildren();\r\n (node.children[0] as IJSLVNode).children = [{tag: \"dummy\"}];\r\n (this.State.renderer as any).updateNode(node.children[0], vrBody);\r\n return false;\r\n }\r\n }, children: [vrBody]\r\n };\r\n return vrContainer;\r\n }\r\n\r\n // public scrollRowToTop(idx: number) {\r\n\r\n // }\r\n\r\n // public scrollRowToCenter(idx: number) {\r\n\r\n // }\r\n\r\n // public scrollRowToBottom(idx: number) {\r\n\r\n // }\r\n\r\n private getChildren() {\r\n const o = this.options;\r\n const children = [];\r\n const viewport = {\r\n top: Math.floor((this.State.scrollPos - o.bufferSizeInPx) / o.rowHeight),\r\n bottom: Math.ceil((this.State.scrollPos + o.viewportSizeInPX + o.bufferSizeInPx) / o.rowHeight)\r\n };\r\n for (let idx = viewport.top; idx < viewport.bottom; idx++) {\r\n if (idx < 0 || idx >= o.data.length) {\r\n continue;\r\n }\r\n const node: IJSLVNode = {\r\n tag: o.rowTag, attr: {\r\n style: {\r\n top: (idx * o.rowHeight) + \"px\",\r\n height: o.rowHeight + \"px\",\r\n position: \"absolute\",\r\n left: \"0\",\r\n right: \"0\"\r\n }\r\n }, children: []\r\n };\r\n const result = o.renderRow({ index: idx, container: node, rowData: o.data[idx] });\r\n if (typeof result === \"string\") {\r\n node.content = result;\r\n } else if (result != null) {\r\n node.children.push(result as (IJSLVNode | IJSLComponent));\r\n }\r\n\r\n children.push(node);\r\n }\r\n return children;\r\n }\r\n\r\n}\r\n","/*\r\n * Contains basic SlickGrid editors.\r\n */\r\n\r\nimport { numeric } from \"../core/numeric\";\r\nimport { handleKeydownLRNav, handleKeydownLRNoNav } from \"./slick.editors.nav\";\r\n\r\nexport function TextEditor(args) {\r\n var input: HTMLInputElement;\r\n var defaultValue;\r\n var scope = this;\r\n\r\n this.init = function () {\r\n var navOnLR = args.grid.getOptions().editorCellNavOnLRKeys;\r\n input = document.createElement(\"input\");\r\n input.type = \"text\";\r\n input.className = \"editor-text\";\r\n if (args.column.maxLength > 0) {\r\n input.maxLength = args.column.maxLength;\r\n }\r\n input.addEventListener(\"keydown\", navOnLR ? handleKeydownLRNav : handleKeydownLRNoNav);\r\n args.container.appendChild(input);\r\n input.focus();\r\n input.select();\r\n };\r\n\r\n this.destroy = function () {\r\n input.parentElement.removeChild(input);\r\n };\r\n\r\n this.focus = function () {\r\n input.focus();\r\n };\r\n\r\n this.getValue = function () {\r\n return input.value;\r\n };\r\n\r\n this.setValue = function (val) {\r\n input.value = val;\r\n };\r\n\r\n this.loadValue = function (item) {\r\n defaultValue = item[args.column.field] || \"\";\r\n input.value = defaultValue;\r\n input.defaultValue = defaultValue;\r\n input.select();\r\n };\r\n\r\n this.serializeValue = function () {\r\n return input.value;\r\n };\r\n\r\n this.applyValue = function (item, state) {\r\n item[args.column.field] = state;\r\n };\r\n\r\n this.isValueChanged = function () {\r\n return (!(input.value == \"\" && defaultValue == null)) && (input.value != defaultValue);\r\n };\r\n\r\n this.validate = function () {\r\n if (args.column.validator) {\r\n var validationResults = args.column.validator(input.value);\r\n if (!validationResults.valid) {\r\n return validationResults;\r\n }\r\n }\r\n\r\n return {\r\n valid: true,\r\n msg: null\r\n };\r\n };\r\n\r\n this.init();\r\n}\r\n\r\nexport function MultiLineTextEditor(args) {\r\n var input: HTMLTextAreaElement;\r\n var defaultValue;\r\n var scope = this;\r\n\r\n this.init = function () {\r\n var navOnLR = args.grid.getOptions().editorCellNavOnLRKeys;\r\n input = document.createElement(\"textarea\");\r\n if (args.column.maxLength > 0) {\r\n input.maxLength = args.column.maxLength;\r\n }\r\n input.className = \"editor-text\";\r\n input.addEventListener(\"keydown\", navOnLR ? handleKeydownLRNav : handleKeydownLRNoNav);\r\n args.container.appendChild(input);\r\n input.focus();\r\n input.select();\r\n };\r\n\r\n this.destroy = function () {\r\n input.parentElement.removeChild(input);\r\n };\r\n\r\n this.focus = function () {\r\n input.focus();\r\n };\r\n\r\n this.getValue = function () {\r\n return input.value;\r\n };\r\n\r\n this.setValue = function (val) {\r\n input.value = val;\r\n };\r\n\r\n this.loadValue = function (item) {\r\n defaultValue = item[args.column.field] || \"\";\r\n input.value = defaultValue;\r\n input.defaultValue = defaultValue;\r\n input.select();\r\n };\r\n\r\n this.serializeValue = function () {\r\n return input.value;\r\n };\r\n\r\n this.applyValue = function (item, state) {\r\n item[args.column.field] = state;\r\n };\r\n\r\n this.isValueChanged = function () {\r\n return (!(input.value == \"\" && defaultValue == null)) && (input.value != defaultValue);\r\n };\r\n\r\n this.validate = function () {\r\n if (args.column.validator) {\r\n var validationResults = args.column.validator(input.value);\r\n if (!validationResults.valid) {\r\n return validationResults;\r\n }\r\n }\r\n\r\n return {\r\n valid: true,\r\n msg: null\r\n };\r\n };\r\n\r\n this.init();\r\n}\r\n\r\n\r\nexport function NumericEditor(args) {\r\n var input: HTMLInputElement;\r\n var defaultValue;\r\n var scope = this;\r\n\r\n this.init = function () {\r\n var navOnLR = args.grid.getOptions().editorCellNavOnLRKeys;\r\n input = document.createElement(\"input\");\r\n input.type = \"text\";\r\n input.className = \"editor-text right\";\r\n input.addEventListener(\"keydown\", navOnLR ? handleKeydownLRNav : handleKeydownLRNoNav);\r\n args.container.appendChild(input);\r\n input.focus();\r\n input.select();\r\n };\r\n\r\n this.destroy = function () {\r\n input.parentElement.removeChild(input);\r\n };\r\n\r\n this.focus = function () {\r\n input.focus();\r\n };\r\n\r\n // function getDecimalPlaces() {\r\n // // returns the number of fixed decimal places or null\r\n // var rtn = args.column.editorFixedDecimalPlaces;\r\n // if (typeof rtn == 'undefined') {\r\n // rtn = (<any>FloatEditor).DefaultDecimalPlaces;\r\n // }\r\n // return (!rtn && rtn!==0 ? null : rtn);\r\n // }\r\n\r\n this.loadValue = function (item) {\r\n defaultValue = item[args.column.field];\r\n let val_as_str = numeric.format(defaultValue, args.column.format);\r\n input.value = val_as_str;\r\n input.select();\r\n };\r\n\r\n this.serializeValue = function () {\r\n return numeric.parse(input.value);\r\n };\r\n\r\n this.applyValue = function (item, state) {\r\n item[args.column.field] = state;\r\n };\r\n\r\n this.isValueChanged = function () {\r\n return numeric.parse(input.value) !== defaultValue;\r\n };\r\n\r\n this.validate = function () {\r\n if (input.value !== \"\" && numeric.parse(input.value) === undefined) {\r\n return {\r\n valid: false,\r\n msg: \"Please enter a valid number\"\r\n };\r\n }\r\n\r\n if (args.column.validator) {\r\n var validationResults = args.column.validator(numeric.parse(input.value));\r\n if (!validationResults.valid) {\r\n return validationResults;\r\n }\r\n }\r\n\r\n return {\r\n valid: true,\r\n msg: null\r\n };\r\n };\r\n\r\n this.init();\r\n}\r\n\r\nexport function BooleanEditor(args) {\r\n var $select: HTMLSelectElement;\r\n var defaultValue;\r\n var scope = this;\r\n\r\n this.init = function () {\r\n $select = document.createElement(\"select\");\r\n $select.setAttribute(\"tabIndex\", \"0\");\r\n $select.className = \"editor-yesno\"; // <OPTION value='-'>-</OPTION>\r\n $select.innerHTML = \"<OPTION value='yes'>✔</OPTION><OPTION value='no'>-</OPTION>\";\r\n args.container.appendChild($select);\r\n args.container.style.textAlign = \"center\";\r\n $select.focus();\r\n };\r\n\r\n this.destroy = function () {\r\n $select.parentElement.removeChild($select);\r\n };\r\n\r\n this.focus = function () {\r\n $select.focus();\r\n };\r\n\r\n this.loadValue = function (item) {\r\n defaultValue = item[args.column.field];\r\n $select.value = defaultValue == null ? \"-\" : (defaultValue ? \"yes\" : \"no\");\r\n $select.focus();\r\n //$select.select();\r\n };\r\n\r\n this.serializeValue = function () {\r\n if ($select.value === \"-\") {\r\n return null;\r\n }\r\n return ($select.value === \"yes\");\r\n };\r\n\r\n this.applyValue = function (item, state) {\r\n item[args.column.field] = state;\r\n };\r\n\r\n this.isValueChanged = function () {\r\n if ($select.value === \"-\" && defaultValue == null) {\r\n return false;\r\n }\r\n var v = $select.value === \"yes\";\r\n return (v !== defaultValue);\r\n };\r\n\r\n this.validate = function () {\r\n return {\r\n valid: true,\r\n msg: null\r\n };\r\n };\r\n\r\n this.init();\r\n}\r\n\r\n","\r\n\r\nexport let keyCodes = {\r\n LEFT: 37,\r\n RIGHT: 39\r\n};\r\n\r\n/*\r\n * Depending on the value of Grid option 'editorCellNavOnLRKeys', us \r\n * Navigate to the cell on the left if the cursor is at the beginning of the input string\r\n * and to the right cell if it's at the end. Otherwise, move the cursor within the text\r\n */\r\nexport function handleKeydownLRNav(e) {\r\n var cursorPosition = e.target.selectionStart;\r\n var textLength = e.target.value.length;\r\n if ((e.which === keyCodes.LEFT && cursorPosition > 0) ||\r\n e.which === keyCodes.RIGHT && cursorPosition < textLength) {\r\n e.stopImmediatePropagation();\r\n }\r\n}\r\n\r\nexport function handleKeydownLRNoNav(e) {\r\n if (e.which === keyCodes.LEFT || e.which === keyCodes.RIGHT) {\r\n e.stopImmediatePropagation();\r\n }\r\n}\r\n","import \"./slick.tree.css\";\r\nimport { IJSLGrid, ISlickCreatorOptions } from \"./slick.creator\";\r\nimport { ISlickFormatter } from \"./slick.core\";\r\n\r\nexport interface IGridTreeOptions {\r\n parentColumn: string;\r\n indentInRem?: number;\r\n enableCollapsing?: boolean;\r\n hiddenStateField?: string;\r\n collapsedStateField?: string;\r\n expandIconHTML?: string;\r\n collapseIconHTML?: string;\r\n}\r\n\r\nexport let IndentFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext, grid): string {\r\n let result = \"\";\r\n const hierachy: GridTree<any> = (grid as any)._hierachy;\r\n if (hierachy != null) {\r\n const options = hierachy.getOptions();\r\n const level = hierachy.getLevel(dataContext);\r\n if (level > 0) {\r\n result += \"<span class='jsl-indent' style='min-width:\" + (level * hierachy.getOptions().indentInRem) + \"rem;'></span>\";\r\n }\r\n if (options.enableCollapsing) {\r\n const hasChildren = hierachy.hasChildren(dataContext);\r\n if (hasChildren) {\r\n if (dataContext[options.collapsedStateField]) {\r\n result += \"<span class='jsl-toggle'>\" + options.expandIconHTML + \"</span>\";\r\n } else {\r\n result += \"<span class='jsl-toggle'>\" + options.collapseIconHTML + \"</span>\";\r\n }\r\n } else {\r\n result += \"<span class='jsl-toggle-spacer'></span>\";\r\n }\r\n }\r\n }\r\n if (value != null) {\r\n result += (value + \"\").replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\r\n }\r\n return result;\r\n};\r\n\r\nexport class GridTree<T> {\r\n\r\n private primaryKey: string;\r\n\r\n private options: IGridTreeOptions;\r\n\r\n constructor(private grid: IJSLGrid<T>, o: IGridTreeOptions) {\r\n this.options = {\r\n ...{\r\n enableCollapsing: true,\r\n indentInRem: 1,\r\n hiddenStateField: \"_hidden_by_h\",\r\n collapsedStateField: \"_callapsed\",\r\n expandIconHTML: \"▶\", // \"˃\",\r\n collapseIconHTML: \"▼\" // \"˅\"\r\n }, ...o\r\n };\r\n this.primaryKey = (this.grid.getOptions() as ISlickCreatorOptions).primaryKey;\r\n (grid as any)._hierachy = this;\r\n grid.refresh();\r\n this.initEvents();\r\n }\r\n\r\n public getOptions() {\r\n return this.options;\r\n }\r\n\r\n public getLevel(item: T): number {\r\n let level = 0;\r\n let parent = this.getParent(item);\r\n while (parent != null) {\r\n parent = this.getParent(parent);\r\n level++;\r\n }\r\n return level;\r\n }\r\n\r\n public getParent(item: T): T {\r\n return this.grid.dataView.getItemById(item[this.options.parentColumn]);\r\n }\r\n\r\n public hasChildren(item: T): boolean {\r\n return this.rowHasChildren(this.grid.dataView.getIdxByItem(item));\r\n }\r\n\r\n public getDirectChildren(item: T): T[] {\r\n const id = item[this.primaryKey];\r\n const result = [];\r\n const data = this.grid.getData();\r\n for (let i = 0; i < data.length; i++) {\r\n const pid = data[i][this.options.parentColumn];\r\n if (pid === id) {\r\n result.push(data[i]);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n public getAllChildren(item: T): T[] {\r\n const parentid = item[this.primaryKey];\r\n const result = [];\r\n const data = this.grid.getData();\r\n for (let i = 0; i < data.length; i++) {\r\n if (data[i][this.options.parentColumn] === parentid) {\r\n result.push(data[i]);\r\n result.push(...this.getAllChildren(data[i]));\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n public rowHasChildren(row: number): boolean {\r\n const data = this.grid.getData();\r\n if (data.length > row + 1) {\r\n return data[row + 1][this.options.parentColumn] === data[row][this.primaryKey];\r\n }\r\n return false;\r\n }\r\n\r\n public toggleExpand(item: T): void {\r\n if (item[this.options.collapsedStateField]) {\r\n this.expand(item);\r\n } else {\r\n this.collapse(item);\r\n }\r\n }\r\n\r\n public expand(item: T): void {\r\n item[this.options.collapsedStateField] = false;\r\n const data = this.grid.getData();\r\n let i = this.grid.dataView.getIdxByItem(item);\r\n while (i < data.length) {\r\n data[i][this.options.hiddenStateField] = false;\r\n if (this.rowHasChildren(i)) {\r\n if (data[i][this.options.collapsedStateField]) {\r\n //skip children\r\n i += this.getAllChildren(data[i]).length;\r\n }\r\n }\r\n i++;\r\n }\r\n this.grid.refreshData();\r\n }\r\n\r\n public indent(rows: T[]) {\r\n const realRows = this.filterChildren(rows);\r\n const data = this.grid.getData();\r\n //get indexes of rows\r\n const indexes = [];\r\n for (let i = 0; i < realRows.length; i++) {\r\n indexes.push(this.grid.dataView.getIdxByItem(realRows[i]));\r\n }\r\n //sort indexes\r\n indexes.sort((a, b) => a > b ? 1 : (a < b ? -1 : 0));\r\n //change parents to indent rows\r\n for (let i = 0; i < indexes.length; i++) {\r\n const rowIdx = indexes[i];\r\n const parentID = data[rowIdx][this.options.parentColumn];\r\n for (let tmp = rowIdx - 1; tmp >= 0; tmp--) {\r\n if (data[tmp][this.options.parentColumn] === parentID) {\r\n data[rowIdx][this.options.parentColumn] = data[tmp][this.primaryKey];\r\n break;\r\n }\r\n }\r\n }\r\n this.grid.refreshData();\r\n }\r\n\r\n public outdent(rows: T[]) {\r\n const rows2 = this.filterChildren(rows);\r\n const data = this.grid.getData();\r\n for (let i = 0; i < rows2.length; i++) {\r\n const row = rows2[i];\r\n const oldparent = row[this.options.parentColumn];\r\n if (oldparent) {\r\n const newparent = data[this.grid.dataView.getIdxById(oldparent)][this.options.parentColumn];\r\n row[this.options.parentColumn] = newparent;\r\n //make all subsequent items with same ParentID have current row as new parentid\r\n let idx = this.grid.dataView.getIdxById(row[this.primaryKey]);\r\n while (++idx < data.length) {\r\n if (data[idx][this.options.parentColumn] === oldparent) {\r\n data[idx][this.options.parentColumn] = row[this.primaryKey];\r\n }\r\n //TODO: optimize -> break sooner\r\n }\r\n }\r\n }\r\n this.grid.refreshData();\r\n }\r\n\r\n public filterChildren(rows: T[]): T[] {\r\n const result = [];\r\n\r\n const dict: any = {};\r\n\r\n for (let i = 0; i < rows.length; i++) {\r\n dict[rows[i][this.primaryKey]] = true;\r\n }\r\n\r\n for (let i = 0; i < rows.length; i++) {\r\n const row = rows[i];\r\n const parentid = row[this.options.parentColumn];\r\n if (!parentid || !dict[parentid]) {\r\n result.push(row);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n public collapse(item: T): void {\r\n item[this.options.collapsedStateField] = true;\r\n const children = this.getAllChildren(item);\r\n for (let i = 0; i < children.length; i++) {\r\n children[i][this.options.hiddenStateField] = true;\r\n }\r\n this.grid.refreshData();\r\n }\r\n\r\n private initEvents() {\r\n // collapse / expand click events\r\n if (this.options.enableCollapsing) {\r\n this.grid.onClick.subscribe((e, args) => {\r\n if (e.target.classList.contains(\"jsl-toggle\")) {\r\n e.stopImmediatePropagation();\r\n this.toggleExpand(this.grid.dataView.getItem(args.row));\r\n }\r\n });\r\n }\r\n\r\n // filters\r\n const hiddenFilter = {\r\n field: this.options.hiddenStateField,\r\n match: (itm, field) => {\r\n return !itm[this.options.hiddenStateField];\r\n }\r\n };\r\n this.grid.addFilter(hiddenFilter);\r\n\r\n }\r\n\r\n}\r\n","import { jQueryReplacement } from '../../core/jq'\r\nimport { Slick } from '../slick.core'\r\n\r\n\r\nlet $ = jQueryReplacement;\r\n\r\n// register namespace\r\n$.deepExtend(Slick, {\r\n \"CellRangeDecorator\": CellRangeDecorator\r\n});\r\n\r\n/***\r\n * Displays an overlay on top of a given cell range.\r\n *\r\n * TODO:\r\n * Currently, it blocks mouse events to DOM nodes behind it.\r\n * Use FF and WebKit-specific \"pointer-events\" CSS style, or some kind of event forwarding.\r\n * Could also construct the borders separately using 4 individual DIVs.\r\n *\r\n * @param {Grid} grid\r\n * @param {Object} options\r\n */\r\nexport function CellRangeDecorator(grid, options) {\r\n var _elem;\r\n var _defaults = {\r\n selectionCssClass: 'slick-range-decorator',\r\n selectionCss: {\r\n \"zIndex\": \"9999\",\r\n \"border\": \"2px dashed red\"\r\n },\r\n offset: {\r\n top: -1,\r\n left: -1,\r\n height: -2,\r\n width: -2\r\n }\r\n };\r\n\r\n options = $.deepExtend({}, _defaults, options);\r\n\r\n\r\n function show(range) {\r\n if (!_elem) {\r\n _elem = $(\"<div></div>\"/*, {css: options.selectionCss}*/)\r\n .addClass(options.selectionCssClass)\r\n .css(\"position\", \"absolute\")\r\n .appendTo(grid.getActiveCanvasNode());\r\n if (options.selectionCss) {\r\n for (let key in options.selectionCss) {\r\n _elem.css(key, options.selectionCss[key]);\r\n }\r\n }\r\n }\r\n\r\n var from = grid.getCellNodeBox(range.fromRow, range.fromCell);\r\n var to = grid.getCellNodeBox(range.toRow, range.toCell);\r\n _elem.css({\r\n top: from.top + options.offset.top,\r\n left: from.left + options.offset.left,\r\n height: to.bottom - from.top + options.offset.height,\r\n width: to.right - from.left + options.offset.width\r\n });\r\n\r\n return _elem;\r\n }\r\n\r\n function hide() {\r\n if (_elem) {\r\n _elem.remove();\r\n _elem = null;\r\n }\r\n }\r\n\r\n $.shallowExtend(this, {\r\n \"pluginName\": \"CellRangeDecorator\",\r\n \"show\": show,\r\n \"hide\": hide\r\n });\r\n}","import { jQueryReplacement } from '../../core/jq'\r\nimport { Slick, Range } from '../slick.core'\r\nimport { CellRangeDecorator } from './slick.cellrangedecorator';\r\n\r\nlet $ = jQueryReplacement;\r\n\r\n// register namespace\r\n$.deepExtend(window, {\r\n \"Slick\": {\r\n \"CellRangeSelector\": CellRangeSelector\r\n }\r\n});\r\n\r\nexport function CellRangeSelector(options) {\r\n var _grid;\r\n var _currentlySelectedRange;\r\n var _canvas;\r\n var _gridOptions;\r\n var _$activeCanvas;\r\n var _dragging;\r\n var _decorator;\r\n var _self = this;\r\n var _handler = new Slick.EventHandler();\r\n var _defaults = {\r\n selectionCss: {\r\n \"border\": \"2px dashed blue\"\r\n }\r\n };\r\n\r\n // Frozen row & column variables\r\n var _rowOffset;\r\n var _columnOffset;\r\n var _isRightCanvas;\r\n var _isBottomCanvas;\r\n\r\n // Scrollings\r\n var _scrollTop = 0;\r\n var _scrollLeft = 0;\r\n\r\n function init(grid) {\r\n options = $.deepExtend({}, _defaults, options);\r\n _decorator = options.cellDecorator || new CellRangeDecorator(grid, options);\r\n _grid = grid;\r\n _canvas = _grid.getCanvasNode();\r\n _gridOptions = _grid.getOptions();\r\n _handler\r\n .subscribe(_grid.onScroll, handleScroll)\r\n .subscribe(_grid.onDragInit, handleDragInit)\r\n .subscribe(_grid.onDragStart, handleDragStart)\r\n .subscribe(_grid.onDrag, handleDrag)\r\n .subscribe(_grid.onDragEnd, handleDragEnd);\r\n }\r\n\r\n function destroy() {\r\n _handler.unsubscribeAll();\r\n }\r\n\r\n function getCellDecorator() {\r\n return _decorator;\r\n }\r\n\r\n function handleScroll(e, args) {\r\n _scrollTop = args.scrollTop;\r\n _scrollLeft = args.scrollLeft;\r\n }\r\n\r\n function handleDragInit(e, dd) {\r\n // Set the active canvas node because the decorator needs to append its\r\n // box to the correct canvas\r\n _$activeCanvas = $(_grid.getActiveCanvasNode(e));\r\n\r\n var c = _$activeCanvas.offset();\r\n\r\n _rowOffset = 0;\r\n _columnOffset = 0;\r\n _isBottomCanvas = _$activeCanvas.hasClass('grid-canvas-bottom');\r\n\r\n if (_gridOptions.frozenRow > -1 && _isBottomCanvas) {\r\n _rowOffset = (_gridOptions.frozenBottom) ? $('.grid-canvas-bottom').height() : $('.grid-canvas-top').height();\r\n }\r\n\r\n _isRightCanvas = _$activeCanvas.hasClass('grid-canvas-right');\r\n\r\n if (_gridOptions.frozenColumn > -1 && _isRightCanvas) {\r\n _columnOffset = $('.grid-canvas-left').width();\r\n }\r\n\r\n // prevent the grid from cancelling drag'n'drop by default\r\n e.stopImmediatePropagation();\r\n }\r\n\r\n function handleDragStart(e, dd) {\r\n var cell = _grid.getCellFromEvent(e);\r\n if (_self.onBeforeCellRangeSelected.notify(cell) !== false) {\r\n if (_grid.canCellBeSelected(cell.row, cell.cell)) {\r\n _dragging = true;\r\n e.stopImmediatePropagation();\r\n }\r\n }\r\n if (!_dragging) {\r\n return;\r\n }\r\n\r\n _grid.focus();\r\n\r\n var startX = dd.startX - $(_canvas).offset().left;\r\n if (_gridOptions.frozenColumn >= 0 && _isRightCanvas) {\r\n startX += _scrollLeft;\r\n }\r\n\r\n var startY = dd.startY - $(_canvas).offset().top;\r\n if (_gridOptions.frozenRow >= 0 && _isBottomCanvas) {\r\n startY += _scrollTop;\r\n }\r\n\r\n var start = _grid.getCellFromPoint(startX, startY);\r\n\r\n dd.range = { start: start, end: {} };\r\n _currentlySelectedRange = dd.range;\r\n return _decorator.show(new Range(start.row, start.cell));\r\n }\r\n\r\n function handleDrag(e, dd) {\r\n if (!_dragging) {\r\n return;\r\n }\r\n e.stopImmediatePropagation();\r\n\r\n var end = _grid.getCellFromPoint(\r\n e.pageX - _$activeCanvas.offset().left + _columnOffset,\r\n e.pageY - _$activeCanvas.offset().top + _rowOffset\r\n );\r\n // ... frozen column(s), \r\n if (_gridOptions.frozenColumn >= 0 && (!_isRightCanvas && (end.cell > _gridOptions.frozenColumn)) || (_isRightCanvas && (end.cell <= _gridOptions.frozenColumn))) {\r\n return;\r\n }\r\n\r\n // ... or frozen row(s)\r\n if (_gridOptions.frozenRow >= 0 && (!_isBottomCanvas && (end.row >= _gridOptions.frozenRow)) || (_isBottomCanvas && (end.row < _gridOptions.frozenRow))) {\r\n return;\r\n }\r\n\r\n // ... or regular grid (without any frozen options)\r\n if (!_grid.canCellBeSelected(end.row, end.cell)) {\r\n return;\r\n }\r\n\r\n dd.range.end = end;\r\n\r\n _decorator.show(new Slick.Range(dd.range.start.row, dd.range.start.cell, end.row, end.cell));\r\n }\r\n\r\n function handleDragEnd(e, dd) {\r\n if (!_dragging) {\r\n return;\r\n }\r\n\r\n _dragging = false;\r\n e.stopImmediatePropagation();\r\n\r\n _decorator.hide();\r\n _self.onCellRangeSelected.notify({\r\n range: new Slick.Range(\r\n dd.range.start.row,\r\n dd.range.start.cell,\r\n dd.range.end.row,\r\n dd.range.end.cell\r\n )\r\n });\r\n }\r\n\r\n function getCurrentRange() {\r\n return _currentlySelectedRange;\r\n }\r\n\r\n $.shallowExtend(this, {\r\n \"init\": init,\r\n \"destroy\": destroy,\r\n \"pluginName\": \"CellRangeSelector\",\r\n\r\n \"getCellDecorator\": getCellDecorator,\r\n \"getCurrentRange\": getCurrentRange,\r\n\r\n \"onBeforeCellRangeSelected\": new Slick.Event(),\r\n \"onCellRangeSelected\": new Slick.Event()\r\n });\r\n}\r\n","import { jQueryReplacement } from '../../core/jq'\r\nimport { Slick, Range } from '../slick.core'\r\nimport { CellRangeSelector } from './slick.cellrangeselector';\r\n\r\n\r\nlet $ = jQueryReplacement;\r\n\r\n// register namespace\r\n$.deepExtend(window, {\r\n \"Slick\": {\r\n \"CellSelectionModel\": CellSelectionModel\r\n }\r\n});\r\n\r\nexport function CellSelectionModel(options?) {\r\n var _grid;\r\n var _canvas;\r\n var _ranges = [];\r\n var _self = this;\r\n var _selector;\r\n\r\n if (typeof options === \"undefined\" || typeof options.cellRangeSelector === \"undefined\") {\r\n _selector = new CellRangeSelector({\r\n \"selectionCss\": {\r\n \"border\": \"2px solid black\"\r\n }\r\n });\r\n } else {\r\n _selector = options.cellRangeSelector;\r\n }\r\n\r\n var _options;\r\n var _defaults = {\r\n selectActiveCell: true\r\n };\r\n\r\n function init(grid) {\r\n _options = $.deepExtend({}, _defaults, options);\r\n _grid = grid;\r\n _canvas = _grid.getCanvasNode();\r\n _grid.onActiveCellChanged.subscribe(handleActiveCellChange);\r\n _grid.onKeyDown.subscribe(handleKeyDown);\r\n grid.registerPlugin(_selector);\r\n _selector.onCellRangeSelected.subscribe(handleCellRangeSelected);\r\n _selector.onBeforeCellRangeSelected.subscribe(handleBeforeCellRangeSelected);\r\n }\r\n\r\n function destroy() {\r\n _grid.onActiveCellChanged.unsubscribe(handleActiveCellChange);\r\n _grid.onKeyDown.unsubscribe(handleKeyDown);\r\n _selector.onCellRangeSelected.unsubscribe(handleCellRangeSelected);\r\n _selector.onBeforeCellRangeSelected.unsubscribe(handleBeforeCellRangeSelected);\r\n _grid.unregisterPlugin(_selector);\r\n }\r\n\r\n function removeInvalidRanges(ranges) {\r\n var result = [];\r\n\r\n for (var i = 0; i < ranges.length; i++) {\r\n var r = ranges[i];\r\n if (_grid.canCellBeSelected(r.fromRow, r.fromCell) && _grid.canCellBeSelected(r.toRow, r.toCell)) {\r\n result.push(r);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function rangesAreEqual(range1, range2) {\r\n var areDifferent = (range1.length !== range2.length);\r\n if (!areDifferent) {\r\n for (var i = 0; i < range1.length; i++) {\r\n if (\r\n range1[i].fromCell !== range2[i].fromCell\r\n || range1[i].fromRow !== range2[i].fromRow\r\n || range1[i].toCell !== range2[i].toCell\r\n || range1[i].toRow !== range2[i].toRow\r\n ) {\r\n areDifferent = true;\r\n break;\r\n }\r\n }\r\n }\r\n return !areDifferent;\r\n }\r\n\r\n function setSelectedRanges(ranges) {\r\n // simple check for: empty selection didn't change, prevent firing onSelectedRangesChanged\r\n if ((!_ranges || _ranges.length === 0) && (!ranges || ranges.length === 0)) { return; }\r\n\r\n // if range has not changed, don't fire onSelectedRangesChanged\r\n const rangeHasChanged = !rangesAreEqual(_ranges, ranges);\r\n\r\n _ranges = removeInvalidRanges(ranges);\r\n if (rangeHasChanged) { _self.onSelectedRangesChanged.notify(_ranges); }\r\n }\r\n\r\n function getSelectedRanges() {\r\n return _ranges;\r\n }\r\n\r\n function handleBeforeCellRangeSelected(e, args) {\r\n if (_grid.getEditorLock().isActive()) {\r\n e.stopPropagation();\r\n return false;\r\n }\r\n }\r\n\r\n function handleCellRangeSelected(e, args) {\r\n _grid.setActiveCell(args.range.fromRow, args.range.fromCell, false, false, true);\r\n setSelectedRanges([args.range]);\r\n }\r\n\r\n let lastActiveCell;\r\n\r\n function handleActiveCellChange(e, args) {\r\n if (_options.selectActiveCell && args.row != null && args.cell != null) {\r\n\r\n const metaKey = e.ctrlKey || e.metaKey;\r\n if (metaKey) {\r\n const ranges = getSelectedRanges().slice();\r\n ranges.push(new Range(args.row, args.cell));\r\n setSelectedRanges(ranges);\r\n lastActiveCell = {row: args.row, cell: args.cell};\r\n } else if (e.shiftKey) {\r\n const ranges = getSelectedRanges().slice();\r\n if (ranges.length > 0) {\r\n const currentRange = ranges.pop();\r\n if (lastActiveCell == null) {\r\n lastActiveCell = {row: currentRange.fromRow, cell: currentRange.fromCell};\r\n }\r\n const newRange = new Range(Math.min(lastActiveCell.row, args.row),\r\n Math.min(lastActiveCell.cell, args.cell),\r\n Math.max(lastActiveCell.row, args.row),\r\n Math.max(lastActiveCell.cell, args.cell));\r\n ranges.push(newRange);\r\n } else {\r\n ranges.push(new Range(args.row, args.cell));\r\n lastActiveCell = {row: args.row, cell: args.cell};\r\n }\r\n setSelectedRanges(ranges);\r\n } else {\r\n setSelectedRanges([new Range(args.row, args.cell)]);\r\n lastActiveCell = {row: args.row, cell: args.cell};\r\n }\r\n } else if (!_options.selectActiveCell) {\r\n // clear the previous selection once the cell changes\r\n setSelectedRanges([]);\r\n }\r\n }\r\n\r\n function handleKeyDown(e) {\r\n /***\r\n * Кey codes\r\n * 37 left\r\n * 38 up\r\n * 39 right\r\n * 40 down\r\n */\r\n var ranges, last;\r\n var active = _grid.getActiveCell();\r\n var metaKey = e.ctrlKey || e.metaKey;\r\n if (active && e.shiftKey && !metaKey && !e.altKey &&\r\n (e.which == 37 || e.which == 39 || e.which == 38 || e.which == 40)) {\r\n\r\n ranges = getSelectedRanges().slice();\r\n if (!ranges.length)\r\n ranges.push(new Range(active.row, active.cell));\r\n\r\n // keyboard can work with last range only\r\n last = ranges.pop();\r\n\r\n // can't handle selection out of active cell\r\n if (!last.contains(active.row, active.cell))\r\n last = new Range(active.row, active.cell);\r\n\r\n var dRow = last.toRow - last.fromRow,\r\n dCell = last.toCell - last.fromCell,\r\n // walking direction\r\n dirRow = active.row == last.fromRow ? 1 : -1,\r\n dirCell = active.cell == last.fromCell ? 1 : -1;\r\n\r\n if (e.which == 37) {\r\n dCell -= dirCell;\r\n } else if (e.which == 39) {\r\n dCell += dirCell;\r\n } else if (e.which == 38) {\r\n dRow -= dirRow;\r\n } else if (e.which == 40) {\r\n dRow += dirRow;\r\n }\r\n\r\n // define new selection range\r\n var new_last = new Slick.Range(active.row, active.cell, active.row + dirRow * dRow, active.cell + dirCell * dCell);\r\n if (removeInvalidRanges([new_last]).length) {\r\n ranges.push(new_last);\r\n var viewRow = dirRow > 0 ? new_last.toRow : new_last.fromRow;\r\n var viewCell = dirCell > 0 ? new_last.toCell : new_last.fromCell;\r\n _grid.scrollRowIntoView(viewRow);\r\n _grid.scrollCellIntoView(viewRow, viewCell);\r\n }\r\n else\r\n ranges.push(last);\r\n\r\n setSelectedRanges(ranges);\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n }\r\n\r\n $.shallowExtend(this, {\r\n \"getSelectedRanges\": getSelectedRanges,\r\n \"setSelectedRanges\": setSelectedRanges,\r\n\r\n \"init\": init,\r\n \"destroy\": destroy,\r\n \"pluginName\": \"CellSelectionModel\",\r\n\r\n \"onSelectedRangesChanged\": new Slick.Event()\r\n });\r\n} "],"names":["_slickCore","exports","_slickCreator","_slickDataview","_slickEditorsCore","_slickFormatters","_slickGrid","_slickGroupitemmetadataprovider","_slickTree","_slickCellrangedecorator","_slickCellrangeselector","_slickCellselectionmodel","_slickHeadermenu","_slickRowselectionmodel","Slick","export","Range1","require","Event","push","fn","countHandlers","handlers","length","this","unsubscribe","i","splice","notify","args","e","scope","returnValue","isPropagationStopped","isImmediatePropagationStopped","call","EventData","subscribe","event","handler","unsubscribeAll","NonDataItem","Group","GroupTotals","EditorLock","SPACE","BACKSPACE","DELETE","END","ENTER","HOME","INSERT","LEFT","PAGE_DOWN","PAGE_UP","TAB","stopPropagation","stopImmediatePropagation","fromRow","fromCell","toRow","toCell","undefined","Math","min","max","isSingleRow","isSingleCell","contains","row","cell","toString","__nonDataRow","__group","level","count","value","title","collapsed","selectChecked","totals","rows","groups","groupingKey","__groupTotals","group","initialized","prototype","equals","getParentWithClass","el","c","stopAt","classList","parentElement","jQWrapper","elements","_elements","empty","x","innerHTML","appendTo","selector","HTMLElement","appendChild","j","append","add","css","key","indexOf","style","window","getComputedStyle","keyEl","hasOwnProperty","attr","closestClass","name","result","jQueryReplacement","match","remove","parentNode","removeChild","data","html","text","innerText","height","cssHeight","parseInt","isNaN","offsetHeight","width","offsetWidth","removeClass","names","split","nIdx","offset","rect","getBoundingClientRect","top","document","body","scrollTop","left","scrollLeft","children","cidx","on","eventname","fnc","addEventListener","toggleClass","state","find","found","querySelectorAll","slideDown","speed","done","display","slideUp","addClass","hasClass","index","node","previousElementSibling","tmp","createElement","firstElementChild","q","nodeType","Node","ELEMENT_NODE","deepExtend","out","a","arguments","obj","Array","isArray","each","array","shallowExtend","rest","interopDefault","__esModule","default","defineInteropFlag","Object","defineProperty","exportAll","source","dest","keys","forEach","enumerable","get","destName","createJSLGrid","$","_jq","columns","option","formulaObjects","headerMenu","headerButtons","formulas","container","customCommandHandler","grid","dataView","filters","CreateColumnGroups","options","getOptions","columns1","getColumns","frozenColumn","$preHeaderPanel","getPreHeaderPanel","renderHeaderGroups","getPreHeaderPanelRight","preHeaderPanel","start","end","getHeadersWidth","headerColumnWidthDiff","getHeaderColumnWidthDiff","header","lastColumnGroup","widthTotal","m","columnGroup","storeColumnSettings","cols","colSettings","map","id","localStorage","setItem","saveColumnsKey","JSON","stringify","triggerFormula","column","item","f","l","sort","sortAsc","comparer","sortByVisibleValue","b","formatter","getDataItemValueForColumn","y","xStr","yStr","toLocaleLowerCase","refreshData","setItems","refresh","invalidate","getFormattedValue","TextFormatter","formatterResult","getItem","calcLengthInternal","convertElement","w","charWidth","isHTML","measureElement","position","whiteSpace","columnId","dontrefresh","refreshFilters","noColumnHeaderRefresh","mode","setFilter","filterArray","field","orResult","onFiltersChanged","sanitizeColumns","explicitInitialization","querySelector","Error","showColumnGroups","createPreHeaderPanel","showPreHeaderPanel","editCommandHandler","editCommand","oldVal","execute","updateItem","primaryKey","onAfterEdit","oldValue","newValue","handleEditCommand","groupItemMetadataProvider","GroupItemMetadataProvider","groupItemOptions","DataView","inlineFilters","SlickGrid","registerPlugin","setSelectionModel","RowSelectionModel","onHeaderCellRendered","columnHasFilter","onSort","sortCol","onRowsChanged","invalidateRows","render","onRowCountChanged","updateRowCount","onAddNewRow","provideDefaultValues","addItem","showHeaderMenu","HeaderMenu","onBeforeMenuShow","menu","sortable","items","_lang","UILang","Sort","Asc","command","Desc","filterable","Filter","filter","ClearFilter","onCommand","sortCols","multiColumnSort","showFilterDialog","show","clearFilter","_slickHeaderbuttons","HeaderButtons","init","setTimeout","onColumnsResized","onColumnsReordered","parse","setColumns","loadColumnSettings","setHeight","resizeCanvas","getHeight","setData","newData","getData","addFormula","usedColumns","getContentWidth","fitToContent","idx","len","getDataLength","triggerAllFormulas","val","refreshDataItem","updateRow","getRowByItem","addFilter","setFilters","getFilters","getSelectedRows","selRows","rowIdx","toPush","scrollbarDimensions","maxSupportedCssHeight","th","h","ph","n","cj","$container","$focusSink","$focusSink2","$headerScroller","$headers","$headerRow","$headerRowScroller","$headerRowSpacerL","$headerRowSpacerR","$footerRow","$footerRowScroller","$footerRowSpacerL","$footerRowSpacerR","$preHeaderPanelScroller","$preHeaderPanelSpacer","$preHeaderPanelR","$preHeaderPanelScrollerR","$topPanelScroller","$topPanel","$viewport","$canvas","$style","$boundAncestors","stylesheet","columnCssRulesL","columnCssRulesR","viewportH","viewportW","canvasWidth","canvasWidthL","canvasWidthR","headersWidth","headersWidthL","headersWidthR","viewportHasHScroll","viewportHasVScroll","absoluteColumnMinWidth","$activeCanvasNode","$activeViewportNode","activePosX","activeRow","activeCell","serializedEditorValue","editController","selectionModel","$paneHeaderL","$paneHeaderR","$paneTopL","$paneTopR","$paneBottomL","$paneBottomR","$headerScrollerL","$headerScrollerR","$headerL","$headerR","$headerRowScrollerL","$headerRowScrollerR","$footerRowScrollerL","$footerRowScrollerR","$headerRowL","$headerRowR","$footerRowL","$footerRowR","$topPanelScrollerL","$topPanelScrollerR","$topPanelL","$topPanelR","$viewportTopL","$viewportTopR","$viewportBottomL","$viewportBottomR","$canvasTopL","$canvasTopR","$canvasBottomL","$canvasBottomR","$viewportScrollContainerX","$viewportScrollContainerY","$headerScrollContainer","$headerRowScrollContainer","$footerRowScrollContainer","scrollEventHandler","$hiddenParents","defaults","alwaysShowVerticalScroll","alwaysShowHorizontalScroll","alwaysAllowHorizontalScroll","rowHeight","defaultColumnWidth","enableAddRow","leaveSpaceForNewRows","editable","autoEdit","suppressActiveCellChangeOnEdit","enableCellNavigation","enableColumnReorder","asyncEditorLoading","asyncEditorLoadDelay","forceFitColumns","enableAsyncPostRender","asyncPostRenderDelay","enableAsyncPostRenderCleanup","asyncPostRenderCleanupDelay","autoHeight","editorLock","GlobalEditorLock","showHeaderRow","headerRowHeight","createFooterRow","showFooterRow","footerRowHeight","preHeaderPanelHeight","showTopPanel","topPanelHeight","formatterFactory","editorFactory","cellFlashingCssClass","selectedCellCssClass","multiSelect","enableTextSelectionOnCells","dataItemColumnValueExtractor","frozenBottom","frozenRow","fullWidthRows","numberedMultiColumnSort","tristateMultiColumnSort","sortColNumberInSeparateSpan","defaultFormatter","columnDef","dataContext","replace","forceSyncScrolling","addNewRowCssClass","preserveCopiedSelectionOnPaste","showCellSelection","viewportClass","minRowBuffer","emulatePagingWhenScrolling","editorCellNavOnLRKeys","doPaging","resizeDelta","dragDelta","columnDefaults","resizable","minWidth","rerenderOnResize","headerCssClass","defaultSortAsc","focusable","selectable","page","vScrollDir","uid","round","random","self","cellWidthDiff","cellHeightDiff","jQueryNewWidthBehaviour","hasFrozenRows","frozenRowsHeight","actualFrozenRow","paneTopH","paneBottomH","viewportTopH","topPanelH","headerRowH","footerRowH","tabbingDirection","activeCellNode","currentEditor","rowsCache","rowPositionCache","numVisibleRows","prevScrollTop","lastRenderedScrollTop","lastRenderedScrollLeft","prevScrollLeft","selectedRows","plugins","cellCssClasses","columnsById","sortColumns","columnPosLeft","columnPosRight","pagingActive","pagingIsLastPage","scrollThrottle","action","minPeriod_ms","dequeue","queued","unblock","blockAndExecute","blocked","ActionThrottle","h_editorLoader","h_postrender","h_postrenderCleanup","postProcessedRows","postProcessToRow","postProcessFromRow","postProcessedCleanupQueue","cssShow","visibility","oldProps","finishInitialization","dragStartX","dragStartY","isDown","getViewportWidth","getViewportHeight","h1","v","n1","parseFloat","r","measureCellPaddingAndBorder","$target","jquery","target","tagName","preventDefault","cacheRowPositions","setFrozenOptions","setPaneVisibility","setScroller","setOverflow","updateColumnCaches","createColumnHeaders","createColumnFooter","ctrlPressed","metaKey","ctrlKey","$col","getEditorLock","commitCurrentEdit","sortColumn","hadSortCol","shiftKey","setSortColumns","trigger","col","getColumnIndex","_resizable","Resizable","onResize","_eventhandler","EventHandler","evt","processColumnResize","onStart","startColumnResize","onStop","finishColumnResize","mouseDownFnc","arg","lastChild","pageX","touches","dragColStartX","draggedEl","dragGhost","className","offsetLeft","clientHeight","clientWidth","ghostContent","processColumnDrag","finishColumnDrag","startColumnDragging","setupColumnMoveAndResize","createCssRules","elem","scrollWidth","scrollHeight","$elem","handleActiveCellPositionChange","bindAncestorScrollEvents","handleScroll","preventScroll","handleHeaderContextMenu","handleHeaderClick","handleKeyDown","handleClick","handleDblClick","handleContextMenu","dragStartedDD","delta","dd","getCellFromEvent","cellExists","onDragInit","handleDragInit","pageY","handleMouseUp","_dd","abs","dragging","propagates","startX","startY","onDragStart","handleDragStart","handleDrag","onDragEnd","handleDragEnd","removeEventListener","old","hasFrozenColumns","unregisterPlugin","plugin","destroy","setActiveCanvasNode","element","setActiveViewportNode","measureScrollbar","$outerdiv","$innerdiv","dim","includeScrollbar","ii","getCanvasWidth","availableWidth","totalRowWidth","updateCanvasWidth","forceColumnWidthsUpdate","widthChanged","oldCanvasWidth","oldCanvasWidthL","oldCanvasWidthR","applyColumnWidths","onBeforeFooterRowCellDestroy","footerRowCell","onFooterRowCellRendered","onMouseEnter","onMouseLeave","onBeforeHeaderCellDestroy","onBeforeHeaderRowCellDestroy","$headerTarget","$headerRowTarget","div","toolTip","resizeHandleWidth","sortIndicator","numIndicator","headerRowCell","onHeaderRowCellRendered","getImpactedColumns","limit","impactedColumns","prevEl","nextEl","nextElementSibling","prevWidth","nextWidth","draggedDistance","insertBefore","changedTouches","$colsL","$colsR","reorderedIds","concat","reorderedColumns","applyColumnResort","minPageX","maxPageX","colIdx","columnElements","shrinkLeewayOnRight","stretchLeewayOnRight","previousWidth","maxWidth","shrinkLeewayOnLeft","stretchLeewayOnLeft","currentX","actualMinWidth","d","newCanvasWidthL","k","j1","j2","applyColumnHeaderWidths","syncColumnCellResize","newWidth","invalidateAllRows","getVBoxDelta","$el","getRowTop","dataLength","type","rules","styleSheet","cssText","join","createTextNode","getColumnCssRules","sheets","styleSheets","ownerNode","matches","columnIdx","cssRules","selectorText","exec","substr","removeCssRules","tmp_fnc","apply","_isImmediatePropagationStopped","_isPropagationStopped","autosizeColumns","prevTotal","widths","shrinkLeeway","total","availWidth","shrinkProportion","absMinWidth","shrinkSize","floor","growProportion","growSize","currentWidth","reRender","onAutosizeColumns","headers","rule","right","numberCols","headerColumnEls","columnIndex","handleSelectedRangesChanged","ranges","previousSelectedRows","slice","arr1","arr2","hash","canCellBeSelected","setCellCssStyles","onSelectedRowsChanged","updateColumnProps","widthRequest","columnDefinitions","validateAndEnforceOptions","getLength","getDataLengthIncludingAddNew","getDataItem","variableRowHeight","getRowFromPosition","rowsInPosCache","ar","compare_fn","cmp","binarySearch","pos","cacheEntry","bottom","scrollTo","oldOffset","newScrollTop","cleanupRows","getVisibleRange","rowNode","updateRowPositions","onViewportChanged","getFormatter","rowMetadata","getItemMetadata","columnOverrides","getEditor","columnMetadata","editor","fields","appendRowHtml","range","dataLoading","rowCss","metadata","cssClasses","onAppendRow","colspan","frozenRowOffset","getFrozenRowOffset","rowHtml","getRowHeight","L","R","columnData","leftPx","alwaysRenderColumn","rightPx","appendCellHtml","stringResult","cellCss","cssClass","addlCssClasses","addClasses","cellRenderQueue","cellColSpans","rangeToKeep","removeFrozenRow","removeRowFromCache","startPostProcessingCleanup","makeActiveCellNormal","onBeforeRemoveRow","dom","rl","invalidateRow","applyFormatResultToCellNode","cellNode","suppressRemove","removeClasses","ensureCellNodesInRowsCache","cellNodesByColumnIdx","loadValue","onAppendCell","invalidatePostProcessingResults","fullHeight","preHeaderH","ceil","paneBottomTop","offsetTop","dataLengthIncludingAddNew","numberOfRows","oldH","tempViewportH","oldViewportHasVScroll","r1","resetActiveCell","rowH","oldScrollTopInRange","viewportTop","viewportLeft","getRenderedRangeFromVisibleRange","buffer","minBuffer","lastNode","lastElementChild","pop","cleanUpCells","cellToRemove","cellsToRemove","cleanUpAndRenderCells","cellsAdded","stringArray","processedRows","btm","processedRow","renderRows","needToReselectCell","xRight","i1","ii1","xChild","xChildRight","nodes","childNodes","idx1","cIdx","getCellNode","startPostProcessing","clearTimeout","asyncPostProcessRows","asyncPostProcessCleanupRows","visible","rendered","renderedFrozenRows","onRendered","startRow","endRow","isMouseWheel","vScrollDist","maxScrollDistanceY","maxScrollDistanceX","hScrollDist","dx","dy","enqueue","onScroll","_handleScroll","processedStatus","asyncPostRender","groupId","shift","entry","actionType","asyncPostRenderCleanup","updateCellCssStylesOnRenderedRows","addedHash","removedHash","addedRowHash","removedRowHash","prevHash","onKeyDown","keyCode","altKey","keyCaptureList","which","handled","navigateTop","navigateRowStart","navigateBottom","navigateRowEnd","navigatePrev","ESCAPE","isActive","navigatePageDown","navigateLeft","RIGHT","navigateRight","UP","navigateUp","DOWN","navigateDown","navigateNext","makeActiveCellEditable","error","activeElement","setFocus","onClick","scrollRowIntoView","setActiveCellInternal","preClickModeOn","suppressActiveCellChangedEvent","$cell","onContextMenu","onDblClick","gotoCell","$header","onHeaderContextMenu","onHeaderClick","getCellFromPoint","cls","getRowBottom","rowOffset","getCellFromNode","focus","scrollCellIntoView","getColspan","scrollRight","newCell","opt_editMode","$activeCellNode","$activeCellOffset","isBottom","isCellPotentiallyEditable","onActiveCellChanged","getActiveCell","readonly","onBeforeCellEditorDestroy","userAgent","toLowerCase","selection","sel","getSelection","removeAllRanges","clearTextSelection","deactivate","onBeforeEditCell","activate","useEditor","suppressClearOnEdit","columnMetaData","gridPosition","absBox","commitChanges","commitEditAndNavDown","commitChangesOnly","commitEditAndSetFocus","cancelEditAndSetFocus","serializeValue","cancelCurrentEdit","box","offsetParent","onActiveCellPositionChanged","hide","cellBox","viewportScrollH","rowNumber","rowBottom","rowAtTop","rowAtBottom","scrollPage","dir","deltaRows","prevCell","canCellBeActive","prevActivePosX","navigatePageUp","num_rows","findFirstFocusableCell","lastFocusableCell","gotoRight","posX","gotoLeft","firstFocusableCell","prev","gotoUp","findLastFocusableCell","lastSelectableCell","gotoRowStart","gotoRowEnd","navigate","gotoPrev","gotoNext","forceEdit","isValueChanged","validate","valid","onCellChange","serializedValue","applyValue","newItem","unshift","pluginName","ascending","suppressRender","scrollToTop","model","onSelectedRangesChanged","setSelectedRanges","Range","lastCell","rowsToRanges","pagingInfo","pageSize","pageNum","totalPages","currentActiveCell","columnIdOrIdx","rowIndex","getActiveCellPosition","y1","x1","y2","targetHeader","targetIndex","$rtn","eq","$footerRowTarget","$footer","times","remaining","toggleCellClass","onBeforeDestroy","all_parents","hiddenParents","p","cacheCssForHiddenInit","supportedHeight","testUpTo","navigator","test","getMaxSupportedCssHeight","msMaxTouchPoints","headerL","headerR","headerRowScrollerL","headerRowScrollerR","headerRowSpacerL","headerRowSpacerR","headerRowL","headerRowR","topPanelScrollerL","topPanelScrollerR","cloneNode","Grid","ResizeContainer","defaultOptions","resizeHandlePrefix","startSize","mouseDownContainer","resizeX","resizeY","extractArg","mouseMove","mouseUp","raiseEvt","gridX","minHeight","maxHeight","gridY","[object Object]","options1","CustomEvent","CustomEvent1","params","bubbles","cancelable","detail","createEvent","initCustomEvent","Element","click","res","fnc1","val2","console","warn","_grid","_inHandler","_options","_ranges","_self","_handler","_defaults","selectActiveRow","wrapHandler","rangesToRows","handleActiveCellChange","active","from","to","getRowsRange","setActiveCell","o","last","MinAggregator","SumAggregator","sortComparer","filterArgs","idProperty","idxById","rowsById","updated","refreshHints","prevRefreshHints","filteredItems","filterCache","getter","predefinedValues","aggregators","aggregateEmpty","aggregateChildGroups","displayTotalsRow","lazyTotalsCalculation","groupingInfos","toggledGroupsByLevel","groupingDelimiter","pagesize","pagenum","totalRows","onRowsOrCountChanged","startingIndex","getPagingInfo","reverse","setGrouping","groupingInfo","Data","gi","getterIsAFn","newId","deleteItem","sortedAddItem","searchItem","high","mid","low","sortedIndex","expandCollapseAllGroups","collapse","expandCollapseGroup","extractGroups","rows1","parentGroup","groups1","l1","groupsByVal","i2","calculateTotals","agg","isLeafLevel","compiledAccumulators","storeResult","addGroupTotals","g","aggregateCollapsed","addTotals","groupCollapsed","toggledGroups","flattenGroupedRows","groupedRows","gl","jj","compileAccumulatorLoop","aggregator","accumulatorInfo","getFunctionInfo","accumulate","Function","displayName","items1","retval","uncompiledFilterWithCaching","cache","recalc","_items","second","isFilterNarrowing","isFilterExpanding","filteredItems1","batchFilter","uncompiledFilter","batchFilterWithCaching","isFilterUnchanged","paged","getFilteredAndPagedItems","newRows","diff","eitherIsNonData","ignoreDiffsAfter","getRowDiffs","suspend","countBefore","totalRowsBefore","onPagingInfoChanged","previous","callingOnRowsChanged","beginUpdate","endUpdate","setPagingOptions","getItems","objectIdProperty","filterFn","getFilter","getFilteredItems","valueGetter","valueFormatter","sortComparer1","groupAggregators","includeCollapsed","varArgs","arg0","itemArray","ensureRowsByIdCache","rowArray","ids","idArray","hints","insertItem","updateIdxById","getItemById","oldItem","preserveHidden","preserveHiddenOnSelectionChange","inHandler","self1","selectedRowIds","mapRowsToIds","setSelectedRowIds","rowIds","existing","getRowById","newSelectedRowIds","onSelectedRowIdsChanged","hashById","storeCellCssStyles","update","newHash","getCellCssStyles","onCellCssStylesChanged","__height","count_","nonNullCount_","field_","groupTotals","avg","min_","checkboxSelect","checkboxSelectPlugin","groupCssClass","checkboxSelectCssClass","toggleCssClass","toggleCollapsedCssClass","toggleExpandedCssClass","indentation","groupTitleCssClass","groupTotalsFormatter","formatter_res","sum","getRenderedRange","setRefreshHints","ignoreDiffsBefore","collapseGroup","mapItemsToRows","selectRows","deSelectRows","rowIndexes","enableExpandCollapse","expandGroup","handleGridClick","handleGridKeyDown","0","groupFormatter","handleBodyMouseDown","$menu","hideMenu","$activeHeaderColumn","handleHeaderCellRendered","buttonCssClass","buttonImage","showMenu","handleBeforeHeaderCellDestroy","newOptions","Plugins","EmptyFormatter","ComponentFormatter","YesNoFormatter","CheckboxFormatter","CheckmarkFormatter","NumericFormatter","DateFormatter","HtmlFormatter","LookupFormatter","MultiLookupFormatter","TooltipFormatter","MultiLineTextFormatter","TimeFormatter","DateTimeFormatter","ButtonFormatter","escapeHTMLChars","_numeric","numeric","format","vl","valueList","txt","pad","nr","getHours","getMinutes","nrAsString","info","decimalSep","_cultureDefault","thousandSep","str","comma_sep","charAt","numberFormat","formatCache","parseNrFormat","formatNumber","prefix","suffix","show_sep","min_length","max_comma_places","min_comma_places","comma_pos","comma_separator","thousand_separator","cp_min","cp_max","ml","negative","nr_str_raw","toFixed","cp","nr_str","t","_w","_current_culture","culture","_culture","dateFormat","set","cult_vals","cultures","current_culture","de","en-us","en-gb","date2","date","settings","shortYearCutoff","_helper","Date","getFullYear","dayNamesShort","monthNamesShort","monthNames","iFormat","lookAhead","RegExp","num","iValue","getName","shortNames","longNames","literal","doy","getNumber","month","day","date1","getDate","year","_ticksTo1970","getMonth","checkLiteral","_getDaysInMonth","_daylightSavingAdjust","dayNames","output","formatName","getDay","getTime","inputMode","getSeconds","ExcelFilter","rem","documentElement","fontSize","values","currentFilters","getDistinctValues","filterOptions","getFilterValues","oldCheckedValues","_checkedValues","dlg","core","Ok","Cancel","dlgBody","helper","newDomGuid","search","Search","cbAllContainer","cbAll","cbAllLabel","setAttribute","textContent","All","cursor","marginLeft","sortedValues","visibleValues","checkedValues","cbContainer","convertRemToPixels","innerHeight","vr","_virtualRenderComponent","VirtualRenderComponent","renderRow","tag","checked","rowData","change","_","selId","selId1","allChecked","getOwnPropertyNames","for","raw","content","renderer","_jslRender","JSLRender","term","dlgObj","_dialog","Dialog","autoOpen","onClose","selLength","anyChecked","filterObject","close","dlgClearButton","textToValues","dropDown","SelectOption","SelectOptionMultiple","NoResults","NoOptions","MaxSelection","AlreadyInUse","substring","pl","decode","s","decodeURIComponent","query","location","urlParams","seenObjects","detect","correctDates","dateISO","fromString","getTimezoneOffset","emptyGuid","regexIso8601","_myparse","UTC","JSLDialog","autoFocus","closeOnOverlayClick","modal","closeOnEscape","overlay","background","pointerEvents","firstInput","onKeydownEvent","onOpen","input","el1","open","State","scrollPos","bufferSizeInPx","rowTag","viewportSizeInPX","__proto__","vrBody","class","getChildren","scroll","newScrollPos","updateNode","viewport","TextEditor","MultiLineTextEditor","NumericEditor","BooleanEditor","navOnLR","maxLength","_slickEditorsNav","handleKeydownLRNav","handleKeydownLRNoNav","select","defaultValue","validator","val_as_str","msg","$select","keyCodes","parcelHelpers","selectionStart","textLength","IndentFormatter","GridTree","hierachy","_hierachy","getLevel","indentInRem","enableCollapsing","hasChildren","collapsedStateField","expandIconHTML","collapseIconHTML","hiddenStateField","initEvents","parent","getParent","parentColumn","rowHasChildren","getIdxByItem","parentid","getAllChildren","expand","realRows","filterChildren","indexes","parentID","rows2","oldparent","newparent","getIdxById","dict","toggleExpand","hiddenFilter","itm","CellRangeDecorator","zIndex","border","_elem","selectionCss","getCellNodeBox","CellRangeSelector","_currentlySelectedRange","_canvas","_gridOptions","_$activeCanvas","_dragging","_decorator","_rowOffset","_columnOffset","_isRightCanvas","_isBottomCanvas","_scrollTop","_scrollLeft","getActiveCanvasNode","onBeforeCellRangeSelected","onCellRangeSelected","cellDecorator","getCanvasNode","onDrag","CellSelectionModel","_selector","cellRangeSelector","selectActiveCell","removeInvalidRanges","rangeHasChanged","range1","range2","areDifferent","rangesAreEqual","getSelectedRanges","handleBeforeCellRangeSelected","handleCellRangeSelected","lastActiveCell","currentRange","newRange","dRow","dCell","dirCell","dirRow","new_last","viewRow","viewCell"],"version":3,"file":"index.js.map"}
|
|
1
|
+
{"mappings":"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","sources":["grid.ts","grid/slick.core.ts","core/jq.ts","node_modules/@parcel/transformer-js/src/esmodule-helpers.js","grid/slick.creator.ts","grid/slick.grid.ts","interaction/resizable.ts","core/polyfills.ts","interaction/eventhandler.ts","grid/plugins/slick.rowselectionmodel.ts","grid/slick.dataview.ts","grid/slick.groupitemmetadataprovider.ts","grid/plugins/slick.headermenu.ts","grid/plugins/slick.headerbuttons.ts","grid/slick.formatters.ts","core/numeric.ts","core/culture.ts","core/date.ts","grid/filterDialogs/excelFilter.ts","core/lang.ts","core/helper.ts","ui/dialog.ts","components/virtual-render/VirtualRenderComponent.ts","grid/slick.editors.core.ts","grid/slick.editors.nav.ts","grid/slick.tree.ts","grid/plugins/slick.cellrangedecorator.ts","grid/plugins/slick.cellrangeselector.ts","grid/plugins/slick.cellselectionmodel.ts"],"sourcesContent":["\r\nexport * from \"./grid/slick.core\";\r\nexport * from \"./grid/slick.creator\";\r\nexport * from \"./grid/slick.dataview\";\r\nexport * from \"./grid/slick.editors.core\";\r\nexport * from \"./grid/slick.formatters\";\r\nexport * from \"./grid/slick.grid\";\r\nexport * from \"./grid/slick.groupitemmetadataprovider\";\r\nexport * from \"./grid/slick.tree\";\r\n\r\nexport * from \"./grid/plugins/slick.cellrangedecorator\";\r\nexport * from \"./grid/plugins/slick.cellrangeselector\";\r\nexport * from \"./grid/plugins/slick.cellselectionmodel\";\r\nexport * from \"./grid/plugins/slick.headermenu\";\r\nexport * from \"./grid/plugins/slick.rowselectionmodel\";\r\n","import { jQueryReplacement, IjQueryReplacement } from \"../core/jq\";\r\nimport { ISlickGrid } from \"./slick.grid\";\r\n\r\nexport interface ISlick {\r\n \"Event\": () => void;\r\n \"EventData\": () => void;\r\n \"EventHandler\": () => void;\r\n \"Range\": (fromRow: number, fromCell: number, toRow: number, toCell: number) => void;\r\n \"NonDataRow\": () => void;\r\n \"Group\": any;\r\n \"GroupTotals\": any;\r\n \"EditorLock\": () => void;\r\n \"GlobalEditorLock\": any;\r\n // \"TreeColumns\": (treeColumns: any) => void;\r\n \"keyCode\": any;\r\n \"preClickClassName\": string;\r\n $: IjQueryReplacement;\r\n // formatters: { [index:string] : {formatter: ISlickFormatter} }\r\n}\r\n\r\nexport interface ISlickEvent<T> {\r\n subscribe(fnc: (e, args: T) => any);\r\n notify(e, args: T);\r\n countHandlers(): number;\r\n}\r\n\r\nexport interface ISlickFormatterResult {\r\n addClasses?: string[];\r\n toolTip?: string;\r\n text?: string;\r\n}\r\n\r\nexport type ISlickFormatter = (row: number, cell: number, value: any, columnDef: ISlickColumn, dataContext: any, grid?: ISlickGrid<any>) => string | ISlickFormatterResult;\r\n\r\nexport interface ISlickColumn {\r\n id: string;\r\n field?: string;\r\n name?: string;\r\n resizable?: boolean;\r\n sortable?: boolean;\r\n minWidth?: number;\r\n width?: number;\r\n maxWidth?: number;\r\n previousWidth?: number; // only for internal use\r\n rerenderOnResize?: boolean;\r\n headerCssClass?: string;\r\n defaultSortAsc?: boolean;\r\n focusable?: boolean;\r\n selectable?: boolean;\r\n format?: string;\r\n formatter?: ISlickFormatter;\r\n cssClass?: string;\r\n columnGroup?: string; // correct?\r\n editor?: any; // TODO\r\n editorOptions?: any;\r\n readonly?: boolean;\r\n valueList?: string[] | { [key: string]: string } | Array<{text: string, value: any}>;\r\n sortByVisibleValue?: boolean;\r\n comparer?: (a: any, b: any) => 0 | 1 | -1;\r\n header?: {buttons: [{image?: string, html?: string, showOnHover?: boolean, handler: (e:any) => void, cssClass?: string, tooltip?: string, command?: string}]};\r\n filterable?: boolean;\r\n hideMenu?: boolean;\r\n toolTip?: string;\r\n maxLength?: number;\r\n alwaysRenderColumn?: boolean;\r\n asyncPostRender?: (node: HTMLElement, row: number, item: Text, column: ISlickColumn, status: boolean) => void;\r\n asyncPostRenderCleanup?: (node: HTMLElement, row: number, column: ISlickColumn) => void;\r\n cannotTriggerInsert?: boolean;\r\n groupTotalsFormatter?: (item: any, columnDef: ISlickColumn, grid: any) => string | ISlickFormatterResult;\r\n}\r\n\r\n\r\nexport let Slick: ISlick = {\r\n \"Event\": Event,\r\n \"EventData\": EventData,\r\n \"EventHandler\": EventHandler,\r\n \"Range\": Range,\r\n \"NonDataRow\": NonDataItem,\r\n \"Group\": Group,\r\n \"GroupTotals\": GroupTotals,\r\n \"EditorLock\": EditorLock,\r\n\r\n /***\r\n * A global singleton editor lock.\r\n * @class GlobalEditorLock\r\n * @static\r\n * @constructor\r\n */\r\n \"GlobalEditorLock\": new EditorLock(),\r\n // \"TreeColumns\": TreeColumns,\r\n\r\n \"keyCode\": {\r\n SPACE: 8,\r\n BACKSPACE: 8,\r\n DELETE: 46,\r\n DOWN: 40,\r\n END: 35,\r\n ENTER: 13,\r\n ESCAPE: 27,\r\n HOME: 36,\r\n INSERT: 45,\r\n LEFT: 37,\r\n PAGE_DOWN: 34,\r\n PAGE_UP: 33,\r\n RIGHT: 39,\r\n TAB: 9,\r\n UP: 38,\r\n A: 65\r\n },\r\n \"preClickClassName\": \"slick-edit-preclick\",\r\n $: jQueryReplacement\r\n // formatters:{}\r\n};\r\n\r\n/***\r\n * An event object for passing data to event handlers and letting them control propagation.\r\n * <p>This is pretty much identical to how W3C and jQuery implement events.</p>\r\n * @class EventData\r\n * @constructor\r\n */\r\nfunction EventData() {\r\n var isPropagationStopped = false;\r\n var isImmediatePropagationStopped = false;\r\n\r\n /***\r\n * Stops event from propagating up the DOM tree.\r\n * @method stopPropagation\r\n */\r\n this.stopPropagation = function () {\r\n isPropagationStopped = true;\r\n };\r\n\r\n /***\r\n * Returns whether stopPropagation was called on this event object.\r\n * @method isPropagationStopped\r\n * @return {Boolean}\r\n */\r\n this.isPropagationStopped = function (): boolean {\r\n return isPropagationStopped;\r\n };\r\n\r\n /***\r\n * Prevents the rest of the handlers from being executed.\r\n * @method stopImmediatePropagation\r\n */\r\n this.stopImmediatePropagation = function () {\r\n isImmediatePropagationStopped = true;\r\n };\r\n\r\n /***\r\n * Returns whether stopImmediatePropagation was called on this event object.\\\r\n * @method isImmediatePropagationStopped\r\n * @return {Boolean}\r\n */\r\n this.isImmediatePropagationStopped = function (): boolean {\r\n return isImmediatePropagationStopped;\r\n };\r\n}\r\n\r\n/***\r\n * A simple publisher-subscriber implementation.\r\n * @class Event\r\n * @constructor\r\n */\r\nfunction Event() {\r\n var handlers: Function[] = [];\r\n\r\n /***\r\n * Adds an event handler to be called when the event is fired.\r\n * <p>Event handler will receive two arguments - an <code>EventData</code> and the <code>data</code>\r\n * object the event was fired with.<p>\r\n * @method subscribe\r\n * @param fn {Function} Event handler.\r\n */\r\n this.subscribe = function (fn: Function) {\r\n handlers.push(fn);\r\n };\r\n\r\n this.countHandlers = function () {\r\n return handlers.length;\r\n };\r\n\r\n /***\r\n * Removes an event handler added with <code>subscribe(fn)</code>.\r\n * @method unsubscribe\r\n * @param fn {Function} Event handler to be removed.\r\n */\r\n this.unsubscribe = function (fn: Function) {\r\n for (var i = handlers.length - 1; i >= 0; i--) {\r\n if (handlers[i] === fn) {\r\n handlers.splice(i, 1);\r\n }\r\n }\r\n };\r\n\r\n /***\r\n * Fires an event notifying all subscribers.\r\n * @method notify\r\n * @param args {Object} Additional data object to be passed to all handlers.\r\n * @param e {EventData}\r\n * Optional.\r\n * An <code>EventData</code> object to be passed to all handlers.\r\n * For DOM events, an existing W3C/jQuery event object can be passed in.\r\n * @param scope {Object}\r\n * Optional.\r\n * The scope (\"this\") within which the handler will be executed.\r\n * If not specified, the scope will be set to the <code>Event</code> instance.\r\n */\r\n this.notify = function (args: any, e, scope: any) {\r\n e = e || new EventData();\r\n scope = scope || this;\r\n\r\n var returnValue;\r\n for (var i = 0; i < handlers.length && !((e.isPropagationStopped && e.isPropagationStopped()) || (e.isImmediatePropagationStopped && e.isImmediatePropagationStopped())); i++) {\r\n returnValue = handlers[i].call(scope, e, args);\r\n }\r\n\r\n return returnValue;\r\n };\r\n}\r\n\r\nfunction EventHandler() {\r\n var handlers = [];\r\n\r\n this.subscribe = function (event, handler) {\r\n handlers.push({\r\n event: event,\r\n handler: handler\r\n });\r\n event.subscribe(handler);\r\n\r\n return this; // allow chaining\r\n };\r\n\r\n this.unsubscribe = function (event, handler) {\r\n var i = handlers.length;\r\n while (i--) {\r\n if (handlers[i].event === event &&\r\n handlers[i].handler === handler) {\r\n handlers.splice(i, 1);\r\n event.unsubscribe(handler);\r\n return;\r\n }\r\n }\r\n\r\n return this; // allow chaining\r\n };\r\n\r\n this.unsubscribeAll = function () {\r\n var i = handlers.length;\r\n while (i--) {\r\n handlers[i].event.unsubscribe(handlers[i].handler);\r\n }\r\n handlers = [];\r\n\r\n return this; // allow chaining\r\n };\r\n}\r\n\r\n/***\r\n * A structure containing a range of cells.\r\n * @class Range\r\n * @constructor\r\n * @param fromRow {Integer} Starting row.\r\n * @param fromCell {Integer} Starting cell.\r\n * @param toRow {Integer} Optional. Ending row. Defaults to <code>fromRow</code>.\r\n * @param toCell {Integer} Optional. Ending cell. Defaults to <code>fromCell</code>.\r\n */\r\nexport function Range(fromRow: number, fromCell: number, toRow?: number, toCell?: number) {\r\n if (toRow === undefined && toCell === undefined) {\r\n toRow = fromRow;\r\n toCell = fromCell;\r\n }\r\n\r\n /***\r\n * @property fromRow\r\n * @type {Integer}\r\n */\r\n this.fromRow = Math.min(fromRow, toRow);\r\n\r\n /***\r\n * @property fromCell\r\n * @type {Integer}\r\n */\r\n this.fromCell = Math.min(fromCell, toCell);\r\n\r\n /***\r\n * @property toRow\r\n * @type {Integer}\r\n */\r\n this.toRow = Math.max(fromRow, toRow);\r\n\r\n /***\r\n * @property toCell\r\n * @type {Integer}\r\n */\r\n this.toCell = Math.max(fromCell, toCell);\r\n\r\n /***\r\n * Returns whether a range represents a single row.\r\n * @method isSingleRow\r\n * @return {Boolean}\r\n */\r\n this.isSingleRow = function (): boolean {\r\n return this.fromRow == this.toRow;\r\n };\r\n\r\n /***\r\n * Returns whether a range represents a single cell.\r\n * @method isSingleCell\r\n * @return {Boolean}\r\n */\r\n this.isSingleCell = function (): boolean {\r\n return this.fromRow == this.toRow && this.fromCell == this.toCell;\r\n };\r\n\r\n /***\r\n * Returns whether a range contains a given cell.\r\n * @method contains\r\n * @param row {Integer}\r\n * @param cell {Integer}\r\n * @return {Boolean}\r\n */\r\n this.contains = function (row, cell) {\r\n return row >= this.fromRow && row <= this.toRow &&\r\n cell >= this.fromCell && cell <= this.toCell;\r\n };\r\n\r\n /***\r\n * Returns a readable representation of a range.\r\n * @method toString\r\n * @return {String}\r\n */\r\n this.toString = function (): string {\r\n if (this.isSingleCell()) {\r\n return \"(\" + this.fromRow + \":\" + this.fromCell + \")\";\r\n } else {\r\n return \"(\" + this.fromRow + \":\" + this.fromCell + \" - \" + this.toRow + \":\" + this.toCell + \")\";\r\n }\r\n };\r\n}\r\n\r\n\r\n/***\r\n * A base class that all special / non-data rows (like Group and GroupTotals) derive from.\r\n * @class NonDataItem\r\n * @constructor\r\n */\r\nfunction NonDataItem() {\r\n this.__nonDataRow = true;\r\n}\r\n\r\n\r\n/***\r\n * Information about a group of rows.\r\n * @class Group\r\n * @extends Slick.NonDataItem\r\n * @constructor\r\n */\r\nfunction Group() {\r\n this.__group = true;\r\n\r\n /**\r\n * Grouping level, starting with 0.\r\n * @property level\r\n * @type {Number}\r\n */\r\n this.level = 0;\r\n\r\n /***\r\n * Number of rows in the group.\r\n * @property count\r\n * @type {Integer}\r\n */\r\n this.count = 0;\r\n\r\n /***\r\n * Grouping value.\r\n * @property value\r\n * @type {Object}\r\n */\r\n this.value = null;\r\n\r\n /***\r\n * Formatted display value of the group.\r\n * @property title\r\n * @type {String}\r\n */\r\n this.title = null;\r\n\r\n /***\r\n * Whether a group is collapsed.\r\n * @property collapsed\r\n * @type {Boolean}\r\n */\r\n this.collapsed = false;\r\n\r\n /***\r\n * Whether a group selection checkbox is checked.\r\n * @property selectChecked\r\n * @type {Boolean}\r\n */\r\n this.selectChecked = false;\r\n\r\n /***\r\n * GroupTotals, if any.\r\n * @property totals\r\n * @type {GroupTotals}\r\n */\r\n this.totals = null;\r\n\r\n /**\r\n * Rows that are part of the group.\r\n * @property rows\r\n * @type {Array}\r\n */\r\n this.rows = [];\r\n\r\n /**\r\n * Sub-groups that are part of the group.\r\n * @property groups\r\n * @type {Array}\r\n */\r\n this.groups = null;\r\n\r\n /**\r\n * A unique key used to identify the group. This key can be used in calls to DataView\r\n * collapseGroup() or expandGroup().\r\n * @property groupingKey\r\n * @type {Object}\r\n */\r\n this.groupingKey = null;\r\n}\r\n\r\nGroup.prototype = new NonDataItem();\r\n\r\n/***\r\n * Compares two Group instances.\r\n * @method equals\r\n * @return {Boolean}\r\n * @param group {Group} Group instance to compare to.\r\n */\r\nGroup.prototype.equals = function (group): boolean {\r\n return this.value === group.value &&\r\n this.count === group.count &&\r\n this.collapsed === group.collapsed &&\r\n this.title === group.title;\r\n};\r\n\r\n/***\r\n * Information about group totals.\r\n * An instance of GroupTotals will be created for each totals row and passed to the aggregators\r\n * so that they can store arbitrary data in it. That data can later be accessed by group totals\r\n * formatters during the display.\r\n * @class GroupTotals\r\n * @extends Slick.NonDataItem\r\n * @constructor\r\n */\r\nfunction GroupTotals() {\r\n this.__groupTotals = true;\r\n\r\n /***\r\n * Parent Group.\r\n * @param group\r\n * @type {Group}\r\n */\r\n this.group = null;\r\n\r\n /***\r\n * Whether the totals have been fully initialized / calculated.\r\n * Will be set to false for lazy-calculated group totals.\r\n * @param initialized\r\n * @type {Boolean}\r\n */\r\n this.initialized = false;\r\n}\r\n\r\nGroupTotals.prototype = new NonDataItem();\r\n\r\n/***\r\n * A locking helper to track the active edit controller and ensure that only a single controller\r\n * can be active at a time. This prevents a whole class of state and validation synchronization\r\n * issues. An edit controller (such as SlickGrid) can query if an active edit is in progress\r\n * and attempt a commit or cancel before proceeding.\r\n * @class EditorLock\r\n * @constructor\r\n */\r\nfunction EditorLock() {\r\n var activeEditController = null;\r\n\r\n /***\r\n * Returns true if a specified edit controller is active (has the edit lock).\r\n * If the parameter is not specified, returns true if any edit controller is active.\r\n * @method isActive\r\n * @param editController {EditController}\r\n * @return {Boolean}\r\n */\r\n this.isActive = function (editController) {\r\n return (editController ? activeEditController === editController : activeEditController !== null);\r\n };\r\n\r\n /***\r\n * Sets the specified edit controller as the active edit controller (acquire edit lock).\r\n * If another edit controller is already active, and exception will be throw new Error(.\r\n * @method activate\r\n * @param editController {EditController} edit controller acquiring the lock\r\n */\r\n this.activate = function (editController) {\r\n if (editController === activeEditController) { // already activated?\r\n return;\r\n }\r\n if (activeEditController !== null) {\r\n throw new Error(\"SlickGrid.EditorLock.activate: an editController is still active, can't activate another editController\");\r\n }\r\n if (!editController.commitCurrentEdit) {\r\n throw new Error(\"SlickGrid.EditorLock.activate: editController must implement .commitCurrentEdit()\");\r\n }\r\n if (!editController.cancelCurrentEdit) {\r\n throw new Error(\"SlickGrid.EditorLock.activate: editController must implement .cancelCurrentEdit()\");\r\n }\r\n activeEditController = editController;\r\n };\r\n\r\n /***\r\n * Unsets the specified edit controller as the active edit controller (release edit lock).\r\n * If the specified edit controller is not the active one, an exception will be throw new Error(.\r\n * @method deactivate\r\n * @param editController {EditController} edit controller releasing the lock\r\n */\r\n this.deactivate = function (editController) {\r\n if (activeEditController !== editController) {\r\n throw new Error(\"SlickGrid.EditorLock.deactivate: specified editController is not the currently active one\");\r\n }\r\n activeEditController = null;\r\n };\r\n\r\n /***\r\n * Attempts to commit the current edit by calling \"commitCurrentEdit\" method on the active edit\r\n * controller and returns whether the commit attempt was successful (commit may fail due to validation\r\n * errors, etc.). Edit controller's \"commitCurrentEdit\" must return true if the commit has succeeded\r\n * and false otherwise. If no edit controller is active, returns true.\r\n * @method commitCurrentEdit\r\n * @return {Boolean}\r\n */\r\n this.commitCurrentEdit = function (): boolean {\r\n return (activeEditController ? activeEditController.commitCurrentEdit() : true);\r\n };\r\n\r\n /***\r\n * Attempts to cancel the current edit by calling \"cancelCurrentEdit\" method on the active edit\r\n * controller and returns whether the edit was successfully cancelled. If no edit controller is\r\n * active, returns true.\r\n * @method cancelCurrentEdit\r\n * @return {Boolean}\r\n */\r\n this.cancelCurrentEdit = function cancelCurrentEdit() {\r\n return (activeEditController ? activeEditController.cancelCurrentEdit() : true);\r\n };\r\n}\r\n\r\n// /**\r\n// *\r\n// * @param {Array} treeColumns Array com levels of columns\r\n// * @returns {{hasDepth: 'hasDepth', getTreeColumns: 'getTreeColumns', extractColumns: 'extractColumns', getDepth: 'getDepth', getColumnsInDepth: 'getColumnsInDepth', getColumnsInGroup: 'getColumnsInGroup', visibleColumns: 'visibleColumns', filter: 'filter', reOrder: reOrder}}\r\n// * @constructor\r\n// */\r\n// function TreeColumns(treeColumns) {\r\n\r\n// var columnsById = {};\r\n\r\n// function init() {\r\n// mapToId(treeColumns);\r\n// }\r\n\r\n// function mapToId(columns) {\r\n// columns\r\n// .forEach(function (column) {\r\n// columnsById[column.id] = column;\r\n\r\n// if (column.columns) {\r\n// mapToId(column.columns);\r\n// }\r\n// });\r\n// }\r\n\r\n// function filter(node, condition) {\r\n\r\n// return node.filter(function (column) {\r\n\r\n// var valid = condition.call(column);\r\n\r\n// if (valid && column.columns) {\r\n// column.columns = filter(column.columns, condition);\r\n// }\r\n\r\n// return valid && (!column.columns || column.columns.length);\r\n// });\r\n\r\n// }\r\n\r\n// function sort(columns, grid) {\r\n// columns\r\n// .sort(function (a, b) {\r\n// var indexA = getOrDefault(grid.getColumnIndex(a.id)),\r\n// indexB = getOrDefault(grid.getColumnIndex(b.id));\r\n\r\n// return indexA - indexB;\r\n// })\r\n// .forEach(function (column) {\r\n// if (column.columns) {\r\n// sort(column.columns, grid);\r\n// }\r\n// });\r\n// }\r\n\r\n// function getOrDefault(value) {\r\n// return typeof value === \"undefined\" ? -1 : value;\r\n// }\r\n\r\n// function getDepth(node) {\r\n// if (node.length) {\r\n// for (var i in node)\r\n// return getDepth(node[i]);\r\n// }\r\n// else if (node.columns) {\r\n// return 1 + getDepth(node.columns);\r\n// }\r\n// else {\r\n// return 1;\r\n// }\r\n// }\r\n\r\n// function getColumnsInDepth(node: any[], depth: number, current?: number) {\r\n// var columns = [];\r\n// current = current || 0;\r\n\r\n// if (depth == current) {\r\n\r\n// if (node.length) {\r\n// node.forEach(function (n) {\r\n// if (n.columns)\r\n// n.extractColumns = function () {\r\n// return extractColumns(n);\r\n// };\r\n// });\r\n// }\r\n\r\n// return node;\r\n// } else {\r\n// for (var i in node) {\r\n// if (node[i].columns) {\r\n// columns = columns.concat(getColumnsInDepth(node[i].columns, depth, current + 1));\r\n// }\r\n// }\r\n// }\r\n\r\n// return columns;\r\n// }\r\n\r\n// function extractColumns(node) {\r\n// var result = [];\r\n\r\n// if (node.hasOwnProperty(\"length\")) {\r\n\r\n// for (var i = 0; i < node.length; i++) {\r\n// result = result.concat(extractColumns(node[i]));\r\n// }\r\n\r\n// } else {\r\n\r\n// if (node.hasOwnProperty(\"columns\")) {\r\n\r\n// result = result.concat(extractColumns(node.columns));\r\n// } else {\r\n// return node;\r\n// }\r\n\r\n// }\r\n\r\n// return result;\r\n// }\r\n\r\n// function cloneTreeColumns() {\r\n// return (<any>window).Slick.$.shallowExtend([], treeColumns);\r\n// }\r\n\r\n// init();\r\n\r\n// this.hasDepth = function () {\r\n\r\n// for (var i in treeColumns) {\r\n// if (treeColumns[i].hasOwnProperty('columns'))\r\n// return true;\r\n// }\r\n\r\n// return false;\r\n// };\r\n\r\n// this.getTreeColumns = function () {\r\n// return treeColumns;\r\n// };\r\n\r\n// this.extractColumns = function () {\r\n// return this.hasDepth() ? extractColumns(treeColumns) : treeColumns;\r\n// };\r\n\r\n// this.getDepth = function () {\r\n// return getDepth(treeColumns);\r\n// };\r\n\r\n// this.getColumnsInDepth = function (depth) {\r\n// return getColumnsInDepth(treeColumns, depth);\r\n// };\r\n\r\n// this.getColumnsInGroup = function (groups) {\r\n// return extractColumns(groups);\r\n// };\r\n\r\n// this.visibleColumns = function () {\r\n// return filter(cloneTreeColumns(), function () {\r\n// return this.visible;\r\n// });\r\n// };\r\n\r\n// this.filter = function (condition) {\r\n// return filter(cloneTreeColumns(), condition);\r\n// };\r\n\r\n// this.reOrder = function (grid) {\r\n// return sort(treeColumns, grid);\r\n// };\r\n\r\n// this.getById = function (id) {\r\n// return columnsById[id];\r\n// };\r\n\r\n// this.getInIds = function (ids) {\r\n// return ids.map(function (id) {\r\n// return columnsById[id];\r\n// });\r\n// };\r\n// }\r\n\r\n// (<any>window).Slick = Slick;\r\n\r\n","export interface IjQueryWrapper {\r\n length: number;\r\n empty: () => IjQueryWrapper;\r\n appendTo: (selector: IjQueryWrapper | HTMLElement) => IjQueryWrapper;\r\n append: (el: HTMLElement) => IjQueryWrapper;\r\n add: (selector: IjQueryWrapper | HTMLElement) => IjQueryWrapper;\r\n css: (key: string, value?: any) => IjQueryWrapper | any;\r\n attr: (key: string, value?: any) => IjQueryWrapper | string;\r\n closestClass: (name: string, stopAt?: string) => IjQueryWrapper;\r\n data: (name: string, value?: any) => any;\r\n remove(): void;\r\n html: (value?: any) => string | IjQueryWrapper;\r\n text: (value: string) => IjQueryWrapper;\r\n addClass: (name: string) => IjQueryWrapper;\r\n hasClass: (name: string) => boolean;\r\n height: (val?: number | string) => number | IjQueryWrapper;\r\n width: (val?: number | string) => number | IjQueryWrapper;\r\n removeClass: (name: string) => IjQueryWrapper;\r\n offset: () => { top: number, left: number };\r\n children: () => IjQueryWrapper;\r\n on: (eventname: string, fnc: Function) => IjQueryWrapper;\r\n toggleClass: (name: string, state?: boolean) => IjQueryWrapper;\r\n find: (selector: string) => IjQueryWrapper;\r\n slideDown: (speed: string, done: Function) => IjQueryWrapper;\r\n slideUp: (speed: string, done: Function) => IjQueryWrapper;\r\n index: () => number;\r\n}\r\n\r\nexport interface IjQueryReplacement {\r\n (selector?: string | HTMLElement | Document): IjQueryWrapper;\r\n deepExtend?: (out: any, ...a: any[]) => any;\r\n shallowExtend?: (out: any, ...a: any[]) => any;\r\n each?: (array: any[] | IjQueryWrapper, fnc: (idx: number, val: any) => void) => void;\r\n}\r\n\r\nfunction deepExtend(out: any, ...a: any[]): any {\r\n out = out || {};\r\n\r\n for (let i = 1; i < arguments.length; i++) {\r\n let obj = arguments[i];\r\n\r\n if (!obj)\r\n continue;\r\n\r\n for (let key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n if (obj[key] !== null && typeof obj[key] === 'object')\r\n out[key] = deepExtend((Array.isArray(obj[key]) && out[key] === undefined) ? [] : out[key], obj[key]);\r\n else\r\n out[key] = obj[key];\r\n }\r\n }\r\n }\r\n\r\n return out;\r\n}\r\n\r\nfunction getParentWithClass(el: HTMLElement, c: string, stopAt?: string): HTMLElement {\r\n if (el.classList.contains(c))\r\n return el;\r\n if (stopAt !== undefined && el.classList.contains(stopAt))\r\n return undefined;\r\n if (el.parentElement) {\r\n return getParentWithClass(el.parentElement, c);\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction jQWrapper(elements: HTMLElement[]): IjQueryWrapper {\r\n let _elements: any = elements;\r\n\r\n _elements.empty = function (): IjQueryWrapper {\r\n for (let x of _elements) {\r\n x.innerHTML = '';\r\n }\r\n return this;\r\n };\r\n\r\n _elements.appendTo = function (selector: IjQueryWrapper | HTMLElement): IjQueryWrapper {\r\n for (let i = 0; i < _elements.length; i++) {\r\n if (selector instanceof HTMLElement) {\r\n selector.appendChild(_elements[i]);\r\n } else {\r\n for (let j = 0; j < selector.length; j++) {\r\n selector[j].appendChild(_elements[i]);\r\n }\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n _elements.append = function (el: HTMLElement): IjQueryWrapper {\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i].appendChild(el);\r\n }\r\n return this;\r\n };\r\n\r\n _elements.add = function (selector: IjQueryWrapper | HTMLElement): IjQueryWrapper {\r\n if (selector !== undefined) {\r\n if (selector instanceof HTMLElement) {\r\n _elements.push(selector);\r\n } else {\r\n for (let i = 0; i < selector.length; i++) {\r\n _elements.push(selector[i]);\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n _elements.css = function (key: string | any, value?: any): IjQueryWrapper | any {\r\n // TODO: support object instead of just simple keys\r\n if (value === undefined) {\r\n if (typeof (key) === \"string\") {\r\n if (!_elements.length) {\r\n return undefined;\r\n }\r\n const computed = [\"borderLeftWidth\", \"borderRightWidth\", \"paddingLeft\", \"paddingRight\",\r\n \"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\"];\r\n if (computed.indexOf(key) < 0) {\r\n return _elements[0].style[key];\r\n }\r\n return window.getComputedStyle(_elements[0])[key];\r\n } else {\r\n for (const keyEl in key) {\r\n if (!key.hasOwnProperty(keyEl)) {\r\n continue;\r\n }\r\n for (let i = 0; i < _elements.length; i++) {\r\n if ([\"height\", \"width\", \"top\", \"left\", \"bottom\", \"right\"].indexOf(keyEl) >= 0 && typeof key[keyEl] === \"number\") {\r\n _elements[i].style[keyEl] = key[keyEl] + \"px\";\r\n } else {\r\n _elements[i].style[keyEl] = key[keyEl];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < _elements.length; i++) {\r\n if ([\"height\", \"width\", \"top\", \"left\", \"bottom\", \"right\"].indexOf(key) >= 0 && typeof value === \"number\") {\r\n _elements[i].style[key] = value + \"px\";\r\n } else {\r\n _elements[i].style[key] = value;\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n _elements.attr = function (key: string, value?: any): IjQueryWrapper | string {\r\n if (value === undefined) {\r\n return _elements.length ? _elements[0][key] : undefined;\r\n }\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i][key] = value;\r\n }\r\n return this;\r\n }\r\n\r\n _elements.closestClass = function (name: string, stopAt?: string): IjQueryWrapper {\r\n let result = jQueryReplacement();\r\n for (let i = 0; i < _elements.length; i++) {\r\n let match = getParentWithClass(_elements[i], name, stopAt);\r\n result.add(match);\r\n }\r\n return result;\r\n }\r\n\r\n _elements.remove = function (): void {\r\n for (let i = 0; i < _elements.length; i++) {\r\n let el = _elements[i];\r\n el.parentNode.removeChild(el);\r\n }\r\n }\r\n\r\n _elements.data = function (name: string, value?: any): any {\r\n if (_elements.length === 0)\r\n return undefined;\r\n if (value === undefined) {\r\n return _elements[0][name];\r\n }\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i][name] = value;\r\n }\r\n return this;\r\n }\r\n\r\n _elements.html = function (value?: any): string | IjQueryWrapper {\r\n if (value === undefined) {\r\n return _elements.length ? _elements[0].innerHTML : undefined;\r\n }\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i].innerHTML = value;\r\n }\r\n return this;\r\n }\r\n\r\n _elements.text = function (value: string): IjQueryWrapper {\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i].innerText = value;\r\n }\r\n return this;\r\n }\r\n\r\n _elements.height = function (value?: number | string): number | IjQueryWrapper {\r\n if (value === undefined) {\r\n if (!_elements.length) {\r\n return undefined;\r\n }\r\n let cssHeight = parseInt(_elements[0].style.height);\r\n if (isNaN(cssHeight)) {\r\n return _elements[0].offsetHeight;\r\n } else {\r\n return cssHeight;\r\n }\r\n }\r\n for (let i = 0; i < _elements.length; i++) {\r\n if (typeof value === \"string\") {\r\n _elements[i].style.height = value;\r\n } else {\r\n //_elements[i].offsetHeight = value;\r\n _elements[i].style.height = value + \"px\";\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n _elements.width = function (value?: number | string): number | IjQueryWrapper {\r\n if (value === undefined) {\r\n if (!_elements.length) {\r\n return undefined;\r\n }\r\n // let cssHeight = parseInt(_elements[0].style.width);\r\n // if (isNaN(cssHeight)) {\r\n return _elements[0].offsetWidth;\r\n // } else {\r\n // return cssHeight;\r\n // }\r\n }\r\n for (let i = 0; i < _elements.length; i++) {\r\n if (typeof value === \"string\") {\r\n _elements[i].style.width = value;\r\n } else {\r\n //_elements[i].offsetWidth = value;\r\n _elements[i].style.width = value + \"px\";\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n _elements.removeClass = function (name: string): IjQueryWrapper {\r\n for (let i = 0; i < _elements.length; i++) {\r\n if (name.indexOf(' ') > 0) {\r\n let names = name.split(' ');\r\n for (let nIdx = 0; nIdx < names.length; nIdx++) {\r\n _elements[i].classList.remove(names[nIdx]);\r\n }\r\n } else {\r\n _elements[i].classList.remove(name);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n _elements.offset = function (): { top: number, left: number } {\r\n if (_elements.length === 0)\r\n return undefined;\r\n let el = _elements[0];\r\n let rect = el.getBoundingClientRect();\r\n return {\r\n top: rect.top + document.body.scrollTop,\r\n left: rect.left + document.body.scrollLeft\r\n };\r\n }\r\n\r\n _elements.children = function (): IjQueryWrapper {\r\n let result: HTMLElement[] = [];\r\n for (let i = 0; i < _elements.length; i++) {\r\n for (let cidx = 0; cidx < _elements[i].children.length; cidx++) {\r\n result.push(_elements[i].children[cidx]);\r\n }\r\n }\r\n return jQWrapper(result);\r\n }\r\n\r\n _elements.on = function (eventname: string, fnc: Function): IjQueryWrapper {\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i].addEventListener(eventname, fnc);\r\n }\r\n return this;\r\n }\r\n\r\n _elements.toggleClass = function (name: string, state?: boolean): IjQueryWrapper {\r\n for (let i = 0; i < _elements.length; i++) {\r\n if (state === false || _elements[i].classList.contains(name)) {\r\n _elements[i].classList.remove(name);\r\n } else if (state === true || !_elements[i].classList.contains(name)) {\r\n _elements[i].classList.add(name);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n _elements.find = function (selector: string): IjQueryWrapper {\r\n var result = jQueryReplacement();\r\n for (let i = 0; i < _elements.length; i++) {\r\n let found = _elements[i].querySelectorAll(selector);\r\n for (let j = 0; j < found.length; j++) {\r\n result.add(found[j]);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n _elements.slideDown = function (speed: string, done: Function): IjQueryWrapper {\r\n //TODO\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i].style.display = '';\r\n }\r\n return this;\r\n }\r\n\r\n _elements.slideUp = function (speed: string, done: Function): IjQueryWrapper {\r\n //TODO\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i].style.display = 'none';\r\n }\r\n return this;\r\n }\r\n\r\n _elements.addClass = function (name: string): IjQueryWrapper {\r\n if (name) {\r\n {\r\n for (let i = 0; i < _elements.length; i++) {\r\n _elements[i].classList.add(name);\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n _elements.hasClass = function (name: string): boolean {\r\n for (let i = 0; i < _elements.length; i++) {\r\n if (_elements[i].classList.contains(name))\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n _elements.index = function (): number {\r\n var index = 0;\r\n let node = _elements[0];\r\n if (!node)\r\n return -1;\r\n while ((node = node.previousElementSibling)) {\r\n index++;\r\n }\r\n return index;\r\n }\r\n\r\n\r\n return _elements;\r\n}\r\n\r\nexport let jQueryReplacement: IjQueryReplacement = function (selector?: string | HTMLElement): IjQueryWrapper {\r\n let elements: HTMLElement[] = [];\r\n if (typeof selector === \"string\") {\r\n if (selector[0] === '<') {\r\n var tmp = document.createElement(\"div\");\r\n tmp.innerHTML = selector;\r\n elements.push(<HTMLElement>tmp.firstElementChild);\r\n } else {\r\n var q = document.querySelectorAll(selector);\r\n\r\n if (q) {\r\n for (let i = 0; i < q.length; i++) {\r\n let node: Node = q[i];\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n elements.push(node as HTMLElement);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n if (selector !== undefined) {\r\n elements.push(<HTMLElement>selector);\r\n }\r\n }\r\n return jQWrapper(elements);\r\n};\r\n\r\njQueryReplacement.deepExtend = deepExtend;\r\njQueryReplacement.each = function (array: any[] | IjQueryWrapper, fnc: (idx: number, val: any) => void): void {\r\n for (let i = 0; i < array.length; i++) {\r\n fnc(i, array[i]);\r\n }\r\n};\r\njQueryReplacement.shallowExtend = function (out, ...rest) {\r\n out = out || {};\r\n\r\n for (var i = 1; i < arguments.length; i++) {\r\n if (!arguments[i])\r\n continue;\r\n\r\n for (var key in arguments[i]) {\r\n if (arguments[i].hasOwnProperty(key))\r\n out[key] = arguments[i][key];\r\n }\r\n }\r\n\r\n return out;\r\n};\r\n\r\n","exports.interopDefault = function(a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function(a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function(source, dest) {\n Object.keys(source).forEach(function(key) {\n if (key === 'default' || key === '__esModule') {\n return;\n }\n\n // Skip duplicate re-exports when they have the same value.\n if (key in dest && dest[key] === source[key]) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function() {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function(dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n","import { ISlickColumn, Slick, ISlickFormatterResult, ISlickEvent } from \"./slick.core\";\r\nimport { SlickGrid, ISlickGridOptions, ISlickGrid } from \"./slick.grid\";\r\nimport { RowSelectionModel } from \"./plugins/slick.rowselectionmodel\";\r\nimport { DataView, ISlickDataView } from \"./slick.dataview\";\r\nimport { GroupItemMetadataProvider } from \"./slick.groupitemmetadataprovider\";\r\nimport { jQueryReplacement, IjQueryWrapper } from \"../core/jq\";\r\nimport { HeaderMenu } from \"./plugins/slick.headermenu\";\r\nimport { HeaderButtons } from \"./plugins/slick.headerbuttons\";\r\nimport { TextFormatter } from \"./slick.formatters\";\r\nimport { ExcelFilter } from \"./filterDialogs/excelFilter\";\r\nimport { UILang } from \"../core/lang\";\r\n\r\nexport interface ISlickCreatorOptions extends ISlickGridOptions {\r\n primaryKey: string;\r\n showHeaderMenu?: boolean;\r\n provideDefaultValues?: (item: any) => boolean | void;\r\n groupItemOptions?: any; // TODO\r\n showColumnGroups?: boolean;\r\n mode?: \"client\" | \"server\";\r\n dataView?: any; // TODO\r\n saveColumnsKey?: string;\r\n groupItemMetadataProvider?: any;\r\n getFilterValues?: (column: ISlickColumn /* TODO: selected values of other columns */) => Promise<{ [key: string]: any[] } | any[]>;\r\n showFilterDialog?: (column: ISlickColumn, grid: IJSLGrid<any>) => void;\r\n}\r\n\r\nexport interface IJSLGrid<T> extends ISlickGrid<T> {\r\n dataView: ISlickDataView<T>;\r\n setHeight: (height: number) => void;\r\n getHeight: () => number;\r\n sort: (column: ISlickColumn, sortAsc?: boolean) => void;\r\n refreshData: () => void;\r\n setData: (newData: T[]) => void;\r\n getData: () => T[];\r\n refresh: () => void;\r\n addFormula: (field: string, fnc: (row: T, grid: IJSLGrid<T>, field: string) => any,\r\n usedColumns: string[]) => void;\r\n getFormattedValue: (column: ISlickColumn, value: any, item?: T) => string;\r\n getContentWidth: (column: ISlickColumn, row: number) => number;\r\n fitToContent: (column: ISlickColumn) => void;\r\n triggerAllFormulas: () => void;\r\n columnHasFilter: (columnId: string) => boolean;\r\n refreshDataItem: (item: T) => void;\r\n addFilter: (filter: {\r\n field: string,\r\n columnId?: string,\r\n match: (item: T, field: string) => boolean, combine?: \"or\" | \"and\"\r\n }, dontrefresh?: boolean) => void;\r\n setFilters: (filters: Array<{\r\n field: string,\r\n columnId?: string,\r\n match: (item: T, field: string) => boolean, combine?: \"or\" | \"and\"\r\n }>, dontrefresh?: boolean) => void;\r\n getFilters: () => Array<{\r\n field: string,\r\n columnId?: string,\r\n match: (item: T, field: string) => boolean, combine?: \"or\" | \"and\"\r\n }>;\r\n clearFilter: (field?: string, dontrefresh?: boolean) => void;\r\n refreshFilters: (refreshFilters?: boolean) => void;\r\n getSelectedItems: () => T[];\r\n onAfterEdit: ISlickEvent<{\r\n grid: IJSLGrid<T>,\r\n oldValue: any,\r\n newValue: any,\r\n column: ISlickColumn,\r\n item: T\r\n }>;\r\n onFiltersChanged: ISlickEvent<void>;\r\n getHeaderMenu: () => any;\r\n getFilterDialog: () => any;\r\n}\r\n\r\nconst $ = jQueryReplacement;\r\n\r\nexport function createJSLGrid<T>(selector: string | HTMLDivElement, data: T[],\r\n columns: ISlickColumn[], option: ISlickCreatorOptions): IJSLGrid<T> {\r\n\r\n const formulaObjects:\r\n Array<{\r\n column: string;\r\n fnc: (item: any, creator: IJSLGrid<any>, field: string) => any\r\n }> = [];\r\n\r\n let headerMenu;\r\n let headerButtons;\r\n\r\n const formulas = {};\r\n\r\n let container: HTMLDivElement;\r\n\r\n let filters: Array<{ field: string, columnId?: string, match: (item: T, field: string) => boolean, combine?: \"or\" | \"and\" }> = [];\r\n\r\n let customCommandHandler;\r\n\r\n let grid: IJSLGrid<T>;\r\n let dataView: ISlickDataView<T>;\r\n\r\n //let options: ISlickCreatorOptions;\r\n\r\n function createMe() {\r\n\r\n sanitizeColumns(columns);\r\n const options = $.shallowExtend({ explicitInitialization: true, mode: \"client\" }, option);\r\n\r\n container = typeof (selector) === \"string\" ?\r\n document.querySelector(selector) as HTMLDivElement :\r\n selector as HTMLDivElement;\r\n\r\n if (!container) {\r\n throw new Error(\"error: selector for SlickCreator is invalid\");\r\n }\r\n\r\n if (options.showColumnGroups) {\r\n options.createPreHeaderPanel = true;\r\n options.showPreHeaderPanel = true;\r\n }\r\n\r\n customCommandHandler = option.editCommandHandler;\r\n options.editCommandHandler = (a, b, c) => { handleEditCommand(a, b, c); };\r\n\r\n const groupItemMetadataProvider = options.groupItemMetadataProvider || GroupItemMetadataProvider(options.groupItemOptions);\r\n if (options.dataView != null) {\r\n dataView = options.dataView;\r\n } else {\r\n dataView = new DataView({ inlineFilters: true, groupItemMetadataProvider });\r\n dataView.setItems(data, options.primaryKey);\r\n }\r\n grid = new SlickGrid(container, dataView, columns, options);\r\n grid.registerPlugin(groupItemMetadataProvider);\r\n grid.setSelectionModel(new RowSelectionModel());\r\n\r\n grid.onHeaderCellRendered.subscribe((e, args) => {\r\n if (columnHasFilter(args.column.id)) {\r\n //this column is filtered\r\n args.node.classList.add(\"slick-filtered-header\");\r\n }\r\n });\r\n\r\n addCustomEvents();\r\n setupDefaultSort();\r\n setupChangeEvents();\r\n if (options.showHeaderMenu) {\r\n setupHeaderMenu();\r\n }\r\n setupHeaderButtons();\r\n\r\n if (!option.explicitInitialization) {\r\n grid.init();\r\n }\r\n\r\n if (options.showColumnGroups) {\r\n setTimeout(() => {\r\n // TODO -> find better solution then timeout\r\n grid.onColumnsResized.subscribe(() => {\r\n CreateColumnGroups();\r\n });\r\n CreateColumnGroups();\r\n }, 1);\r\n }\r\n\r\n if (options.saveColumnsKey) {\r\n grid.onColumnsResized.subscribe(() => {\r\n storeColumnSettings();\r\n });\r\n grid.onColumnsReordered.subscribe(() => {\r\n storeColumnSettings();\r\n });\r\n loadColumnSettings();\r\n }\r\n\r\n }\r\n\r\n function CreateColumnGroups() {\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n const columns = grid.getColumns();\r\n if (options.frozenColumn >= 0) {\r\n // Add column groups to left panel\r\n let $preHeaderPanel = $(grid.getPreHeaderPanel());\r\n renderHeaderGroups($preHeaderPanel, 0, options.frozenColumn + 1);\r\n // Add column groups to right panel\r\n $preHeaderPanel = $(grid.getPreHeaderPanelRight());\r\n renderHeaderGroups($preHeaderPanel, options.frozenColumn + 1, columns.length);\r\n } else {\r\n const $preHeaderPanel = $(grid.getPreHeaderPanel());\r\n renderHeaderGroups($preHeaderPanel, 0, columns.length);\r\n }\r\n\r\n function renderHeaderGroups(preHeaderPanel, start, end) {\r\n preHeaderPanel.empty()\r\n .addClass(\"slick-header-columns\")\r\n .css(\"left\", \"-1000px\")\r\n .width(grid.getHeadersWidth());\r\n preHeaderPanel[0].parentElement.classList.add(\"slick-header\");\r\n\r\n const headerColumnWidthDiff = grid.getHeaderColumnWidthDiff();\r\n let header;\r\n let lastColumnGroup = \"\";\r\n let widthTotal = 0;\r\n\r\n for (let i = start; i < end; i++) {\r\n const m = columns[i];\r\n if (lastColumnGroup === m.columnGroup && i > start) {\r\n widthTotal += m.width;\r\n header.width(widthTotal - headerColumnWidthDiff);\r\n } else {\r\n widthTotal = m.width;\r\n header = (($(\"<div class='ui-state-default slick-header-column' />\")\r\n .html(\"<span class='slick-column-name'>\" + (m.columnGroup || '') + \"</span>\") as IjQueryWrapper)\r\n .width(m.width - headerColumnWidthDiff) as IjQueryWrapper)\r\n .appendTo(preHeaderPanel);\r\n }\r\n lastColumnGroup = m.columnGroup;\r\n }\r\n }\r\n\r\n }\r\n\r\n function storeColumnSettings() {\r\n const cols = grid.getColumns();\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n const colSettings = cols.map((c) => ({id: c.id, width: c.width}));\r\n if (window.localStorage) {\r\n localStorage.setItem(\"_grid_col_settings_\" + options.saveColumnsKey, JSON.stringify(colSettings));\r\n }\r\n }\r\n\r\n function loadColumnSettings() {\r\n if (!window.localStorage) {\r\n return;\r\n }\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n const key = options.saveColumnsKey;\r\n if (key) {\r\n const cols = grid.getColumns();\r\n const colSettings = JSON.parse(localStorage.getItem(\"_grid_col_settings_\" + key));\r\n if (!colSettings) {\r\n return;\r\n }\r\n for (let i = 0; i < colSettings.length; i++) {\r\n for (let j = 0; j < cols.length; j++) {\r\n if (cols[j].id === colSettings[i].id) {\r\n const c = cols[j];\r\n c.width = colSettings[i].width;\r\n if (i !== j) {\r\n cols.splice(j, 1);\r\n cols.splice(i, 0, c);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n grid.setColumns(cols);\r\n }\r\n }\r\n\r\n function sanitizeColumns(cols: ISlickColumn[]) {\r\n for (let i = 0; i < cols.length; i++) {\r\n const c = cols[i];\r\n if (c.field === undefined && c.id) {\r\n c.field = c.id;\r\n }\r\n }\r\n }\r\n\r\n function addCustomEvents() {\r\n (grid as any).onAfterEdit = new Slick.Event();\r\n (grid as any).onFiltersChanged = new Slick.Event();\r\n }\r\n\r\n function setupChangeEvents() {\r\n dataView.onRowsChanged.subscribe((e, args) => {\r\n grid.invalidateRows(args.rows);\r\n grid.render();\r\n // for (let idx = 0; idx < args.rows.length; idx++) {\r\n // grid.updateRow(args.rows[idx]);\r\n // }\r\n // grid.invalidate();\r\n });\r\n\r\n dataView.onRowCountChanged.subscribe((e, args) => {\r\n grid.updateRowCount();\r\n grid.render();\r\n });\r\n\r\n grid.onAddNewRow.subscribe((e, args) => {\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n if (options.provideDefaultValues != null) {\r\n const result = options.provideDefaultValues(args.item);\r\n if (result === false) {\r\n return;\r\n }\r\n }\r\n dataView.addItem(args.item);\r\n (grid as any).onAfterEdit.notify({\r\n grid,\r\n oldValue: undefined,\r\n newValue: grid.getDataItemValueForColumn(args.item, args.column),\r\n column: args.column,\r\n item: args.item\r\n });\r\n });\r\n }\r\n\r\n function setupDefaultSort() {\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n if (options.mode === \"client\") {\r\n grid.onSort.subscribe((e, args) => {\r\n sort(args.sortCol, args.sortAsc);\r\n });\r\n }\r\n // TODO: multi column sort\r\n }\r\n\r\n function setupHeaderButtons() {\r\n headerButtons = new HeaderButtons({});\r\n grid.registerPlugin(headerButtons);\r\n }\r\n\r\n function setupHeaderMenu() {\r\n headerMenu = new HeaderMenu({});\r\n grid.registerPlugin(headerMenu);\r\n headerMenu.onBeforeMenuShow.subscribe((e, args) => {\r\n const column: ISlickColumn = args.column;\r\n const menu = args.menu;\r\n if (column.sortable) {\r\n menu.items.push({\r\n title: UILang.grid.Sort + \" \" + UILang.grid.Asc,\r\n command: \"sort-asc\"\r\n });\r\n menu.items.push({\r\n title: UILang.grid.Sort + \" \" + UILang.grid.Desc,\r\n command: \"sort-desc\"\r\n });\r\n }\r\n if (column.filterable) {\r\n menu.items.push({\r\n title: UILang.grid.Filter,\r\n command: \"filter\"\r\n });\r\n if (filters.filter((f) => f.columnId === column.id).length > 0) {\r\n menu.items.push({\r\n title: UILang.grid.ClearFilter,\r\n command: \"clear-filter\"\r\n });\r\n }\r\n }\r\n });\r\n\r\n headerMenu.onCommand.subscribe((e, args) => {\r\n if (args.command === \"sort-asc\" || args.command === \"sort-desc\") {\r\n grid.onSort.notify({\r\n sortAsc: args.command === \"sort-asc\",\r\n sortCol: args.column,\r\n columnId: args.column.id,\r\n sortCols: [{ columnId: args.column.id, sortCol: args.column, sortAsc: args.command === \"sort-asc\" }],\r\n multiColumnSort: false\r\n }, e);\r\n // sort(args.column, args.command === \"sort-asc\");\r\n } else if (args.command === \"filter\") {\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n if (options.showFilterDialog != null) {\r\n options.showFilterDialog(args.column, grid);\r\n } else {\r\n new ExcelFilter(grid).show(args.column);\r\n }\r\n } else if (args.command === \"clear-filter\") {\r\n clearFilter(args.column.id);\r\n }\r\n });\r\n\r\n }\r\n\r\n // refresh formulas depending on the given column\r\n function triggerFormula(column, item): void {\r\n const f = formulas[column];\r\n if (f) {\r\n for (let i = 0, l = f.length; i < l; i++) {\r\n item[f[i].column] = f[i].fnc(item, column);\r\n }\r\n }\r\n }\r\n\r\n function handleEditCommand(item, column, editCommand) {\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n const oldVal = grid.getDataItemValueForColumn(item, column);\r\n if (customCommandHandler) {\r\n customCommandHandler(item, column, editCommand);\r\n } else {\r\n editCommand.execute();\r\n }\r\n triggerFormula(column.field, item);\r\n dataView.updateItem(item[options.primaryKey], item);\r\n\r\n const afterEditResult = (grid as any).onAfterEdit.notify({\r\n grid,\r\n oldValue: oldVal,\r\n newValue: grid.getDataItemValueForColumn(item, column),\r\n column,\r\n item\r\n });\r\n\r\n if (afterEditResult === false) {\r\n item[column.field] = oldVal;\r\n triggerFormula(column.field, item);\r\n dataView.updateItem(item[options.primaryKey], item);\r\n }\r\n }\r\n\r\n function setHeight(height: number): void {\r\n $(container).height(height);\r\n grid.resizeCanvas();\r\n }\r\n\r\n function getHeight(): number {\r\n return $(container).height() as number;\r\n }\r\n\r\n function sort(column: ISlickColumn, sortAsc?: boolean) {\r\n\r\n function _comparer(a, b) {\r\n let x = grid.getDataItemValueForColumn(a, column);\r\n let y = grid.getDataItemValueForColumn(b, column);\r\n if (typeof x === \"string\" && typeof y === \"string\") {\r\n x = x.toLocaleLowerCase();\r\n y = y.toLocaleLowerCase();\r\n }\r\n if (x == null && y != null) {\r\n return -1;\r\n } else if (x != null && y == null) {\r\n return 1;\r\n } else {\r\n return (x === y ? 0 : (x > y ? 1 : -1));\r\n }\r\n }\r\n\r\n function _visibleComparer(a, b) {\r\n const x = column.formatter(0, 0, grid.getDataItemValueForColumn(a, column), column, a);\r\n const y = column.formatter(0, 0, grid.getDataItemValueForColumn(b, column), column, b);\r\n let xStr = (Object.prototype.toString.call(x) !== \"[object Object]\" ? (x as string) : (x as ISlickFormatterResult).text);\r\n let yStr = (Object.prototype.toString.call(y) !== \"[object Object]\" ? (y as string) : (y as ISlickFormatterResult).text);\r\n if (typeof x === \"string\" && typeof y === \"string\") {\r\n xStr = x.toLocaleLowerCase();\r\n yStr = y.toLocaleLowerCase();\r\n }\r\n return (xStr === yStr ? 0 : (xStr > yStr ? 1 : -1));\r\n }\r\n\r\n const comparer = column.comparer || (column.sortByVisibleValue ? _visibleComparer : _comparer);\r\n dataView.sort(comparer, sortAsc ? true : false);\r\n }\r\n\r\n function setData(newData: T[]) {\r\n data = newData;\r\n dataView.setItems(data);\r\n refresh();\r\n }\r\n\r\n function getData(): T[] {\r\n return data;\r\n }\r\n\r\n function refreshData() {\r\n // var selrows = self.getSelectedRows();\r\n dataView.setItems(data);\r\n // self.setSelectedRows(selrows);\r\n refresh();\r\n }\r\n\r\n function refresh() {\r\n grid.invalidate();\r\n }\r\n\r\n function addFormula(field: string, fnc: (row: T, grid: IJSLGrid<T>, field: string) => any,\r\n usedColumns: string[]) {\r\n formulaObjects.push({ fnc, column: field });\r\n for (let i = 0; i < usedColumns.length; i++) {\r\n if (!formulas[usedColumns[i]]) {\r\n formulas[usedColumns[i]] = [];\r\n }\r\n formulas[usedColumns[i]].push({ fnc, column: field });\r\n }\r\n }\r\n\r\n /**\r\n * returns the string representation of a value based on column settings\r\n */\r\n function getFormattedValue(column: ISlickColumn, value: any, item?: T): string {\r\n const formatter = column.formatter || TextFormatter;\r\n const formatterResult = formatter(0, 0, value, column, item, grid);\r\n return (Object.prototype.toString.call(formatterResult) !== \"[object Object]\" ?\r\n (formatterResult as string) :\r\n ((formatterResult as ISlickFormatterResult).text));\r\n }\r\n\r\n function getContentWidth(column: ISlickColumn, row: number): number {\r\n const item = dataView.getItem(row);\r\n const html = getFormattedValue(column, grid.getDataItemValueForColumn(item, column), item);\r\n if (html.indexOf(\"<\") >= 0) {\r\n return calcLengthInternal(html, true) + 12;\r\n } else {\r\n if (convertElement == null) {\r\n convertElement = document.createElement(\"span\");\r\n }\r\n convertElement.innerHTML = html;\r\n return calcTextLength(convertElement.textContent) + 12;\r\n }\r\n }\r\n\r\n let measureElement: HTMLSpanElement;\r\n let convertElement: HTMLSpanElement;\r\n const charWidth = {};\r\n\r\n function calcTextLength(text: string) {\r\n let result = 0;\r\n for (let i = 0; i < text.length; i++) {\r\n const c = text[i];\r\n let w = charWidth[c];\r\n if (w == null) {\r\n charWidth[c] = w = calcLengthInternal(c, false);\r\n }\r\n result += w;\r\n }\r\n return result;\r\n }\r\n\r\n function calcLengthInternal(c: string, isHTML: boolean): number {\r\n if (measureElement == null) {\r\n measureElement = document.createElement(\"span\");\r\n measureElement.style.top = \"-100000px\";\r\n measureElement.style.position = \"absolute\";\r\n measureElement.style.whiteSpace = \"pre\";\r\n document.body.appendChild(measureElement);\r\n grid.onBeforeDestroy.subscribe(() => {\r\n if (measureElement.parentElement != null) {\r\n measureElement.parentElement.removeChild(measureElement);\r\n }\r\n });\r\n }\r\n if (isHTML) {\r\n measureElement.innerHTML = c;\r\n } else {\r\n measureElement.textContent = c;\r\n }\r\n\r\n return measureElement.getBoundingClientRect().width;\r\n }\r\n\r\n function fitToContent(column: ISlickColumn): void {\r\n let width = 10;\r\n for (let idx = 0, len = grid.getDataLength(); idx < len; idx++) {\r\n //const d = grid.getDataItem(idx);\r\n width = Math.max(width, getContentWidth(column, idx));\r\n }\r\n column.width = width;\r\n grid.setColumns(grid.getColumns());\r\n // TODO: raise column resize event\r\n // TODO (2): find more performant way to refresh columns\r\n }\r\n\r\n function triggerAllFormulas(): void {\r\n\r\n if (formulaObjects.length === 0) {\r\n return;\r\n }\r\n for (let j = 0; j < formulaObjects.length; j++) {\r\n for (let i = 0; i < data.length; i++) {\r\n const val = formulaObjects[j].fnc(data[i], grid, formulaObjects[j].column);\r\n data[i][formulaObjects[j].column] = val;\r\n }\r\n }\r\n refreshData();\r\n }\r\n\r\n function columnHasFilter(columnId: string): boolean {\r\n for (let i = 0, l = (filters ? filters.length : 0); i < l; i++) {\r\n if (filters[i].columnId === columnId) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function refreshDataItem(item: T): void {\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n dataView.updateItem(item[options.primaryKey], item);\r\n // formula refresh\r\n for (const f in formulas) {\r\n if (formulas.hasOwnProperty(f)) {\r\n triggerFormula(f, item);\r\n }\r\n }\r\n grid.updateRow(dataView.getRowByItem(item));\r\n }\r\n\r\n function addFilter(filter: {\r\n field: string,\r\n columnId?: string,\r\n match: (item: T, field: string) => boolean, combine?: \"or\" | \"and\"\r\n }, dontrefresh?: boolean): void {\r\n let filterArray;\r\n if (Array.isArray(filter)) {\r\n filterArray = filter;\r\n } else {\r\n filterArray = [filter];\r\n }\r\n for (let idx = 0; idx < filterArray.length; idx++) {\r\n // add filter\r\n filters.push(filterArray[idx]);\r\n }\r\n if (!dontrefresh) {\r\n refreshFilters();\r\n }\r\n }\r\n\r\n function setFilters(f: Array<{\r\n field: string,\r\n columnId?: string,\r\n match: (item: T, field: string) => boolean, combine?: \"or\" | \"and\"\r\n }>,\r\n dontrefresh?: boolean): void {\r\n filters = f;\r\n if (!dontrefresh) {\r\n refreshFilters();\r\n }\r\n }\r\n\r\n function getFilters() {\r\n return filters;\r\n }\r\n\r\n function clearFilter(columnId?: string, dontrefresh?: boolean): void {\r\n if (columnId === undefined) { // clear all filters\r\n filters.length = 0;\r\n } else {\r\n for (let i = 0; i < filters.length; i++) {\r\n if (filters[i].columnId === columnId) {\r\n filters.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n }\r\n if (!dontrefresh) {\r\n refreshFilters();\r\n }\r\n }\r\n\r\n function refreshFilters(noColumnHeaderRefresh?: boolean): void {\r\n const options = grid.getOptions() as ISlickCreatorOptions;\r\n\r\n function client_filter(item, args): boolean {\r\n const filterArray = args;\r\n // no filter present -> show all rows\r\n if (filterArray.length === 0) {\r\n return true;\r\n }\r\n\r\n if (filterArray.length === 1) {\r\n return filterArray[0].match.call(null, item, filterArray[0].field);\r\n } else {\r\n let result = true;\r\n let i = 0;\r\n while (i < filterArray.length) {\r\n let orResult = false;\r\n while (i < filterArray.length) { // combine or(s)\r\n if (orResult || filterArray[i].match.call(null, item, filterArray[i].field)) {\r\n orResult = true;\r\n }\r\n if (filterArray[i].combine !== \"or\") {\r\n break;\r\n } else {\r\n i++;\r\n }\r\n }\r\n if (!orResult) {\r\n result = false;\r\n break;\r\n }\r\n i++;\r\n }\r\n return result;\r\n }\r\n }\r\n\r\n if (options.mode === \"client\") {\r\n dataView.setFilterArgs(filters);\r\n dataView.setFilter(client_filter);\r\n }\r\n // redraw columns\r\n if (!noColumnHeaderRefresh) {\r\n grid.setColumns(grid.getColumns());\r\n }\r\n (grid as any).onFiltersChanged.notify();\r\n }\r\n\r\n function getSelectedItems(): T[] {\r\n const selRows = grid.getSelectedRows();\r\n const rows = [];\r\n for (let i = 0; i < selRows.length; i++) {\r\n const rowIdx = selRows[i];\r\n const toPush = dataView.getItem(rowIdx);\r\n if (toPush !== undefined && !(toPush as any).__group && !(toPush as any).__groupTotals) {\r\n rows.push(toPush);\r\n }\r\n }\r\n return rows;\r\n }\r\n\r\n function getHeaderMenu(): any { // TODO -> type\r\n return headerMenu;\r\n }\r\n\r\n // function setHierachy(o: IGridTreeOptions): GridTree {\r\n // return new GridTree(this, o);\r\n // }\r\n\r\n createMe();\r\n\r\n return $.shallowExtend(grid, {\r\n dataView,\r\n setHeight,\r\n getHeight,\r\n sort,\r\n refreshData,\r\n setData,\r\n getData,\r\n refresh,\r\n addFormula,\r\n getFormattedValue,\r\n getContentWidth,\r\n fitToContent,\r\n triggerAllFormulas,\r\n columnHasFilter,\r\n refreshDataItem,\r\n addFilter,\r\n setFilters,\r\n getFilters,\r\n clearFilter,\r\n refreshFilters,\r\n getSelectedItems,\r\n getHeaderMenu // ,\r\n // setHierachy\r\n });\r\n}\r\n","/**\r\n * @license\r\n * (c) 2009-2016 Michael Leibman\r\n * michael{dot}leibman{at}gmail{dot}com\r\n * http://github.com/mleibman/slickgrid\r\n *\r\n * Distributed under MIT license.\r\n * All rights reserved.\r\n *\r\n * SlickGrid v2.4\r\n */\r\n\r\nimport { jQueryReplacement, IjQueryWrapper, IjQueryReplacement } from \"../core/jq\";\r\nimport { Slick, ISlickColumn, ISlickFormatterResult, ISlickFormatter, ISlickEvent } from \"./slick.core\";\r\nimport \"./slick.grid.css\";\r\nimport \"./slick-default-theme.css\";\r\nimport { Resizable } from \"../interaction/resizable\";\r\nimport { EventHandler } from \"../interaction/eventhandler\";\r\n\r\nexport interface ISlickGridOptions {\r\n syncColumnCellResize?: boolean;\r\n alwaysShowVerticalScroll?: boolean;\r\n alwaysShowHorizontalScroll?: boolean;\r\n alwaysAllowHorizontalScroll?: boolean;\r\n explicitInitialization?: boolean;\r\n rowHeight?: number;\r\n defaultColumnWidth?: number;\r\n enableAddRow?: boolean;\r\n leaveSpaceForNewRows?: boolean;\r\n editable?: boolean;\r\n autoEdit?: boolean;\r\n suppressActiveCellChangeOnEdit?: boolean;\r\n enableCellNavigation?: boolean;\r\n enableColumnReorder?: boolean;\r\n asyncEditorLoading?: boolean;\r\n asyncEditorLoadDelay?: number;\r\n forceFitColumns?: boolean;\r\n enableAsyncPostRender?: boolean;\r\n asyncPostRenderDelay?: number;\r\n enableAsyncPostRenderCleanup?: boolean;\r\n asyncPostRenderCleanupDelay?: number;\r\n autoHeight?: boolean;\r\n editorLock?: any;\r\n showHeaderRow?: boolean;\r\n headerRowHeight?: number;\r\n createFooterRow?: boolean;\r\n showFooterRow?: boolean;\r\n footerRowHeight?: number;\r\n createPreHeaderPanel?: boolean;\r\n showPreHeaderPanel?: boolean;\r\n preHeaderPanelHeight?: number;\r\n showTopPanel?: boolean;\r\n topPanelHeight?: number;\r\n formatterFactory?: { getFormatter: (column: ISlickColumn, row?: number) => ISlickFormatter };\r\n editorFactory?: { getEditor: (column: ISlickColumn, row?: number) => any };\r\n cellFlashingCssClass?: string;\r\n selectedCellCssClass?: string;\r\n multiSelect?: boolean;\r\n enableTextSelectionOnCells?: boolean;\r\n dataItemColumnValueExtractor?: (item: any, columnDef: ISlickColumn) => any;\r\n frozenBottom?: boolean;\r\n frozenColumn?: number;\r\n frozenRow?: number;\r\n fullWidthRows?: boolean;\r\n multiColumnSort?: boolean;\r\n numberedMultiColumnSort?: boolean;\r\n tristateMultiColumnSort?: boolean;\r\n sortColNumberInSeparateSpan?: boolean;\r\n defaultFormatter?: ISlickFormatter;\r\n forceSyncScrolling?: boolean;\r\n addNewRowCssClass?: string;\r\n preserveCopiedSelectionOnPaste?: boolean;\r\n showCellSelection?: boolean;\r\n viewportClass?: string;\r\n minRowBuffer?: number;\r\n emulatePagingWhenScrolling?: boolean;\r\n editorCellNavOnLRKeys?: boolean;\r\n doPaging?: boolean;\r\n resizeHandleWidth?: string;\r\n variableRowHeight?: boolean;\r\n editCommandHandler?: (item: any, column: ISlickColumn, editCommand: any) => void;\r\n resizeDelta?: number;\r\n dragDelta?: number;\r\n}\r\n\r\ninterface ICacheEntry {\r\n rowNode?: HTMLElement[];\r\n\r\n // colSpans of rendered cells (by column idx).\r\n // can also be used for checking whether a cell has been rendered.\r\n cellColSpans: number[];\r\n\r\n // cell nodes (by column idx). Lazy-populated by ensureCellNodesInRowsCache().\r\n cellNodesByColumnIdx: HTMLElement[];\r\n\r\n // column indices of cell nodes that have been rendered, but not yet indexed in\r\n // cellNodesByColumnIdx. These are in the same order as cell nodes added at the\r\n // end of the row.\r\n cellRenderQueue: number[];\r\n}\r\n\r\nexport interface ISlickGrid<T> {\r\n \"slickGridVersion\": string;\r\n\r\n /* events */\r\n \"onScroll\": ISlickEvent<{ scrollLeft: number, scrollTop: number }>;\r\n \"onSort\": ISlickEvent<{\r\n multiColumnSort: boolean,\r\n columnId?: string,\r\n sortCol?: ISlickColumn,\r\n sortAsc?: boolean,\r\n sortCols?: Array<{\r\n columnId?: string,\r\n sortCol?: ISlickColumn\r\n sortAsc?: boolean\r\n }>\r\n }>;\r\n \"onAppendRow\": ISlickEvent<{ row: number, item: T }>;\r\n \"onBeforeRemoveRow\": ISlickEvent<{ row: number, dom: HTMLDivElement }>;\r\n \"onClick\": ISlickEvent<{ row: number, cell: number }>;\r\n \"onDblClick\": ISlickEvent<{ row: number, cell: number }>;\r\n \"onColumnsResized\": ISlickEvent<any>;\r\n \"onAppendCell\": ISlickEvent<{ row: number, cell: number, value: any, item: T, column: ISlickColumn, dom: HTMLDivElement }>;\r\n \"onCellChange\": ISlickEvent<{ row: number, cell: number, item: T, value: any }>;\r\n \"onAddNewRow\": ISlickEvent<{ item: T, column: ISlickColumn }>;\r\n \"onHeaderRowCellRendered\": ISlickEvent<{ node: HTMLElement, column: ISlickColumn, grid: ISlickGrid<T> }>;\r\n \"onFooterRowCellRendered\": ISlickEvent<{ node: HTMLElement, column: ISlickColumn, grid: ISlickGrid<T> }>;\r\n \"onHeaderCellRendered\": ISlickEvent<{ node: HTMLElement, column: ISlickColumn, grid: ISlickGrid<T> }>;\r\n \"onBeforeEditCell\": ISlickEvent<{ row: number, cell: number, item: T, column: ISlickColumn }>;\r\n \"onSelectedRowsChanged\": ISlickEvent<{ rows: number[] }>;\r\n \"onBeforeDestroy\": ISlickEvent<any>;\r\n \"onColumnsReordered\": ISlickEvent<any>;\r\n \"onViewportChanged\": ISlickEvent<any>;\r\n \"onActiveCellChanged\": ISlickEvent<{ row: number, cell: number }>;\r\n \"onDragInit\": ISlickEvent<any>;\r\n \"onDragStart\": ISlickEvent<any>;\r\n \"onDrag\": ISlickEvent<any>;\r\n \"onDragEnd\": ISlickEvent<any>;\r\n\r\n\r\n /* methods */\r\n \"registerPlugin\": (plugin) => void;\r\n \"init\": () => void;\r\n \"resizeCanvas\": () => void;\r\n \"invalidate\": () => void;\r\n \"invalidateAllRows\": () => void;\r\n \"updateRow\": (row: number) => void;\r\n \"getColumns\": () => ISlickColumn[];\r\n \"setColumns\": (columns: ISlickColumn[]) => void;\r\n \"getSelectedRows\": () => number[];\r\n \"setSelectedRows\": (rows: number[]) => void;\r\n \"invalidateRows\": (rows: number[]) => void;\r\n \"render\": () => void;\r\n \"updateRowCount\": () => void;\r\n \"getColumnIndex\": (columnId: string) => number;\r\n \"scrollRowIntoView\": (row: number, doPaging?: boolean) => void;\r\n \"flashCell\": (row: number, cell: number, speed?: number, times?: number) => void;\r\n \"getActiveCell\": () => { row: number, cell: number };\r\n \"setActiveCell\": (row: number, cell: number, opt_editMode?: boolean,\r\n preClickModeOn?: boolean, suppressActiveCellChangedEvent?: boolean) => void;\r\n \"gotoCell\": (row: number, cell: number, forceEdit?: boolean, e?: any) => void;\r\n \"destroy\": () => void;\r\n \"getColumnById\": (id: string) => ISlickColumn;\r\n \"getHeaderColumnWidthDiff\": () => number;\r\n \"getPreHeaderPanel\": () => HTMLDivElement;\r\n \"getPreHeaderPanelRight\": () => HTMLDivElement;\r\n \"getHeadersWidth\": () => number;\r\n \"getViewportNode\": () => HTMLDivElement;\r\n \"updateColumnHeader\": (columnId: string, title: string, toolTip: string) => void;\r\n \"setSortColumn\": (columnId: string, ascending?: boolean) => void;\r\n \"setSortColumns\": (columns: Array<{ columnId: string, ascending?: boolean }>) => void;\r\n \"getSortColumns\": () => Array<{ columnId: string, ascending?: boolean }>;\r\n \"autosizeColumns\": () => void;\r\n \"setOptions\": (args: ISlickGridOptions, supressRender?: boolean) => void;\r\n \"getOptions\": () => ISlickGridOptions;\r\n \"scrollRowToTop\": (row: number) => void;\r\n \"scrollCellIntoView\": (row: number, cell: number, doPaging?: boolean) => void;\r\n \"scrollColumnIntoView\": (cell: number) => void;\r\n \"getCellFromPoint\": (x: number, y: number) => { row: number, cell: number };\r\n \"getCellFromEvent\": (e: any, dd: any) => { row: number, cell: number };\r\n \"getActiveCellNode\": () => HTMLElement;\r\n // \"unregisterPlugin\": unregisterPlugin,\r\n // \"getPluginByName\": getPluginByName,\r\n \"getDataLength\": () => number;\r\n \"getDataItem\": (idx: number) => T;\r\n \"getSelectionModel\": () => any; // TODO\r\n \"setSelectionModel\": (model: any) => void; // TODO\r\n \"getContainerNode\": () => HTMLDivElement;\r\n \"getDataItemValueForColumn\": (item: T, columnDef: ISlickColumn) => any;\r\n \"getViewport\": (viewPortTop?: number, viewPortLeft?: number) => { top: number, bottom: number, leftPx: number, rightPx: number };\r\n \"getRenderedRange\": (viewportTop?: number, viewportLeft?: number) => { top: number, bottom: number, leftPx: number, rightPx: number };\r\n \"getEditController\": () => {commitCurrentEdit: () => boolean, cancelCurrentEdit: () => boolean};\r\n\r\n // // Events\r\n // \"onHeaderContextMenu\": new Slick.Event(),\r\n // \"onHeaderClick\": new Slick.Event(),\r\n // ,\r\n // \"onBeforeHeaderCellDestroy\": new Slick.Event(),\r\n // \"onBeforeHeaderRowCellDestroy\": new Slick.Event(),\r\n // \"onBeforeFooterRowCellDestroy\": new Slick.Event(),\r\n // \"onMouseEnter\": new Slick.Event(),\r\n // \"onMouseLeave\": new Slick.Event(),\r\n // \"onContextMenu\": new Slick.Event(),\r\n // \"onKeyDown\": new Slick.Event(),\r\n // \"onValidationError\": new Slick.Event(),\r\n // ,\r\n // \"onBeforeCellEditorDestroy\": new Slick.Event(),\r\n // \r\n // \"onActiveCellPositionChanged\": new Slick.Event(),\r\n // \"onDragInit\": new Slick.Event(),\r\n // \"onDragStart\": new Slick.Event(),\r\n // \"onDrag\": new Slick.Event(),\r\n // \"onDragEnd\": new Slick.Event(),\r\n // \"onCellCssStylesChanged\": new Slick.Event(),\r\n // \"onAutosizeColumns\": new Slick.Event(),\r\n // \"onRendered\": new Slick.Event(),\r\n\r\n // // Methods\r\n // \"setData\": setData,\r\n // \"getData\": getData,\r\n\r\n // \"getContainerNode\": getContainerNode,\r\n // \"updatePagingStatusFromView\": updatePagingStatusFromView,\r\n // \"applyFormatResultToCellNode\": applyFormatResultToCellNode,\r\n\r\n // \"invalidateRow\": invalidateRow,\r\n // \"invalidateAllRows\": invalidateAllRows,\r\n // \"updateCell\": updateCell,\r\n // \"updateRow\": updateRow,\r\n\r\n // \"getCanvasNode\": getCanvasNode,\r\n // \"getUID\": getUID,\r\n //\r\n // \"getScrollbarDimensions\": getScrollbarDimensions,\r\n // ,\r\n // \"getCanvasWidth\": getCanvasWidth,\r\n // \"getCanvases\": getCanvases,\r\n // \"getActiveCanvasNode\": getActiveCanvasNode,\r\n // \"setActiveCanvasNode\": setActiveCanvasNode,\r\n // \"getActiveViewportNode\": getActiveViewportNode,\r\n // \"setActiveViewportNode\": setActiveViewportNode,\r\n // \"focus\": setFocus,\r\n // \"scrollTo\": scrollTo,\r\n\r\n // \"getActiveCellPosition\": getActiveCellPosition,\r\n \"resetActiveCell\": () => void;\r\n // \"editActiveCell\": makeActiveCellEditable,\r\n // \"getCellEditor\": getCellEditor,\r\n // \"getCellNode\": getCellNode,\r\n // \"getCellNodeBox\": getCellNodeBox,\r\n // \"canCellBeSelected\": canCellBeSelected,\r\n // \"canCellBeActive\": canCellBeActive,\r\n // \"navigatePrev\": navigatePrev,\r\n // \"navigateNext\": navigateNext,\r\n // \"navigateUp\": navigateUp,\r\n // \"navigateDown\": navigateDown,\r\n // \"navigateLeft\": navigateLeft,\r\n // \"navigateRight\": navigateRight,\r\n // \"navigatePageUp\": navigatePageUp,\r\n // \"navigatePageDown\": navigatePageDown,\r\n // \"navigateTop\": navigateTop,\r\n // \"navigateBottom\": navigateBottom,\r\n // \"navigateRowStart\": navigateRowStart,\r\n // \"navigateRowEnd\": navigateRowEnd,\r\n // \"getTopPanel\": getTopPanel,\r\n // \"setTopPanelVisibility\": setTopPanelVisibility,\r\n //\r\n // \"setPreHeaderPanelVisibility\": setPreHeaderPanelVisibility,\r\n // \"getHeader\": getHeader,\r\n // \"getHeaderColumn\": getHeaderColumn,\r\n // \"setHeaderRowVisibility\": setHeaderRowVisibility,\r\n // \"getHeaderRow\": getHeaderRow,\r\n // \"getHeaderRowColumn\": getHeaderRowColumn,\r\n // \"setFooterRowVisibility\": setFooterRowVisibility,\r\n // \"getFooterRow\": getFooterRow,\r\n // \"getFooterRowColumn\": getFooterRowColumn,\r\n // \"getGridPosition\": getGridPosition,\r\n // \"addCellCssStyles\": addCellCssStyles,\r\n // \"setCellCssStyles\": setCellCssStyles,\r\n // \"removeCellCssStyles\": removeCellCssStyles,\r\n // \"getCellCssStyles\": getCellCssStyles,\r\n // \"getFrozenRowOffset\": getFrozenRowOffset,\r\n\r\n // // IEditor implementation\r\n // \"getEditorLock\": getEditorLock\r\n}\r\n\r\nlet $: IjQueryReplacement = Slick.$;\r\n\r\n$.deepExtend(Slick, { Grid: SlickGrid });\r\n\r\n// shared across all grids on the page\r\nvar scrollbarDimensions;\r\nvar maxSupportedCssHeight; // = 500000; // browser's breaking point\r\n\r\n\r\nexport function SlickGrid(container: HTMLDivElement | string, data, columns: ISlickColumn[], options: ISlickGridOptions) {\r\n // settings\r\n var defaults: ISlickGridOptions = {\r\n // syncColumnCellResize: true, // TODO: remove this option\r\n alwaysShowVerticalScroll: false,\r\n alwaysShowHorizontalScroll: false,\r\n alwaysAllowHorizontalScroll: false,\r\n explicitInitialization: false,\r\n rowHeight: 28,\r\n defaultColumnWidth: 80,\r\n enableAddRow: false,\r\n leaveSpaceForNewRows: false,\r\n editable: false,\r\n autoEdit: true,\r\n suppressActiveCellChangeOnEdit: false,\r\n enableCellNavigation: true,\r\n enableColumnReorder: true,\r\n asyncEditorLoading: false,\r\n asyncEditorLoadDelay: 100,\r\n forceFitColumns: false,\r\n enableAsyncPostRender: false,\r\n asyncPostRenderDelay: 50,\r\n enableAsyncPostRenderCleanup: false,\r\n asyncPostRenderCleanupDelay: 40,\r\n autoHeight: false,\r\n editorLock: Slick.GlobalEditorLock,\r\n showHeaderRow: false,\r\n headerRowHeight: 28,\r\n createFooterRow: false,\r\n showFooterRow: false,\r\n footerRowHeight: 28,\r\n createPreHeaderPanel: false,\r\n showPreHeaderPanel: false,\r\n preHeaderPanelHeight: 28,\r\n showTopPanel: false,\r\n topPanelHeight: 28,\r\n formatterFactory: null,\r\n editorFactory: null,\r\n cellFlashingCssClass: \"flashing\",\r\n selectedCellCssClass: \"selected\",\r\n multiSelect: true,\r\n enableTextSelectionOnCells: false,\r\n dataItemColumnValueExtractor: null,\r\n frozenBottom: false,\r\n frozenColumn: -1,\r\n frozenRow: -1,\r\n fullWidthRows: false,\r\n multiColumnSort: false,\r\n numberedMultiColumnSort: false,\r\n tristateMultiColumnSort: false,\r\n sortColNumberInSeparateSpan: false,\r\n defaultFormatter: defaultFormatter,\r\n forceSyncScrolling: false,\r\n addNewRowCssClass: \"new-row\",\r\n preserveCopiedSelectionOnPaste: false,\r\n showCellSelection: true,\r\n viewportClass: null,\r\n minRowBuffer: 3,\r\n emulatePagingWhenScrolling: true, // when scrolling off bottom of viewport, place new row at top of viewport\r\n editorCellNavOnLRKeys: false, // TODO: change to true per default?\r\n doPaging: true,\r\n resizeDelta: 2, // NEW\r\n dragDelta: 3, // NEW\r\n };\r\n\r\n var columnDefaults = {\r\n name: \"\",\r\n resizable: true,\r\n sortable: false,\r\n minWidth: 30,\r\n width: undefined,\r\n rerenderOnResize: false,\r\n headerCssClass: null,\r\n defaultSortAsc: true,\r\n focusable: true,\r\n selectable: true\r\n };\r\n\r\n // scroller\r\n var th; // virtual height\r\n var h; // real scrollable height\r\n var ph; // page height\r\n var n; // number of pages\r\n var cj; // \"jumpiness\" coefficient\r\n\r\n var page = 0; // current page\r\n var offset = 0; // current page offset\r\n var vScrollDir = 1;\r\n // var programmaticScrollingTimeout;\r\n\r\n // private\r\n var initialized = false;\r\n var $container: IjQueryWrapper;\r\n var uid = \"slickgrid_\" + Math.round(1000000 * Math.random());\r\n var self = this;\r\n var $focusSink: IjQueryWrapper, $focusSink2: IjQueryWrapper;\r\n var $groupHeaders: IjQueryWrapper = $();\r\n var $headerScroller: IjQueryWrapper;\r\n var $headers: IjQueryWrapper;\r\n var $headerRow: IjQueryWrapper, $headerRowScroller: IjQueryWrapper, $headerRowSpacerL: IjQueryWrapper, $headerRowSpacerR: IjQueryWrapper;\r\n var $footerRow: IjQueryWrapper, $footerRowScroller: IjQueryWrapper, $footerRowSpacerL: IjQueryWrapper, $footerRowSpacerR: IjQueryWrapper;\r\n var $preHeaderPanel: IjQueryWrapper, $preHeaderPanelScroller: IjQueryWrapper, $preHeaderPanelSpacer: IjQueryWrapper;\r\n var $preHeaderPanelR: IjQueryWrapper, $preHeaderPanelScrollerR: IjQueryWrapper, $preHeaderPanelSpacerR: IjQueryWrapper;\r\n var $topPanelScroller: IjQueryWrapper;\r\n var $topPanel: IjQueryWrapper;\r\n var $viewport: IjQueryWrapper;\r\n var $canvas: IjQueryWrapper;\r\n var $style: IjQueryWrapper;\r\n var $boundAncestors: IjQueryWrapper;\r\n // var treeColumns;\r\n var stylesheet, columnCssRulesL, columnCssRulesR;\r\n var viewportH: number, viewportW: number;\r\n var canvasWidth: number, canvasWidthL: number, canvasWidthR: number;\r\n var headersWidth: number, headersWidthL: number, headersWidthR: number;\r\n var viewportHasHScroll: boolean, viewportHasVScroll: boolean;\r\n var headerColumnWidthDiff = 0, headerColumnHeightDiff = 0, // border+padding\r\n cellWidthDiff = 0, cellHeightDiff = 0, jQueryNewWidthBehaviour = false;\r\n var absoluteColumnMinWidth;\r\n var hasFrozenRows = false;\r\n var frozenRowsHeight = 0;\r\n var actualFrozenRow = -1;\r\n var paneTopH = 0;\r\n var paneBottomH = 0;\r\n var viewportTopH = 0;\r\n var viewportBottomH = 0;\r\n var topPanelH = 0;\r\n var headerRowH = 0;\r\n var footerRowH = 0;\r\n\r\n var tabbingDirection = 1;\r\n var $activeCanvasNode: IjQueryWrapper;\r\n var $activeViewportNode: IjQueryWrapper;\r\n var activePosX;\r\n var activeRow, activeCell;\r\n var activeCellNode: HTMLElement = null;\r\n var currentEditor = null;\r\n var serializedEditorValue;\r\n var editController;\r\n\r\n var rowsCache: { [key: string]: ICacheEntry } = {};\r\n var rowPositionCache = [];\r\n\r\n var renderedRows = 0;\r\n var numVisibleRows = 0;\r\n var prevScrollTop = 0;\r\n var scrollTop = 0;\r\n var lastRenderedScrollTop = 0;\r\n var lastRenderedScrollLeft = 0;\r\n var prevScrollLeft = 0;\r\n var scrollLeft = 0;\r\n\r\n var selectionModel;\r\n var selectedRows = [];\r\n\r\n var plugins = [];\r\n var cellCssClasses = {};\r\n\r\n var columnsById = {};\r\n var sortColumns = [];\r\n var columnPosLeft = [];\r\n var columnPosRight = [];\r\n\r\n var pagingActive = false;\r\n var pagingIsLastPage = false;\r\n\r\n var scrollThrottle = ActionThrottle(render, 50);\r\n\r\n // async call handles\r\n var h_editorLoader = null;\r\n var h_render = null;\r\n var h_postrender = null;\r\n var h_postrenderCleanup = null;\r\n var postProcessedRows = {};\r\n var postProcessToRow = null;\r\n var postProcessFromRow = null;\r\n var postProcessedCleanupQueue = [];\r\n var postProcessgroupId = 0;\r\n\r\n var $paneHeaderL: IjQueryWrapper;\r\n var $paneHeaderR: IjQueryWrapper;\r\n var $paneTopL: IjQueryWrapper;\r\n var $paneTopR: IjQueryWrapper;\r\n var $paneBottomL: IjQueryWrapper;\r\n var $paneBottomR: IjQueryWrapper;\r\n\r\n var $headerScrollerL: IjQueryWrapper;\r\n var $headerScrollerR: IjQueryWrapper;\r\n\r\n var $headerL: IjQueryWrapper;\r\n var $headerR: IjQueryWrapper;\r\n\r\n var $groupHeadersL: IjQueryWrapper[];\r\n var $groupHeadersR: IjQueryWrapper[];\r\n\r\n var $headerRowScrollerL: IjQueryWrapper;\r\n var $headerRowScrollerR: IjQueryWrapper;\r\n\r\n var $footerRowScrollerL: IjQueryWrapper;\r\n var $footerRowScrollerR: IjQueryWrapper;\r\n\r\n var $headerRowL: IjQueryWrapper;\r\n var $headerRowR: IjQueryWrapper;\r\n\r\n var $footerRowL: IjQueryWrapper;\r\n var $footerRowR: IjQueryWrapper;\r\n\r\n var $topPanelScrollerL: IjQueryWrapper;\r\n var $topPanelScrollerR: IjQueryWrapper;\r\n\r\n var $topPanelL: IjQueryWrapper;\r\n var $topPanelR: IjQueryWrapper;\r\n\r\n var $viewportTopL: IjQueryWrapper;\r\n var $viewportTopR: IjQueryWrapper;\r\n var $viewportBottomL: IjQueryWrapper;\r\n var $viewportBottomR: IjQueryWrapper;\r\n\r\n var $canvasTopL: IjQueryWrapper;\r\n var $canvasTopR: IjQueryWrapper;\r\n var $canvasBottomL: IjQueryWrapper;\r\n var $canvasBottomR: IjQueryWrapper;\r\n\r\n var $viewportScrollContainerX: IjQueryWrapper;\r\n var $viewportScrollContainerY: IjQueryWrapper;\r\n var $headerScrollContainer: IjQueryWrapper;\r\n var $headerRowScrollContainer: IjQueryWrapper;\r\n var $footerRowScrollContainer: IjQueryWrapper;\r\n\r\n var scrollEventHandler;\r\n\r\n // store css attributes if display:none is active in container or parent\r\n var cssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" };\r\n var $hiddenParents: IjQueryWrapper;\r\n var oldProps = [];\r\n // var columnResizeDragging = false;\r\n // var columnDragging = false;\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////\r\n // initialization\r\n\r\n function init() {\r\n $container = $(container);\r\n if ($container.length < 1) {\r\n throw new Error(\"SlickGrid requires a valid container, \" + container + \" does not exist in the DOM.\");\r\n }\r\n\r\n if (options.showFooterRow && !options.createFooterRow) {\r\n throw new Error(\"option showFooterRow requires option createFooterRow to be set\");\r\n }\r\n\r\n cacheCssForHiddenInit();\r\n\r\n // calculate these only once and share between grid instances\r\n maxSupportedCssHeight = maxSupportedCssHeight || getMaxSupportedCssHeight();\r\n\r\n options = $.shallowExtend({}, defaults, options);\r\n validateAndEnforceOptions();\r\n columnDefaults.width = options.defaultColumnWidth;\r\n\r\n // treeColumns = new Slick.TreeColumns(columns);\r\n // columns = treeColumns.extractColumns();\r\n\r\n updateColumnProps();\r\n\r\n //// validate loaded JavaScript modules against requested options\r\n // if (options.enableColumnReorder && !$.fn.sortable) {\r\n // throw new Error(\"SlickGrid's 'enableColumnReorder = true' option requires jquery-ui.sortable module to be loaded\");\r\n // }\r\n\r\n editController = {\r\n \"commitCurrentEdit\": commitCurrentEdit,\r\n \"cancelCurrentEdit\": cancelCurrentEdit\r\n };\r\n\r\n $container\r\n .empty()\r\n .css(\"overflow\", \"hidden\")\r\n .css(\"outline\", 0)\r\n .addClass(uid)\r\n .addClass(\"slickgrid\")\r\n .addClass(\"ui-widget\");\r\n\r\n const isTouch = ((\"ontouchstart\" in window) || ((navigator as any).msMaxTouchPoints > 0));\r\n if (isTouch) {\r\n $container.addClass(\"js-touch\");\r\n }\r\n // $container.addClass(\"js-touch\");\r\n\r\n // set up a positioning container if needed\r\n if (!/relative|absolute|fixed/.test($container.css(\"position\"))) {\r\n $container.css(\"position\", \"relative\");\r\n }\r\n\r\n $focusSink = $(\"<div tabIndex='0' hideFocus style='position:fixed;width:0;height:0;top:0;left:0;outline:0;'></div>\").appendTo($container);\r\n\r\n // containers used for scrolling frozen columns and rows\r\n $paneHeaderL = $(\"<div class='slick-pane slick-pane-header slick-pane-left' tabIndex='0' />\").appendTo($container);\r\n $paneHeaderR = $(\"<div class='slick-pane slick-pane-header slick-pane-right' tabIndex='0' />\").appendTo($container);\r\n $paneTopL = $(\"<div class='slick-pane slick-pane-top slick-pane-left' tabIndex='0' />\").appendTo($container);\r\n $paneTopR = $(\"<div class='slick-pane slick-pane-top slick-pane-right' tabIndex='0' />\").appendTo($container);\r\n $paneBottomL = $(\"<div class='slick-pane slick-pane-bottom slick-pane-left' tabIndex='0' />\").appendTo($container);\r\n $paneBottomR = $(\"<div class='slick-pane slick-pane-bottom slick-pane-right' tabIndex='0' />\").appendTo($container);\r\n\r\n if (options.createPreHeaderPanel) {\r\n $preHeaderPanelScroller = $(\"<div class='slick-preheader-panel ui-state-default' style='overflow:hidden;position:relative;' />\").appendTo($paneHeaderL);\r\n $preHeaderPanel = $(\"<div />\").appendTo($preHeaderPanelScroller);\r\n $preHeaderPanelSpacer = $(\"<div style='display:block;height:1px;position:absolute;top:0;left:0;'></div>\")\r\n .appendTo($preHeaderPanelScroller);\r\n\r\n $preHeaderPanelScrollerR = $(\"<div class='slick-preheader-panel ui-state-default' style='overflow:hidden;position:relative;' />\").appendTo($paneHeaderR);\r\n $preHeaderPanelR = $(\"<div />\").appendTo($preHeaderPanelScrollerR);\r\n $preHeaderPanelSpacerR = $(\"<div style='display:block;height:1px;position:absolute;top:0;left:0;'></div>\")\r\n .appendTo($preHeaderPanelScrollerR);\r\n\r\n if (!options.showPreHeaderPanel) {\r\n $preHeaderPanelScroller[0].style.display = \"none\";\r\n $preHeaderPanelScrollerR[0].style.display = \"none\";\r\n }\r\n }\r\n\r\n // append the header scroller containers\r\n $headerScrollerL = $(\"<div class='slick-header ui-state-default slick-header-left' />\").appendTo($paneHeaderL);\r\n $headerScrollerR = $(\"<div class='slick-header ui-state-default slick-header-right' />\").appendTo($paneHeaderR);\r\n\r\n // cache the header scroller containers\r\n $headerScroller = $().add($headerScrollerL).add($headerScrollerR);\r\n $groupHeaders = $();\r\n // if (treeColumns.hasDepth()) {\r\n // $groupHeadersL = [], $groupHeadersR = [];\r\n // for (var index = 0; index < treeColumns.getDepth() - 1; index++) {\r\n // $groupHeadersL[index] = $(\"<div class='slick-group-header-columns slick-group-header-columns-left' style='left:-1000px' />\").appendTo($headerScrollerL);\r\n // $groupHeadersR[index] = $(\"<div class='slick-group-header-columns slick-group-header-columns-right' style='left:-1000px' />\").appendTo($headerScrollerR);\r\n // $groupHeaders.add($groupHeadersL[index]).add($groupHeadersR[index]);\r\n // }\r\n // }\r\n\r\n // append the columnn containers to the headers\r\n var headerL = document.createElement(\"div\");\r\n headerL.className = \"slick-header-columns slick-header-columns-left\";\r\n headerL.style.left = \"-1000px\";\r\n var headerR = document.createElement(\"div\");\r\n headerR.className = \"slick-header-columns slick-header-columns-right\";\r\n headerR.style.left = \"-1000px\";\r\n $headerL = $(headerL).appendTo($headerScrollerL);\r\n $headerR = $(headerR).appendTo($headerScrollerR);\r\n\r\n // cache the header columns\r\n $headers = $().add($headerL).add($headerR);\r\n\r\n $headers.on(\"selectstart\", function (event) {\r\n event.preventDefault();\r\n });\r\n\r\n var headerRowScrollerL = document.createElement(\"div\");\r\n headerRowScrollerL.className = \"slick-headerrow ui-state-default\";\r\n var headerRowScrollerR = document.createElement(\"div\");\r\n headerRowScrollerR.className = \"slick-headerrow ui-state-default\";\r\n $headerRowScrollerL = $(headerRowScrollerL).appendTo($paneTopL);\r\n $headerRowScrollerR = $(headerRowScrollerR).appendTo($paneTopR);\r\n\r\n $headerRowScroller = $().add($headerRowScrollerL).add($headerRowScrollerR);\r\n\r\n var headerRowSpacerL = document.createElement(\"div\");\r\n headerRowSpacerL.style.display = \"block\";\r\n headerRowSpacerL.style.height = \"1px\";\r\n headerRowSpacerL.style.left = \"0\";\r\n headerRowSpacerL.style.top = \"0\";\r\n headerRowSpacerL.style.position = \"absolute\";\r\n\r\n var headerRowSpacerR = document.createElement(\"div\");\r\n headerRowSpacerR.style.display = \"block\";\r\n headerRowSpacerR.style.height = \"1px\";\r\n headerRowSpacerR.style.left = \"0\";\r\n headerRowSpacerR.style.top = \"0\";\r\n headerRowSpacerR.style.position = \"absolute\";\r\n\r\n $headerRowSpacerL = $(headerRowSpacerL)\r\n .appendTo($headerRowScrollerL);\r\n $headerRowSpacerR = $(headerRowSpacerR)\r\n .appendTo($headerRowScrollerR);\r\n\r\n var headerRowL = document.createElement(\"div\");\r\n headerRowL.className = \"slick-headerrow-columns slick-headerrow-columns-left\";\r\n\r\n var headerRowR = document.createElement(\"div\");\r\n headerRowR.className = \"slick-headerrow-columns slick-headerrow-columns-right\";\r\n\r\n $headerRowL = $(headerRowL).appendTo($headerRowScrollerL);\r\n $headerRowR = $(headerRowR).appendTo($headerRowScrollerR);\r\n\r\n $headerRow = $().add($headerRowL).add($headerRowR);\r\n\r\n // append the top panel scroller\r\n var topPanelScrollerL = document.createElement(\"div\");\r\n topPanelScrollerL.className = \"slick-top-panel-scroller ui-state-default\";\r\n var topPanelScrollerR = document.createElement(\"div\");\r\n topPanelScrollerR.className = \"slick-top-panel-scroller ui-state-default\";\r\n $topPanelScrollerL = $(topPanelScrollerL).appendTo($paneTopL);\r\n $topPanelScrollerR = $(topPanelScrollerR).appendTo($paneTopR);\r\n\r\n $topPanelScroller = $().add($topPanelScrollerL).add($topPanelScrollerR);\r\n\r\n // append the top panel\r\n $topPanelL = $(\"<div class='slick-top-panel' style='width:10000px' />\").appendTo($topPanelScrollerL);\r\n $topPanelR = $(\"<div class='slick-top-panel' style='width:10000px' />\").appendTo($topPanelScrollerR);\r\n\r\n $topPanel = $().add($topPanelL).add($topPanelR);\r\n\r\n if (!options.showTopPanel) {\r\n $.each($topPanelScroller, function (idx, el) { el.style.display = \"none\"; });\r\n }\r\n\r\n if (!options.showHeaderRow) {\r\n $.each($headerRowScroller, function (idx, el) { el.style.display = \"none\"; });\r\n }\r\n\r\n // append the viewport containers\r\n $viewportTopL = $(\"<div class='slick-viewport slick-viewport-top slick-viewport-left' tabIndex='0' hideFocus />\").appendTo($paneTopL);\r\n $viewportTopR = $(\"<div class='slick-viewport slick-viewport-top slick-viewport-right' tabIndex='0' hideFocus />\").appendTo($paneTopR);\r\n $viewportBottomL = $(\"<div class='slick-viewport slick-viewport-bottom slick-viewport-left' tabIndex='0' hideFocus />\").appendTo($paneBottomL);\r\n $viewportBottomR = $(\"<div class='slick-viewport slick-viewport-bottom slick-viewport-right' tabIndex='0' hideFocus />\").appendTo($paneBottomR);\r\n\r\n // cache the viewports\r\n $viewport = $().add($viewportTopL).add($viewportTopR).add($viewportBottomL).add($viewportBottomR);\r\n\r\n\r\n // default the active viewport to the top left\r\n $activeViewportNode = $viewportTopL;\r\n\r\n // append the canvas containers\r\n $canvasTopL = $(\"<div class='grid-canvas grid-canvas-top grid-canvas-left' tabIndex='0' hideFocus />\").appendTo($viewportTopL);\r\n $canvasTopR = $(\"<div class='grid-canvas grid-canvas-top grid-canvas-right' tabIndex='0' hideFocus />\").appendTo($viewportTopR);\r\n $canvasBottomL = $(\"<div class='grid-canvas grid-canvas-bottom grid-canvas-left' tabIndex='0' hideFocus />\").appendTo($viewportBottomL);\r\n $canvasBottomR = $(\"<div class='grid-canvas grid-canvas-bottom grid-canvas-right' tabIndex='0' hideFocus />\").appendTo($viewportBottomR);\r\n if (options.viewportClass) { $viewport.toggleClass(options.viewportClass, true); }\r\n\r\n // cache the canvases\r\n $canvas = $().add($canvasTopL).add($canvasTopR).add($canvasBottomL).add($canvasBottomR);\r\n\r\n scrollbarDimensions = scrollbarDimensions || measureScrollbar();\r\n\r\n // default the active canvas to the top left\r\n $activeCanvasNode = $canvasTopL;\r\n\r\n // pre-header\r\n if ($preHeaderPanelSpacer) { $preHeaderPanelSpacer.css(\"width\", getCanvasWidth() + scrollbarDimensions.width + \"px\"); }\r\n $headers.width(getHeadersWidth());\r\n $headerRowSpacerL.css(\"width\", getCanvasWidth() + scrollbarDimensions.width + \"px\");\r\n $headerRowSpacerR.css(\"width\", getCanvasWidth() + scrollbarDimensions.width + \"px\");\r\n\r\n // footer Row\r\n if (options.createFooterRow) {\r\n $footerRowScrollerR = $(\"<div class='slick-footerrow ui-state-default' />\").appendTo($paneTopR);\r\n $footerRowScrollerL = $(\"<div class='slick-footerrow ui-state-default' />\").appendTo($paneTopL);\r\n\r\n $footerRowScroller = $().add($footerRowScrollerL).add($footerRowScrollerR);\r\n\r\n $footerRowSpacerL = $(\"<div style='display:block;height:1px;position:absolute;top:0;left:0;'></div>\")\r\n .css(\"width\", getCanvasWidth() + scrollbarDimensions.width + \"px\")\r\n .appendTo($footerRowScrollerL);\r\n $footerRowSpacerR = $(\"<div style='display:block;height:1px;position:absolute;top:0;left:0;'></div>\")\r\n .css(\"width\", getCanvasWidth() + scrollbarDimensions.width + \"px\")\r\n .appendTo($footerRowScrollerR);\r\n\r\n\r\n $footerRowL = $(\"<div class='slick-footerrow-columns slick-footerrow-columns-left' />\").appendTo($footerRowScrollerL);\r\n $footerRowR = $(\"<div class='slick-footerrow-columns slick-footerrow-columns-right' />\").appendTo($footerRowScrollerR);\r\n\r\n $footerRow = $().add($footerRowL).add($footerRowR);\r\n\r\n if (!options.showFooterRow) {\r\n $.each($footerRowScroller, function (idx, el) { el.style.display = \"none\"; });\r\n }\r\n }\r\n\r\n $focusSink2 = $($focusSink[0].cloneNode(true)).appendTo($container);\r\n\r\n if (!options.explicitInitialization) {\r\n finishInitialization();\r\n }\r\n }\r\n\r\n function finishInitialization() {\r\n if (!initialized) {\r\n initialized = true;\r\n\r\n getViewportWidth();\r\n getViewportHeight();\r\n\r\n // header columns and cells may have different padding/border skewing width calculations (box-sizing, hello?)\r\n // calculate the diff so we can set consistent sizes\r\n measureCellPaddingAndBorder();\r\n\r\n // for usability reasons, all text selection in SlickGrid is disabled\r\n // with the exception of input and textarea elements (selection must\r\n // be enabled there so that editors work as expected); note that\r\n // selection in grid cells (grid body) is already unavailable in\r\n // all browsers except IE\r\n disableSelection($headers); // disable all text selection in header (including input and textarea)\r\n\r\n if (!options.enableTextSelectionOnCells) {\r\n // disable text selection in grid cells except in input and textarea elements\r\n // (this is IE-specific, because selectstart event will only fire in IE)\r\n $viewport.on(\"selectstart\", function (event) {\r\n if (event.target.tagName !== \"INPUT\" && event.target.tagName !== \"TEXTAREA\") {\r\n event.preventDefault();\r\n }\r\n });\r\n }\r\n\r\n cacheRowPositions();\r\n\r\n setFrozenOptions();\r\n setPaneVisibility();\r\n setScroller();\r\n setOverflow();\r\n\r\n updateColumnCaches();\r\n createColumnHeaders();\r\n // createColumnGroupHeaders();\r\n createColumnFooter();\r\n setupColumnSort();\r\n setupColumnMoveAndResize();\r\n createCssRules();\r\n resizeCanvas();\r\n bindAncestorScrollEvents();\r\n\r\n $container.on(\"resize\", resizeCanvas);\r\n $viewport.on(\"scroll\", handleScroll);\r\n\r\n // tODO !!! TODOFIX\r\n // if (jQuery.fn.mousewheel) {\r\n // $viewport.on(\"mousewheel\", handleMouseWheel);\r\n // }\r\n\r\n $headerScroller\r\n .on(\"scroll\", preventScroll) // .on(\"scroll\", handleHeaderScroll)\r\n .on(\"contextmenu\", handleHeaderContextMenu)\r\n .on(\"click\", handleHeaderClick);\r\n\r\n $headerRowScroller\r\n .on(\"scroll\", preventScroll);\r\n\r\n if (options.createFooterRow) {\r\n $footerRowScroller\r\n .on(\"scroll\", preventScroll);\r\n }\r\n\r\n if (options.createPreHeaderPanel) {\r\n $preHeaderPanelScroller\r\n .on(\"scroll\", preventScroll);\r\n }\r\n\r\n\r\n // $headerRowScroller\r\n // .on(\"scroll\", handleHeaderRowScroll);\r\n\r\n // if (options.createFooterRow) {\r\n // $footerRowScroller\r\n // .on(\"scroll\", handleFooterRowScroll);\r\n // }\r\n\r\n // if (options.createPreHeaderPanel) {\r\n // $preHeaderPanelScroller\r\n // .on(\"scroll\", handlePreHeaderPanelScroll);\r\n // }\r\n\r\n $focusSink.add($focusSink2)\r\n .on(\"keydown\", handleKeyDown);\r\n $canvas\r\n .on(\"keydown\", handleKeyDown)\r\n .on(\"click\", handleClick)\r\n .on(\"dblclick\", handleDblClick)\r\n .on(\"contextmenu\", handleContextMenu);\r\n\r\n\r\n // ---- BEGIN\r\n\r\n\r\n let dragStartX;\r\n let dragStartY;\r\n let isDown;\r\n let dragStartedDD = null;\r\n const delta = 3;\r\n // $canvas.on(\"touchstart\", function (e, dd) {\r\n // handleDragInit(e, dd);\r\n // // TODO\r\n // });\r\n $canvas.on(\"mousedown\", function (e, dd) {\r\n const res = handleDragInit(e, dd); // TODO -> do something with result?\r\n dragStartX = e.pageX;\r\n dragStartY = e.pageY;\r\n isDown = true;\r\n document.addEventListener(\"mouseup\", handleMouseUp);\r\n });\r\n $canvas.on(\"mousemove\", function (e, _dd) {\r\n if (isDown) {\r\n if (Math.abs(dragStartX - e.pageX) < delta\r\n && Math.abs(dragStartY - e.pageY) < delta) {\r\n return;\r\n }\r\n if (dragStartedDD == null) {\r\n dragStartedDD = {};\r\n dragStartedDD.dragging = null;\r\n dragStartedDD.propagates = 1;\r\n dragStartedDD.target = e.target;\r\n dragStartedDD.pageX = e.pageX;\r\n dragStartedDD.pageY = e.pageY;\r\n dragStartedDD.startX = dragStartedDD.pageX;\r\n dragStartedDD.startY = dragStartedDD.pageY;\r\n const res = handleDragStart(e, dragStartedDD); // TODO -> do something with result?\r\n }\r\n dragStartedDD.pageX = e.pageX;\r\n dragStartedDD.pageY = e.pageY;\r\n dragStartedDD.startX = dragStartedDD.pageX;\r\n dragStartedDD.startY = dragStartedDD.pageY;\r\n handleDrag(e, dragStartedDD);\r\n }\r\n });\r\n\r\n const handleMouseUp = (e) => {\r\n if (isDown && dragStartedDD != null) {\r\n handleDragEnd(e, dragStartedDD);\r\n }\r\n isDown = false;\r\n dragStartedDD = null;\r\n document.removeEventListener(\"mouseup\", handleMouseUp);\r\n }\r\n\r\n // .on(\"draginit\", handleDragInit) //TODO TODOFIX\r\n // .on(\"dragstart\", {distance: 3}, handleDragStart) //TODO TODOFIX\r\n // .on(\"drag\", handleDrag) //TODO TODOFIX\r\n // .on(\"dragend\", handleDragEnd); //TODO TODOFIX\r\n // .on(\"mouseenter\", \".slick-cell\", handleMouseEnter) //TODO TODOFIX\r\n // .on(\"mouseleave\", \".slick-cell\", handleMouseLeave); //TODO TODOFIX\r\n\r\n restoreCssFromHiddenInit();\r\n }\r\n }\r\n\r\n function cacheCssForHiddenInit() {\r\n // handle display:none on container or container parents\r\n var all_parents = $().add($container).add($container[0].parentElement);\r\n var hiddenParents = [];\r\n $hiddenParents = $();\r\n for (var i = 0; i < all_parents.length; i++) {\r\n if ((all_parents[i].display || \"\").toLowerCase() === \"none\") {\r\n hiddenParents.push(all_parents[i]);\r\n $hiddenParents.add(all_parents[i]);\r\n }\r\n }\r\n hiddenParents.forEach(function (p) {\r\n var old = {};\r\n for (var name in cssShow) {\r\n old[name] = p.style[name];\r\n p.style[name] = cssShow[name];\r\n }\r\n oldProps.push(old);\r\n });\r\n }\r\n\r\n function restoreCssFromHiddenInit() {\r\n // finish handle display:none on container or container parents\r\n // - put values back the way they were\r\n $.each($hiddenParents, function (i) {\r\n var old = oldProps[i];\r\n for (var name in cssShow) {\r\n this.style[name] = old[name];\r\n }\r\n });\r\n }\r\n\r\n function hasFrozenColumns() {\r\n return options.frozenColumn > -1;\r\n }\r\n\r\n function registerPlugin(plugin) {\r\n plugins.unshift(plugin);\r\n plugin.init(self);\r\n }\r\n\r\n function unregisterPlugin(plugin) {\r\n for (var i = plugins.length; i >= 0; i--) {\r\n if (plugins[i] === plugin) {\r\n if (plugins[i].destroy) {\r\n plugins[i].destroy();\r\n }\r\n plugins.splice(i, 1);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n function getPluginByName(name) {\r\n for (var i = plugins.length - 1; i >= 0; i--) {\r\n if (plugins[i].pluginName === name) {\r\n return plugins[i];\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n function setSelectionModel(model) {\r\n if (selectionModel) {\r\n selectionModel.onSelectedRangesChanged.unsubscribe(handleSelectedRangesChanged);\r\n if (selectionModel.destroy) {\r\n selectionModel.destroy();\r\n }\r\n }\r\n\r\n selectionModel = model;\r\n if (selectionModel) {\r\n selectionModel.init(self);\r\n selectionModel.onSelectedRangesChanged.subscribe(handleSelectedRangesChanged);\r\n }\r\n }\r\n\r\n function getSelectionModel() {\r\n return selectionModel;\r\n }\r\n\r\n function getCanvasNode(columnIdOrIdx, rowIndex) {\r\n if (!columnIdOrIdx) { columnIdOrIdx = 0; }\r\n if (!rowIndex) { rowIndex = 0; }\r\n\r\n var idx = (typeof columnIdOrIdx === \"number\" ? columnIdOrIdx : getColumnIndex(columnIdOrIdx));\r\n\r\n return (hasFrozenRows && rowIndex >= actualFrozenRow + (options.frozenBottom ? 0 : 1))\r\n ? ((hasFrozenColumns() && idx > options.frozenColumn) ? $canvasBottomR[0] : $canvasBottomL[0])\r\n : ((hasFrozenColumns() && idx > options.frozenColumn) ? $canvasTopR[0] : $canvasTopL[0])\r\n ;\r\n }\r\n\r\n function getActiveCanvasNode(element) {\r\n setActiveCanvasNode(element);\r\n\r\n return $activeCanvasNode[0];\r\n }\r\n\r\n function getCanvases() {\r\n return $canvas;\r\n }\r\n\r\n function setActiveCanvasNode(element) {\r\n if (element) {\r\n $activeCanvasNode = $(element.target).closestClass(\"grid-canvas\");\r\n }\r\n }\r\n\r\n function getViewportNode() {\r\n return $viewport[0];\r\n }\r\n\r\n function getActiveViewportNode(element) {\r\n setActiveViewportNode(element);\r\n\r\n return $activeViewportNode[0];\r\n }\r\n\r\n function setActiveViewportNode(element) {\r\n if (element) {\r\n $activeViewportNode = $(element.target).closestClass(\"slick-viewport\");\r\n }\r\n }\r\n\r\n function measureScrollbar() {\r\n //var $outerdiv = $(\"<div style=\\\"position:absolute; top:-10000px; left:-10000px; overflow:auto; width:100px; height:100px;\\\"></div>\").appendTo($viewport);\r\n const $outerdiv = $(\"<div style=\\\"position:absolute; top:-10000px; left:-10000px; overflow:auto; width:100px; height:100px;\\\"></div>\").appendTo($(\"body\"));\r\n const $innerdiv = $(\"<div style=\\\"width:200px; height:200px; overflow:auto;\\\"></div>\").appendTo($outerdiv);\r\n const dim = {\r\n width: $outerdiv[0].offsetWidth - $outerdiv[0].clientWidth,\r\n height: $outerdiv[0].offsetHeight - $outerdiv[0].clientHeight\r\n };\r\n $innerdiv.remove();\r\n $outerdiv.remove();\r\n return dim;\r\n }\r\n\r\n function getHeadersWidth() {\r\n headersWidth = headersWidthL = headersWidthR = 0;\r\n var includeScrollbar = !options.autoHeight;\r\n\r\n for (var i = 0, ii = columns.length; i < ii; i++) {\r\n var width = columns[i].width;\r\n\r\n if ((options.frozenColumn) > -1 && (i > options.frozenColumn)) {\r\n headersWidthR += width;\r\n } else {\r\n headersWidthL += width;\r\n }\r\n }\r\n\r\n if (includeScrollbar) {\r\n if ((options.frozenColumn) > -1 && (i > options.frozenColumn)) {\r\n headersWidthR += scrollbarDimensions.width;\r\n } else {\r\n headersWidthL += scrollbarDimensions.width;\r\n }\r\n }\r\n\r\n if (hasFrozenColumns()) {\r\n headersWidthL = headersWidthL + 1000;\r\n\r\n headersWidthR = Math.max(headersWidthR, viewportW) + headersWidthL;\r\n headersWidthR += scrollbarDimensions.width;\r\n } else {\r\n headersWidthL += scrollbarDimensions.width;\r\n headersWidthL = Math.max(headersWidthL, viewportW) + 1000;\r\n }\r\n\r\n headersWidth = headersWidthL + headersWidthR;\r\n return Math.max(headersWidth, viewportW) + 1000;\r\n }\r\n\r\n // function getHeadersWidthL() {\r\n // headersWidthL = 0;\r\n\r\n // columns.forEach(function (column, i) {\r\n // if (!((options.frozenColumn) > -1 && (i > options.frozenColumn))) {\r\n // headersWidthL += column.width;\r\n // }\r\n // });\r\n\r\n // if (hasFrozenColumns()) {\r\n // headersWidthL += 1000;\r\n // } else {\r\n // headersWidthL += scrollbarDimensions.width;\r\n // headersWidthL = Math.max(headersWidthL, viewportW) + 1000;\r\n // }\r\n\r\n // return headersWidthL;\r\n // }\r\n\r\n // function getHeadersWidthR() {\r\n // headersWidthR = 0;\r\n\r\n // columns.forEach(function (column, i) {\r\n // if ((options.frozenColumn) > -1 && (i > options.frozenColumn)) {\r\n // headersWidthR += column.width;\r\n // }\r\n // });\r\n\r\n // if (hasFrozenColumns()) {\r\n // headersWidthR = Math.max(headersWidthR, viewportW) + getHeadersWidthL();\r\n // headersWidthR += scrollbarDimensions.width;\r\n // }\r\n\r\n // return headersWidthR;\r\n // }\r\n\r\n function getCanvasWidth() {\r\n var availableWidth = viewportHasVScroll ? viewportW - scrollbarDimensions.width : viewportW;\r\n var i = columns.length;\r\n\r\n canvasWidthL = canvasWidthR = 0;\r\n\r\n while (i--) {\r\n if (hasFrozenColumns() && (i > options.frozenColumn)) {\r\n canvasWidthR += columns[i].width;\r\n } else {\r\n canvasWidthL += columns[i].width;\r\n }\r\n }\r\n var totalRowWidth = canvasWidthL + canvasWidthR;\r\n return options.fullWidthRows ? Math.max(totalRowWidth, availableWidth) : totalRowWidth;\r\n }\r\n\r\n function updateCanvasWidth(forceColumnWidthsUpdate?: boolean) {\r\n var oldCanvasWidth = canvasWidth;\r\n var oldCanvasWidthL = canvasWidthL;\r\n var oldCanvasWidthR = canvasWidthR;\r\n var widthChanged;\r\n canvasWidth = getCanvasWidth();\r\n\r\n widthChanged = canvasWidth !== oldCanvasWidth || canvasWidthL !== oldCanvasWidthL || canvasWidthR !== oldCanvasWidthR;\r\n\r\n if (widthChanged || hasFrozenColumns() || hasFrozenRows) {\r\n $canvasTopL.width(canvasWidthL);\r\n\r\n getHeadersWidth();\r\n\r\n $headerL.width(headersWidthL);\r\n $headerR.width(headersWidthR);\r\n\r\n if (hasFrozenColumns()) {\r\n $canvasTopR.width(canvasWidthR);\r\n\r\n $paneHeaderL.width(canvasWidthL);\r\n $paneHeaderR.css(\"left\", canvasWidthL);\r\n // $paneHeaderR.css(\"width\", viewportW - canvasWidthL);\r\n $paneHeaderR.css(\"width\", \"calc(100% - \" + canvasWidthL + \"px)\");\r\n\r\n $paneTopL.width(canvasWidthL);\r\n $paneTopR.css(\"left\", canvasWidthL);\r\n //$paneTopR.css(\"width\", viewportW - canvasWidthL);\r\n $paneTopR.css(\"width\", \"calc(100% - \" + canvasWidthL + \"px)\");\r\n\r\n $headerRowScrollerL.width(canvasWidthL);\r\n // $headerRowScrollerR.width(viewportW - canvasWidthL);\r\n $headerRowScrollerR.css(\"width\", \"100%\");\r\n\r\n $headerRowL.width(canvasWidthL);\r\n $headerRowR.width(canvasWidthR);\r\n\r\n if (options.createFooterRow) {\r\n $footerRowScrollerL.width(canvasWidthL);\r\n //$footerRowScrollerR.width(viewportW - canvasWidthL);\r\n $footerRowScrollerR.css(\"width\", \"100%\");\r\n\r\n $footerRowL.width(canvasWidthL);\r\n $footerRowR.width(canvasWidthR);\r\n }\r\n if (options.createPreHeaderPanel) {\r\n $preHeaderPanel.width(canvasWidth);\r\n }\r\n $viewportTopL.width(canvasWidthL);\r\n //$viewportTopR.width(viewportW - canvasWidthL);\r\n $viewportTopR.css(\"width\", \"100%\");\r\n\r\n if (hasFrozenRows) {\r\n $paneBottomL.width(canvasWidthL);\r\n $paneBottomR.css(\"left\", canvasWidthL);\r\n\r\n $viewportBottomL.width(canvasWidthL);\r\n // $viewportBottomR.width(viewportW - canvasWidthL);\r\n $viewportBottomR.width(\"100%\");\r\n\r\n $canvasBottomL.width(canvasWidthL);\r\n $canvasBottomR.width(canvasWidthR);\r\n }\r\n } else {\r\n $paneHeaderL.width(\"100%\");\r\n $paneTopL.width(\"100%\");\r\n $headerRowScrollerL.width(\"100%\");\r\n $headerRowL.width(canvasWidth);\r\n\r\n if (options.createFooterRow) {\r\n $footerRowScrollerL.width(\"100%\");\r\n $footerRowL.width(canvasWidth);\r\n }\r\n\r\n if (options.createPreHeaderPanel) {\r\n $preHeaderPanel.width(\"100%\");\r\n $preHeaderPanel.width(canvasWidth);\r\n }\r\n $viewportTopL.width(\"100%\");\r\n\r\n if (hasFrozenRows) {\r\n $viewportBottomL.width(\"100%\");\r\n $canvasBottomL.width(canvasWidthL);\r\n }\r\n }\r\n\r\n viewportHasHScroll = options.alwaysShowHorizontalScroll || (canvasWidth > viewportW - scrollbarDimensions.width);\r\n }\r\n\r\n $headerRowSpacerL.width(canvasWidth + (viewportHasVScroll ? scrollbarDimensions.width : 0));\r\n $headerRowSpacerR.width(canvasWidth + (viewportHasVScroll ? scrollbarDimensions.width : 0));\r\n\r\n if (options.createFooterRow) {\r\n $footerRowSpacerL.width(canvasWidth + (viewportHasVScroll ? scrollbarDimensions.width : 0));\r\n $footerRowSpacerR.width(canvasWidth + (viewportHasVScroll ? scrollbarDimensions.width : 0));\r\n }\r\n\r\n if (widthChanged || forceColumnWidthsUpdate) {\r\n applyColumnWidths();\r\n }\r\n }\r\n\r\n function disableSelection($target) {\r\n if ($target && $target.jquery) {\r\n $target\r\n .attr(\"unselectable\", \"on\")\r\n .css(\"MozUserSelect\", \"none\")\r\n .on(\"selectstart.ui\", function () {\r\n return false;\r\n }); // from jquery:ui.core.js 1.7.2\r\n }\r\n }\r\n\r\n function getMaxSupportedCssHeight() {\r\n var supportedHeight = 1000000;\r\n // fF reports the height back but still renders blank after ~6M px\r\n var testUpTo = navigator.userAgent.toLowerCase().match(/firefox/) ? 6000000 : 1000000000;\r\n var div: IjQueryWrapper = $(\"<div />\");\r\n div.appendTo(document.body);\r\n\r\n while (true) {\r\n var test = supportedHeight * 2;\r\n div.height(test);\r\n if (test > testUpTo || div.height() !== test) {\r\n break;\r\n } else {\r\n supportedHeight = test;\r\n }\r\n }\r\n\r\n div.remove();\r\n return supportedHeight;\r\n }\r\n\r\n function getUID() {\r\n return uid;\r\n }\r\n\r\n function getHeaderColumnWidthDiff() {\r\n return headerColumnWidthDiff;\r\n }\r\n\r\n function getScrollbarDimensions() {\r\n return scrollbarDimensions;\r\n }\r\n\r\n // tODO: this is static. need to handle page mutation.\r\n function bindAncestorScrollEvents() {\r\n var elem = (hasFrozenRows && !options.frozenBottom) ? $canvasBottomL[0] : $canvasTopL[0];\r\n while ((elem = elem.parentNode) != document.body && elem != null) {\r\n // bind to scroll containers only\r\n if (elem == $viewportTopL[0] || elem.scrollWidth != elem.clientWidth || elem.scrollHeight != elem.clientHeight) {\r\n var $elem = $(elem);\r\n if (!$boundAncestors) {\r\n $boundAncestors = $elem;\r\n } else {\r\n $boundAncestors = $boundAncestors.add($elem);\r\n }\r\n scrollEventHandler = (elem as HTMLDivElement).addEventListener(\"scroll\", handleActiveCellPositionChange);\r\n //$elem.on(\"scroll.\" + uid, handleActiveCellPositionChange); //TODOFIX\r\n }\r\n }\r\n }\r\n\r\n function unbindAncestorScrollEvents() {\r\n if (!$boundAncestors) {\r\n return;\r\n }\r\n // $boundAncestors.off(\"scroll.\" + uid); //TODO TODOFIX\r\n if (scrollEventHandler) {\r\n $boundAncestors[0].removeEventListener(\"scroll\");\r\n }\r\n $boundAncestors = null;\r\n }\r\n\r\n function updateColumnHeader(columnId, title, toolTip) {\r\n if (!initialized) { return; }\r\n var idx = getColumnIndex(columnId);\r\n if (idx == null) {\r\n return;\r\n }\r\n\r\n var columnDef = columns[idx];\r\n var $header = $($headers.children()[idx]);\r\n if ($header) {\r\n if (title !== undefined) {\r\n columns[idx].name = title;\r\n }\r\n if (toolTip !== undefined) {\r\n columns[idx].toolTip = toolTip;\r\n }\r\n\r\n trigger(self.onBeforeHeaderCellDestroy, {\r\n \"node\": $header[0],\r\n \"column\": columnDef,\r\n \"grid\": self\r\n });\r\n\r\n (<IjQueryWrapper>$header\r\n .attr(\"title\", toolTip || \"\"))\r\n .children()[0].innerHTML = title;\r\n\r\n trigger(self.onHeaderCellRendered, {\r\n \"node\": $header[0],\r\n \"column\": columnDef,\r\n \"grid\": self\r\n });\r\n }\r\n }\r\n\r\n function getHeader(columnDef) {\r\n if (!columnDef) {\r\n return hasFrozenColumns() ? $headers : $headerL;\r\n }\r\n var idx = getColumnIndex(columnDef.id);\r\n return hasFrozenColumns() ? ((idx <= options.frozenColumn) ? $headerL : $headerR) : $headerL;\r\n }\r\n\r\n function getHeaderColumn(columnIdOrIdx) {\r\n var idx = (typeof columnIdOrIdx === \"number\" ? columnIdOrIdx : getColumnIndex(columnIdOrIdx));\r\n var targetHeader = hasFrozenColumns() ? ((idx <= options.frozenColumn) ? $headerL : $headerR) : $headerL;\r\n var targetIndex = hasFrozenColumns() ? ((idx <= options.frozenColumn) ? idx : idx - options.frozenColumn - 1) : idx;\r\n var $rtn = targetHeader.children()[targetIndex];\r\n return $rtn && $rtn[0];\r\n }\r\n\r\n function getHeaderRow() {\r\n return hasFrozenColumns() ? $headerRow : $headerRow[0];\r\n }\r\n\r\n function getFooterRow() {\r\n return hasFrozenColumns() ? $footerRow : $footerRow[0];\r\n }\r\n\r\n function getPreHeaderPanel(): Element {\r\n return $preHeaderPanel[0];\r\n }\r\n\r\n function getPreHeaderPanelRight() {\r\n return $preHeaderPanelR[0];\r\n }\r\n\r\n function getHeaderRowColumn(columnIdOrIdx) {\r\n var idx = (typeof columnIdOrIdx === \"number\" ? columnIdOrIdx : getColumnIndex(columnIdOrIdx));\r\n\r\n var $headerRowTarget;\r\n\r\n if (hasFrozenColumns()) {\r\n if (idx <= options.frozenColumn) {\r\n $headerRowTarget = $headerRowL;\r\n } else {\r\n $headerRowTarget = $headerRowR;\r\n idx -= options.frozenColumn + 1;\r\n }\r\n } else {\r\n $headerRowTarget = $headerRowL;\r\n }\r\n\r\n var $header = $headerRowTarget.children().eq(idx);\r\n return $header && $header[0];\r\n }\r\n\r\n function getFooterRowColumn(columnIdOrIdx) {\r\n var idx = (typeof columnIdOrIdx === \"number\" ? columnIdOrIdx : getColumnIndex(columnIdOrIdx));\r\n\r\n var $footerRowTarget;\r\n\r\n if (hasFrozenColumns()) {\r\n if (idx <= options.frozenColumn) {\r\n $footerRowTarget = $footerRowL;\r\n } else {\r\n $footerRowTarget = $footerRowR;\r\n\r\n idx -= options.frozenColumn + 1;\r\n }\r\n } else {\r\n $footerRowTarget = $footerRowL;\r\n }\r\n\r\n var $footer = $footerRowTarget.children().eq(idx);\r\n return $footer && $footer[0];\r\n }\r\n\r\n function createColumnFooter() {\r\n if (options.createFooterRow) {\r\n $.each($footerRow.find(\".slick-footerrow-column\")\r\n , function () {\r\n var columnDef = $(this).data(\"column\");\r\n if (columnDef) {\r\n trigger(self.onBeforeFooterRowCellDestroy, {\r\n \"node\": this,\r\n \"column\": columnDef,\r\n \"grid\": self\r\n });\r\n }\r\n });\r\n\r\n $footerRowL.empty();\r\n $footerRowR.empty();\r\n\r\n for (var i = 0; i < columns.length; i++) {\r\n var m = columns[i];\r\n\r\n var footerRowCell = $(\"<div class='ui-state-default slick-footerrow-column l\" + i + \" r\" + i + \"'></div>\")\r\n .data(\"column\", m)\r\n .addClass(hasFrozenColumns() && i <= options.frozenColumn ? \"frozen\" : \"\")\r\n .appendTo(hasFrozenColumns() && (i > options.frozenColumn) ? $footerRowR : $footerRowL);\r\n\r\n trigger(self.onFooterRowCellRendered, {\r\n \"node\": footerRowCell[0],\r\n \"column\": m,\r\n \"grid\": self\r\n });\r\n }\r\n }\r\n }\r\n\r\n // function createColumnGroupHeaders() {\r\n // var columnsLength = 0;\r\n // var frozenColumnsValid = false;\r\n\r\n // if (!treeColumns.hasDepth()) {\r\n // return;\r\n // }\r\n\r\n // for (var index = 0; index < $groupHeadersL.length; index++) {\r\n\r\n // $groupHeadersL[index].empty();\r\n // $groupHeadersR[index].empty();\r\n\r\n // var groupColumns = treeColumns.getColumnsInDepth(index);\r\n\r\n // for (var indexGroup in groupColumns) {\r\n // var m = groupColumns[indexGroup];\r\n\r\n // columnsLength += m.extractColumns().length;\r\n\r\n // if (hasFrozenColumns() && index == 0 && (columnsLength - 1) === options.frozenColumn) {\r\n // frozenColumnsValid = true;\r\n // }\r\n\r\n // var tmp = document.createElement(\"div\");\r\n // tmp.className = \"ui-state-default slick-group-header-column\";\r\n // tmp.innerHTML = \"<span class='slick-column-name'>\" + m.name + \"</span>\";\r\n // // tmp.innerHTML = m.name;\r\n // tmp.id = \"\" + uid + m.id;\r\n // tmp.title = m.toolTip || \"\";\r\n // if (m.headerCssClass) {\r\n // tmp.classList.add(m.headerCssClass);\r\n // }\r\n // if (hasFrozenColumns() && (columnsLength - 1) > options.frozenColumn) {\r\n // tmp.classList.add(\"frozen\");\r\n // }\r\n // var $tmp = $(tmp);\r\n // $tmp.data(\"column\", m);\r\n // if (hasFrozenColumns() && (columnsLength - 1) > options.frozenColumn) {\r\n // $tmp.appendTo($groupHeadersR[index]);\r\n // } else {\r\n // $tmp.appendTo($groupHeadersL[index]);\r\n // }\r\n // }\r\n\r\n // if (hasFrozenColumns() && index == 0 && !frozenColumnsValid) {\r\n // $groupHeadersL[index].empty();\r\n // $groupHeadersR[index].empty();\r\n // alert(\"All columns of group should to be grouped!\");\r\n // break;\r\n // }\r\n // }\r\n\r\n // applyColumnGroupHeaderWidths();\r\n // }\r\n\r\n function createColumnHeaders() {\r\n function onMouseEnter() {\r\n $(this).addClass(\"ui-state-hover\");\r\n }\r\n\r\n function onMouseLeave() {\r\n $(this).removeClass(\"ui-state-hover\");\r\n }\r\n\r\n $.each($headers.find(\".slick-header-column\"),\r\n function () {\r\n var columnDef = $(this).data(\"column\");\r\n if (columnDef) {\r\n trigger(self.onBeforeHeaderCellDestroy, {\r\n \"node\": this,\r\n \"column\": columnDef,\r\n \"grid\": self\r\n });\r\n }\r\n });\r\n\r\n $headerL.empty();\r\n $headerR.empty();\r\n\r\n getHeadersWidth();\r\n\r\n $headerL.width(headersWidthL);\r\n $headerR.width(headersWidthR);\r\n\r\n $.each($headerRow.find(\".slick-headerrow-column\"),\r\n function () {\r\n var columnDef = $(this).data(\"column\");\r\n if (columnDef) {\r\n trigger(self.onBeforeHeaderRowCellDestroy, {\r\n \"node\": this,\r\n \"column\": columnDef,\r\n \"grid\": self\r\n });\r\n }\r\n });\r\n\r\n $headerRowL.empty();\r\n $headerRowR.empty();\r\n\r\n if (options.createFooterRow) {\r\n $.each($footerRowL.find(\".slick-footerrow-column\"),\r\n function () {\r\n var columnDef = $(this).data(\"column\");\r\n if (columnDef) {\r\n trigger(self.onBeforeFooterRowCellDestroy, {\r\n \"node\": this,\r\n \"column\": columnDef,\r\n \"grid\": self\r\n });\r\n }\r\n });\r\n $footerRowL.empty();\r\n\r\n if (hasFrozenColumns()) {\r\n $.each($footerRowR.find(\".slick-footerrow-column\"),\r\n function () {\r\n var columnDef = $(this).data(\"column\");\r\n if (columnDef) {\r\n trigger(self.onBeforeFooterRowCellDestroy, {\r\n \"node\": this,\r\n \"column\": columnDef,\r\n \"grid\": self\r\n });\r\n }\r\n });\r\n $footerRowR.empty();\r\n }\r\n }\r\n\r\n for (var i = 0; i < columns.length; i++) {\r\n var m = columns[i];\r\n\r\n var $headerTarget = hasFrozenColumns() ? ((i <= options.frozenColumn) ? $headerL : $headerR) : $headerL;\r\n var $headerRowTarget = hasFrozenColumns() ? ((i <= options.frozenColumn) ? $headerRowL : $headerRowR) : $headerRowL;\r\n\r\n\r\n var div = document.createElement(\"div\");\r\n div.className = \"ui-state-default slick-header-column\";\r\n div.style.width = (m.width - headerColumnWidthDiff) + \"px\";\r\n div.id = \"\" + uid + m.id;\r\n div.title = m.toolTip || \"\";\r\n let html = \"<span class='slick-column-name'>\" + m.name + \"</span>\";\r\n if (m.resizable) {\r\n html += \"<span class='rs-r'\" + (options.resizeHandleWidth ? \"style='width:\" + options.resizeHandleWidth + \"'\" : \"\") + \"></span>\";\r\n div.className += \" resizable\";\r\n }\r\n div.innerHTML = html;\r\n if (m.headerCssClass) {\r\n div.className += \" \" + m.headerCssClass;\r\n }\r\n if (hasFrozenColumns() && i <= options.frozenColumn) {\r\n div.classList.add(\"frozen\");\r\n }\r\n var header = $(div);\r\n header.appendTo($headerTarget);\r\n header.data(\"column\", m);\r\n // var header = $(\"<div class='ui-state-default slick-header-column' />\")\r\n // .html(\"<span class='slick-column-name'>\" + m.name + \"</span>\")\r\n // .width(m.width - headerColumnWidthDiff)\r\n // .attr(\"id\", \"\" + uid + m.id)\r\n // .attr(\"title\", m.toolTip || \"\")\r\n // .data(\"column\", m)\r\n // .addClass(m.headerCssClass || \"\")\r\n // .addClass(hasFrozenColumns() && i <= options.frozenColumn? 'frozen': '')\r\n // .appendTo($headerTarget);\r\n\r\n if (options.enableColumnReorder || m.sortable) {\r\n header\r\n .on(\"mouseenter\", onMouseEnter)\r\n .on(\"mouseleave\", onMouseLeave);\r\n }\r\n\r\n if (m.sortable) {\r\n header.addClass(\"slick-header-sortable\");\r\n var sortIndicator = document.createElement(\"span\");\r\n sortIndicator.className = \"slick-sort-indicator\"\r\n + (options.numberedMultiColumnSort && !options.sortColNumberInSeparateSpan ? \" slick-sort-indicator-numbered\" : \"\");\r\n header.append(sortIndicator);\r\n if (options.numberedMultiColumnSort && options.sortColNumberInSeparateSpan) {\r\n var numIndicator = document.createElement(\"span\");\r\n numIndicator.className = \"slick-sort-indicator-numbered\";\r\n header.append(numIndicator);\r\n }\r\n }\r\n\r\n trigger(self.onHeaderCellRendered, {\r\n \"node\": header[0],\r\n \"column\": m,\r\n \"grid\": self\r\n });\r\n\r\n if (options.showHeaderRow) {\r\n var headerRowCell = $(\"<div class='ui-state-default slick-headerrow-column l\" + i + \" r\" + i + \"'></div>\")\r\n .data(\"column\", m)\r\n .addClass(hasFrozenColumns() && i <= options.frozenColumn ? \"frozen\" : \"\")\r\n .appendTo($headerRowTarget);\r\n\r\n trigger(self.onHeaderRowCellRendered, {\r\n \"node\": headerRowCell[0],\r\n \"column\": m,\r\n \"grid\": self\r\n });\r\n }\r\n if (options.createFooterRow && options.showFooterRow) {\r\n var footerRowCell = $(\"<div class='ui-state-default slick-footerrow-column l\" + i + \" r\" + i + \"'></div>\")\r\n .data(\"column\", m)\r\n .appendTo($footerRow);\r\n\r\n trigger(self.onFooterRowCellRendered, {\r\n \"node\": footerRowCell[0],\r\n \"column\": m,\r\n \"grid\": self\r\n });\r\n }\r\n }\r\n\r\n setSortColumns(sortColumns);\r\n // setupColumnResize();\r\n // if (options.enableColumnReorder) {\r\n // if (typeof options.enableColumnReorder == 'function') {\r\n // options.enableColumnReorder(self, $headers, headerColumnWidthDiff, setColumns, setupColumnResize, columns, getColumnIndex, uid, trigger);\r\n // } else {\r\n // setupColumnReorder();\r\n // }\r\n // }\r\n }\r\n\r\n function setupColumnSort() {\r\n $headers.on(\"click\", function (e) {\r\n\r\n let ctrlPressed: boolean = e.metaKey || e.ctrlKey;\r\n if ($(e.target).hasClass(\"rs-r\")) {\r\n return;\r\n }\r\n\r\n var $col = $(e.target).closestClass(\"slick-header-column\");\r\n if (!$col.length) {\r\n return;\r\n }\r\n\r\n var column = $col.data(\"column\");\r\n if (column.sortable) {\r\n if (!getEditorLock().commitCurrentEdit()) {\r\n return;\r\n }\r\n\r\n var sortColumn = null;\r\n var i = 0;\r\n for (; i < sortColumns.length; i++) {\r\n if (sortColumns[i].columnId == column.id) {\r\n sortColumn = sortColumns[i];\r\n sortColumn.sortAsc = !sortColumn.sortAsc;\r\n break;\r\n }\r\n }\r\n var hadSortCol = !!sortColumn;\r\n\r\n if (options.tristateMultiColumnSort) {\r\n if (!sortColumn) {\r\n sortColumn = { columnId: column.id, sortAsc: column.defaultSortAsc };\r\n }\r\n if (hadSortCol && sortColumn.sortAsc) {\r\n // three state: remove sort rather than go back to ASC\r\n sortColumns.splice(i, 1);\r\n sortColumn = null;\r\n }\r\n if (!options.multiColumnSort) { sortColumns = []; }\r\n if (sortColumn && (!hadSortCol || !options.multiColumnSort)) {\r\n sortColumns.push(sortColumn);\r\n }\r\n } else {\r\n // legacy behaviour\r\n if (ctrlPressed && options.multiColumnSort) {\r\n if (sortColumn) {\r\n sortColumns.splice(i, 1);\r\n }\r\n } else {\r\n if ((!e.shiftKey && !ctrlPressed) || !options.multiColumnSort) {\r\n sortColumns = [];\r\n }\r\n\r\n if (!sortColumn) {\r\n sortColumn = { columnId: column.id, sortAsc: column.defaultSortAsc };\r\n sortColumns.push(sortColumn);\r\n } else if (sortColumns.length == 0) {\r\n sortColumns.push(sortColumn);\r\n }\r\n }\r\n }\r\n\r\n setSortColumns(sortColumns);\r\n\r\n if (!options.multiColumnSort) {\r\n trigger(self.onSort, {\r\n multiColumnSort: false,\r\n columnId: (sortColumns.length > 0 ? column.id : null),\r\n sortCol: (sortColumns.length > 0 ? column : null),\r\n sortAsc: (sortColumns.length > 0 ? sortColumns[0].sortAsc : true)\r\n }, e);\r\n } else {\r\n trigger(self.onSort, {\r\n multiColumnSort: true,\r\n sortCols: sortColumns.map(function (col) {\r\n return { columnId: columns[getColumnIndex(col.columnId)].id, sortCol: columns[getColumnIndex(col.columnId)], sortAsc: col.sortAsc };\r\n })\r\n }, e);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function currentPositionInHeader(id) {\r\n var currentPosition = 0;\r\n $.each($headers.find(\".slick-header-column\"), function (i) {\r\n if (this.id == id) {\r\n currentPosition = i;\r\n return false;\r\n }\r\n });\r\n\r\n return currentPosition;\r\n }\r\n\r\n // function limitPositionInGroup(idColumn) {\r\n // var groupColumnOfPreviousPosition,\r\n // startLimit = 0,\r\n // endLimit = 0;\r\n\r\n // treeColumns\r\n // .getColumnsInDepth($groupHeadersL.length - 1)\r\n // .some(function (groupColumn) {\r\n // startLimit = endLimit;\r\n // endLimit += groupColumn.columns.length;\r\n\r\n // groupColumn.columns.some(function (column) {\r\n\r\n // if (column.id === idColumn) {\r\n // groupColumnOfPreviousPosition = groupColumn;\r\n // }\r\n\r\n // return groupColumnOfPreviousPosition;\r\n // });\r\n\r\n // return groupColumnOfPreviousPosition;\r\n // });\r\n\r\n // endLimit--;\r\n\r\n // return {\r\n // start: startLimit,\r\n // end: endLimit,\r\n // group: groupColumnOfPreviousPosition\r\n // };\r\n // }\r\n\r\n function remove(arr, elem) {\r\n var index = arr.lastIndexOf(elem);\r\n if (index > -1) {\r\n arr.splice(index, 1);\r\n remove(arr, elem);\r\n }\r\n }\r\n\r\n // function columnPositionValidInGroup($item: IjQueryWrapper) {\r\n // var currentPosition = currentPositionInHeader($item[0].id);\r\n // var limit = limitPositionInGroup($item.data(\"column\").id);\r\n // var positionValid = limit.start <= currentPosition && currentPosition <= limit.end;\r\n\r\n // return {\r\n // limit: limit,\r\n // valid: positionValid,\r\n // message: positionValid ? \"\" : \"Column \\\"\".concat($item[0].textContent, \"\\\" can be reordered only within the \\\"\", limit.group.name, \"\\\" group!\")\r\n // };\r\n // }\r\n\r\n function setupColumnReorder() {\r\n if (1) { return; }\r\n var columnScrollTimer = null;\r\n\r\n function scrollColumnsRight() {\r\n $viewportScrollContainerX[0].scrollLeft = $viewportScrollContainerX[0].scrollLeft + 10;\r\n }\r\n\r\n function scrollColumnsLeft() {\r\n $viewportScrollContainerX[0].scrollLeft = $viewportScrollContainerX[0].scrollLeft - 10;\r\n }\r\n\r\n var canDragScroll;\r\n // $headers.sortable({\r\n // containment: \"parent\",\r\n // distance: 3,\r\n // axis: \"x\",\r\n // cursor: \"default\",\r\n // tolerance: \"intersection\",\r\n // helper: \"clone\",\r\n // placeholder: \"slick-sortable-placeholder ui-state-default slick-header-column\",\r\n // start: function (e, ui) {\r\n // ui.placeholder.width(ui.helper.outerWidth() - headerColumnWidthDiff);\r\n // canDragScroll = !hasFrozenColumns() ||\r\n // (ui.placeholder.offset().left + ui.placeholder.width()) > $viewportScrollContainerX.offset().left;\r\n // $(ui.helper).addClass(\"slick-header-column-active\");\r\n // },\r\n // beforeStop: function (e, ui) {\r\n // $(ui.helper).removeClass(\"slick-header-column-active\");\r\n // },\r\n // sort: function (e, ui) {\r\n // if (canDragScroll && e.originalEvent.pageX > $container[0].clientWidth) {\r\n // if (!(columnScrollTimer)) {\r\n // columnScrollTimer = setInterval(\r\n // scrollColumnsRight, 100);\r\n // }\r\n // } else if (canDragScroll && e.originalEvent.pageX < $viewportScrollContainerX.offset().left) {\r\n // if (!(columnScrollTimer)) {\r\n // columnScrollTimer = setInterval(\r\n // scrollColumnsLeft, 100);\r\n // }\r\n // } else {\r\n // clearInterval(columnScrollTimer);\r\n // columnScrollTimer = null;\r\n // }\r\n // },\r\n // stop: function (e, ui) {\r\n // var cancel = false;\r\n // clearInterval(columnScrollTimer);\r\n // columnScrollTimer = null;\r\n // var limit = null;\r\n\r\n // if (treeColumns.hasDepth()) {\r\n // var validPositionInGroup = columnPositionValidInGroup(ui.item);\r\n // limit = validPositionInGroup.limit;\r\n\r\n // cancel = !validPositionInGroup.valid;\r\n\r\n // if (cancel)\r\n // alert(validPositionInGroup.message);\r\n // }\r\n\r\n // if (cancel || !getEditorLock().commitCurrentEdit()) {\r\n // //$(this).sortable(\"cancel\");\r\n // return;\r\n // }\r\n\r\n // var reorderedIds = $headerL.sortable(\"toArray\");\r\n // reorderedIds = reorderedIds.concat($headerR.sortable(\"toArray\"));\r\n\r\n // var reorderedColumns = [];\r\n // for (var i = 0; i < reorderedIds.length; i++) {\r\n // reorderedColumns.push(columns[getColumnIndex(reorderedIds[i].replace(uid, \"\"))]);\r\n // }\r\n // setColumns(reorderedColumns);\r\n\r\n // trigger(self.onColumnsReordered, { impactedColumns : getImpactedColumns( limit ) });\r\n // e.stopPropagation();\r\n // setupColumnResize();\r\n // }\r\n // });\r\n }\r\n\r\n function getImpactedColumns(limit) {\r\n var impactedColumns = [];\r\n\r\n if (limit != undefined) {\r\n\r\n for (var i = limit.start; i <= limit.end; i++) {\r\n impactedColumns.push(columns[i]);\r\n }\r\n } else {\r\n\r\n impactedColumns = columns;\r\n }\r\n\r\n return impactedColumns;\r\n }\r\n\r\n function setupColumnMoveAndResize() {\r\n\r\n for (const c of ($container.find(\".slick-header-columns\") as any)) {\r\n Resizable(c, {\r\n resizeDelta: options.resizeDelta,\r\n onResize: new EventHandler((evt) => {\r\n processColumnResize(evt.target, evt.x);\r\n }),\r\n onStart: new EventHandler((evt) => {\r\n startColumnResize(evt.target, evt.x);\r\n }),\r\n onStop: new EventHandler((evt) => {\r\n finishColumnResize();\r\n })\r\n });\r\n // c.addEventListener(\"js-rs-resize\", (evt) => {\r\n // processColumnResize(evt.detail.target, evt.detail.pageX);\r\n // });\r\n // c.addEventListener(\"js-rs-start\", (evt) => {\r\n // startColumnResize(evt.detail.target, evt.detail.pageX);\r\n // });\r\n // c.addEventListener(\"js-rs-stop\", (evt) => {\r\n // finishColumnResize();\r\n // });\r\n }\r\n\r\n const mouseDownFnc = function (e) {\r\n let arg: MouseEvent = e;\r\n let $target: IjQueryWrapper = $(e.target).closestClass(\"slick-header-column\");\r\n if ($target.length === 0) {\r\n // special case for last column\r\n if (e.target.classList.contains(\"slick-header-columns\")) {\r\n $target = $((e.target as HTMLDivElement).lastChild as HTMLElement);\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n const x: number = arg.pageX != null ? arg.pageX : ((arg as unknown) as TouchEvent).touches[0].pageX;\r\n let columnInfo: ISlickColumn = $target.data(\"column\");\r\n\r\n if (options.enableColumnReorder) {\r\n startColumnDragging($target, x);\r\n } else {\r\n //sort\r\n }\r\n };\r\n\r\n $headers.on(\"mousedown\", mouseDownFnc);\r\n $headers.on(\"touchstart\", mouseDownFnc);\r\n\r\n }\r\n\r\n var dragColStartX = 0;\r\n var draggedEl: HTMLElement;\r\n var dragGhost: HTMLElement;\r\n\r\n function startColumnDragging($target: IjQueryWrapper, x: number) {\r\n dragColStartX = x;\r\n draggedEl = $target[0];\r\n dragGhost = document.createElement(\"div\");\r\n dragGhost.className = \"slick-col-ghost\";\r\n dragGhost.style.left = draggedEl.offsetLeft + \"px\";\r\n dragGhost.style.height = draggedEl.clientHeight + \"px\";\r\n dragGhost.style.width = draggedEl.clientWidth + \"px\";\r\n let ghostContent = document.createElement(\"div\");\r\n ghostContent.className = \"slick-ghost-content\";\r\n ghostContent.style.height = draggedEl.clientHeight + \"px\";\r\n dragGhost.appendChild(ghostContent);\r\n draggedEl.classList.add(\"slick-header-column-active\");\r\n draggedEl.parentElement.appendChild(dragGhost);\r\n window.addEventListener(\"mousemove\", processColumnDrag);\r\n window.addEventListener(\"touchmove\", processColumnDrag);\r\n window.addEventListener(\"mouseup\", finishColumnDrag);\r\n window.addEventListener(\"touchend\", finishColumnDrag);\r\n }\r\n\r\n function processColumnDrag(evt: MouseEvent) {\r\n const x: number = evt.pageX != null ? evt.pageX : ((evt as unknown) as TouchEvent).touches[0].pageX;\r\n let prevEl: HTMLElement = draggedEl.previousElementSibling as HTMLElement;\r\n let nextEl: HTMLElement = draggedEl.nextElementSibling as HTMLElement;\r\n\r\n let prevWidth = prevEl != null ? prevEl.offsetWidth : -1;\r\n let nextWidth = nextEl != null ? nextEl.offsetWidth : -1;\r\n let draggedDistance = x - dragColStartX;\r\n dragGhost.style.left = (draggedEl.offsetLeft + draggedDistance) + \"px\";\r\n if (prevWidth >= 0 && draggedDistance < -prevWidth) {\r\n if (prevEl != null) {\r\n draggedEl.parentNode.insertBefore(draggedEl, prevEl);\r\n }\r\n } else if (nextWidth >= 0 && draggedDistance > nextWidth) {\r\n if (nextEl != null) {\r\n draggedEl.parentNode.insertBefore(nextEl, draggedEl);\r\n }\r\n } else {\r\n return;\r\n }\r\n dragColStartX = x;\r\n }\r\n\r\n function applyColumnResort(arg: any) {\r\n\r\n if (!getEditorLock().commitCurrentEdit()) {\r\n return;\r\n }\r\n\r\n let $colsL = $headerL.find(\".slick-header-column\");\r\n let $colsR = $headerR.find(\".slick-header-column\");\r\n let reorderedIds = (($colsL as unknown) as HTMLElement[]).map((e) => e.id);\r\n reorderedIds = reorderedIds.concat((($colsR as unknown) as HTMLElement[]).map((e) => e.id));\r\n\r\n let reorderedColumns = [];\r\n for (let i = 0; i < reorderedIds.length; i++) {\r\n reorderedColumns.push(columns[getColumnIndex(reorderedIds[i].replace(uid, \"\"))]);\r\n }\r\n setColumns(reorderedColumns);\r\n\r\n trigger(self.onColumnsReordered, { impactedColumns: getImpactedColumns(0 /*limit*/) }); // tODO limit\r\n }\r\n\r\n function finishColumnDrag(arg: any) {\r\n const x: number = arg.pageX != null ? arg.pageX : (arg.touches.length > 0 ? arg.touches : arg.changedTouches)[0].pageX;\r\n window.removeEventListener(\"mousemove\", processColumnDrag);\r\n window.removeEventListener(\"mouseup\", finishColumnDrag);\r\n window.removeEventListener(\"touchmove\", processColumnDrag);\r\n window.removeEventListener(\"touchend\", finishColumnDrag);\r\n $headers.find(\".slick-header-column-active\").removeClass(\"slick-header-column-active\");\r\n if (dragGhost != null) {\r\n dragGhost.parentElement.removeChild(dragGhost);\r\n }\r\n dragGhost = null;\r\n if (Math.abs(dragColStartX - x) > options.dragDelta) {\r\n applyColumnResort(arg);\r\n } else {\r\n //sort\r\n }\r\n }\r\n\r\n\r\n let pageX, minPageX, maxPageX;\r\n\r\n function startColumnResize(target: HTMLElement, x: number) {\r\n const $target = $(target);\r\n // columnResizeDragging = true;\r\n if (!getEditorLock().commitCurrentEdit()) {\r\n return false;\r\n }\r\n pageX = x;\r\n let colIdx = $target.index();\r\n let columnElements = $headers.children();\r\n let shrinkLeewayOnRight = null, stretchLeewayOnRight = null;\r\n $target.addClass(\"slick-header-column-active\");\r\n // lock each column's width option to current width\r\n $.each(columnElements, function (i, e) {\r\n if (i >= columns.length) { return; }\r\n columns[i].previousWidth = $(e).width() as number;\r\n });\r\n if (options.forceFitColumns) {\r\n shrinkLeewayOnRight = 0;\r\n stretchLeewayOnRight = 0;\r\n // colums on right affect maxPageX/minPageX\r\n for (let j = colIdx + 1; j < columns.length; j++) {\r\n let c = columns[j];\r\n if (c.resizable) {\r\n if (stretchLeewayOnRight !== null) {\r\n if (c.maxWidth) {\r\n stretchLeewayOnRight += c.maxWidth - c.previousWidth;\r\n } else {\r\n stretchLeewayOnRight = null;\r\n }\r\n }\r\n shrinkLeewayOnRight += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n }\r\n }\r\n }\r\n let shrinkLeewayOnLeft = 0, stretchLeewayOnLeft = 0;\r\n for (let j = 0; j <= colIdx; j++) {\r\n // columns on left only affect minPageX\r\n let c = columns[j];\r\n if (c.resizable) {\r\n if (stretchLeewayOnLeft !== null) {\r\n if (c.maxWidth) {\r\n stretchLeewayOnLeft += c.maxWidth - c.previousWidth;\r\n } else {\r\n stretchLeewayOnLeft = null;\r\n }\r\n }\r\n shrinkLeewayOnLeft += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n }\r\n }\r\n if (shrinkLeewayOnRight === null) {\r\n shrinkLeewayOnRight = 100000;\r\n }\r\n if (shrinkLeewayOnLeft === null) {\r\n shrinkLeewayOnLeft = 100000;\r\n }\r\n if (stretchLeewayOnRight === null) {\r\n stretchLeewayOnRight = 100000;\r\n }\r\n if (stretchLeewayOnLeft === null) {\r\n stretchLeewayOnLeft = 100000;\r\n }\r\n maxPageX = pageX + Math.min(shrinkLeewayOnRight, stretchLeewayOnLeft);\r\n minPageX = pageX - Math.min(shrinkLeewayOnLeft, stretchLeewayOnRight);\r\n // $current_resize_target = $target;\r\n }\r\n\r\n\r\n\r\n function processColumnResize(target: HTMLElement, currentX: number) {\r\n // if (options.resizeDelta && Math.abs(oldResizeX - newx) <= options.resizeDelta)\r\n // return;\r\n let $target = $(target);\r\n // const width = $target.width() as number;\r\n // oldResizeX = newx;\r\n let colIdx = $target.index();\r\n if (hasFrozenColumns() && $target.closestClass(\"slick-header-columns\").hasClass(\"slick-header-columns-right\")) {\r\n colIdx += options.frozenColumn + 1;\r\n }\r\n let actualMinWidth, d = Math.min(maxPageX, Math.max(minPageX, currentX)) - pageX, x;\r\n if (d < 0) { // shrink column\r\n x = d;\r\n\r\n var newCanvasWidthL = 0, newCanvasWidthR = 0;\r\n\r\n for (let j = colIdx; j >= 0; j--) {\r\n let c = columns[j];\r\n if (c.resizable) {\r\n actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n if (x && c.previousWidth + x < actualMinWidth) {\r\n x += c.previousWidth - actualMinWidth;\r\n c.width = actualMinWidth;\r\n } else {\r\n c.width = c.previousWidth + x;\r\n x = 0;\r\n }\r\n }\r\n }\r\n // return;\r\n\r\n for (let k = 0; k <= colIdx; k++) {\r\n let c = columns[k];\r\n\r\n if (hasFrozenColumns() && (k > options.frozenColumn)) {\r\n newCanvasWidthR += c.width;\r\n } else {\r\n newCanvasWidthL += c.width;\r\n }\r\n }\r\n\r\n if (options.forceFitColumns) {\r\n x = -d;\r\n for (let j = colIdx + 1; j < columns.length; j++) {\r\n let c = columns[j];\r\n if (c.resizable) {\r\n if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n x -= c.maxWidth - c.previousWidth;\r\n c.width = c.maxWidth;\r\n } else {\r\n c.width = c.previousWidth + x;\r\n x = 0;\r\n }\r\n\r\n if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n newCanvasWidthR += c.width;\r\n } else {\r\n newCanvasWidthL += c.width;\r\n }\r\n }\r\n }\r\n } else {\r\n for (let j = colIdx + 1; j < columns.length; j++) {\r\n let c = columns[j];\r\n\r\n if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n newCanvasWidthR += c.width;\r\n } else {\r\n newCanvasWidthL += c.width;\r\n }\r\n }\r\n }\r\n\r\n if (options.forceFitColumns) {\r\n x = -d;\r\n for (let j = colIdx + 1; j < columns.length; j++) {\r\n let c = columns[j];\r\n if (c.resizable) {\r\n if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n x -= c.maxWidth - c.previousWidth;\r\n c.width = c.maxWidth;\r\n } else {\r\n c.width = c.previousWidth + x;\r\n x = 0;\r\n }\r\n }\r\n }\r\n }\r\n } else { // stretch column\r\n x = d;\r\n\r\n var newCanvasWidthL = 0, newCanvasWidthR = 0;\r\n\r\n for (let j = colIdx; j >= 0; j--) {\r\n let c = columns[j];\r\n if (c.resizable) {\r\n if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n x -= c.maxWidth - c.previousWidth;\r\n c.width = c.maxWidth;\r\n } else {\r\n c.width = c.previousWidth + x;\r\n x = 0;\r\n }\r\n }\r\n }\r\n\r\n for (let k = 0; k <= colIdx; k++) {\r\n let c = columns[k];\r\n\r\n if (hasFrozenColumns() && (k > options.frozenColumn)) {\r\n newCanvasWidthR += c.width;\r\n } else {\r\n newCanvasWidthL += c.width;\r\n }\r\n }\r\n\r\n if (options.forceFitColumns) {\r\n x = -d;\r\n for (let j = colIdx + 1; j < columns.length; j++) {\r\n let c = columns[j];\r\n if (c.resizable) {\r\n actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n if (x && c.previousWidth + x < actualMinWidth) {\r\n x += c.previousWidth - actualMinWidth;\r\n c.width = actualMinWidth;\r\n } else {\r\n c.width = c.previousWidth + x;\r\n x = 0;\r\n }\r\n\r\n if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n newCanvasWidthR += c.width;\r\n } else {\r\n newCanvasWidthL += c.width;\r\n }\r\n }\r\n }\r\n } else {\r\n for (let j = colIdx + 1; j < columns.length; j++) {\r\n let c = columns[j];\r\n\r\n if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n newCanvasWidthR += c.width;\r\n } else {\r\n newCanvasWidthL += c.width;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (hasFrozenColumns() && newCanvasWidthL != canvasWidthL) {\r\n $headerL.width(newCanvasWidthL + 1000);\r\n $paneHeaderR.css(\"left\", newCanvasWidthL);\r\n }\r\n\r\n applyColumnHeaderWidths();\r\n // applyColumnGroupHeaderWidths();\r\n if (options.syncColumnCellResize) {\r\n applyColumnWidths();\r\n }\r\n\r\n }\r\n\r\n function finishColumnResize() {\r\n let newWidth: number;\r\n let columnElements = $headers.children();\r\n $headers.find(\".slick-header-column-active\").removeClass(\"slick-header-column-active\");\r\n for (let j = 0; j < columns.length; j++) {\r\n let c = columns[j];\r\n newWidth = $(columnElements[j]).width() as number;\r\n\r\n if (c.previousWidth !== newWidth && c.rerenderOnResize) {\r\n invalidateAllRows();\r\n break;\r\n }\r\n }\r\n updateCanvasWidth(true);\r\n resizeCanvas();\r\n handleScroll();\r\n\r\n trigger(self.onColumnsResized, {});\r\n }\r\n\r\n\r\n // function setupColumnResize() {\r\n // if (1) return;\r\n // var $col, j, k, c, pageX, columnElements: IjQueryWrapper, minPageX, maxPageX, firstResizable, lastResizable;\r\n // columnElements = $headers.children();\r\n // columnElements.find(\".slick-resizable-handle\").remove();\r\n // $.each(columnElements, function (i, e) {\r\n // if (i >= columns.length) { return; }\r\n // if (columns[i].resizable) {\r\n // if (firstResizable === undefined) {\r\n // firstResizable = i;\r\n // }\r\n // lastResizable = i;\r\n // }\r\n // });\r\n // if (firstResizable === undefined) {\r\n // return;\r\n // }\r\n // $.each(columnElements, function (i, e) {\r\n // if (i >= columns.length) { return; }\r\n // if (i < firstResizable || (options.forceFitColumns && i >= lastResizable)) {\r\n // return;\r\n // }\r\n // $col = $(e);\r\n // var resHandle = document.createElement(\"div\");\r\n // resHandle.className = \"slick-resizable-handle\";\r\n // e.appendChild(resHandle);\r\n // $(resHandle).on(\"dragstart\", function (e, dd) {\r\n // if (!getEditorLock().commitCurrentEdit()) {\r\n // return false;\r\n // }\r\n // pageX = e.pageX;\r\n // resHandle.parentElement.classList.add(\"slick-header-column-active\");\r\n // var shrinkLeewayOnRight = null, stretchLeewayOnRight = null;\r\n // // lock each column's width option to current width\r\n // $.each(columnElements, function (i, e) {\r\n // if (i >= columns.length) { return; }\r\n // columns[i].previousWidth = $(e).width(); //.outerWidth();\r\n // });\r\n // if (options.forceFitColumns) {\r\n // shrinkLeewayOnRight = 0;\r\n // stretchLeewayOnRight = 0;\r\n // // colums on right affect maxPageX/minPageX\r\n // for (j = i + 1; j < columns.length; j++) {\r\n // c = columns[j];\r\n // if (c.resizable) {\r\n // if (stretchLeewayOnRight !== null) {\r\n // if (c.maxWidth) {\r\n // stretchLeewayOnRight += c.maxWidth - c.previousWidth;\r\n // } else {\r\n // stretchLeewayOnRight = null;\r\n // }\r\n // }\r\n // shrinkLeewayOnRight += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n // }\r\n // }\r\n // }\r\n // var shrinkLeewayOnLeft = 0, stretchLeewayOnLeft = 0;\r\n // for (j = 0; j <= i; j++) {\r\n // // columns on left only affect minPageX\r\n // c = columns[j];\r\n // if (c.resizable) {\r\n // if (stretchLeewayOnLeft !== null) {\r\n // if (c.maxWidth) {\r\n // stretchLeewayOnLeft += c.maxWidth - c.previousWidth;\r\n // } else {\r\n // stretchLeewayOnLeft = null;\r\n // }\r\n // }\r\n // shrinkLeewayOnLeft += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n // }\r\n // }\r\n // if (shrinkLeewayOnRight === null) {\r\n // shrinkLeewayOnRight = 100000;\r\n // }\r\n // if (shrinkLeewayOnLeft === null) {\r\n // shrinkLeewayOnLeft = 100000;\r\n // }\r\n // if (stretchLeewayOnRight === null) {\r\n // stretchLeewayOnRight = 100000;\r\n // }\r\n // if (stretchLeewayOnLeft === null) {\r\n // stretchLeewayOnLeft = 100000;\r\n // }\r\n // maxPageX = pageX + Math.min(shrinkLeewayOnRight, stretchLeewayOnLeft);\r\n // minPageX = pageX - Math.min(shrinkLeewayOnLeft, stretchLeewayOnRight);\r\n // })\r\n // .on(\"drag\", function (e, dd) {\r\n // columnResizeDragging = true;\r\n // var actualMinWidth, d = Math.min(maxPageX, Math.max(minPageX, e.pageX)) - pageX, x;\r\n // if (d < 0) { // shrink column\r\n // x = d;\r\n\r\n // var newCanvasWidthL = 0, newCanvasWidthR = 0;\r\n\r\n // for (j = i; j >= 0; j--) {\r\n // c = columns[j];\r\n // if (c.resizable) {\r\n // actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n // if (x && c.previousWidth + x < actualMinWidth) {\r\n // x += c.previousWidth - actualMinWidth;\r\n // c.width = actualMinWidth;\r\n // } else {\r\n // c.width = c.previousWidth + x;\r\n // x = 0;\r\n // }\r\n // }\r\n // }\r\n\r\n // for (k = 0; k <= i; k++) {\r\n // c = columns[k];\r\n\r\n // if (hasFrozenColumns() && (k > options.frozenColumn)) {\r\n // newCanvasWidthR += c.width;\r\n // } else {\r\n // newCanvasWidthL += c.width;\r\n // }\r\n // }\r\n\r\n // if (options.forceFitColumns) {\r\n // x = -d;\r\n // for (j = i + 1; j < columns.length; j++) {\r\n // c = columns[j];\r\n // if (c.resizable) {\r\n // if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n // x -= c.maxWidth - c.previousWidth;\r\n // c.width = c.maxWidth;\r\n // } else {\r\n // c.width = c.previousWidth + x;\r\n // x = 0;\r\n // }\r\n\r\n // if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n // newCanvasWidthR += c.width;\r\n // } else {\r\n // newCanvasWidthL += c.width;\r\n // }\r\n // }\r\n // }\r\n // } else {\r\n // for (j = i + 1; j < columns.length; j++) {\r\n // c = columns[j];\r\n\r\n // if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n // newCanvasWidthR += c.width;\r\n // } else {\r\n // newCanvasWidthL += c.width;\r\n // }\r\n // }\r\n // }\r\n\r\n // if (options.forceFitColumns) {\r\n // x = -d;\r\n // for (j = i + 1; j < columns.length; j++) {\r\n // c = columns[j];\r\n // if (c.resizable) {\r\n // if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n // x -= c.maxWidth - c.previousWidth;\r\n // c.width = c.maxWidth;\r\n // } else {\r\n // c.width = c.previousWidth + x;\r\n // x = 0;\r\n // }\r\n // }\r\n // }\r\n // }\r\n // } else { // stretch column\r\n // x = d;\r\n\r\n // var newCanvasWidthL = 0, newCanvasWidthR = 0;\r\n\r\n // for (j = i; j >= 0; j--) {\r\n // c = columns[j];\r\n // if (c.resizable) {\r\n // if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n // x -= c.maxWidth - c.previousWidth;\r\n // c.width = c.maxWidth;\r\n // } else {\r\n // c.width = c.previousWidth + x;\r\n // x = 0;\r\n // }\r\n // }\r\n // }\r\n\r\n // for (k = 0; k <= i; k++) {\r\n // c = columns[k];\r\n\r\n // if (hasFrozenColumns() && (k > options.frozenColumn)) {\r\n // newCanvasWidthR += c.width;\r\n // } else {\r\n // newCanvasWidthL += c.width;\r\n // }\r\n // }\r\n\r\n // if (options.forceFitColumns) {\r\n // x = -d;\r\n // for (j = i + 1; j < columns.length; j++) {\r\n // c = columns[j];\r\n // if (c.resizable) {\r\n // actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n // if (x && c.previousWidth + x < actualMinWidth) {\r\n // x += c.previousWidth - actualMinWidth;\r\n // c.width = actualMinWidth;\r\n // } else {\r\n // c.width = c.previousWidth + x;\r\n // x = 0;\r\n // }\r\n\r\n // if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n // newCanvasWidthR += c.width;\r\n // } else {\r\n // newCanvasWidthL += c.width;\r\n // }\r\n // }\r\n // }\r\n // } else {\r\n // for (j = i + 1; j < columns.length; j++) {\r\n // c = columns[j];\r\n\r\n // if (hasFrozenColumns() && (j > options.frozenColumn)) {\r\n // newCanvasWidthR += c.width;\r\n // } else {\r\n // newCanvasWidthL += c.width;\r\n // }\r\n // }\r\n // }\r\n // }\r\n\r\n // if (hasFrozenColumns() && newCanvasWidthL != canvasWidthL) {\r\n // $headerL.width(newCanvasWidthL + 1000);\r\n // $paneHeaderR.css('left', newCanvasWidthL);\r\n // }\r\n\r\n // applyColumnHeaderWidths();\r\n // applyColumnGroupHeaderWidths();\r\n // if (options.syncColumnCellResize) {\r\n // applyColumnWidths();\r\n // }\r\n // })\r\n // .on(\"dragend\", function (e, dd) {\r\n // var newWidth;\r\n // resHandle.parentElement.classList.remove(\"slick-header-column-active\");\r\n // for (j = 0; j < columns.length; j++) {\r\n // c = columns[j];\r\n // newWidth = $(columnElements[j]).width(); //.outerWidth();\r\n\r\n // if (c.previousWidth !== newWidth && c.rerenderOnResize) {\r\n // invalidateAllRows();\r\n // }\r\n // }\r\n // updateCanvasWidth(true);\r\n // render();\r\n // trigger(self.onColumnsResized, {});\r\n // setTimeout(function () { columnResizeDragging = false; }, 300);\r\n // });\r\n // });\r\n // }\r\n\r\n function getVBoxDelta($el) {\r\n var p = [\"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\"];\r\n var delta = 0;\r\n $.each(p, function (n, val) {\r\n delta += parseFloat($el.css(val)) || 0;\r\n });\r\n return delta;\r\n }\r\n\r\n function setFrozenOptions() {\r\n options.frozenColumn = (options.frozenColumn >= 0 && options.frozenColumn < columns.length)\r\n ? options.frozenColumn\r\n : -1;\r\n\r\n if (options.frozenRow > -1) {\r\n hasFrozenRows = true;\r\n frozenRowsHeight = getRowTop(options.frozenRow);\r\n\r\n var dataLength = getDataLength();\r\n\r\n actualFrozenRow = (options.frozenBottom)\r\n ? (dataLength - options.frozenRow)\r\n : options.frozenRow;\r\n } else {\r\n hasFrozenRows = false;\r\n }\r\n }\r\n\r\n function setPaneVisibility() {\r\n if (hasFrozenColumns()) {\r\n $.each($paneHeaderR, function (idx, el) { el.style.display = \"\"; });\r\n $.each($paneTopR, function (idx, el) { el.style.display = \"\"; });\r\n\r\n if (hasFrozenRows) {\r\n $.each($paneBottomL, function (idx, el) { el.style.display = \"\"; });\r\n $.each($paneBottomR, function (idx, el) { el.style.display = \"\"; });\r\n } else {\r\n $.each($paneBottomR, function (idx, el) { el.style.display = \"none\"; });\r\n $.each($paneBottomL, function (idx, el) { el.style.display = \"none\"; });\r\n }\r\n } else {\r\n $.each($paneHeaderR, function (idx, el) { el.style.display = \"none\"; });\r\n $.each($paneTopR, function (idx, el) { el.style.display = \"none\"; });\r\n $.each($paneBottomR, function (idx, el) { el.style.display = \"none\"; });\r\n\r\n if (hasFrozenRows) {\r\n $.each($paneBottomL, function (idx, el) { el.style.display = \"\"; });\r\n } else {\r\n $.each($paneBottomR, function (idx, el) { el.style.display = \"none\"; });\r\n $.each($paneBottomL, function (idx, el) { el.style.display = \"none\"; });\r\n }\r\n }\r\n }\r\n\r\n function setOverflow() {\r\n $viewportTopL\r\n .css(\"overflow-x\", options.alwaysShowHorizontalScroll ? \"scroll\" : (hasFrozenColumns()) ? (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"hidden\" : \"scroll\") : (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"hidden\" : \"auto\"))\r\n .css(\"overflow-y\", options.alwaysShowVerticalScroll ? \"scroll\" : ((hasFrozenColumns()) ? (hasFrozenRows ? \"hidden\" : \"hidden\") : (hasFrozenRows ? \"scroll\" : \"auto\"))\r\n );\r\n\r\n $viewportTopR\r\n .css(\"overflow-x\", options.alwaysShowHorizontalScroll ? \"scroll\" : (hasFrozenColumns()) ? (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"hidden\" : \"scroll\") : (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"hidden\" : \"auto\"))\r\n .css(\"overflow-y\", options.alwaysShowVerticalScroll ? \"scroll\" : ((hasFrozenColumns()) ? (hasFrozenRows ? \"scroll\" : \"auto\") : (hasFrozenRows ? \"scroll\" : \"auto\"))\r\n );\r\n\r\n $viewportBottomL\r\n .css(\"overflow-x\", options.alwaysShowHorizontalScroll ? \"scroll\" : (hasFrozenColumns()) ? (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"scroll\" : \"auto\") : (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"auto\" : \"auto\"))\r\n .css(\"overflow-y\", options.alwaysShowVerticalScroll ? \"scroll\" : ((hasFrozenColumns()) ? (hasFrozenRows ? \"hidden\" : \"hidden\") : (hasFrozenRows ? \"scroll\" : \"auto\"))\r\n );\r\n\r\n $viewportBottomR\r\n .css(\"overflow-x\", options.alwaysShowHorizontalScroll ? \"scroll\" : (hasFrozenColumns()) ? (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"scroll\" : \"auto\") : (hasFrozenRows && !options.alwaysAllowHorizontalScroll ? \"auto\" : \"auto\"))\r\n .css(\"overflow-y\", options.alwaysShowVerticalScroll ? \"scroll\" : ((hasFrozenColumns()) ? (hasFrozenRows ? \"auto\" : \"auto\") : (hasFrozenRows ? \"auto\" : \"auto\"))\r\n );\r\n if (options.viewportClass) {\r\n $viewportTopL.toggleClass(options.viewportClass, true);\r\n $viewportTopR.toggleClass(options.viewportClass, true);\r\n $viewportBottomL.toggleClass(options.viewportClass, true);\r\n $viewportBottomR.toggleClass(options.viewportClass, true);\r\n }\r\n }\r\n\r\n function setScroller() {\r\n if (hasFrozenColumns()) {\r\n $headerScrollContainer = $headerScrollerR;\r\n $headerRowScrollContainer = $headerRowScrollerR;\r\n $footerRowScrollContainer = $footerRowScrollerR;\r\n\r\n if (hasFrozenRows) {\r\n if (options.frozenBottom) {\r\n $viewportScrollContainerX = $viewportBottomR;\r\n $viewportScrollContainerY = $viewportTopR;\r\n } else {\r\n $viewportScrollContainerX = $viewportScrollContainerY = $viewportBottomR;\r\n }\r\n } else {\r\n $viewportScrollContainerX = $viewportScrollContainerY = $viewportTopR;\r\n }\r\n } else {\r\n $headerScrollContainer = $headerScrollerL;\r\n $headerRowScrollContainer = $headerRowScrollerL;\r\n $footerRowScrollContainer = $footerRowScrollerL;\r\n\r\n if (hasFrozenRows) {\r\n if (options.frozenBottom) {\r\n $viewportScrollContainerX = $viewportBottomL;\r\n $viewportScrollContainerY = $viewportTopL;\r\n } else {\r\n $viewportScrollContainerX = $viewportScrollContainerY = $viewportBottomL;\r\n }\r\n } else {\r\n $viewportScrollContainerX = $viewportScrollContainerY = $viewportTopL;\r\n }\r\n }\r\n }\r\n\r\n function measureCellPaddingAndBorder() {\r\n var el;\r\n var h = [\"borderLeftWidth\", \"borderRightWidth\", \"paddingLeft\", \"paddingRight\"];\r\n var v = [\"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\"];\r\n\r\n // jquery prior to version 1.8 handles .width setter/getter as a direct css write/read\r\n // jquery 1.8 changed .width to read the true inner element width if box-sizing is set to border-box, and introduced a setter for .outerWidth\r\n // so for equivalent functionality, prior to 1.8 use .width, and after use .outerWidth\r\n // var verArray = $.fn.jquery.split('.');\r\n jQueryNewWidthBehaviour = false; // (verArray[0]==1 && verArray[1]>=8) || verArray[0] >=2;\r\n\r\n el = $(\"<div class='ui-state-default slick-header-column' style='visibility:hidden'>-</div>\").appendTo($headers);\r\n headerColumnWidthDiff = headerColumnHeightDiff = 0;\r\n if (el.css(\"box-sizing\") != \"border-box\" && el.css(\"-moz-box-sizing\") != \"border-box\" && el.css(\"-webkit-box-sizing\") != \"border-box\") {\r\n $.each(h, function (n, val) {\r\n headerColumnWidthDiff += parseFloat(el.css(val)) || 0;\r\n });\r\n $.each(v, function (n, val) {\r\n headerColumnHeightDiff += parseFloat(el.css(val)) || 0;\r\n });\r\n }\r\n el.remove();\r\n\r\n var r = $(\"<div class='slick-row' />\").appendTo($canvas);\r\n el = $(\"<div class='slick-cell' id='' style='visibility:hidden'>-</div>\").appendTo(r);\r\n cellWidthDiff = cellHeightDiff = 0;\r\n if (el.css(\"box-sizing\") != \"border-box\" && el.css(\"-moz-box-sizing\") != \"border-box\" && el.css(\"-webkit-box-sizing\") != \"border-box\") {\r\n $.each(h, function (n, val) {\r\n cellWidthDiff += parseFloat(el.css(val)) || 0;\r\n });\r\n $.each(v, function (n, val) {\r\n cellHeightDiff += parseFloat(el.css(val)) || 0;\r\n });\r\n }\r\n r.remove();\r\n\r\n absoluteColumnMinWidth = Math.max(headerColumnWidthDiff, cellWidthDiff);\r\n }\r\n\r\n function createCssRules() {\r\n let style = document.createElement(\"style\");\r\n style.type = \"text/css\";\r\n $(\"head\").append(style);\r\n $style = $(style);\r\n // $style = $(\"<style type='text/css' rel='stylesheet' />\").appendTo($(\"head\"));\r\n var rowHeight = (options.rowHeight - cellHeightDiff);\r\n var rules = [\r\n \".\" + uid + \" .slick-group-header-column { left: 1000px; }\",\r\n \".\" + uid + \" .slick-header-column { left: 1000px; }\",\r\n \".\" + uid + \" .slick-top-panel { height:\" + options.topPanelHeight + \"px; }\",\r\n \".\" + uid + \" .slick-preheader-panel { height:\" + options.preHeaderPanelHeight + \"px; }\",\r\n \".\" + uid + \" .slick-headerrow-columns { height:\" + options.headerRowHeight + \"px; }\",\r\n \".\" + uid + \" .slick-footerrow-columns { height:\" + options.footerRowHeight + \"px; }\",\r\n \".\" + uid + \" .slick-cell { height:\" + rowHeight + \"px; }\",\r\n \".\" + uid + \" .slick-row { height:\" + options.rowHeight + \"px; }\"\r\n ];\r\n\r\n for (var i = 0; i < columns.length; i++) {\r\n rules.push(\".\" + uid + \" .l\" + i + \" { }\");\r\n rules.push(\".\" + uid + \" .r\" + i + \" { }\");\r\n }\r\n\r\n if ($style[0].styleSheet) { // iE\r\n $style[0].styleSheet.cssText = rules.join(\" \");\r\n } else {\r\n $style[0].appendChild(document.createTextNode(rules.join(\" \")));\r\n }\r\n }\r\n\r\n function getColumnCssRules(idx) {\r\n var i;\r\n if (!stylesheet) {\r\n var sheets = document.styleSheets;\r\n for (i = 0; i < sheets.length; i++) {\r\n if (sheets[i].ownerNode == $style[0]) {\r\n stylesheet = sheets[i];\r\n break;\r\n }\r\n }\r\n\r\n if (!stylesheet) {\r\n throw new Error(\"Cannot find stylesheet.\");\r\n }\r\n\r\n // find and cache column CSS rules\r\n columnCssRulesL = [];\r\n columnCssRulesR = [];\r\n var cssRules = (stylesheet.cssRules || stylesheet.rules);\r\n var matches, columnIdx;\r\n for (i = 0; i < cssRules.length; i++) {\r\n var selector = cssRules[i].selectorText;\r\n if (matches = /\\.l\\d+/.exec(selector)) {\r\n columnIdx = parseInt(matches[0].substr(2, matches[0].length - 2), 10);\r\n columnCssRulesL[columnIdx] = cssRules[i];\r\n } else if (matches = /\\.r\\d+/.exec(selector)) {\r\n columnIdx = parseInt(matches[0].substr(2, matches[0].length - 2), 10);\r\n columnCssRulesR[columnIdx] = cssRules[i];\r\n }\r\n }\r\n }\r\n\r\n return {\r\n \"left\": columnCssRulesL[idx],\r\n \"right\": columnCssRulesR[idx]\r\n };\r\n }\r\n\r\n function removeCssRules() {\r\n $style.remove();\r\n stylesheet = null;\r\n }\r\n\r\n function destroy() {\r\n getEditorLock().cancelCurrentEdit();\r\n\r\n trigger(self.onBeforeDestroy, {});\r\n\r\n var i = plugins.length;\r\n while (i--) {\r\n unregisterPlugin(plugins[i]);\r\n }\r\n\r\n unbindAncestorScrollEvents();\r\n // $container.off(\".slickgrid\"); //TODO TODOFIX\r\n removeCssRules();\r\n\r\n // $canvas.off(\"draginit dragstart dragend drag\"); //TODO TODOFIX\r\n $container.empty().removeClass(uid);\r\n }\r\n\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////\r\n // general\r\n\r\n function trigger(evt, args, e?: any) {\r\n // if (evt.countHandlers() === 0) {\r\n // return;\r\n // }\r\n e = e || new Slick.EventData();\r\n if (e.stopImmediatePropagation) {\r\n let tmp_fnc = e.stopImmediatePropagation;\r\n e.stopImmediatePropagation = function () {\r\n tmp_fnc.apply(e);\r\n e._isImmediatePropagationStopped = true;\r\n };\r\n if (!e.isImmediatePropagationStopped) {\r\n e.isImmediatePropagationStopped = function () {\r\n return e._isImmediatePropagationStopped;\r\n };\r\n }\r\n }\r\n if (e.stopPropagation) {\r\n let tmp_fnc = e.stopPropagation;\r\n e.stopPropagation = function () {\r\n tmp_fnc.apply(e);\r\n e._isPropagationStopped = true;\r\n };\r\n if (!e.isPropagationStopped) {\r\n e.isPropagationStopped = function () {\r\n return e._isPropagationStopped;\r\n };\r\n }\r\n }\r\n args = args || {};\r\n args.grid = self;\r\n return evt.notify(args, e, self);\r\n }\r\n\r\n function getEditorLock() {\r\n return options.editorLock;\r\n }\r\n\r\n function getEditController() {\r\n return editController;\r\n }\r\n\r\n function getColumnIndex(id: string): number {\r\n return columnsById[id];\r\n }\r\n\r\n function getColumnById(id: string): ISlickColumn {\r\n return columns[getColumnIndex(id)];\r\n }\r\n\r\n function autosizeColumns() {\r\n var i, c,\r\n widths = [],\r\n shrinkLeeway = 0,\r\n total = 0,\r\n prevTotal,\r\n availWidth = viewportHasVScroll ? viewportW - scrollbarDimensions.width : viewportW;\r\n\r\n for (i = 0; i < columns.length; i++) {\r\n c = columns[i];\r\n widths.push(c.width);\r\n total += c.width;\r\n if (c.resizable) {\r\n shrinkLeeway += c.width - Math.max(c.minWidth, absoluteColumnMinWidth);\r\n }\r\n }\r\n\r\n // shrink\r\n prevTotal = total;\r\n while (total > availWidth && shrinkLeeway) {\r\n var shrinkProportion = (total - availWidth) / shrinkLeeway;\r\n for (i = 0; i < columns.length && total > availWidth; i++) {\r\n c = columns[i];\r\n var width = widths[i];\r\n if (!c.resizable || width <= c.minWidth || width <= absoluteColumnMinWidth) {\r\n continue;\r\n }\r\n var absMinWidth = Math.max(c.minWidth, absoluteColumnMinWidth);\r\n var shrinkSize = Math.floor(shrinkProportion * (width - absMinWidth)) || 1;\r\n shrinkSize = Math.min(shrinkSize, width - absMinWidth);\r\n total -= shrinkSize;\r\n shrinkLeeway -= shrinkSize;\r\n widths[i] -= shrinkSize;\r\n }\r\n if (prevTotal <= total) { // avoid infinite loop\r\n break;\r\n }\r\n prevTotal = total;\r\n }\r\n\r\n // grow\r\n prevTotal = total;\r\n while (total < availWidth) {\r\n var growProportion = availWidth / total;\r\n for (i = 0; i < columns.length && total < availWidth; i++) {\r\n c = columns[i];\r\n var currentWidth = widths[i];\r\n var growSize;\r\n\r\n if (!c.resizable || c.maxWidth <= currentWidth) {\r\n growSize = 0;\r\n } else {\r\n growSize = Math.min(Math.floor(growProportion * currentWidth) - currentWidth, (c.maxWidth - currentWidth) || 1000000) || 1;\r\n }\r\n total += growSize;\r\n widths[i] += (total <= availWidth ? growSize : 0);\r\n }\r\n if (prevTotal >= total) { // avoid infinite loop\r\n break;\r\n }\r\n prevTotal = total;\r\n }\r\n\r\n var reRender = false;\r\n for (i = 0; i < columns.length; i++) {\r\n if (columns[i].rerenderOnResize && columns[i].width != widths[i]) {\r\n reRender = true;\r\n }\r\n columns[i].width = widths[i];\r\n }\r\n\r\n applyColumnHeaderWidths();\r\n // applyColumnGroupHeaderWidths();\r\n updateCanvasWidth(true);\r\n\r\n trigger(self.onAutosizeColumns, { \"columns\": columns });\r\n\r\n if (reRender) {\r\n invalidateAllRows();\r\n render();\r\n }\r\n }\r\n\r\n // function applyColumnGroupHeaderWidths() {\r\n // if (!treeColumns.hasDepth()) {\r\n // return;\r\n // }\r\n\r\n // for (var depth = $groupHeadersL.length - 1; depth >= 0; depth--) {\r\n\r\n // var groupColumns = treeColumns.getColumnsInDepth(depth);\r\n\r\n // $.each($().add($groupHeadersL[depth]).add($groupHeadersR[depth]), function (i, el) {\r\n // var $groupHeader = $(el),\r\n // currentColumnIndex = 0;\r\n\r\n // $groupHeader.width(i == 0 ? getHeadersWidthL() : getHeadersWidthR());\r\n\r\n // $.each($groupHeader.children(), function (idx2, el2) {\r\n // var $groupHeaderColumn = $(el2);\r\n\r\n // var m = $(this).data(\"column\");\r\n\r\n // m.width = 0;\r\n\r\n // m.columns.forEach(function () {\r\n // var headerColumn = <HTMLElement>(<HTMLElement>$groupHeader[0]).nextElementSibling.children[currentColumnIndex++];\r\n // m.width += headerColumn.offsetWidth;\r\n // });\r\n\r\n // $groupHeaderColumn.width(m.width - headerColumnWidthDiff);\r\n\r\n // });\r\n\r\n // });\r\n\r\n // }\r\n // }\r\n\r\n function applyColumnHeaderWidths() {\r\n if (!initialized) { return; }\r\n var h: IjQueryWrapper;\r\n\r\n for (var i = 0, headers = $headers.children(), ii = columns.length; i < ii; i++) {\r\n h = $(headers[i]);\r\n if (jQueryNewWidthBehaviour) {\r\n if (h.width() !== columns[i].width) {\r\n h.width(columns[i].width);\r\n }\r\n } else {\r\n // if (<number>h.width() !== <number>h.width() - headerColumnWidthDiff) {\r\n h.width(columns[i].width - headerColumnWidthDiff);\r\n // }\r\n }\r\n }\r\n\r\n updateColumnCaches();\r\n }\r\n\r\n function applyColumnWidths() {\r\n var x = 0, w, rule;\r\n for (var i = 0; i < columns.length; i++) {\r\n w = columns[i].width;\r\n\r\n rule = getColumnCssRules(i);\r\n rule.left.style.left = x + \"px\";\r\n rule.right.style.right = (((options.frozenColumn != -1 && i > options.frozenColumn) ? canvasWidthR : canvasWidthL) - x - w) + \"px\";\r\n\r\n // if this column is frozen, reset the css left value since the\r\n // column starts in a new viewport.\r\n if (options.frozenColumn == i) {\r\n x = 0;\r\n } else {\r\n x += columns[i].width;\r\n }\r\n }\r\n }\r\n\r\n function setSortColumn(columnId, ascending) {\r\n setSortColumns([{ columnId: columnId, sortAsc: ascending }]);\r\n }\r\n\r\n function setSortColumns(cols) {\r\n sortColumns = cols;\r\n var numberCols = options.numberedMultiColumnSort && sortColumns.length > 1;\r\n var headerColumnEls = $headers.children();\r\n headerColumnEls\r\n .removeClass(\"slick-header-column-sorted\")\r\n .find(\".slick-sort-indicator\")\r\n .removeClass(\"slick-sort-indicator-asc slick-sort-indicator-desc\");\r\n headerColumnEls\r\n .find(\".slick-sort-indicator-numbered\")\r\n .text(\"\");\r\n\r\n $.each(sortColumns, function (i, col) {\r\n if (col.sortAsc == null) {\r\n col.sortAsc = true;\r\n }\r\n var columnIndex = getColumnIndex(col.columnId);\r\n if (columnIndex != null) {\r\n $(headerColumnEls[columnIndex])\r\n .addClass(\"slick-header-column-sorted\")\r\n .find(\".slick-sort-indicator\")\r\n .addClass(col.sortAsc ? \"slick-sort-indicator-asc\" : \"slick-sort-indicator-desc\");\r\n if (numberCols) {\r\n $(headerColumnEls[columnIndex])\r\n .find(\".slick-sort-indicator-numbered\")\r\n .text((i + 1).toString());\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getSortColumns() {\r\n return sortColumns;\r\n }\r\n\r\n function handleSelectedRangesChanged(e, ranges) {\r\n var previousSelectedRows = selectedRows.slice(0); // shallow copy previously selected rows for later comparison\r\n selectedRows = [];\r\n var hash = {};\r\n for (var i = 0; i < ranges.length; i++) {\r\n for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {\r\n if (!hash[j]) { // prevent duplicates\r\n selectedRows.push(j);\r\n hash[j] = {};\r\n }\r\n for (var k = ranges[i].fromCell; k <= ranges[i].toCell; k++) {\r\n if (canCellBeSelected(j, k)) {\r\n hash[j][columns[k].id] = options.selectedCellCssClass;\r\n }\r\n }\r\n }\r\n }\r\n\r\n setCellCssStyles(options.selectedCellCssClass, hash);\r\n\r\n if (simpleArrayEquals(previousSelectedRows, selectedRows)) {\r\n trigger(self.onSelectedRowsChanged, { rows: getSelectedRows() }, e);\r\n }\r\n }\r\n\r\n // compare 2 simple arrays (integers or strings only, do not use to compare object arrays)\r\n function simpleArrayEquals(arr1, arr2) {\r\n return Array.isArray(arr1) && Array.isArray(arr2) && arr2.sort().toString() !== arr1.sort().toString();\r\n }\r\n\r\n function getColumns() {\r\n return columns;\r\n }\r\n\r\n function updateColumnCaches() {\r\n // pre-calculate cell boundaries.\r\n columnPosLeft = [];\r\n columnPosRight = [];\r\n var x = 0;\r\n for (var i = 0, ii = columns.length; i < ii; i++) {\r\n columnPosLeft[i] = x;\r\n columnPosRight[i] = x + columns[i].width;\r\n\r\n if (options.frozenColumn == i) {\r\n x = 0;\r\n } else {\r\n x += columns[i].width;\r\n }\r\n }\r\n }\r\n\r\n function updateColumnProps() {\r\n columnsById = {};\r\n for (var i = 0; i < columns.length; i++) {\r\n if (columns[i].width) { (<any>columns[i]).widthRequest = columns[i].width; }\r\n\r\n var m = columns[i] = $.shallowExtend({}, columnDefaults, columns[i]);\r\n columnsById[m.id] = i;\r\n if (m.minWidth && m.width < m.minWidth) {\r\n m.width = m.minWidth;\r\n }\r\n if (m.maxWidth && m.width > m.maxWidth) {\r\n m.width = m.maxWidth;\r\n }\r\n }\r\n }\r\n\r\n function setColumns(columnDefinitions) {\r\n // var _treeColumns = new Slick.TreeColumns(columnDefinitions);\r\n // if (_treeColumns.hasDepth()) {\r\n // treeColumns = _treeColumns;\r\n // columns = treeColumns.extractColumns();\r\n // } else {\r\n columns = columnDefinitions;\r\n // }\r\n\r\n updateColumnProps();\r\n updateColumnCaches();\r\n if (initialized) {\r\n setPaneVisibility();\r\n setOverflow();\r\n invalidateAllRows();\r\n createColumnHeaders();\r\n // createColumnGroupHeaders();\r\n createColumnFooter();\r\n removeCssRules();\r\n createCssRules();\r\n resizeCanvas(); // does not work when not visible\r\n updateCanvasWidth();\r\n applyColumnWidths();\r\n handleScroll();\r\n }\r\n }\r\n\r\n function getOptions() {\r\n return options;\r\n }\r\n\r\n function setOptions(args, suppressRender) {\r\n if (!getEditorLock().commitCurrentEdit()) {\r\n return;\r\n }\r\n\r\n makeActiveCellNormal();\r\n\r\n if (options.enableAddRow !== args.enableAddRow) {\r\n invalidateRow(getDataLength());\r\n }\r\n\r\n options = $.shallowExtend(options, args);\r\n validateAndEnforceOptions();\r\n\r\n $viewport.css(\"overflow-y\", options.autoHeight ? \"hidden\" : \"auto\");\r\n if (!suppressRender) { render(); }\r\n\r\n setFrozenOptions();\r\n setScroller();\r\n // zombieRowNodeFromLastMouseWheelEvent = null;\r\n\r\n setColumns(columns);\r\n }\r\n\r\n function validateAndEnforceOptions() {\r\n if (options.autoHeight) {\r\n options.leaveSpaceForNewRows = false;\r\n }\r\n }\r\n\r\n function setData(newData, scrollToTop) {\r\n data = newData;\r\n invalidateAllRows();\r\n updateRowCount();\r\n if (scrollToTop) {\r\n scrollTo(0);\r\n }\r\n }\r\n\r\n function getData() {\r\n return data;\r\n }\r\n\r\n function getDataLength(): number {\r\n if (data.getLength) {\r\n return data.getLength();\r\n } else {\r\n return data && data.length || 0;\r\n }\r\n }\r\n\r\n function getDataLengthIncludingAddNew() {\r\n return getDataLength() + (!options.enableAddRow ? 0\r\n : (!pagingActive || pagingIsLastPage ? 1 : 0)\r\n );\r\n }\r\n\r\n function getDataItem(i) {\r\n if (data.getItem) {\r\n return data.getItem(i);\r\n } else {\r\n return data[i];\r\n }\r\n }\r\n\r\n function getTopPanel() {\r\n return $topPanel[0];\r\n }\r\n\r\n function setTopPanelVisibility(visible) {\r\n if (options.showTopPanel != visible) {\r\n options.showTopPanel = visible;\r\n if (visible) {\r\n $topPanelScroller.slideDown(\"fast\", resizeCanvas);\r\n } else {\r\n $topPanelScroller.slideUp(\"fast\", resizeCanvas);\r\n }\r\n }\r\n }\r\n\r\n function setHeaderRowVisibility(visible) {\r\n if (options.showHeaderRow != visible) {\r\n options.showHeaderRow = visible;\r\n if (visible) {\r\n $headerRowScroller.slideDown(\"fast\", resizeCanvas);\r\n } else {\r\n $headerRowScroller.slideUp(\"fast\", resizeCanvas);\r\n }\r\n }\r\n }\r\n\r\n function setFooterRowVisibility(visible) {\r\n if (options.showFooterRow != visible) {\r\n options.showFooterRow = visible;\r\n if (visible) {\r\n $footerRowScroller.slideDown(\"fast\", resizeCanvas);\r\n } else {\r\n $footerRowScroller.slideUp(\"fast\", resizeCanvas);\r\n }\r\n }\r\n }\r\n\r\n function setPreHeaderPanelVisibility(visible) {\r\n if (options.showPreHeaderPanel != visible) {\r\n options.showPreHeaderPanel = visible;\r\n if (visible) {\r\n $preHeaderPanelScroller.slideDown(\"fast\", resizeCanvas);\r\n } else {\r\n $preHeaderPanelScroller.slideUp(\"fast\", resizeCanvas);\r\n }\r\n }\r\n }\r\n\r\n function getContainerNode() {\r\n return $container[0];\r\n }\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////\r\n // rendering / Scrolling\r\n\r\n function getRowTop(row) {\r\n let result;\r\n if (options.variableRowHeight) {\r\n result = rowPositionCache[row].top - offset;\r\n } else {\r\n result = options.rowHeight * row - offset;\r\n }\r\n if (hasFrozenRows && row < actualFrozenRow) {\r\n result += offset;\r\n }\r\n return result;\r\n }\r\n\r\n function getRowBottom(row) {\r\n if (options.variableRowHeight) {\r\n return rowPositionCache[row].bottom - offset;\r\n }\r\n return options.rowHeight * (row + 1) - offset;\r\n }\r\n\r\n function getRowFromPosition(y) {\r\n if (!options.variableRowHeight) {\r\n return Math.floor((y + offset) / options.rowHeight);\r\n }\r\n\r\n let rowsInPosCache = getDataLength();\r\n\r\n if (!rowsInPosCache) {\r\n return 0;\r\n }\r\n\r\n // loop through the row position cache and break when\r\n // the row is found\r\n let row = Math.max(0,\r\n binarySearch(rowPositionCache, y + offset, function (pos, cacheEntry) {\r\n if (cacheEntry.top <= pos) {\r\n if (cacheEntry.bottom > pos) {\r\n return 0;\r\n } else {\r\n return 1;\r\n }\r\n } else {\r\n return -1;\r\n }\r\n })\r\n );\r\n\r\n // for ( var i = 0; i < rowsInPosCache; i++ ) {\r\n // if ( rowPositionCache[i].top <= y + offset\r\n // && rowPositionCache[i].bottom >= y + offset\r\n // ) {\r\n // row = i;\r\n // continue;\r\n // }\r\n // }\r\n\r\n // return the last row in the grid\r\n if (y + offset > rowPositionCache[rowsInPosCache - 1].bottom) {\r\n row = rowsInPosCache - 1;\r\n }\r\n\r\n return row;\r\n }\r\n\r\n function binarySearch(ar, el, compare_fn) {\r\n var m = 0;\r\n var n = ar.length - 1;\r\n while (m <= n) {\r\n var k = (n + m) >> 1;\r\n var cmp = compare_fn(el, ar[k]);\r\n if (cmp > 0) {\r\n m = k + 1;\r\n } else if (cmp < 0) {\r\n n = k - 1;\r\n } else {\r\n return k;\r\n }\r\n }\r\n return -m - 1;\r\n }\r\n\r\n function scrollTo(y) {\r\n y = Math.max(y, 0);\r\n y = Math.min(y, th - <number>$viewportScrollContainerY.height() + ((viewportHasHScroll || hasFrozenColumns()) ? scrollbarDimensions.height : 0));\r\n\r\n var oldOffset = offset;\r\n\r\n page = Math.min(n - 1, Math.floor(y / ph));\r\n offset = Math.round(page * cj);\r\n var newScrollTop = y - offset;\r\n\r\n if (offset != oldOffset) {\r\n var range = getVisibleRange(newScrollTop);\r\n cleanupRows(range);\r\n updateRowPositions();\r\n }\r\n\r\n if (prevScrollTop != newScrollTop) {\r\n vScrollDir = (prevScrollTop + oldOffset < newScrollTop + offset) ? 1 : -1;\r\n lastRenderedScrollTop = (scrollTop = prevScrollTop = newScrollTop);\r\n\r\n if (hasFrozenColumns()) {\r\n $viewportTopL[0].scrollTop = newScrollTop;\r\n }\r\n\r\n if (hasFrozenRows) {\r\n $viewportBottomL[0].scrollTop = $viewportBottomR[0].scrollTop = newScrollTop;\r\n }\r\n\r\n $viewportScrollContainerY[0].scrollTop = newScrollTop;\r\n\r\n trigger(self.onViewportChanged, {});\r\n }\r\n }\r\n\r\n function defaultFormatter(row: number, cell: number, value: any, columnDef: ISlickColumn, dataContext: any): string {\r\n if (value == null) {\r\n return \"\";\r\n } else {\r\n return (value + \"\").replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\r\n }\r\n }\r\n\r\n function getFormatter(row, column) {\r\n var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n\r\n // look up by id, then index\r\n var columnOverrides = rowMetadata &&\r\n rowMetadata.columns &&\r\n (rowMetadata.columns[column.id] || rowMetadata.columns[getColumnIndex(column.id)]);\r\n\r\n return (columnOverrides && columnOverrides.formatter) ||\r\n (rowMetadata && rowMetadata.formatter) ||\r\n column.formatter ||\r\n (options.formatterFactory && options.formatterFactory.getFormatter(column, row)) ||\r\n options.defaultFormatter;\r\n }\r\n\r\n function callFormatter(row, cell, value, m, item, grid) {\r\n\r\n var result;\r\n\r\n // pass metadata to formatter\r\n var metadata = data.getItemMetadata && data.getItemMetadata(row);\r\n metadata = metadata && metadata.columns;\r\n\r\n if (metadata) {\r\n var columnData = metadata[m.id] || metadata[cell];\r\n result = getFormatter(row, m)(row, cell, value, m, item, columnData);\r\n } else {\r\n result = getFormatter(row, m)(row, cell, value, m, item);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function getEditor(row, cell) {\r\n var column = columns[cell];\r\n var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n var columnMetadata = rowMetadata && rowMetadata.columns;\r\n\r\n if (columnMetadata && columnMetadata[column.id] && columnMetadata[column.id].editor !== undefined) {\r\n return columnMetadata[column.id].editor;\r\n }\r\n if (columnMetadata && columnMetadata[cell] && columnMetadata[cell].editor !== undefined) {\r\n return columnMetadata[cell].editor;\r\n }\r\n\r\n return column.editor || (options.editorFactory && options.editorFactory.getEditor(column, row));\r\n }\r\n\r\n function getDataItemValueForColumn(item, columnDef) {\r\n if (options.dataItemColumnValueExtractor) {\r\n return options.dataItemColumnValueExtractor(item, columnDef);\r\n }\r\n if (item == null) {\r\n return undefined;\r\n }\r\n if (columnDef.field.indexOf(\".\") > 0) {\r\n const fields = columnDef.field.split(\".\");\r\n let result = item;\r\n for (let i = 0; i < fields.length; i++) {\r\n result = result[fields[i]];\r\n }\r\n return result;\r\n }\r\n return item[columnDef.field];\r\n }\r\n\r\n function appendRowHtml(html: { L: string, R: string }, row, range, dataLength) {\r\n var d = getDataItem(row);\r\n var dataLoading = row < dataLength && !d;\r\n var rowCss = \"slick-row\" +\r\n (hasFrozenRows && row <= options.frozenRow ? \" frozen\" : \"\") +\r\n (dataLoading ? \" loading\" : \"\") +\r\n (row === activeRow && options.showCellSelection ? \" active\" : \"\") +\r\n (row % 2 === 1 ? \" odd\" : \" even\");\r\n\r\n if (!d && row >= dataLength) {\r\n rowCss += \" \" + options.addNewRowCssClass;\r\n }\r\n\r\n var metadata = data.getItemMetadata && data.getItemMetadata(row);\r\n\r\n if (metadata && metadata.cssClasses) {\r\n rowCss += \" \" + metadata.cssClasses;\r\n }\r\n\r\n rowCss += \" \" + (trigger(self.onAppendRow, { row: row, item: d }) || \"\");\r\n\r\n var frozenRowOffset = getFrozenRowOffset(row);\r\n\r\n var top = getRowTop(row) - frozenRowOffset;\r\n\r\n var rowHtml = \"<div class='ui-widget-content \" + rowCss + \"' style='top:\"\r\n + top + \"px\";\r\n if (getRowHeight(row) !== options.rowHeight) {\r\n rowHtml += \";height:\" + getRowHeight(row) + \"px\";\r\n }\r\n rowHtml += \"'>\";\r\n\r\n html.L += rowHtml;\r\n\r\n if (hasFrozenColumns()) {\r\n html.R += rowHtml;\r\n }\r\n\r\n var colspan, m;\r\n for (var i = 0, ii = columns.length; i < ii; i++) {\r\n m = columns[i];\r\n colspan = 1;\r\n if (metadata && metadata.columns) {\r\n var columnData = metadata.columns[m.id] || metadata.columns[i];\r\n colspan = (columnData && columnData.colspan) || 1;\r\n if (colspan === \"*\") {\r\n colspan = ii - i;\r\n }\r\n }\r\n\r\n // do not render cells outside of the viewport.\r\n if (columnPosRight[Math.min(ii - 1, i + colspan - 1)] > range.leftPx || m.alwaysRenderColumn) {\r\n if (!m.alwaysRenderColumn && columnPosLeft[i] > range.rightPx) {\r\n // all columns to the right are outside the range.\r\n break;\r\n }\r\n\r\n if (hasFrozenColumns() && (i > options.frozenColumn)) {\r\n html.R += appendCellHtml(row, i, colspan, d);\r\n } else {\r\n html.L += appendCellHtml(row, i, colspan, d);\r\n }\r\n }\r\n // else if (m.alwaysRenderColumn || (hasFrozenColumns() && i <= options.frozenColumn)) {\r\n // html.L += appendCellHtml(row, i, colspan, d);\r\n // }\r\n\r\n if (colspan > 1) {\r\n i += (colspan - 1);\r\n }\r\n }\r\n\r\n html.L += \"</div>\";\r\n\r\n if (hasFrozenColumns()) {\r\n html.R += \"</div>\";\r\n }\r\n }\r\n\r\n function appendCellHtml(row: number, cell: number, colspan: number, item: any): string {\r\n // result: string containing the HTML parts\r\n // row, cell: row and column index\r\n // colspan: HTML colspan\r\n // item: grid data for row\r\n var stringResult = \"\";\r\n\r\n var m: ISlickColumn = columns[cell];\r\n var cellCss = \"slick-cell l\" + cell + \" r\" + Math.min(columns.length - 1, cell + colspan - 1) +\r\n (m.cssClass ? \" \" + m.cssClass : \"\");\r\n\r\n if (hasFrozenColumns() && cell <= options.frozenColumn) {\r\n cellCss += (\" frozen\");\r\n }\r\n\r\n if (row === activeRow && cell === activeCell && options.showCellSelection) {\r\n cellCss += (\" active\");\r\n }\r\n\r\n for (var key in cellCssClasses) {\r\n if (cellCssClasses[key][row] && cellCssClasses[key][row][m.id]) {\r\n cellCss += (\" \" + cellCssClasses[key][row][m.id]);\r\n }\r\n }\r\n\r\n var value = null, formatterResult: ISlickFormatterResult | string = \"\";\r\n if (item) {\r\n value = getDataItemValueForColumn(item, m);\r\n formatterResult = getFormatter(row, m)(row, cell, value, m, item, self);\r\n if (formatterResult === null || formatterResult === undefined) { formatterResult = \"\"; }\r\n }\r\n\r\n // get addl css class names from object type formatter return\r\n var addlCssClasses = (formatterResult && (<ISlickFormatterResult>formatterResult).addClasses ? (addlCssClasses ? \" \" : \"\") + (<ISlickFormatterResult>formatterResult).addClasses : \"\");\r\n var toolTip = formatterResult && (<ISlickFormatterResult>formatterResult).toolTip ? \"title='\" + (<ISlickFormatterResult>formatterResult).toolTip + \"'\" : \"\";\r\n\r\n stringResult += \"<div class='\" +\r\n cellCss + (addlCssClasses ? \" \" + addlCssClasses : \"\") + \"' \" +\r\n toolTip +\r\n ((getRowHeight(row) !== options.rowHeight)\r\n ? \"style='height:\" + (getRowHeight(row) - cellHeightDiff) + \"px'>\"\r\n : \">\");\r\n\r\n // if there is a corresponding row (if not, this is the Add New row or this data hasn't been loaded yet)\r\n if (item) {\r\n stringResult += (Object.prototype.toString.call(formatterResult) !== \"[object Object]\" ? (<string>formatterResult) : (<ISlickFormatterResult>formatterResult).text);\r\n }\r\n\r\n stringResult += \"</div>\";\r\n\r\n rowsCache[row].cellRenderQueue.push(cell);\r\n rowsCache[row].cellColSpans[cell] = colspan;\r\n return stringResult;\r\n }\r\n\r\n\r\n function cleanupRows(rangeToKeep: { top: number, bottom: number }) {\r\n for (var i in rowsCache) {\r\n let idx = parseInt(i, 10);\r\n var removeFrozenRow = true;\r\n\r\n if (hasFrozenRows\r\n && ((options.frozenBottom && idx >= actualFrozenRow) // frozen bottom rows\r\n || (!options.frozenBottom && idx <= actualFrozenRow) // frozen top rows\r\n )\r\n ) {\r\n removeFrozenRow = false;\r\n }\r\n\r\n if ((idx !== activeRow)\r\n && (idx < rangeToKeep.top || idx > rangeToKeep.bottom)\r\n && (removeFrozenRow)\r\n ) {\r\n removeRowFromCache(i);\r\n }\r\n }\r\n if (options.enableAsyncPostRenderCleanup) { startPostProcessingCleanup(); }\r\n }\r\n\r\n function invalidate() {\r\n let currentActiveCell = null;\r\n if (currentEditor) {\r\n currentActiveCell = getActiveCell();\r\n }\r\n updateRowCount();\r\n invalidateAllRows();\r\n render();\r\n if (currentActiveCell) {\r\n makeActiveCellEditable(null, null, {});\r\n }\r\n }\r\n\r\n function invalidateAllRows() {\r\n if (currentEditor) {\r\n makeActiveCellNormal();\r\n }\r\n for (var row in rowsCache) {\r\n removeRowFromCache(row);\r\n }\r\n if (options.enableAsyncPostRenderCleanup) { startPostProcessingCleanup(); }\r\n }\r\n\r\n function queuePostProcessedRowForCleanup(cacheEntry, postProcessedRow, rowIdx) {\r\n postProcessgroupId++;\r\n\r\n // store and detach node for later async cleanup\r\n for (var column in postProcessedRow) {\r\n if (postProcessedRow.hasOwnProperty(column)) {\r\n let columnIdx = parseInt(column, 10) | 0;\r\n postProcessedCleanupQueue.push({\r\n actionType: \"C\",\r\n groupId: postProcessgroupId,\r\n node: cacheEntry.cellNodesByColumnIdx[columnIdx],\r\n columnIdx: columnIdx,\r\n rowIdx: rowIdx\r\n });\r\n }\r\n }\r\n postProcessedCleanupQueue.push({\r\n actionType: \"R\",\r\n groupId: postProcessgroupId,\r\n node: cacheEntry.rowNode\r\n });\r\n cacheEntry.rowNode.forEach(x => x.parent.removeChild(x)); // $(cacheEntry.rowNode).detach();\r\n }\r\n\r\n function initializeRowPositions() {\r\n rowPositionCache = [{\r\n top: 0\r\n , height: options.rowHeight\r\n , bottom: options.rowHeight\r\n }];\r\n }\r\n\r\n function cacheRowPositions() {\r\n if (!options.variableRowHeight) {\r\n return;\r\n }\r\n\r\n initializeRowPositions();\r\n\r\n for (var i = 0, l = getDataLength(); i <= l; i++) {\r\n var metadata = data.getItemMetadata && data.getItemMetadata(i);\r\n\r\n rowPositionCache[i] = {\r\n top: (rowPositionCache[i - 1])\r\n ? (rowPositionCache[i - 1].bottom/* - offset */)\r\n : 0\r\n , height: (metadata && metadata.height !== undefined)\r\n ? metadata.height\r\n : options.rowHeight\r\n };\r\n\r\n rowPositionCache[i].bottom = rowPositionCache[i].top + rowPositionCache[i].height;\r\n }\r\n }\r\n\r\n function removeRowFromCache(row) {\r\n var cacheEntry = rowsCache[row];\r\n if (!cacheEntry) {\r\n return;\r\n }\r\n\r\n trigger(self.onBeforeRemoveRow, { row: row, dom: cacheEntry.rowNode });\r\n\r\n cacheEntry.rowNode.forEach(x => {\r\n x.parentElement.removeChild(x);\r\n });\r\n\r\n delete rowsCache[row];\r\n delete postProcessedRows[row];\r\n }\r\n\r\n function invalidateRows(rows) {\r\n var i, rl;\r\n if (!rows || !rows.length) {\r\n return;\r\n }\r\n vScrollDir = 0;\r\n rl = rows.length;\r\n for (i = 0; i < rl; i++) {\r\n if (currentEditor && activeRow === rows[i]) {\r\n makeActiveCellNormal();\r\n }\r\n if (rowsCache[rows[i]]) {\r\n removeRowFromCache(rows[i]);\r\n }\r\n }\r\n if (options.enableAsyncPostRenderCleanup) { startPostProcessingCleanup(); }\r\n }\r\n\r\n function invalidateRow(row) {\r\n if (!row && row !== 0) { return; }\r\n invalidateRows([row]);\r\n }\r\n\r\n function applyFormatResultToCellNode(formatterResult, cellNode, suppressRemove?: boolean) {\r\n if (formatterResult === null || formatterResult === undefined) { formatterResult = \"\"; }\r\n if (Object.prototype.toString.call(formatterResult) !== \"[object Object]\") {\r\n cellNode.innerHTML = formatterResult;\r\n } else {\r\n cellNode.innerHTML = formatterResult.text;\r\n if (formatterResult.removeClasses && !suppressRemove) {\r\n $(cellNode).removeClass(formatterResult.removeClasses);\r\n }\r\n if (formatterResult.addClasses) {\r\n $(cellNode).addClass(formatterResult.addClasses);\r\n }\r\n if (formatterResult.toolTip) {\r\n $(cellNode).attr(\"title\", formatterResult.toolTip);\r\n }\r\n }\r\n }\r\n\r\n function updateCell(row, cell) {\r\n var cellNode = getCellNode(row, cell);\r\n if (!cellNode) {\r\n return;\r\n }\r\n\r\n var m = columns[cell], d = getDataItem(row);\r\n if (currentEditor && activeRow === row && activeCell === cell) {\r\n currentEditor.loadValue(d);\r\n } else {\r\n var formatterResult = d ? getFormatter(row, m)(row, cell, getDataItemValueForColumn(d, m), m, d, self) : \"\";\r\n applyFormatResultToCellNode(formatterResult, cellNode);\r\n if (self.onAppendCell.countHandlers() > 0) {\r\n let item = getDataItem(activeRow);\r\n let value = getDataItemValueForColumn(item, columns[activeCell]);\r\n trigger(self.onAppendCell,\r\n {\r\n row: row, cell: cell,\r\n value: value, item: item,\r\n column: m, dom: cellNode\r\n });\r\n }\r\n invalidatePostProcessingResults(row);\r\n }\r\n }\r\n\r\n function updateRow(row) {\r\n var cacheEntry = rowsCache[row];\r\n if (!cacheEntry) {\r\n return;\r\n }\r\n\r\n ensureCellNodesInRowsCache(row);\r\n\r\n var formatterResult, d = getDataItem(row);\r\n\r\n // if (d) {\r\n // for (let cacheRow of cacheEntry.rowNode) {\r\n // cacheRow.classList.remove(\"loading\");\r\n // }\r\n // }\r\n\r\n for (var column in cacheEntry.cellNodesByColumnIdx) {\r\n if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(column)) {\r\n continue;\r\n }\r\n\r\n let columnIdx = parseInt(column, 10) | 0;\r\n var m = columns[columnIdx],\r\n node = cacheEntry.cellNodesByColumnIdx[columnIdx];\r\n\r\n if (row === activeRow && columnIdx === activeCell && currentEditor) {\r\n currentEditor.loadValue(d);\r\n } else if (d) {\r\n formatterResult = getFormatter(row, m)(row, columnIdx, getDataItemValueForColumn(d, m), m, d, self);\r\n applyFormatResultToCellNode(formatterResult, node);\r\n if (self.onAppendCell.countHandlers() > 0) {\r\n let item = getDataItem(row);\r\n let value = getDataItemValueForColumn(item, columns[columnIdx]);\r\n trigger(self.onAppendCell,\r\n {\r\n row: row, cell: columnIdx,\r\n value: value, item: item,\r\n column: columns[columnIdx], dom: node\r\n });\r\n }\r\n } else {\r\n node.innerHTML = \"\";\r\n }\r\n }\r\n\r\n invalidatePostProcessingResults(row);\r\n }\r\n\r\n function getViewportHeight() {\r\n if (options.autoHeight) {\r\n let fullHeight: number = <number>$paneHeaderL.height();\r\n fullHeight += (options.showHeaderRow) ? options.headerRowHeight + getVBoxDelta($headerRowScroller) : 0;\r\n fullHeight += (options.showFooterRow) ? options.footerRowHeight + getVBoxDelta($footerRowScroller) : 0;\r\n fullHeight += (getCanvasWidth() > viewportW) ? scrollbarDimensions.height : 0;\r\n\r\n if (options.variableRowHeight) {\r\n viewportH = rowPositionCache[getDataLengthIncludingAddNew()].bottom; // tODO Test this (also with frozen columns)\r\n } else {\r\n viewportH = options.rowHeight\r\n * getDataLengthIncludingAddNew()\r\n + ((options.frozenColumn == -1) ? <number>fullHeight : 0);\r\n }\r\n\r\n } else {\r\n topPanelH = (options.showTopPanel) ? options.topPanelHeight + getVBoxDelta($topPanelScroller) : 0;\r\n headerRowH = (options.showHeaderRow) ? options.headerRowHeight + getVBoxDelta($headerRowScroller) : 0;\r\n footerRowH = (options.showFooterRow) ? options.footerRowHeight + getVBoxDelta($footerRowScroller) : 0;\r\n let preHeaderH = (options.createPreHeaderPanel && options.showPreHeaderPanel) ? options.preHeaderPanelHeight + getVBoxDelta($preHeaderPanelScroller) : 0;\r\n\r\n viewportH = $container[0].clientHeight\r\n - $headerScroller[0].clientHeight\r\n - getVBoxDelta($headerScroller)\r\n - topPanelH\r\n - headerRowH\r\n - footerRowH\r\n - preHeaderH;\r\n }\r\n\r\n numVisibleRows = Math.ceil(viewportH / options.rowHeight); // tODO -> variable Row height\r\n return viewportH;\r\n }\r\n\r\n function getViewportWidth() {\r\n viewportW = $container.width() as number - 2; // 2 for border\r\n }\r\n\r\n function resizeCanvas() {\r\n if (!initialized) { return; }\r\n paneTopH = 0;\r\n paneBottomH = 0;\r\n viewportTopH = 0;\r\n viewportBottomH = 0;\r\n\r\n getViewportWidth();\r\n getViewportHeight();\r\n\r\n // account for Frozen Rows\r\n if (hasFrozenRows) {\r\n if (options.frozenBottom) {\r\n paneTopH = viewportH - frozenRowsHeight - scrollbarDimensions.height;\r\n paneBottomH = frozenRowsHeight + scrollbarDimensions.height;\r\n } else {\r\n paneTopH = frozenRowsHeight;\r\n paneBottomH = viewportH - frozenRowsHeight;\r\n }\r\n } else {\r\n paneTopH = viewportH;\r\n }\r\n\r\n // the top pane includes the top panel and the header row\r\n paneTopH += topPanelH + headerRowH + footerRowH;\r\n\r\n if (hasFrozenColumns() && options.autoHeight) {\r\n paneTopH += scrollbarDimensions.height;\r\n }\r\n\r\n // the top viewport does not contain the top panel or header row\r\n viewportTopH = paneTopH - topPanelH - headerRowH - footerRowH;\r\n\r\n if (options.autoHeight) {\r\n if (hasFrozenColumns()) {\r\n $container.height(\r\n paneTopH + $headerScrollerL[0].offsetHeight\r\n );\r\n }\r\n\r\n $paneTopL.css(\"position\", \"relative\");\r\n }\r\n\r\n $paneTopL.css(\"top\", $paneHeaderL.height()).css(\"height\", paneTopH);\r\n var paneBottomTop = $paneTopL[0].offsetTop + paneTopH;\r\n\r\n if (!options.autoHeight) {\r\n $viewportTopL.height(viewportTopH);\r\n }\r\n\r\n if (hasFrozenColumns()) {\r\n $paneTopR.css(\"top\", $paneHeaderL.height()).css(\"height\", paneTopH);\r\n\r\n $viewportTopR.height(viewportTopH);\r\n\r\n if (hasFrozenRows) {\r\n $paneBottomL.css(\"top\", paneBottomTop).css(\"height\", paneBottomH);\r\n\r\n $paneBottomR.css(\"top\", paneBottomTop).css(\"height\", paneBottomH);\r\n\r\n $viewportBottomR.height(paneBottomH);\r\n }\r\n } else {\r\n if (hasFrozenRows) {\r\n $paneBottomL.css(\"width\", \"100%\").css(\"height\", paneBottomH);\r\n\r\n $paneBottomL.css(\"top\", paneBottomTop);\r\n }\r\n }\r\n\r\n if (hasFrozenRows) {\r\n $viewportBottomL.height(paneBottomH);\r\n\r\n if (options.frozenBottom) {\r\n $canvasBottomL.height(frozenRowsHeight);\r\n\r\n if (hasFrozenColumns()) {\r\n $canvasBottomR.height(frozenRowsHeight);\r\n }\r\n } else {\r\n $canvasTopL.height(frozenRowsHeight);\r\n\r\n if (hasFrozenColumns()) {\r\n $canvasTopR.height(frozenRowsHeight);\r\n }\r\n }\r\n } else {\r\n $viewportTopR.height(viewportTopH);\r\n }\r\n\r\n if (!scrollbarDimensions || !scrollbarDimensions.width) {\r\n scrollbarDimensions = measureScrollbar();\r\n }\r\n\r\n if (options.forceFitColumns) {\r\n autosizeColumns();\r\n }\r\n\r\n updateRowCount();\r\n handleScroll();\r\n\r\n\r\n // since the width has changed, force the render() to reevaluate virtually rendered cells.\r\n lastRenderedScrollLeft = -1;\r\n render();\r\n }\r\n\r\n function updatePagingStatusFromView(pagingInfo) {\r\n pagingActive = (pagingInfo.pageSize !== 0);\r\n pagingIsLastPage = (pagingInfo.pageNum == pagingInfo.totalPages - 1);\r\n }\r\n\r\n function updateRowCount() {\r\n if (!initialized) { return; }\r\n cacheRowPositions();\r\n\r\n var dataLength = getDataLength();\r\n var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n var numberOfRows = 0;\r\n var oldH = (hasFrozenRows && !options.frozenBottom) ? parseInt($canvasBottomL[0].style.height) : parseInt($canvasTopL[0].style.height);\r\n if (hasFrozenRows) {\r\n numberOfRows = getDataLength() - options.frozenRow;\r\n } else {\r\n numberOfRows = dataLengthIncludingAddNew + (options.leaveSpaceForNewRows ? numVisibleRows - 1 : 0);\r\n }\r\n\r\n var tempViewportH = <number>$viewportScrollContainerY.height();\r\n var oldViewportHasVScroll = viewportHasVScroll;\r\n // with autoHeight, we do not need to accommodate the vertical scroll bar\r\n viewportHasVScroll = options.alwaysShowVerticalScroll || !options.autoHeight &&\r\n (options.variableRowHeight ?\r\n (rowPositionCache[numberOfRows - 1] && (rowPositionCache[numberOfRows - 1].bottom > viewportH)) :\r\n (numberOfRows * options.rowHeight > tempViewportH));\r\n makeActiveCellNormal();\r\n\r\n // remove the rows that are now outside of the data range\r\n // this helps avoid redundant calls to .removeRow() when the size of the data decreased by thousands of rows\r\n var r1 = dataLength - 1;\r\n for (var i in rowsCache) {\r\n if (parseInt(i, 10) > r1) {\r\n removeRowFromCache(i);\r\n }\r\n }\r\n if (options.enableAsyncPostRenderCleanup) { startPostProcessingCleanup(); }\r\n\r\n if (activeCellNode && activeRow > r1) {\r\n resetActiveCell();\r\n }\r\n\r\n oldH = h;\r\n\r\n var rowH = options.variableRowHeight ? (options.enableAddRow\r\n ? rowPositionCache[getDataLength()].bottom\r\n : rowPositionCache[getDataLength()].top) : options.rowHeight * numberOfRows;\r\n\r\n if (options.autoHeight) {\r\n h = rowH;\r\n } else {\r\n th = Math.max(rowH, tempViewportH - scrollbarDimensions.height);\r\n if (th < maxSupportedCssHeight) {\r\n // just one page\r\n h = ph = th;\r\n n = 1;\r\n cj = 0;\r\n } else {\r\n // break into pages\r\n h = maxSupportedCssHeight;\r\n ph = h / 100;\r\n n = Math.floor(th / ph);\r\n cj = (th - h) / (n - 1);\r\n }\r\n }\r\n\r\n if (h !== oldH) {\r\n if (hasFrozenRows && !options.frozenBottom) {\r\n $canvasBottomL.css(\"height\", h);\r\n\r\n if (hasFrozenColumns()) {\r\n $canvasBottomR.css(\"height\", h);\r\n }\r\n } else {\r\n $canvasTopL.css(\"height\", h);\r\n $canvasTopR.css(\"height\", h);\r\n }\r\n\r\n scrollTop = $viewportScrollContainerY[0].scrollTop;\r\n }\r\n\r\n var oldScrollTopInRange = (scrollTop + offset <= th - tempViewportH);\r\n\r\n if (th == 0 || scrollTop == 0) {\r\n page = offset = 0;\r\n } else if (oldScrollTopInRange) {\r\n // maintain virtual position\r\n scrollTo(scrollTop + offset);\r\n } else {\r\n // scroll to bottom\r\n scrollTo(th - tempViewportH);\r\n }\r\n\r\n if (h != oldH && options.autoHeight) {\r\n resizeCanvas();\r\n }\r\n\r\n if (options.forceFitColumns && oldViewportHasVScroll != viewportHasVScroll) {\r\n autosizeColumns();\r\n }\r\n updateCanvasWidth(false);\r\n }\r\n\r\n function getVisibleRange(viewportTop?: number, viewportLeft?: number) {\r\n if (viewportTop == null) {\r\n viewportTop = scrollTop;\r\n }\r\n if (viewportLeft == null) {\r\n viewportLeft = scrollLeft;\r\n }\r\n\r\n return {\r\n top: getRowFromPosition(viewportTop),\r\n bottom: getRowFromPosition(viewportTop + viewportH) + 1,\r\n leftPx: viewportLeft,\r\n rightPx: viewportLeft + viewportW\r\n };\r\n }\r\n\r\n function getRenderedRangeFromVisibleRange(range) {\r\n var buffer = Math.round(viewportH / options.rowHeight); // TODO -> probably not correct for variableRowHeight\r\n var minBuffer = options.minRowBuffer;\r\n\r\n if (vScrollDir === -1) {\r\n range.top -= buffer;\r\n range.bottom += minBuffer;\r\n } else if (vScrollDir === 1) {\r\n range.top -= minBuffer;\r\n range.bottom += buffer;\r\n } else {\r\n range.top -= minBuffer;\r\n range.bottom += minBuffer;\r\n }\r\n\r\n range.top = Math.max(0, range.top);\r\n range.bottom = Math.min(getDataLengthIncludingAddNew() - 1, range.bottom);\r\n\r\n range.leftPx -= viewportW;\r\n range.rightPx += viewportW;\r\n\r\n range.leftPx = Math.max(0, range.leftPx);\r\n range.rightPx = Math.min(canvasWidth, range.rightPx);\r\n\r\n return range;\r\n }\r\n\r\n function getRenderedRange(viewportTop?: number, viewportLeft?: number) {\r\n var range = getVisibleRange(viewportTop, viewportLeft);\r\n return getRenderedRangeFromVisibleRange(range);\r\n }\r\n\r\n function ensureCellNodesInRowsCache(row) {\r\n var cacheEntry = rowsCache[row];\r\n if (cacheEntry) {\r\n if (cacheEntry.cellRenderQueue.length) {\r\n var lastNode = <HTMLElement>cacheEntry.rowNode[cacheEntry.rowNode.length - 1].lastElementChild;// cacheEntry.rowNode.children().last();\r\n while (lastNode && cacheEntry.cellRenderQueue.length) {\r\n var columnIdx = cacheEntry.cellRenderQueue.pop();\r\n cacheEntry.cellNodesByColumnIdx[columnIdx] = lastNode;\r\n lastNode = <HTMLElement>lastNode.previousElementSibling;\r\n // hack to retrieve the frozen columns because\r\n if (!lastNode) {\r\n lastNode = <HTMLElement>cacheEntry.rowNode[0].lastElementChild;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n function cleanUpCells(range, row) {\r\n // ignore frozen rows\r\n if (hasFrozenRows\r\n && ((options.frozenBottom && row > actualFrozenRow) // frozen bottom rows\r\n || (row <= actualFrozenRow) // frozen top rows\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n var totalCellsRemoved = 0;\r\n var cacheEntry = rowsCache[row];\r\n\r\n // remove cells outside the range.\r\n var cellsToRemove = [];\r\n for (var idx in cacheEntry.cellNodesByColumnIdx) {\r\n // i really hate it when people mess with Array.prototype.\r\n if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(idx)) {\r\n continue;\r\n }\r\n\r\n // this is a string, so it needs to be cast back to a number.\r\n let i = parseInt(idx, 10) | 0;\r\n\r\n // ignore frozen columns\r\n if (i <= options.frozenColumn) {\r\n continue;\r\n }\r\n\r\n // ignore alwaysRenderedColumns\r\n if (Array.isArray(columns) && columns[i] && columns[i].alwaysRenderColumn) {\r\n continue;\r\n }\r\n\r\n var colspan = cacheEntry.cellColSpans[i];\r\n if (columnPosLeft[i] > range.rightPx ||\r\n columnPosRight[Math.min(columns.length - 1, i + colspan - 1)] < range.leftPx) {\r\n if (!(row == activeRow && i == activeCell)) {\r\n cellsToRemove.push(i);\r\n }\r\n }\r\n }\r\n\r\n var cellToRemove;\r\n while ((cellToRemove = cellsToRemove.pop()) != null) {\r\n cacheEntry.cellNodesByColumnIdx[cellToRemove].parentElement.removeChild(cacheEntry.cellNodesByColumnIdx[cellToRemove]);\r\n\r\n delete cacheEntry.cellColSpans[cellToRemove];\r\n delete cacheEntry.cellNodesByColumnIdx[cellToRemove];\r\n if (postProcessedRows[row]) {\r\n delete postProcessedRows[row][cellToRemove];\r\n }\r\n totalCellsRemoved++;\r\n }\r\n }\r\n\r\n function cleanUpAndRenderCells(range) {\r\n\r\n var cacheEntry: ICacheEntry;\r\n var stringArray = \"\";\r\n var processedRows = [];\r\n var cellsAdded;\r\n var totalCellsAdded = 0;\r\n var colspan;\r\n\r\n for (var row = range.top, btm = range.bottom; row <= btm; row++) {\r\n cacheEntry = rowsCache[row];\r\n if (!cacheEntry) {\r\n continue;\r\n }\r\n\r\n // cellRenderQueue populated in renderRows() needs to be cleared first\r\n ensureCellNodesInRowsCache(row);\r\n\r\n cleanUpCells(range, row);\r\n\r\n // render missing cells.\r\n cellsAdded = 0;\r\n\r\n var metadata = data.getItemMetadata && data.getItemMetadata(row);\r\n metadata = metadata && metadata.columns;\r\n\r\n var d = getDataItem(row);\r\n\r\n for (var i = 0, ii = columns.length; i < ii; i++) {\r\n // cells to the right are outside the range.\r\n if (columnPosLeft[i] > range.rightPx) {\r\n break;\r\n }\r\n\r\n // already rendered.\r\n if ((colspan = cacheEntry.cellColSpans[i]) != null) {\r\n i += (colspan > 1 ? colspan - 1 : 0);\r\n continue;\r\n }\r\n\r\n colspan = 1;\r\n if (metadata) {\r\n var columnData = metadata[columns[i].id] || metadata[i];\r\n colspan = (columnData && columnData.colspan) || 1;\r\n if (colspan === \"*\") {\r\n colspan = ii - i;\r\n }\r\n }\r\n\r\n if (columnPosRight[Math.min(ii - 1, i + colspan - 1)] > range.leftPx) {\r\n stringArray += appendCellHtml(row, i, colspan, d);\r\n cellsAdded++;\r\n }\r\n\r\n i += (colspan > 1 ? colspan - 1 : 0);\r\n }\r\n\r\n if (cellsAdded) {\r\n totalCellsAdded += cellsAdded;\r\n processedRows.push(row);\r\n }\r\n }\r\n\r\n if (!stringArray.length) {\r\n return;\r\n }\r\n\r\n var x = document.createElement(\"div\");\r\n x.innerHTML = stringArray;\r\n // tODO TODOFIX -> call var addlCssClasses = trigger(self.onAppendCell, { row: row, cell: cell, value: value, dataContext: item, column: m }) || '';\r\n\r\n var processedRow;\r\n while ((processedRow = processedRows.pop()) != null) {\r\n cacheEntry = rowsCache[processedRow];\r\n var columnIdx;\r\n while ((columnIdx = cacheEntry.cellRenderQueue.pop()) != null) {\r\n var node = <HTMLElement>x.lastElementChild;\r\n\r\n if (hasFrozenColumns() && (columnIdx > options.frozenColumn)) {\r\n cacheEntry.rowNode[1].appendChild(node);\r\n } else {\r\n cacheEntry.rowNode[0].appendChild(node);\r\n }\r\n\r\n if (self.onAppendCell.countHandlers() > 0) {\r\n let item = getDataItem(processedRow);\r\n let value = getDataItemValueForColumn(item, columns[columnIdx]);\r\n trigger(self.onAppendCell,\r\n {\r\n row: processedRow, cell: columnIdx,\r\n value: value, item: item,\r\n column: columns[columnIdx], dom: node\r\n });\r\n }\r\n\r\n cacheEntry.cellNodesByColumnIdx[columnIdx] = node;\r\n }\r\n }\r\n }\r\n\r\n function renderRows(range) {\r\n var html = { L: \"\", R: \"\" },\r\n rows = [],\r\n needToReselectCell = false,\r\n dataLength = getDataLength();\r\n\r\n for (let i = range.top, ii = range.bottom; i <= ii; i++) {\r\n if (rowsCache[i] || (hasFrozenRows && options.frozenBottom && i == getDataLength())) {\r\n continue;\r\n }\r\n renderedRows++;\r\n rows.push(i);\r\n\r\n // create an entry right away so that appendRowHtml() can\r\n // start populatating it.\r\n rowsCache[i] = {\r\n rowNode: null,\r\n\r\n // colSpans of rendered cells (by column idx).\r\n // can also be used for checking whether a cell has been rendered.\r\n cellColSpans: [],\r\n\r\n // cell nodes (by column idx). Lazy-populated by ensureCellNodesInRowsCache().\r\n cellNodesByColumnIdx: [],\r\n\r\n // column indices of cell nodes that have been rendered, but not yet indexed in\r\n // cellNodesByColumnIdx. These are in the same order as cell nodes added at the\r\n // end of the row.\r\n cellRenderQueue: []\r\n };\r\n\r\n appendRowHtml(html, i, range, dataLength);\r\n if (activeCellNode && activeRow === i) {\r\n needToReselectCell = true;\r\n }\r\n }\r\n\r\n if (!rows.length) { return; }\r\n\r\n\r\n let x;\r\n if (html.L.length > 0) {\r\n x = document.createElement(\"div\");\r\n x.innerHTML = html.L;\r\n }\r\n let xRight;\r\n if (html.R.length > 0) {\r\n xRight = document.createElement(\"div\");\r\n xRight.innerHTML = html.R;\r\n }\r\n\r\n\r\n for (let i = 0, ii = rows.length; i < ii; i++) {\r\n let xChild: HTMLDivElement;\r\n let xChildRight: HTMLDivElement;\r\n rowsCache[rows[i]].rowNode = [];\r\n if (x && x.children.length > 0) {\r\n xChild = x.children[0];\r\n rowsCache[rows[i]].rowNode.push(xChild);\r\n }\r\n if (xRight && xRight.children.length > 0) {\r\n xChildRight = xRight.children[0];\r\n rowsCache[rows[i]].rowNode.push(xChildRight);\r\n }\r\n\r\n if ((hasFrozenRows) && (rows[i] >= actualFrozenRow)) {\r\n $canvasBottomL[0].appendChild(xChild);\r\n if (hasFrozenColumns()) {\r\n $canvasBottomR[0].appendChild(xChildRight);\r\n }\r\n } else if (hasFrozenColumns()) {\r\n $canvasTopL[0].appendChild(xChild);\r\n $canvasTopR[0].appendChild(xChildRight);\r\n } else {\r\n $canvasTopL[0].appendChild(xChild);\r\n }\r\n\r\n if (self.onAppendCell.countHandlers() > 0) {\r\n const nodes: HTMLDivElement[] = [];\r\n for (let idx = 0; idx < xChild.childNodes.length; idx++) {\r\n nodes.push(xChild.childNodes[idx] as HTMLDivElement);\r\n }\r\n if (xChildRight) {\r\n for (let idx = 0; idx < xChildRight.childNodes.length; idx++) {\r\n nodes.push(xChildRight.childNodes[idx] as HTMLDivElement);\r\n }\r\n }\r\n for (let cIdx = 0; cIdx < nodes.length; cIdx++) {\r\n let item = getDataItem(rows[i]);\r\n let value = getDataItemValueForColumn(item, columns[cIdx]);\r\n trigger(self.onAppendCell,\r\n {\r\n row: rows[i], cell: cIdx,\r\n value: value, item: item,\r\n column: columns[cIdx], dom: nodes[cIdx]\r\n });\r\n }\r\n }\r\n\r\n }\r\n\r\n if (needToReselectCell) {\r\n activeCellNode = getCellNode(activeRow, activeCell);\r\n }\r\n }\r\n\r\n\r\n function startPostProcessing() {\r\n if (!options.enableAsyncPostRender) {\r\n return;\r\n }\r\n clearTimeout(h_postrender);\r\n h_postrender = setTimeout(asyncPostProcessRows, options.asyncPostRenderDelay);\r\n }\r\n\r\n function startPostProcessingCleanup() {\r\n if (!options.enableAsyncPostRenderCleanup) {\r\n return;\r\n }\r\n clearTimeout(h_postrenderCleanup);\r\n h_postrenderCleanup = setTimeout(asyncPostProcessCleanupRows, options.asyncPostRenderCleanupDelay);\r\n }\r\n\r\n function invalidatePostProcessingResults(row) {\r\n // change status of columns to be re-rendered\r\n for (var columnIdx in postProcessedRows[row]) {\r\n if (postProcessedRows[row].hasOwnProperty(columnIdx)) {\r\n postProcessedRows[row][columnIdx] = \"C\";\r\n }\r\n }\r\n postProcessFromRow = Math.min(postProcessFromRow, row);\r\n postProcessToRow = Math.max(postProcessToRow, row);\r\n startPostProcessing();\r\n }\r\n\r\n function updateRowPositions() {\r\n for (var row in rowsCache) {\r\n rowsCache[row].rowNode.forEach(x => x.style.top = getRowTop(row) + \"px\");\r\n }\r\n }\r\n\r\n function render() {\r\n if (!initialized) { return; }\r\n\r\n scrollThrottle.dequeue();\r\n\r\n var visible = getVisibleRange();\r\n var rendered = getRenderedRangeFromVisibleRange(visible);// getRenderedRange();\r\n\r\n // remove rows no longer in the viewport\r\n cleanupRows(rendered);\r\n\r\n // add new rows & missing cells in existing rows\r\n if (lastRenderedScrollLeft != scrollLeft) {\r\n\r\n if (hasFrozenRows) {\r\n\r\n var renderedFrozenRows = $.deepExtend({}, rendered);\r\n\r\n if (options.frozenBottom) {\r\n\r\n renderedFrozenRows.top = actualFrozenRow;\r\n renderedFrozenRows.bottom = getDataLength();\r\n } else {\r\n\r\n renderedFrozenRows.top = 0;\r\n renderedFrozenRows.bottom = options.frozenRow;\r\n }\r\n\r\n cleanUpAndRenderCells(renderedFrozenRows);\r\n }\r\n\r\n cleanUpAndRenderCells(rendered);\r\n }\r\n\r\n // render missing rows\r\n renderRows(rendered);\r\n\r\n // render frozen rows\r\n if (hasFrozenRows) {\r\n if (options.frozenBottom) {\r\n renderRows({\r\n top: actualFrozenRow, bottom: getDataLength() - 1, leftPx: rendered.leftPx, rightPx: rendered.rightPx\r\n });\r\n } else {\r\n renderRows({\r\n top: 0, bottom: options.frozenRow - 1, leftPx: rendered.leftPx, rightPx: rendered.rightPx\r\n });\r\n }\r\n }\r\n\r\n postProcessFromRow = visible.top;\r\n postProcessToRow = Math.min(getDataLengthIncludingAddNew() - 1, visible.bottom);\r\n startPostProcessing();\r\n\r\n lastRenderedScrollTop = scrollTop;\r\n lastRenderedScrollLeft = scrollLeft;\r\n h_render = null;\r\n trigger(self.onRendered, { startRow: visible.top, endRow: visible.bottom, grid: self });\r\n }\r\n\r\n function preventScroll(e) {\r\n e.preventDefault();\r\n }\r\n\r\n // function handleHeaderScroll() {\r\n // handleElementScroll($headerScrollContainer[0]);\r\n // }\r\n\r\n //function handleHeaderRowScroll() {\r\n // if (programmaticScrollingTimeout) {\r\n // return;\r\n // }\r\n // var scrollLeft = $headerRowScrollContainer[0].scrollLeft;\r\n // if (scrollLeft != $viewportScrollContainerX[0].scrollLeft) {\r\n // $viewportScrollContainerX[0].scrollLeft = scrollLeft;\r\n // }\r\n // }\r\n\r\n // function handleFooterRowScroll(e) {\r\n // if (programmaticScrollingTimeout) {\r\n // return;\r\n // }\r\n // var scrollLeft = $footerRowScrollContainer[0].scrollLeft;\r\n // if (scrollLeft != $viewportScrollContainerX[0].scrollLeft) {\r\n // $viewportScrollContainerX[0].scrollLeft = scrollLeft;\r\n // }\r\n //}\r\n\r\n // function handlePreHeaderPanelScroll() {\r\n // handleElementScroll($preHeaderPanelScroller[0]);\r\n // }\r\n\r\n //function handleElementScroll(element) {\r\n // if (programmaticScrollingTimeout) {\r\n // return;\r\n // }\r\n // var scrollLeft = element.scrollLeft;\r\n // if (scrollLeft != $viewportScrollContainerX[0].scrollLeft) {\r\n // $viewportScrollContainerX[0].scrollLeft = scrollLeft;\r\n // }\r\n // }\r\n\r\n function handleScroll() {\r\n scrollTop = $viewportScrollContainerY[0].scrollTop;\r\n scrollLeft = $viewportScrollContainerX[0].scrollLeft;\r\n return _handleScroll(false);\r\n }\r\n\r\n function _handleScroll(isMouseWheel) {\r\n // if (programmaticScrollingTimeout) {\r\n // clearTimeout(programmaticScrollingTimeout);\r\n // }\r\n // programmaticScrollingTimeout = setTimeout(() => {\r\n // programmaticScrollingTimeout = null;\r\n // }, 600);\r\n\r\n // ceiling the max scroll values\r\n let vScrollDist = 0;\r\n if (!options.autoHeight) {\r\n let maxScrollDistanceY = $viewportScrollContainerY[0].scrollHeight - $viewportScrollContainerY[0].clientHeight;\r\n if (scrollTop > maxScrollDistanceY) {\r\n scrollTop = maxScrollDistanceY;\r\n }\r\n vScrollDist = Math.abs(scrollTop - prevScrollTop);\r\n }\r\n\r\n let maxScrollDistanceX = $viewportScrollContainerY[0].scrollWidth - $viewportScrollContainerY[0].clientWidth;\r\n if (scrollLeft > maxScrollDistanceX) {\r\n scrollLeft = maxScrollDistanceX;\r\n }\r\n let hScrollDist = Math.abs(scrollLeft - prevScrollLeft);\r\n\r\n\r\n if (hScrollDist) {\r\n prevScrollLeft = scrollLeft;\r\n\r\n $viewportScrollContainerX[0].scrollLeft = scrollLeft;\r\n $headerScrollContainer[0].scrollLeft = scrollLeft;\r\n $topPanelScroller[0].scrollLeft = scrollLeft;\r\n $headerRowScrollContainer[0].scrollLeft = scrollLeft;\r\n if (options.createFooterRow) {\r\n $footerRowScrollContainer[0].scrollLeft = scrollLeft;\r\n }\r\n if (options.createPreHeaderPanel) {\r\n if (hasFrozenColumns()) {\r\n $preHeaderPanelScrollerR[0].scrollLeft = scrollLeft;\r\n } else {\r\n $preHeaderPanelScroller[0].scrollLeft = scrollLeft;\r\n }\r\n }\r\n if (hasFrozenColumns()) {\r\n if (hasFrozenRows) {\r\n $viewportTopR[0].scrollLeft = scrollLeft;\r\n }\r\n } else {\r\n if (hasFrozenRows) {\r\n $viewportTopL[0].scrollLeft = scrollLeft;\r\n }\r\n }\r\n }\r\n\r\n if (vScrollDist) {\r\n vScrollDir = prevScrollTop < scrollTop ? 1 : -1;\r\n prevScrollTop = scrollTop;\r\n\r\n if (isMouseWheel) {\r\n $viewportScrollContainerY[0].scrollTop = scrollTop;\r\n }\r\n\r\n if (hasFrozenColumns()) {\r\n if (hasFrozenRows && !options.frozenBottom) {\r\n $viewportBottomL[0].scrollTop = scrollTop;\r\n } else {\r\n $viewportTopL[0].scrollTop = scrollTop;\r\n }\r\n }\r\n\r\n // switch virtual pages if needed\r\n if (vScrollDist < viewportH) {\r\n scrollTo(scrollTop + offset);\r\n } else {\r\n var oldOffset = offset;\r\n if (h == viewportH) {\r\n page = 0;\r\n } else {\r\n page = Math.min(n - 1, Math.floor(scrollTop * ((th - viewportH) / (h - viewportH)) * (1 / ph)));\r\n }\r\n offset = Math.round(page * cj);\r\n if (oldOffset != offset) {\r\n invalidateAllRows();\r\n }\r\n\r\n }\r\n }\r\n\r\n if (hScrollDist || vScrollDist) {\r\n var dx = Math.abs(lastRenderedScrollLeft - scrollLeft);\r\n var dy = Math.abs(lastRenderedScrollTop - scrollTop);\r\n if (dx > 20 || dy > 20) {\r\n // if rendering is forced or scrolling is small enough to be \"easy\", just render\r\n if (options.forceSyncScrolling || (dy < viewportH && dx < viewportW)) {\r\n render();\r\n } else {\r\n // otherwise, perform \"difficult\" renders at a capped frequency\r\n scrollThrottle.enqueue();\r\n }\r\n\r\n trigger(self.onViewportChanged, {});\r\n }\r\n }\r\n\r\n trigger(self.onScroll, { scrollLeft: scrollLeft, scrollTop: scrollTop });\r\n\r\n if (hScrollDist || vScrollDist) { return true; }\r\n return false;\r\n }\r\n\r\n /*\r\n limits the frequency at which the provided action is executed.\r\n call enqueue to execute the action - it will execute either immediately or, if it was executed less than minPeriod_ms in the past, as soon as minPeriod_ms has expired.\r\n call dequeue to cancel any pending action.\r\n */\r\n function ActionThrottle(action, minPeriod_ms) {\r\n\r\n var blocked = false;\r\n var queued = false;\r\n\r\n function enqueue() {\r\n if (!blocked) {\r\n blockAndExecute();\r\n } else {\r\n queued = true;\r\n }\r\n }\r\n\r\n function dequeue() {\r\n queued = false;\r\n }\r\n\r\n function blockAndExecute() {\r\n blocked = true;\r\n setTimeout(unblock, minPeriod_ms);\r\n action();\r\n }\r\n\r\n function unblock() {\r\n if (queued) {\r\n dequeue();\r\n blockAndExecute();\r\n } else {\r\n blocked = false;\r\n }\r\n }\r\n\r\n return {\r\n enqueue: enqueue,\r\n dequeue: dequeue\r\n };\r\n }\r\n\r\n function asyncPostProcessRows() {\r\n var dataLength = getDataLength();\r\n while (postProcessFromRow <= postProcessToRow) {\r\n var row = (vScrollDir >= 0) ? postProcessFromRow++ : postProcessToRow--;\r\n var cacheEntry = rowsCache[row];\r\n if (!cacheEntry || row >= dataLength) {\r\n continue;\r\n }\r\n\r\n if (!postProcessedRows[row]) {\r\n postProcessedRows[row] = {};\r\n }\r\n\r\n ensureCellNodesInRowsCache(row);\r\n for (var column in cacheEntry.cellNodesByColumnIdx) {\r\n if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(column)) {\r\n continue;\r\n }\r\n\r\n let columnIdx = parseInt(column, 10) | 0;\r\n\r\n var m = columns[columnIdx];\r\n var processedStatus = postProcessedRows[row][columnIdx]; // c=cleanup and re-render, R=rendered\r\n if (m.asyncPostRender && processedStatus !== \"R\") {\r\n var node = cacheEntry.cellNodesByColumnIdx[columnIdx];\r\n if (node) {\r\n m.asyncPostRender(node, row, getDataItem(row), m, (processedStatus === \"C\"));\r\n }\r\n postProcessedRows[row][columnIdx] = \"R\";\r\n }\r\n }\r\n\r\n h_postrender = setTimeout(asyncPostProcessRows, options.asyncPostRenderDelay);\r\n return;\r\n }\r\n }\r\n\r\n function asyncPostProcessCleanupRows() {\r\n if (postProcessedCleanupQueue.length > 0) {\r\n var groupId = postProcessedCleanupQueue[0].groupId;\r\n\r\n // loop through all queue members with this groupID\r\n while (postProcessedCleanupQueue.length > 0 && postProcessedCleanupQueue[0].groupId == groupId) {\r\n var entry = postProcessedCleanupQueue.shift();\r\n if (entry.actionType == \"R\") {\r\n $(entry.node).remove();\r\n }\r\n if (entry.actionType == \"C\") {\r\n var column = columns[entry.columnIdx];\r\n if (column.asyncPostRenderCleanup && entry.node) {\r\n // cleanup must also remove element\r\n column.asyncPostRenderCleanup(entry.node, entry.rowIdx, column);\r\n }\r\n }\r\n }\r\n\r\n // call this function again after the specified delay\r\n h_postrenderCleanup = setTimeout(asyncPostProcessCleanupRows, options.asyncPostRenderCleanupDelay);\r\n }\r\n }\r\n\r\n function updateCellCssStylesOnRenderedRows(addedHash, removedHash) {\r\n var node, columnId, addedRowHash, removedRowHash;\r\n for (var row in rowsCache) {\r\n removedRowHash = removedHash && removedHash[row];\r\n addedRowHash = addedHash && addedHash[row];\r\n\r\n if (removedRowHash) {\r\n for (columnId in removedRowHash) {\r\n if (!addedRowHash || removedRowHash[columnId] != addedRowHash[columnId]) {\r\n node = getCellNode(row, getColumnIndex(columnId));\r\n if (node) {\r\n $(node).removeClass(removedRowHash[columnId]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (addedRowHash) {\r\n for (columnId in addedRowHash) {\r\n if (!removedRowHash || removedRowHash[columnId] != addedRowHash[columnId]) {\r\n node = getCellNode(row, getColumnIndex(columnId));\r\n if (node) {\r\n $(node).addClass(addedRowHash[columnId]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n function addCellCssStyles(key, hash) {\r\n if (cellCssClasses[key]) {\r\n throw new Error(\"addCellCssStyles: cell CSS hash with key '\" + key + \"' already exists.\");\r\n }\r\n\r\n cellCssClasses[key] = hash;\r\n updateCellCssStylesOnRenderedRows(hash, null);\r\n\r\n trigger(self.onCellCssStylesChanged, { \"key\": key, \"hash\": hash, \"grid\": self });\r\n }\r\n\r\n function removeCellCssStyles(key) {\r\n if (!cellCssClasses[key]) {\r\n return;\r\n }\r\n\r\n updateCellCssStylesOnRenderedRows(null, cellCssClasses[key]);\r\n delete cellCssClasses[key];\r\n\r\n trigger(self.onCellCssStylesChanged, { \"key\": key, \"hash\": null, \"grid\": self });\r\n }\r\n\r\n function setCellCssStyles(key, hash) {\r\n var prevHash = cellCssClasses[key];\r\n\r\n cellCssClasses[key] = hash;\r\n updateCellCssStylesOnRenderedRows(hash, prevHash);\r\n\r\n trigger(self.onCellCssStylesChanged, { \"key\": key, \"hash\": hash, \"grid\": self });\r\n }\r\n\r\n function getCellCssStyles(key) {\r\n return cellCssClasses[key];\r\n }\r\n\r\n function flashCell(row, cell, speed, times) {\r\n speed = speed || 100;\r\n if (rowsCache[row]) {\r\n let $cell = $(getCellNode(row, cell));\r\n\r\n let toggleCellClass = (remaining) => {\r\n if (!remaining) { return; }\r\n $cell.toggleClass(options.cellFlashingCssClass);\r\n setTimeout(() => {\r\n toggleCellClass(remaining - 1);\r\n }, speed);\r\n };\r\n toggleCellClass((times || 4) * 2);\r\n }\r\n\r\n }\r\n\r\n\r\n function handleDragInit(e, dd) {\r\n var cell = getCellFromEvent(e);\r\n if (!cell || !cellExists(cell.row, cell.cell)) {\r\n return false;\r\n }\r\n\r\n var retval = trigger(self.onDragInit, dd, e);\r\n if (e.isImmediatePropagationStopped()) {\r\n return retval;\r\n }\r\n\r\n // if nobody claims to be handling drag'n'drop by stopping immediate propagation,\r\n // cancel out of it\r\n return false;\r\n }\r\n\r\n function handleDragStart(e, dd) {\r\n var cell = getCellFromEvent(e);\r\n if (!cell || !cellExists(cell.row, cell.cell)) {\r\n return false;\r\n }\r\n\r\n var retval = trigger(self.onDragStart, dd, e);\r\n if (e.isImmediatePropagationStopped()) {\r\n return retval;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function handleDrag(e, dd) {\r\n return trigger(self.onDrag, dd, e);\r\n }\r\n\r\n function handleDragEnd(e, dd) {\r\n trigger(self.onDragEnd, dd, e);\r\n }\r\n\r\n function handleKeyDown(e) {\r\n trigger(self.onKeyDown, { row: activeRow, cell: activeCell }, e);\r\n var handled = e.isImmediatePropagationStopped();\r\n var keyCode = Slick.keyCode;\r\n\r\n if (!handled) {\r\n if (!e.shiftKey && !e.altKey) {\r\n if (options.editable && currentEditor && currentEditor.keyCaptureList) {\r\n if (typeof currentEditor.keyCaptureList === \"function\") {\r\n if (currentEditor.keyCaptureList(e.which) === false) {\r\n return;\r\n }\r\n } else if (currentEditor.keyCaptureList.indexOf(e.which) > -1) {\r\n return;\r\n }\r\n }\r\n if (e.which == keyCode.HOME) {\r\n handled = (e.ctrlKey) ? navigateTop() : navigateRowStart();\r\n } else if (e.which == keyCode.END) {\r\n handled = (e.ctrlKey) ? navigateBottom() : navigateRowEnd();\r\n }\r\n }\r\n }\r\n if (!handled) {\r\n if (!e.shiftKey && !e.altKey && !e.ctrlKey) {\r\n // editor may specify an array of keys to bubble\r\n if (options.editable && currentEditor && currentEditor.keyCaptureList) {\r\n if (typeof currentEditor.keyCaptureList === \"function\") {\r\n if (currentEditor.keyCaptureList(e.which) === false) {\r\n return;\r\n }\r\n } else if (currentEditor.keyCaptureList.indexOf(e.which) > -1) {\r\n return;\r\n }\r\n }\r\n if (e.which == keyCode.ESCAPE) {\r\n if (!getEditorLock().isActive()) {\r\n return; // no editing mode to cancel, allow bubbling and default processing (exit without cancelling the event)\r\n }\r\n cancelEditAndSetFocus();\r\n } else if (e.which == keyCode.PAGE_DOWN) {\r\n navigatePageDown();\r\n handled = true;\r\n } else if (e.which == keyCode.PAGE_UP) {\r\n navigatePageUp();\r\n handled = true;\r\n } else if (e.which == keyCode.LEFT) {\r\n handled = navigateLeft();\r\n } else if (e.which == keyCode.RIGHT) {\r\n handled = navigateRight();\r\n } else if (e.which == keyCode.UP) {\r\n handled = navigateUp();\r\n } else if (e.which == keyCode.DOWN) {\r\n handled = navigateDown();\r\n } else if (e.which == keyCode.TAB) {\r\n handled = navigateNext();\r\n } else if (e.which == keyCode.ENTER) {\r\n if (options.editable) {\r\n if (currentEditor) {\r\n // adding new row\r\n if (activeRow === getDataLength()) {\r\n navigateDown();\r\n } else {\r\n commitEditAndNavDown();\r\n }\r\n } else {\r\n if (getEditorLock().commitCurrentEdit()) {\r\n makeActiveCellEditable(undefined, undefined, e);\r\n }\r\n }\r\n }\r\n handled = true;\r\n }\r\n } else if (e.which == keyCode.TAB && e.shiftKey && !e.ctrlKey && !e.altKey) {\r\n handled = navigatePrev();\r\n }\r\n }\r\n\r\n if (handled) {\r\n // the event has been handled so don't let parent element (bubbling/propagation) or browser (default) handle it\r\n e.stopPropagation();\r\n e.preventDefault();\r\n try {\r\n e.originalEvent.keyCode = 0; // prevent default behaviour for special keys in IE browsers (F3, F5, etc.)\r\n } catch (error) {\r\n }\r\n }\r\n }\r\n\r\n function handleClick(e) {\r\n if (!currentEditor) {\r\n // if this click resulted in some cell child node getting focus,\r\n // don't steal it back - keyboard events will still bubble up\r\n // iE9+ seems to default DIVs to tabIndex=0 instead of -1, so check for cell clicks directly.\r\n if (e.target != document.activeElement || $(e.target).hasClass(\"slick-cell\")) {\r\n setFocus();\r\n }\r\n }\r\n\r\n var cell = getCellFromEvent(e);\r\n if (!cell || (currentEditor !== null && activeRow == cell.row && activeCell == cell.cell)) {\r\n return;\r\n }\r\n\r\n trigger(self.onClick, { row: cell.row, cell: cell.cell }, e);\r\n if (e.isImmediatePropagationStopped()) {\r\n return;\r\n }\r\n\r\n // this optimisation causes trouble - MLeibman #329\r\n // if ((activeCell != cell.cell || activeRow != cell.row) && canCellBeActive(cell.row, cell.cell)) {\r\n if (canCellBeActive(cell.row, cell.cell)) {\r\n if (!getEditorLock().isActive() || getEditorLock().commitCurrentEdit()) {\r\n scrollRowIntoView(cell.row, false);\r\n\r\n var preClickModeOn = (e.target && e.target.className === Slick.preClickClassName);\r\n var column = columns[cell.cell];\r\n var suppressActiveCellChangedEvent = (options.editable && column && column.editor && options.suppressActiveCellChangeOnEdit) ? true : false;\r\n setActiveCellInternal(getCellNode(cell.row, cell.cell), null, preClickModeOn, suppressActiveCellChangedEvent, e);\r\n }\r\n }\r\n }\r\n\r\n function handleContextMenu(e) {\r\n var $cell = $(e.target).closestClass(\"slick-cell\", \"grid-canvas\");\r\n if ($cell.length === 0) {\r\n return;\r\n }\r\n\r\n // are we editing this cell?\r\n if (activeCellNode === $cell[0] && currentEditor !== null) {\r\n return;\r\n }\r\n\r\n trigger(self.onContextMenu, {}, e);\r\n }\r\n\r\n function handleDblClick(e) {\r\n var cell = getCellFromEvent(e);\r\n if (!cell || (currentEditor !== null && activeRow == cell.row && activeCell == cell.cell)) {\r\n return;\r\n }\r\n trigger(self.onDblClick, { row: cell.row, cell: cell.cell }, e);\r\n if (e.isImmediatePropagationStopped()) {\r\n return;\r\n }\r\n\r\n if (options.editable) {\r\n gotoCell(cell.row, cell.cell, true, e);\r\n }\r\n }\r\n\r\n // function handleHeaderMouseEnter(e) {\r\n // trigger(self.onHeaderMouseEnter, {\r\n // \"column\": $(this).data(\"column\"),\r\n // \"grid\": self\r\n // }, e);\r\n // }\r\n\r\n // function handleHeaderMouseLeave(e) {\r\n // trigger(self.onHeaderMouseLeave, {\r\n // \"column\": $(this).data(\"column\"),\r\n // \"grid\": self\r\n // }, e);\r\n // }\r\n\r\n function handleHeaderContextMenu(e) {\r\n var $header = $(e.target).closestClass(\"slick-header-column\", \"slick-header-columns\");\r\n var column = $header && $header.data(\"column\");\r\n trigger(self.onHeaderContextMenu, { column: column }, e);\r\n }\r\n\r\n function handleHeaderClick(e) {\r\n // if (columnResizeDragging) return;\r\n var $header = $(e.target).closestClass(\"slick-header-column\", \"slick-header-columns\");\r\n var column = $header && $header.data(\"column\");\r\n if (column) {\r\n trigger(self.onHeaderClick, { column: column }, e);\r\n }\r\n }\r\n\r\n function handleMouseEnter(e) {\r\n trigger(self.onMouseEnter, {}, e);\r\n }\r\n\r\n function handleMouseLeave(e) {\r\n trigger(self.onMouseLeave, {}, e);\r\n }\r\n\r\n function cellExists(row, cell) {\r\n return !(row < 0 || row >= getDataLength() || cell < 0 || cell >= columns.length);\r\n }\r\n\r\n function getCellFromPoint(x, y) {\r\n var row = getRowFromPosition(y);\r\n\r\n // tODO TODOFIX -> frozen rows at bottom\r\n if (hasFrozenRows && y <= getFrozenRowOffset(actualFrozenRow)) {\r\n row = getRowFromPosition(y - offset);\r\n }\r\n\r\n var cell = 0;\r\n\r\n var w = 0;\r\n for (var i = 0; i < columns.length && w < x; i++) {\r\n w += columns[i].width;\r\n cell++;\r\n }\r\n\r\n if (cell < 0) {\r\n cell = 0;\r\n }\r\n\r\n return { row: row, cell: cell - 1 };\r\n }\r\n\r\n function getCellFromNode(cellNode) {\r\n // read column number from .l<columnNumber> CSS class\r\n var cls = /l\\d+/.exec(cellNode.className);\r\n if (!cls) {\r\n throw new Error(\"getCellFromNode: cannot get cell - \" + cellNode.className);\r\n }\r\n return parseInt(cls[0].substr(1, cls[0].length - 1), 10);\r\n }\r\n\r\n function getRowFromNode(rowNode) {\r\n for (var row in rowsCache) {\r\n for (var i in rowsCache[row].rowNode) {\r\n if (rowsCache[row].rowNode[i] === rowNode) {\r\n return parseInt(row, 10) | 0;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n function getFrozenRowOffset(row) {\r\n var offset =\r\n (hasFrozenRows)\r\n ? (options.frozenBottom)\r\n ? (row >= actualFrozenRow)\r\n ? (h < viewportTopH)\r\n ? (getRowBottom(actualFrozenRow))// (options.rowHeight * (row+1) - offset)\r\n : h\r\n : 0\r\n : (row >= actualFrozenRow)\r\n ? frozenRowsHeight\r\n : 0\r\n : 0;\r\n\r\n return offset;\r\n }\r\n\r\n function getCellFromEvent(e) {\r\n var row, cell;\r\n var $cell = $(e.target).closestClass(\"slick-cell\", \"grid-canvas\");\r\n if (!$cell.length) {\r\n return null;\r\n }\r\n\r\n row = getRowFromNode($cell[0].parentNode);\r\n\r\n if (hasFrozenRows) {\r\n\r\n var c = $cell.closestClass(\"grid-canvas\").offset();\r\n\r\n var rowOffset = 0;\r\n var isBottom = $cell.closestClass(\"grid-canvas-bottom\").length;\r\n\r\n if (isBottom) {\r\n rowOffset = (options.frozenBottom) ? <number>$canvasTopL.height() : frozenRowsHeight;\r\n }\r\n\r\n row = getCellFromPoint(e.clientX - c.left, e.clientY - c.top + rowOffset /* + document.documentElement.scrollTop*/).row;\r\n }\r\n\r\n cell = getCellFromNode($cell[0]);\r\n\r\n if (row == null || cell == null) {\r\n return null;\r\n } else {\r\n return {\r\n \"row\": row,\r\n \"cell\": cell\r\n };\r\n }\r\n }\r\n\r\n function getCellNodeBox(row, cell) {\r\n if (!cellExists(row, cell)) {\r\n return null;\r\n }\r\n\r\n var frozenRowOffset = getFrozenRowOffset(row);\r\n\r\n\r\n\r\n var y1 = getRowTop(row) - frozenRowOffset;\r\n var y2 = y1 + getRowHeight(row) - 1;\r\n var x1 = 0;\r\n for (var i = 0; i < cell; i++) {\r\n x1 += columns[i].width;\r\n\r\n if (options.frozenColumn == i) {\r\n x1 = 0;\r\n }\r\n }\r\n var x2 = x1 + columns[cell].width;\r\n\r\n return {\r\n top: y1,\r\n left: x1,\r\n bottom: y2,\r\n right: x2\r\n };\r\n }\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////\r\n // cell switching\r\n\r\n function getRowHeight(row: number) {\r\n if (!options.variableRowHeight) {\r\n return options.rowHeight;\r\n }\r\n return rowPositionCache[row].height;\r\n }\r\n\r\n function resetActiveCell() {\r\n setActiveCellInternal(null, false);\r\n }\r\n\r\n function setFocus() {\r\n if (tabbingDirection == -1) {\r\n $focusSink[0].focus();\r\n } else {\r\n $focusSink2[0].focus();\r\n }\r\n }\r\n\r\n function scrollCellIntoView(row, cell, doPaging) {\r\n scrollRowIntoView(row, doPaging);\r\n\r\n if (cell <= options.frozenColumn) {\r\n return;\r\n }\r\n\r\n var colspan = getColspan(row, cell);\r\n internalScrollColumnIntoView(columnPosLeft[cell], columnPosRight[cell + (colspan > 1 ? colspan - 1 : 0)]);\r\n }\r\n\r\n function internalScrollColumnIntoView(left, right) {\r\n var scrollRight = scrollLeft + <number>$viewportScrollContainerX.width();\r\n\r\n if (left < scrollLeft) {\r\n $.each($viewportScrollContainerX, function (idx, el) { el.scrollLeft = left; });\r\n handleScroll();\r\n render();\r\n } else if (right > scrollRight) {\r\n $.each($viewportScrollContainerX, function (idx, el) { el.scrollLeft = Math.min(left, right - $viewportScrollContainerX[0].clientWidth); });\r\n handleScroll();\r\n render();\r\n }\r\n }\r\n\r\n function scrollColumnIntoView(cell) {\r\n internalScrollColumnIntoView(columnPosLeft[cell], columnPosRight[cell]);\r\n }\r\n\r\n function setActiveCellInternal(newCell, opt_editMode?, preClickModeOn?, suppressActiveCellChangedEvent?, e?) {\r\n if (activeCellNode !== null) {\r\n makeActiveCellNormal();\r\n $(activeCellNode).removeClass(\"active\");\r\n if (rowsCache[activeRow]) {\r\n rowsCache[activeRow].rowNode.forEach(x => x.classList.remove(\"active\")); // $(rowsCache[activeRow].rowNode).removeClass(\"active\");\r\n }\r\n }\r\n\r\n var activeCellChanged = (activeCellNode !== newCell);\r\n activeCellNode = newCell;\r\n\r\n if (activeCellNode != null) {\r\n var $activeCellNode = $(activeCellNode);\r\n var $activeCellOffset = $activeCellNode.offset();\r\n\r\n var rowOffset = Math.floor($activeCellNode.closestClass(\"grid-canvas\").offset().top);\r\n var isBottom = $activeCellNode.closestClass(\"grid-canvas-bottom\").length;\r\n\r\n if (hasFrozenRows && isBottom) {\r\n rowOffset -= (options.frozenBottom)\r\n ? <number>$canvasTopL.height()\r\n : frozenRowsHeight;\r\n }\r\n\r\n let cell = getCellFromPoint($activeCellOffset.left, Math.ceil($activeCellOffset.top) - rowOffset);\r\n\r\n activeRow = cell.row;\r\n activeCell = activePosX = activeCell = activePosX = getCellFromNode(activeCellNode);\r\n\r\n $activeCellNode.addClass(\"active\");\r\n if (rowsCache[activeRow]) {\r\n rowsCache[activeRow].rowNode.forEach(x => x.classList.add(\"active\"));// $(rowsCache[activeRow].rowNode).addClass('active');\r\n }\r\n\r\n if (opt_editMode == null) {\r\n opt_editMode = (activeRow == getDataLength()) || options.autoEdit;\r\n }\r\n\r\n if (options.showCellSelection) {\r\n $(activeCellNode).addClass(\"active\");\r\n rowsCache[activeRow].rowNode.forEach(x => x.classList.add(\"active\")); // $(rowsCache[activeRow].rowNode).addClass(\"active\");\r\n }\r\n\r\n if (options.editable && opt_editMode && isCellPotentiallyEditable(activeRow, activeCell)) {\r\n clearTimeout(h_editorLoader);\r\n\r\n if (options.asyncEditorLoading) {\r\n h_editorLoader = setTimeout(function () {\r\n makeActiveCellEditable(undefined, preClickModeOn, e);\r\n }, options.asyncEditorLoadDelay);\r\n } else {\r\n makeActiveCellEditable(undefined, preClickModeOn, e);\r\n }\r\n }\r\n } else {\r\n activeRow = activeCell = null;\r\n }\r\n\r\n // this optimisation causes trouble - MLeibman #329\r\n // if (activeCellChanged) {\r\n if (!suppressActiveCellChangedEvent) { trigger(self.onActiveCellChanged, getActiveCell(), e); }\r\n // }\r\n }\r\n\r\n function clearTextSelection() {\r\n if ((<any>document).selection && (<any>document).selection.empty) {\r\n try {\r\n // iE fails here if selected element is not in dom\r\n (<any>document).selection.empty();\r\n } catch (e) { }\r\n } else if (window.getSelection) {\r\n var sel = window.getSelection();\r\n if (sel && sel.removeAllRanges) {\r\n sel.removeAllRanges();\r\n }\r\n }\r\n }\r\n\r\n function isCellPotentiallyEditable(row, cell) {\r\n var dataLength = getDataLength();\r\n // is the data for this row loaded?\r\n if (row < dataLength && !getDataItem(row)) {\r\n return false;\r\n }\r\n\r\n // are we in the Add New row? can we create new from this cell?\r\n if (columns[cell].cannotTriggerInsert && row >= dataLength) {\r\n return false;\r\n }\r\n\r\n // does this cell have an editor?\r\n if (!getEditor(row, cell) || columns[cell].readonly) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function makeActiveCellNormal() {\r\n if (!currentEditor) {\r\n return;\r\n }\r\n trigger(self.onBeforeCellEditorDestroy, { editor: currentEditor });\r\n currentEditor.destroy();\r\n currentEditor = null;\r\n\r\n if (activeCellNode) {\r\n var d = getDataItem(activeRow);\r\n $(activeCellNode).removeClass(\"editable invalid\");\r\n if (d) {\r\n var column = columns[activeCell];\r\n var formatter = getFormatter(activeRow, column);\r\n var formatterResult = formatter(activeRow, activeCell, getDataItemValueForColumn(d, column), column, d, self);\r\n applyFormatResultToCellNode(formatterResult, activeCellNode);\r\n if (self.onAppendCell.countHandlers() > 0) {\r\n let item = getDataItem(activeRow);\r\n let value = getDataItemValueForColumn(item, columns[activeCell]);\r\n trigger(self.onAppendCell,\r\n {\r\n row: activeRow, cell: activeCell,\r\n value: value, item: item,\r\n column: column, dom: activeCellNode\r\n });\r\n }\r\n invalidatePostProcessingResults(activeRow);\r\n }\r\n }\r\n\r\n // if there previously was text selected on a page (such as selected text in the edit cell just removed),\r\n // iE can't set focus to anything else correctly\r\n if (navigator.userAgent.toLowerCase().match(/msie/)) {\r\n clearTextSelection();\r\n }\r\n\r\n getEditorLock().deactivate(editController);\r\n }\r\n\r\n function makeActiveCellEditable(editor, preClickModeOn, e) {\r\n if (!activeCellNode) {\r\n return;\r\n }\r\n if (!options.editable) {\r\n throw new Error(\"Grid : makeActiveCellEditable : should never get called when options.editable is false\");\r\n }\r\n\r\n // cancel pending async call if there is one\r\n clearTimeout(h_editorLoader);\r\n\r\n if (!isCellPotentiallyEditable(activeRow, activeCell)) {\r\n return;\r\n }\r\n\r\n var columnDef = columns[activeCell];\r\n var item = getDataItem(activeRow);\r\n\r\n if (trigger(self.onBeforeEditCell, { row: activeRow, cell: activeCell, item: item, column: columnDef }) === false) {\r\n setFocus();\r\n return;\r\n }\r\n\r\n getEditorLock().activate(editController);\r\n $(activeCellNode).addClass(\"editable\");\r\n\r\n var useEditor = editor || getEditor(activeRow, activeCell);\r\n\r\n // don't clear the cell if a custom editor is passed through\r\n if (!editor && !useEditor.suppressClearOnEdit) {\r\n activeCellNode.innerHTML = \"\";\r\n }\r\n\r\n var metadata = data.getItemMetadata && data.getItemMetadata(activeRow);\r\n metadata = metadata && metadata.columns;\r\n var columnMetaData = metadata && (metadata[columnDef.id] || metadata[activeCell]);\r\n\r\n currentEditor = new useEditor({\r\n grid: self,\r\n gridPosition: absBox($container[0]),\r\n position: absBox(activeCellNode),\r\n container: activeCellNode,\r\n column: columnDef,\r\n columnMetaData: columnMetaData,\r\n item: item || {},\r\n event: e,\r\n commitChanges: commitEditAndNavDown,\r\n commitChangesOnly: commitEditAndSetFocus,\r\n cancelChanges: cancelEditAndSetFocus\r\n });\r\n\r\n if (item) {\r\n currentEditor.loadValue(item);\r\n if (preClickModeOn && currentEditor.preClick) {\r\n currentEditor.preClick();\r\n }\r\n }\r\n\r\n serializedEditorValue = currentEditor.serializeValue();\r\n\r\n if (currentEditor.position) {\r\n handleActiveCellPositionChange();\r\n }\r\n }\r\n\r\n function commitEditAndNavDown() {\r\n // if the commit fails, it would do so due to a validation error\r\n // if so, do not steal the focus from the editor\r\n if (getEditorLock().commitCurrentEdit()) {\r\n setFocus();\r\n if (options.autoEdit) {\r\n navigateDown();\r\n }\r\n }\r\n }\r\n\r\n function commitEditAndSetFocus() {\r\n // if the commit fails, it would do so due to a validation error\r\n // if so, do not steal the focus from the editor\r\n if (getEditorLock().commitCurrentEdit()) {\r\n setFocus();\r\n }\r\n }\r\n\r\n function cancelEditAndSetFocus() {\r\n if (getEditorLock().cancelCurrentEdit()) {\r\n setFocus();\r\n }\r\n }\r\n\r\n function absBox(elem) {\r\n var box = {\r\n top: elem.offsetTop,\r\n left: elem.offsetLeft,\r\n bottom: 0,\r\n right: 0,\r\n width: $(elem).width(), // outerWidth(),\r\n height: $(elem).height(), // outerHeight(),\r\n visible: true\r\n };\r\n box.bottom = box.top + box.height;\r\n box.right = box.left + box.width;\r\n\r\n // walk up the tree\r\n var offsetParent = elem.offsetParent;\r\n while ((elem = elem.parentNode) != document.body) {\r\n if (elem == null) { break; }\r\n\r\n if (box.visible && elem.scrollHeight != elem.offsetHeight && $(elem).css(\"overflowY\") != \"visible\") {\r\n box.visible = box.bottom > elem.scrollTop && box.top < elem.scrollTop + elem.clientHeight;\r\n }\r\n\r\n if (box.visible && elem.scrollWidth != elem.offsetWidth && $(elem).css(\"overflowX\") != \"visible\") {\r\n box.visible = box.right > elem.scrollLeft && box.left < elem.scrollLeft + elem.clientWidth;\r\n }\r\n\r\n box.left -= elem.scrollLeft;\r\n box.top -= elem.scrollTop;\r\n\r\n if (elem === offsetParent) {\r\n box.left += elem.offsetLeft;\r\n box.top += elem.offsetTop;\r\n offsetParent = elem.offsetParent;\r\n }\r\n\r\n box.bottom = box.top + box.height;\r\n box.right = box.left + box.width;\r\n }\r\n\r\n return box;\r\n }\r\n\r\n function getActiveCellPosition() {\r\n return absBox(activeCellNode);\r\n }\r\n\r\n function getGridPosition() {\r\n return absBox($container[0]);\r\n }\r\n\r\n function handleActiveCellPositionChange() {\r\n if (!activeCellNode) {\r\n return;\r\n }\r\n\r\n trigger(self.onActiveCellPositionChanged, {});\r\n\r\n if (currentEditor) {\r\n var cellBox = getActiveCellPosition();\r\n if (currentEditor.show && currentEditor.hide) {\r\n if (!cellBox.visible) {\r\n currentEditor.hide();\r\n } else {\r\n currentEditor.show();\r\n }\r\n }\r\n\r\n if (currentEditor.position) {\r\n currentEditor.position(cellBox);\r\n }\r\n }\r\n }\r\n\r\n function getCellEditor() {\r\n return currentEditor;\r\n }\r\n\r\n function getActiveCell() {\r\n if (!activeCellNode) {\r\n return null;\r\n } else {\r\n return { row: activeRow, cell: activeCell };\r\n }\r\n }\r\n\r\n function getActiveCellNode() {\r\n return activeCellNode;\r\n }\r\n\r\n function scrollRowIntoView(row, doPaging) {\r\n if (!hasFrozenRows ||\r\n (!options.frozenBottom && row > actualFrozenRow - 1) ||\r\n (options.frozenBottom && row < actualFrozenRow - 1)) {\r\n\r\n var viewportScrollH = <number>$viewportScrollContainerY.height();\r\n\r\n // if frozen row on top\r\n // subtract number of frozen row\r\n var rowNumber = (hasFrozenRows && !options.frozenBottom ? row - options.frozenRow : row);\r\n\r\n var rowBottom = options.variableRowHeight ? rowPositionCache[row].bottom : ((rowNumber + 1) * options.rowHeight);\r\n\r\n var rowAtTop = options.variableRowHeight ? rowPositionCache[row].top : (rowNumber * options.rowHeight);\r\n var rowAtBottom = rowBottom - viewportScrollH + (viewportHasHScroll ? scrollbarDimensions.height : 0);\r\n\r\n // need to page down?\r\n if (rowBottom > scrollTop + viewportScrollH + offset) {\r\n scrollTo(doPaging ? rowAtTop : rowAtBottom);\r\n render();\r\n } else if (rowAtTop < scrollTop + offset) {\r\n scrollTo(doPaging ? rowAtBottom : rowAtTop);\r\n render();\r\n }\r\n }\r\n }\r\n\r\n function scrollRowToTop(row: number) {\r\n scrollTo(options.variableRowHeight ? rowPositionCache[row].top : (row * options.rowHeight));\r\n render();\r\n }\r\n\r\n function scrollPage(dir) {\r\n var deltaRows = dir * numVisibleRows;\r\n /// first fully visible row crosses the line with\r\n /// y == bottomOfTopmostFullyVisibleRow\r\n var bottomOfTopmostFullyVisibleRow = scrollTop + options.rowHeight - 1; // tODO\r\n scrollTo((getRowFromPosition(bottomOfTopmostFullyVisibleRow) + deltaRows) * options.rowHeight); // tODO\r\n render();\r\n\r\n if (options.enableCellNavigation && activeRow != null) {\r\n var row = activeRow + deltaRows;\r\n var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n if (row >= dataLengthIncludingAddNew) {\r\n row = dataLengthIncludingAddNew - 1;\r\n }\r\n if (row < 0) {\r\n row = 0;\r\n }\r\n\r\n var cell = 0, prevCell = null;\r\n var prevActivePosX = activePosX;\r\n while (cell <= activePosX) {\r\n if (canCellBeActive(row, cell)) {\r\n prevCell = cell;\r\n }\r\n cell += getColspan(row, cell);\r\n }\r\n\r\n if (prevCell !== null) {\r\n setActiveCellInternal(getCellNode(row, prevCell));\r\n activePosX = prevActivePosX;\r\n } else {\r\n resetActiveCell();\r\n }\r\n }\r\n }\r\n\r\n function navigatePageDown() {\r\n scrollPage(1);\r\n }\r\n\r\n function navigatePageUp() {\r\n scrollPage(-1);\r\n }\r\n\r\n function navigateTop() {\r\n navigateToRow(0);\r\n }\r\n\r\n function navigateBottom() {\r\n navigateToRow(getDataLength() - 1);\r\n }\r\n\r\n function navigateToRow(row) {\r\n var num_rows = getDataLength();\r\n if (!num_rows) { return true; }\r\n\r\n if (row < 0) { row = 0; } else if (row >= num_rows) { row = num_rows - 1; }\r\n\r\n scrollCellIntoView(row, 0, true);\r\n if (options.enableCellNavigation && activeRow != null) {\r\n var cell = 0, prevCell = null;\r\n var prevActivePosX = activePosX;\r\n while (cell <= activePosX) {\r\n if (canCellBeActive(row, cell)) {\r\n prevCell = cell;\r\n }\r\n cell += getColspan(row, cell);\r\n }\r\n\r\n if (prevCell !== null) {\r\n setActiveCellInternal(getCellNode(row, prevCell));\r\n activePosX = prevActivePosX;\r\n } else {\r\n resetActiveCell();\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n function getColspan(row, cell) {\r\n var metadata = data.getItemMetadata && data.getItemMetadata(row);\r\n if (!metadata || !metadata.columns) {\r\n return 1;\r\n }\r\n\r\n var columnData = metadata.columns[columns[cell].id] || metadata.columns[cell];\r\n var colspan = (columnData && columnData.colspan);\r\n if (colspan === \"*\") {\r\n colspan = columns.length - cell;\r\n } else {\r\n colspan = colspan || 1;\r\n }\r\n\r\n return colspan;\r\n }\r\n\r\n function findFirstFocusableCell(row) {\r\n var cell = 0;\r\n while (cell < columns.length) {\r\n if (canCellBeActive(row, cell)) {\r\n return cell;\r\n }\r\n cell += getColspan(row, cell);\r\n }\r\n return null;\r\n }\r\n\r\n function findLastFocusableCell(row) {\r\n var cell = 0;\r\n var lastFocusableCell = null;\r\n while (cell < columns.length) {\r\n if (canCellBeActive(row, cell)) {\r\n lastFocusableCell = cell;\r\n }\r\n cell += getColspan(row, cell);\r\n }\r\n return lastFocusableCell;\r\n }\r\n\r\n function gotoRight(row, cell, posX) {\r\n if (cell >= columns.length) {\r\n return null;\r\n }\r\n\r\n do {\r\n cell += getColspan(row, cell);\r\n }\r\n while (cell < columns.length && !canCellBeActive(row, cell));\r\n\r\n if (cell < columns.length) {\r\n return {\r\n \"row\": row,\r\n \"cell\": cell,\r\n \"posX\": cell\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n function gotoLeft(row, cell, posX) {\r\n if (cell <= 0) {\r\n return null;\r\n }\r\n\r\n var firstFocusableCell = findFirstFocusableCell(row);\r\n if (firstFocusableCell === null || firstFocusableCell >= cell) {\r\n return null;\r\n }\r\n\r\n var prev = {\r\n \"row\": row,\r\n \"cell\": firstFocusableCell,\r\n \"posX\": firstFocusableCell\r\n };\r\n var pos;\r\n while (true) {\r\n pos = gotoRight(prev.row, prev.cell, prev.posX);\r\n if (!pos) {\r\n return null;\r\n }\r\n if (pos.cell >= cell) {\r\n return prev;\r\n }\r\n prev = pos;\r\n }\r\n }\r\n\r\n function gotoDown(row, cell, posX) {\r\n var prevCell;\r\n var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n while (true) {\r\n if (++row >= dataLengthIncludingAddNew) {\r\n return null;\r\n }\r\n\r\n prevCell = cell = 0;\r\n while (cell <= posX) {\r\n prevCell = cell;\r\n cell += getColspan(row, cell);\r\n }\r\n\r\n if (canCellBeActive(row, prevCell)) {\r\n return {\r\n \"row\": row,\r\n \"cell\": prevCell,\r\n \"posX\": posX\r\n };\r\n }\r\n }\r\n }\r\n\r\n function gotoUp(row, cell, posX) {\r\n var prevCell;\r\n while (true) {\r\n if (--row < 0) {\r\n return null;\r\n }\r\n\r\n prevCell = cell = 0;\r\n while (cell <= posX) {\r\n prevCell = cell;\r\n cell += getColspan(row, cell);\r\n }\r\n\r\n if (canCellBeActive(row, prevCell)) {\r\n return {\r\n \"row\": row,\r\n \"cell\": prevCell,\r\n \"posX\": posX\r\n };\r\n }\r\n }\r\n }\r\n\r\n function gotoNext(row, cell, posX) {\r\n if (row == null && cell == null) {\r\n row = cell = posX = 0;\r\n if (canCellBeActive(row, cell)) {\r\n return {\r\n \"row\": row,\r\n \"cell\": cell,\r\n \"posX\": cell\r\n };\r\n }\r\n }\r\n\r\n var pos = gotoRight(row, cell, posX);\r\n if (pos) {\r\n return pos;\r\n }\r\n\r\n var firstFocusableCell = null;\r\n var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n\r\n // if at last row, cycle through columns rather than get stuck in the last one\r\n if (row === dataLengthIncludingAddNew - 1) { row--; }\r\n\r\n while (++row < dataLengthIncludingAddNew) {\r\n firstFocusableCell = findFirstFocusableCell(row);\r\n if (firstFocusableCell !== null) {\r\n return {\r\n \"row\": row,\r\n \"cell\": firstFocusableCell,\r\n \"posX\": firstFocusableCell\r\n };\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n function gotoPrev(row, cell, posX) {\r\n if (row == null && cell == null) {\r\n row = getDataLengthIncludingAddNew() - 1;\r\n cell = posX = columns.length - 1;\r\n if (canCellBeActive(row, cell)) {\r\n return {\r\n \"row\": row,\r\n \"cell\": cell,\r\n \"posX\": cell\r\n };\r\n }\r\n }\r\n\r\n var pos;\r\n var lastSelectableCell;\r\n while (!pos) {\r\n pos = gotoLeft(row, cell, posX);\r\n if (pos) {\r\n break;\r\n }\r\n if (--row < 0) {\r\n return null;\r\n }\r\n\r\n cell = 0;\r\n lastSelectableCell = findLastFocusableCell(row);\r\n if (lastSelectableCell !== null) {\r\n pos = {\r\n \"row\": row,\r\n \"cell\": lastSelectableCell,\r\n \"posX\": lastSelectableCell\r\n };\r\n }\r\n }\r\n return pos;\r\n }\r\n\r\n function gotoRowStart(row, cell, posX) {\r\n var newCell = findFirstFocusableCell(row);\r\n if (newCell === null) { return null; }\r\n\r\n return {\r\n \"row\": row,\r\n \"cell\": newCell,\r\n \"posX\": newCell\r\n };\r\n }\r\n\r\n function gotoRowEnd(row, cell, posX) {\r\n var newCell = findLastFocusableCell(row);\r\n if (newCell === null) { return null; }\r\n\r\n return {\r\n \"row\": row,\r\n \"cell\": newCell,\r\n \"posX\": newCell\r\n };\r\n }\r\n\r\n function navigateRight() {\r\n return navigate(\"right\");\r\n }\r\n\r\n function navigateLeft() {\r\n return navigate(\"left\");\r\n }\r\n\r\n function navigateDown() {\r\n return navigate(\"down\");\r\n }\r\n\r\n function navigateUp() {\r\n return navigate(\"up\");\r\n }\r\n\r\n function navigateNext() {\r\n return navigate(\"next\");\r\n }\r\n\r\n function navigatePrev() {\r\n return navigate(\"prev\");\r\n }\r\n\r\n function navigateRowStart() {\r\n return navigate(\"home\");\r\n }\r\n\r\n function navigateRowEnd() {\r\n return navigate(\"end\");\r\n }\r\n\r\n /**\r\n * @param {string} dir Navigation direction.\r\n * @return {boolean} Whether navigation resulted in a change of active cell.\r\n */\r\n function navigate(dir) {\r\n if (!options.enableCellNavigation) {\r\n return false;\r\n }\r\n\r\n if (!activeCellNode && dir != \"prev\" && dir != \"next\") {\r\n return false;\r\n }\r\n\r\n if (!getEditorLock().commitCurrentEdit()) {\r\n return true;\r\n }\r\n setFocus();\r\n\r\n var tabbingDirections = {\r\n \"up\": -1,\r\n \"down\": 1,\r\n \"left\": -1,\r\n \"right\": 1,\r\n \"prev\": -1,\r\n \"next\": 1,\r\n \"home\": -1,\r\n \"end\": 1\r\n };\r\n tabbingDirection = tabbingDirections[dir];\r\n\r\n var stepFunctions = {\r\n \"up\": gotoUp,\r\n \"down\": gotoDown,\r\n \"left\": gotoLeft,\r\n \"right\": gotoRight,\r\n \"prev\": gotoPrev,\r\n \"next\": gotoNext,\r\n \"home\": gotoRowStart,\r\n \"end\": gotoRowEnd\r\n };\r\n var stepFn = stepFunctions[dir];\r\n var pos = stepFn(activeRow, activeCell, activePosX);\r\n if (pos) {\r\n if (hasFrozenRows && options.frozenBottom && pos.row == getDataLength()) { // tODO correct?\r\n return;\r\n }\r\n\r\n var isAddNewRow = (pos.row == getDataLength());\r\n\r\n if ((!options.frozenBottom && pos.row >= actualFrozenRow)\r\n || (options.frozenBottom && pos.row < actualFrozenRow)\r\n ) {\r\n scrollCellIntoView(pos.row, pos.cell, !isAddNewRow && options.emulatePagingWhenScrolling);\r\n }\r\n setActiveCellInternal(getCellNode(pos.row, pos.cell));\r\n activePosX = pos.posX;\r\n return true;\r\n } else {\r\n setActiveCellInternal(getCellNode(activeRow, activeCell));\r\n return false;\r\n }\r\n }\r\n\r\n function getCellNode(row, cell) {\r\n if (rowsCache[row]) {\r\n ensureCellNodesInRowsCache(row);\r\n // try {\r\n // return rowsCache[row].cellNodesByColumnIdx[cell][0];\r\n // } catch (e) {\r\n return rowsCache[row].cellNodesByColumnIdx[cell];\r\n // }\r\n }\r\n return null;\r\n }\r\n\r\n function setActiveCell(row, cell, opt_editMode, preClickModeOn, suppressActiveCellChangedEvent) {\r\n if (!initialized) { return; }\r\n if (row > getDataLength() || row < 0 || cell >= columns.length || cell < 0) {\r\n return;\r\n }\r\n\r\n if (!options.enableCellNavigation) {\r\n return;\r\n }\r\n\r\n scrollCellIntoView(row, cell, false);\r\n setActiveCellInternal(getCellNode(row, cell), opt_editMode, preClickModeOn, suppressActiveCellChangedEvent);\r\n }\r\n\r\n function canCellBeActive(row, cell) {\r\n if (!options.enableCellNavigation || row >= getDataLengthIncludingAddNew() ||\r\n row < 0 || cell >= columns.length || cell < 0) {\r\n return false;\r\n }\r\n\r\n var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n if (rowMetadata && typeof rowMetadata.focusable !== \"undefined\") {\r\n return !!rowMetadata.focusable;\r\n }\r\n\r\n var columnMetadata = rowMetadata && rowMetadata.columns;\r\n if (columnMetadata && columnMetadata[columns[cell].id] && typeof columnMetadata[columns[cell].id].focusable !== \"undefined\") {\r\n return !!columnMetadata[columns[cell].id].focusable;\r\n }\r\n if (columnMetadata && columnMetadata[cell] && typeof columnMetadata[cell].focusable !== \"undefined\") {\r\n return !!columnMetadata[cell].focusable;\r\n }\r\n\r\n return !!columns[cell].focusable;\r\n }\r\n\r\n function canCellBeSelected(row, cell) {\r\n if (row >= getDataLength() || row < 0 || cell >= columns.length || cell < 0) {\r\n return false;\r\n }\r\n\r\n var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n if (rowMetadata && typeof rowMetadata.selectable !== \"undefined\") {\r\n return !!rowMetadata.selectable;\r\n }\r\n\r\n var columnMetadata = rowMetadata && rowMetadata.columns && (rowMetadata.columns[columns[cell].id] || rowMetadata.columns[cell]);\r\n if (columnMetadata && typeof columnMetadata.selectable !== \"undefined\") {\r\n return !!columnMetadata.selectable;\r\n }\r\n\r\n return !!columns[cell].selectable;\r\n }\r\n\r\n function gotoCell(row, cell, forceEdit?, e?) {\r\n if (!initialized) { return; }\r\n if (!canCellBeActive(row, cell)) {\r\n return;\r\n }\r\n\r\n if (!getEditorLock().commitCurrentEdit()) {\r\n return;\r\n }\r\n\r\n scrollCellIntoView(row, cell, false);\r\n\r\n var newCell = getCellNode(row, cell);\r\n\r\n // if selecting the 'add new' row, start editing right away\r\n var column = columns[cell];\r\n var suppressActiveCellChangedEvent = !!(options.editable && column && column.editor && options.suppressActiveCellChangeOnEdit);\r\n setActiveCellInternal(newCell, (forceEdit || (row === getDataLength()) || options.autoEdit), null, suppressActiveCellChangedEvent, e);\r\n\r\n // if no editor was created, set the focus back on the grid\r\n if (!currentEditor) {\r\n setFocus();\r\n }\r\n }\r\n\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////\r\n // iEditor implementation for the editor lock\r\n\r\n function commitCurrentEdit() {\r\n var item = getDataItem(activeRow);\r\n var column = columns[activeCell];\r\n\r\n if (currentEditor) {\r\n if (currentEditor.isValueChanged()) {\r\n var validationResults = currentEditor.validate();\r\n\r\n if (validationResults.valid) {\r\n if (activeRow < getDataLength()) {\r\n var editCommand = {\r\n row: activeRow,\r\n cell: activeCell,\r\n editor: currentEditor,\r\n serializedValue: currentEditor.serializeValue(),\r\n prevSerializedValue: serializedEditorValue,\r\n execute: function () {\r\n this.editor.applyValue(item, this.serializedValue);\r\n updateRow(this.row);\r\n trigger(self.onCellChange, {\r\n row: this.row,\r\n cell: this.cell,\r\n item: item,\r\n value: this.serializedValue\r\n });\r\n },\r\n undo: function () {\r\n this.editor.applyValue(item, this.prevSerializedValue);\r\n updateRow(this.row);\r\n trigger(self.onCellChange, {\r\n row: this.row,\r\n cell: this.cell,\r\n item: item,\r\n value: this.prevSerializedValue\r\n });\r\n }\r\n };\r\n\r\n if (options.editCommandHandler) {\r\n makeActiveCellNormal();\r\n options.editCommandHandler(item, column, editCommand);\r\n } else {\r\n editCommand.execute();\r\n makeActiveCellNormal();\r\n }\r\n\r\n } else {\r\n var newItem = {};\r\n currentEditor.applyValue(newItem, currentEditor.serializeValue());\r\n makeActiveCellNormal();\r\n trigger(self.onAddNewRow, { item: newItem, column: column });\r\n }\r\n\r\n // check whether the lock has been re-acquired by event handlers\r\n return !getEditorLock().isActive();\r\n } else {\r\n // re-add the CSS class to trigger transitions, if any.\r\n $(activeCellNode).removeClass(\"invalid\");\r\n $(activeCellNode).width(); // force layout\r\n $(activeCellNode).addClass(\"invalid\");\r\n\r\n trigger(self.onValidationError, {\r\n editor: currentEditor,\r\n cellNode: activeCellNode,\r\n validationResults: validationResults,\r\n row: activeRow,\r\n cell: activeCell,\r\n column: column\r\n });\r\n\r\n currentEditor.focus();\r\n return false;\r\n }\r\n }\r\n\r\n makeActiveCellNormal();\r\n }\r\n return true;\r\n }\r\n\r\n function cancelCurrentEdit() {\r\n makeActiveCellNormal();\r\n return true;\r\n }\r\n\r\n function rowsToRanges(rows) {\r\n var ranges = [];\r\n var lastCell = columns.length - 1;\r\n for (var i = 0; i < rows.length; i++) {\r\n ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell));\r\n }\r\n return ranges;\r\n }\r\n\r\n function getSelectedRows() {\r\n if (!selectionModel) {\r\n throw new Error(\"Selection model is not set\");\r\n }\r\n return selectedRows;\r\n }\r\n\r\n function setSelectedRows(rows) {\r\n if (!selectionModel) {\r\n throw new Error(\"Selection model is not set\");\r\n }\r\n // if (self && self.getEditorLock && !self.getEditorLock().isActive()) {\r\n selectionModel.setSelectedRanges(rowsToRanges(rows));\r\n // }\r\n }\r\n\r\n\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////\r\n // public API\r\n\r\n $.shallowExtend(this, {\r\n \"slickGridVersion\": \"2.4.7\",\r\n\r\n // events\r\n \"onScroll\": new Slick.Event(),\r\n \"onSort\": new Slick.Event(),\r\n // \"onHeaderMouseEnter\": new Slick.Event(),\r\n // \"onHeaderMouseLeave\": new Slick.Event(),\r\n \"onHeaderContextMenu\": new Slick.Event(),\r\n \"onHeaderClick\": new Slick.Event(),\r\n \"onHeaderCellRendered\": new Slick.Event(),\r\n \"onBeforeHeaderCellDestroy\": new Slick.Event(),\r\n \"onHeaderRowCellRendered\": new Slick.Event(),\r\n \"onFooterRowCellRendered\": new Slick.Event(),\r\n \"onBeforeHeaderRowCellDestroy\": new Slick.Event(),\r\n \"onBeforeFooterRowCellDestroy\": new Slick.Event(),\r\n \"onMouseEnter\": new Slick.Event(),\r\n \"onMouseLeave\": new Slick.Event(),\r\n \"onClick\": new Slick.Event(),\r\n \"onDblClick\": new Slick.Event(),\r\n \"onContextMenu\": new Slick.Event(),\r\n \"onKeyDown\": new Slick.Event(),\r\n \"onAddNewRow\": new Slick.Event(),\r\n \"onAppendCell\": new Slick.Event(),\r\n \"onValidationError\": new Slick.Event(),\r\n \"onViewportChanged\": new Slick.Event(),\r\n \"onColumnsReordered\": new Slick.Event(),\r\n \"onColumnsResized\": new Slick.Event(),\r\n \"onCellChange\": new Slick.Event(),\r\n \"onBeforeEditCell\": new Slick.Event(),\r\n \"onBeforeCellEditorDestroy\": new Slick.Event(),\r\n \"onBeforeDestroy\": new Slick.Event(),\r\n \"onActiveCellChanged\": new Slick.Event(),\r\n \"onActiveCellPositionChanged\": new Slick.Event(),\r\n \"onDragInit\": new Slick.Event(),\r\n \"onDragStart\": new Slick.Event(),\r\n \"onDrag\": new Slick.Event(),\r\n \"onDragEnd\": new Slick.Event(),\r\n \"onSelectedRowsChanged\": new Slick.Event(),\r\n \"onCellCssStylesChanged\": new Slick.Event(),\r\n \"onAutosizeColumns\": new Slick.Event(),\r\n \"onRendered\": new Slick.Event(),\r\n \"onAppendRow\": new Slick.Event(), // added NEW\r\n \"onBeforeRemoveRow\": new Slick.Event(), // added NEW\r\n\r\n // methods\r\n \"registerPlugin\": registerPlugin,\r\n \"unregisterPlugin\": unregisterPlugin,\r\n \"getPluginByName\": getPluginByName,\r\n \"getColumns\": getColumns,\r\n \"setColumns\": setColumns,\r\n \"getColumnIndex\": getColumnIndex,\r\n \"getColumnById\": getColumnById,\r\n \"updateColumnHeader\": updateColumnHeader,\r\n \"setSortColumn\": setSortColumn,\r\n \"setSortColumns\": setSortColumns,\r\n \"getSortColumns\": getSortColumns,\r\n \"autosizeColumns\": autosizeColumns,\r\n \"getOptions\": getOptions,\r\n \"setOptions\": setOptions,\r\n \"getData\": getData,\r\n \"getDataLength\": getDataLength,\r\n \"getDataItem\": getDataItem,\r\n \"setData\": setData,\r\n \"getSelectionModel\": getSelectionModel,\r\n \"setSelectionModel\": setSelectionModel,\r\n \"getSelectedRows\": getSelectedRows,\r\n \"setSelectedRows\": setSelectedRows,\r\n \"getContainerNode\": getContainerNode,\r\n \"updatePagingStatusFromView\": updatePagingStatusFromView,\r\n \"applyFormatResultToCellNode\": applyFormatResultToCellNode,\r\n\r\n \"render\": render,\r\n \"invalidate\": invalidate,\r\n \"invalidateRow\": invalidateRow,\r\n \"invalidateRows\": invalidateRows,\r\n \"invalidateAllRows\": invalidateAllRows,\r\n \"updateCell\": updateCell,\r\n \"updateRow\": updateRow,\r\n \"getViewport\": getVisibleRange,\r\n \"getRenderedRange\": getRenderedRange,\r\n \"resizeCanvas\": resizeCanvas,\r\n \"updateRowCount\": updateRowCount,\r\n \"scrollRowIntoView\": scrollRowIntoView,\r\n \"scrollRowToTop\": scrollRowToTop,\r\n \"scrollCellIntoView\": scrollCellIntoView,\r\n \"scrollColumnIntoView\": scrollColumnIntoView,\r\n \"getCanvasNode\": getCanvasNode,\r\n \"getUID\": getUID,\r\n \"getHeaderColumnWidthDiff\": getHeaderColumnWidthDiff,\r\n \"getScrollbarDimensions\": getScrollbarDimensions,\r\n \"getHeadersWidth\": getHeadersWidth,\r\n \"getCanvasWidth\": getCanvasWidth,\r\n \"getCanvases\": getCanvases,\r\n \"getActiveCanvasNode\": getActiveCanvasNode,\r\n \"setActiveCanvasNode\": setActiveCanvasNode,\r\n \"getViewportNode\": getViewportNode,\r\n \"getActiveViewportNode\": getActiveViewportNode,\r\n \"setActiveViewportNode\": setActiveViewportNode,\r\n \"focus\": setFocus,\r\n \"scrollTo\": scrollTo,\r\n\r\n \"getCellFromPoint\": getCellFromPoint,\r\n \"getCellFromEvent\": getCellFromEvent,\r\n \"getActiveCell\": getActiveCell,\r\n \"setActiveCell\": setActiveCell,\r\n \"getActiveCellNode\": getActiveCellNode,\r\n \"getActiveCellPosition\": getActiveCellPosition,\r\n \"resetActiveCell\": resetActiveCell,\r\n \"editActiveCell\": makeActiveCellEditable,\r\n \"getCellEditor\": getCellEditor,\r\n \"getCellNode\": getCellNode,\r\n \"getCellNodeBox\": getCellNodeBox,\r\n \"canCellBeSelected\": canCellBeSelected,\r\n \"canCellBeActive\": canCellBeActive,\r\n \"navigatePrev\": navigatePrev,\r\n \"navigateNext\": navigateNext,\r\n \"navigateUp\": navigateUp,\r\n \"navigateDown\": navigateDown,\r\n \"navigateLeft\": navigateLeft,\r\n \"navigateRight\": navigateRight,\r\n \"navigatePageUp\": navigatePageUp,\r\n \"navigatePageDown\": navigatePageDown,\r\n \"navigateTop\": navigateTop,\r\n \"navigateBottom\": navigateBottom,\r\n \"navigateRowStart\": navigateRowStart,\r\n \"navigateRowEnd\": navigateRowEnd,\r\n \"gotoCell\": gotoCell,\r\n \"getTopPanel\": getTopPanel,\r\n \"setTopPanelVisibility\": setTopPanelVisibility,\r\n \"getPreHeaderPanel\": getPreHeaderPanel,\r\n \"getPreHeaderPanelRight\": getPreHeaderPanelRight,\r\n \"setPreHeaderPanelVisibility\": setPreHeaderPanelVisibility,\r\n \"getHeader\": getHeader,\r\n \"getHeaderColumn\": getHeaderColumn,\r\n \"setHeaderRowVisibility\": setHeaderRowVisibility,\r\n \"getHeaderRow\": getHeaderRow,\r\n \"getHeaderRowColumn\": getHeaderRowColumn,\r\n \"setFooterRowVisibility\": setFooterRowVisibility,\r\n \"getFooterRow\": getFooterRow,\r\n \"getFooterRowColumn\": getFooterRowColumn,\r\n \"getGridPosition\": getGridPosition,\r\n \"flashCell\": flashCell,\r\n \"addCellCssStyles\": addCellCssStyles,\r\n \"setCellCssStyles\": setCellCssStyles,\r\n \"removeCellCssStyles\": removeCellCssStyles,\r\n \"getCellCssStyles\": getCellCssStyles,\r\n \"getFrozenRowOffset\": getFrozenRowOffset,\r\n \"getDataItemValueForColumn\": getDataItemValueForColumn,\r\n\r\n \"init\": finishInitialization,\r\n \"destroy\": destroy,\r\n\r\n // iEditor implementation\r\n \"getEditorLock\": getEditorLock,\r\n \"getEditController\": getEditController\r\n });\r\n\r\n init();\r\n}\r\n","import \"./resizable.css\";\r\nimport \"../core/polyfills\";\r\nimport { EventHandler } from \"./eventhandler\";\r\n\r\nexport interface IResizeEventArg {\r\n x: number;\r\n y: number;\r\n target: HTMLElement;\r\n evt: MouseEvent;\r\n}\r\n\r\nexport interface IResizeOptions {\r\n minWidth?: number;\r\n maxWidth?: number;\r\n minHeight?: number;\r\n maxHeight?: number;\r\n resizeDelta?: number;\r\n resizeHandlePrefix?: string;\r\n onStart?: EventHandler<IResizeEventArg>;\r\n onStop?: EventHandler<IResizeEventArg>;\r\n onResize?: EventHandler<IResizeEventArg>;\r\n gridX?: number;\r\n gridY?: number;\r\n}\r\n\r\nconst defaultOptions: IResizeOptions = {\r\n resizeHandlePrefix: \"rs-\",\r\n onStart: new EventHandler<IResizeEventArg>(),\r\n onStop: new EventHandler<IResizeEventArg>(),\r\n onResize: new EventHandler<IResizeEventArg>(),\r\n resizeDelta: 0\r\n};\r\n\r\nexport class ResizeContainer {\r\n\r\n private element: HTMLElement;\r\n\r\n private resizeX: boolean;\r\n private resizeY: boolean;\r\n\r\n private startSize: { x: number, y: number } = { x: null, y: null };\r\n\r\n constructor(private container: HTMLElement,\r\n private options: IResizeOptions) {\r\n this.init();\r\n }\r\n\r\n private init(): void {\r\n this.container.classList.add(\"resizable\");\r\n this.container.addEventListener(\"mousedown\", this.mouseDownContainer, false);\r\n this.container.addEventListener(\"touchstart\", this.mouseDownContainer, false);\r\n }\r\n\r\n private mouseDownContainer = (evt: MouseEvent) => {\r\n const target: HTMLElement = evt.target as HTMLElement;\r\n if ((\" \" + target.className).indexOf(\" \" + this.options.resizeHandlePrefix) < 0) {\r\n return; // not a resize handle\r\n }\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n evt.stopImmediatePropagation();\r\n this.resizeX = target.classList.contains(this.options.resizeHandlePrefix + \"r\") ||\r\n target.classList.contains(this.options.resizeHandlePrefix + \"l\");\r\n this.resizeY = target.classList.contains(this.options.resizeHandlePrefix + \"t\") ||\r\n target.classList.contains(this.options.resizeHandlePrefix + \"b\");\r\n\r\n this.element = target.parentElement; // TODO change to closest class\r\n this.options.onStart.notify({evt, target: this.element, x: this.extractArg<number>(evt, \"pageX\"), y: this.extractArg<number>(evt, \"pageY\")});\r\n\r\n // register event listeners\r\n window.addEventListener(\"mousemove\", this.mouseMove, false);\r\n window.addEventListener(\"mouseup\", this.mouseUp, false);\r\n window.addEventListener(\"touchmove\", this.mouseMove, false);\r\n window.addEventListener(\"touchend\", this.mouseUp, false);\r\n }\r\n\r\n private mouseMove = (evt: MouseEvent) => {\r\n let raiseEvt = false;\r\n\r\n if (this.resizeX) {\r\n let val: number = this.extractArg<number>(evt, \"clientX\") - this.element.getBoundingClientRect().left;\r\n if (this.options.minWidth && val < this.options.minWidth) {\r\n val = this.options.minWidth;\r\n } else if (this.options.maxWidth && val > this.options.maxWidth) {\r\n val = this.options.maxWidth;\r\n }\r\n if (this.startSize != null && this.startSize.x == null) {\r\n this.startSize.x = val;\r\n }\r\n if (this.startSize == null || Math.abs(this.startSize.x - val) >= this.options.resizeDelta) {\r\n // if (!this.options.gridX || Math.round(val) % this.options.gridX === 0) {\r\n if (this.options.gridX) {\r\n val = Math.round(val / this.options.gridX) * this.options.gridX;\r\n }\r\n this.element.style.width = Math.round(val) + \"px\";\r\n raiseEvt = true;\r\n this.startSize = null;\r\n // }\r\n }\r\n }\r\n if (this.resizeY) {\r\n let val: number = this.extractArg<number>(evt, \"clientY\") - this.element.getBoundingClientRect().top;\r\n if (this.options.minHeight && val < this.options.minHeight) {\r\n val = this.options.minHeight;\r\n } else if (this.options.maxHeight && val > this.options.maxHeight) {\r\n val = this.options.maxHeight;\r\n }\r\n if (this.startSize != null && this.startSize.y == null) {\r\n this.startSize.y = val;\r\n }\r\n if (this.startSize == null || Math.abs(this.startSize.y - val) >= this.options.resizeDelta) {\r\n // if (!this.options.gridY || Math.round(val) % this.options.gridY === 0) {\r\n if (this.options.gridY) {\r\n val = Math.round(val / this.options.gridY) * this.options.gridY;\r\n }\r\n this.element.style.height = Math.round(val) + \"px\";\r\n raiseEvt = true;\r\n this.startSize = null;\r\n // }\r\n }\r\n }\r\n if (raiseEvt) {\r\n this.options.onResize.notify({evt, target: this.element, x: this.extractArg<number>(evt, \"pageX\"), y: this.extractArg<number>(evt, \"pageY\")});\r\n }\r\n }\r\n\r\n private mouseUp = (evt: MouseEvent) => {\r\n window.removeEventListener(\"mousemove\", this.mouseMove, false);\r\n window.removeEventListener(\"mouseup\", this.mouseUp, false);\r\n window.removeEventListener(\"touchmove\", this.mouseMove, false);\r\n window.removeEventListener(\"touchend\", this.mouseUp, false);\r\n this.options.onStop.notify({evt, target: this.element, x: this.extractArg<number>(evt, \"pageX\"), y: this.extractArg<number>(evt, \"pageY\")});\r\n this.startSize = { x: null, y: null };\r\n }\r\n\r\n private extractArg<T>(evt: any, key: string): T {\r\n return evt[key] != null ? evt[key] : (evt.touches.length > 0 ? evt.touches : evt.changedTouches)[0][key];\r\n }\r\n\r\n}\r\n\r\nexport function Resizable(selector: HTMLElement | string, options?: IResizeOptions): ResizeContainer {\r\n return new ResizeContainer(typeof selector === \"string\" ?\r\n document.querySelector(selector) :\r\n selector,\r\n { ...defaultOptions, ...options });\r\n}\r\n","// source: https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\r\n(function () {\r\n if (typeof window.CustomEvent === \"function\") { return false };\r\n\r\n function CustomEvent(event, params) {\r\n params = params || { bubbles: false, cancelable: false, detail: undefined };\r\n var evt = document.createEvent(\"CustomEvent\");\r\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\r\n return evt;\r\n }\r\n\r\n CustomEvent.prototype = window.Event.prototype;\r\n\r\n (window as any).CustomEvent = CustomEvent;\r\n\r\n if (!(\"remove\" in Element.prototype)) {\r\n (Element.prototype as any).remove = function() {\r\n if (this.parentNode) {\r\n this.parentNode.removeChild(this);\r\n }\r\n };\r\n }\r\n\r\n})();\r\n","export interface IEvent<T, T2 = void> {\r\n subscribe(fnc: (args?: T, args2?: T2) => any);\r\n notify(val?: T);\r\n}\r\n\r\nexport class EventHandler<T, T2 = void> implements IEvent<T, T2> {\r\n\r\n public static Create(click: (EventHandler<any, any> | ((p?: any, p2?: any) => any))) {\r\n if (click == null) {\r\n return new EventHandler<any, any>();\r\n }\r\n if (typeof click === \"function\") {\r\n const res = new EventHandler<any, any>();\r\n res.subscribe(click);\r\n return res;\r\n }\r\n return click;\r\n }\r\n\r\n private handlers = [];\r\n\r\n constructor(fnc?: (args?: T, args2?: T2) => any) {\r\n if (fnc != null) {\r\n this.handlers.push(fnc);\r\n }\r\n }\r\n\r\n public subscribe(fnc: (args?: T, args2?: T2) => any) {\r\n this.handlers.push(fnc);\r\n }\r\n\r\n public notify(val?: T, val2?: T2) {\r\n for (const h of this.handlers) {\r\n h(val, val2);\r\n }\r\n }\r\n\r\n public count(): number {\r\n return this.handlers.length;\r\n }\r\n\r\n public unSubscribe(fnc: (args?: T, args2?: T2) => any) {\r\n if (this.handlers.indexOf(fnc) >= 0) {\r\n this.handlers.splice(this.handlers.indexOf(fnc), 1);\r\n } else {\r\n // TODO? throw exception?\r\n console.warn(\"handler not found in EventHandler.unSubscribe\");\r\n }\r\n }\r\n}\r\n","import { jQueryReplacement } from '../../core/jq'\r\nimport { Slick } from '../slick.core'\r\n\r\n\r\nlet $ = jQueryReplacement;\r\n\r\n// register namespace\r\n$.deepExtend(window, {\r\n\"Slick\": {\r\n \"RowSelectionModel\": RowSelectionModel\r\n}\r\n});\r\n\r\n export function RowSelectionModel(options?: any) {\r\n var _grid;\r\n var _ranges = [];\r\n var _self = this;\r\n var _handler = new Slick.EventHandler();\r\n var _inHandler;\r\n var _options;\r\n var _defaults = {\r\n selectActiveRow: true\r\n };\r\n\r\n function init(grid) {\r\n _options = $.deepExtend({}, _defaults, options);\r\n _grid = grid;\r\n _handler.subscribe(_grid.onActiveCellChanged,\r\n wrapHandler(handleActiveCellChange));\r\n _handler.subscribe(_grid.onKeyDown,\r\n wrapHandler(handleKeyDown));\r\n _handler.subscribe(_grid.onClick,\r\n wrapHandler(handleClick));\r\n }\r\n\r\n function destroy() {\r\n _handler.unsubscribeAll();\r\n }\r\n\r\n function wrapHandler(handler) {\r\n return function () {\r\n if (!_inHandler) {\r\n _inHandler = true;\r\n handler.apply(this, arguments);\r\n _inHandler = false;\r\n }\r\n };\r\n }\r\n\r\n function rangesToRows(ranges) {\r\n var rows = [];\r\n for (var i = 0; i < ranges.length; i++) {\r\n for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {\r\n rows.push(j);\r\n }\r\n }\r\n return rows;\r\n }\r\n\r\n function rowsToRanges(rows) {\r\n var ranges = [];\r\n var lastCell = _grid.getColumns().length - 1;\r\n for (var i = 0; i < rows.length; i++) {\r\n ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell));\r\n }\r\n return ranges;\r\n }\r\n\r\n function getRowsRange(from, to) {\r\n var i, rows = [];\r\n for (i = from; i <= to; i++) {\r\n rows.push(i);\r\n }\r\n for (i = to; i < from; i++) {\r\n rows.push(i);\r\n }\r\n return rows;\r\n }\r\n\r\n function getSelectedRows() {\r\n return rangesToRows(_ranges);\r\n }\r\n\r\n function setSelectedRows(rows) {\r\n setSelectedRanges(rowsToRanges(rows));\r\n }\r\n\r\n function setSelectedRanges(ranges) {\r\n // simple check for: empty selection didn't change, prevent firing onSelectedRangesChanged\r\n if ((!_ranges || _ranges.length === 0) && (!ranges || ranges.length === 0)) { return; }\r\n _ranges = ranges;\r\n _self.onSelectedRangesChanged.notify(_ranges);\r\n }\r\n\r\n function getSelectedRanges() {\r\n return _ranges;\r\n }\r\n\r\n function handleActiveCellChange(e, data) {\r\n if (_options.selectActiveRow && data.row != null) {\r\n setSelectedRanges([new Slick.Range(data.row, 0, data.row, _grid.getColumns().length - 1)]);\r\n }\r\n }\r\n\r\n function handleKeyDown(e) {\r\n var activeRow = _grid.getActiveCell();\r\n if (_grid.getOptions().multiSelect && activeRow \r\n && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey \r\n && (e.which == Slick.keyCode.UP || e.which == Slick.keyCode.DOWN)) {\r\n var selectedRows = getSelectedRows();\r\n selectedRows.sort(function (x, y) {\r\n return x - y\r\n });\r\n\r\n if (!selectedRows.length) {\r\n selectedRows = [activeRow.row];\r\n }\r\n\r\n var top = selectedRows[0];\r\n var bottom = selectedRows[selectedRows.length - 1];\r\n var active;\r\n\r\n if (e.which == Slick.keyCode.DOWN) {\r\n active = activeRow.row < bottom || top == bottom ? ++bottom : ++top;\r\n } else {\r\n active = activeRow.row < bottom ? --bottom : --top;\r\n }\r\n\r\n if (active >= 0 && active < _grid.getDataLength()) {\r\n _grid.scrollRowIntoView(active);\r\n var tempRanges = rowsToRanges(getRowsRange(top, bottom));\r\n setSelectedRanges(tempRanges);\r\n }\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n }\r\n\r\n function handleClick(e) {\r\n var cell = _grid.getCellFromEvent(e);\r\n if (!cell || !_grid.canCellBeActive(cell.row, cell.cell)) {\r\n return false;\r\n }\r\n\r\n if (!_grid.getOptions().multiSelect || (\r\n !e.ctrlKey && !e.shiftKey && !e.metaKey)) {\r\n return false;\r\n }\r\n\r\n var selection = rangesToRows(_ranges);\r\n var idx = selection.indexOf(cell.row);\r\n //var idx = $.inArray(cell.row, selection);\r\n\r\n if (idx === -1 && (e.ctrlKey || e.metaKey)) {\r\n selection.push(cell.row);\r\n _grid.setActiveCell(cell.row, cell.cell);\r\n } else if (idx !== -1 && (e.ctrlKey || e.metaKey)) {\r\n selection = selection.filter(function (o, i) {\r\n return (o !== cell.row);\r\n });\r\n _grid.setActiveCell(cell.row, cell.cell);\r\n } else if (selection.length && e.shiftKey) {\r\n var last = selection.pop();\r\n var from = Math.min(cell.row, last);\r\n var to = Math.max(cell.row, last);\r\n selection = [];\r\n for (var i = from; i <= to; i++) {\r\n if (i !== last) {\r\n selection.push(i);\r\n }\r\n }\r\n selection.push(last);\r\n _grid.setActiveCell(cell.row, cell.cell);\r\n }\r\n\r\n var tempRanges = rowsToRanges(selection);\r\n setSelectedRanges(tempRanges);\r\n e.stopImmediatePropagation();\r\n\r\n return true;\r\n }\r\n\r\n $.shallowExtend(this, {\r\n \"getSelectedRows\": getSelectedRows,\r\n \"setSelectedRows\": setSelectedRows,\r\n\r\n \"getSelectedRanges\": getSelectedRanges,\r\n \"setSelectedRanges\": setSelectedRanges,\r\n\r\n \"init\": init,\r\n \"destroy\": destroy,\r\n \"pluginName\": \"RowSelectionModel\",\r\n\r\n \"onSelectedRangesChanged\": new Slick.Event()\r\n });\r\n }\r\n","import { jQueryReplacement } from \"../core/jq\";\r\nimport { Slick, ISlickEvent } from \"./slick.core\";\r\n\r\nexport interface IRefreshHint {\r\n isFilterNarrowing?: boolean;\r\n isFilterExpanding?: boolean;\r\n isFilterUnchanged?: boolean;\r\n ignoreDiffsBefore?: number;\r\n ignoreDiffsAfter?: number;\r\n}\r\n\r\nexport interface IGroupInfo {\r\n value: any;\r\n count: number;\r\n rows: any[];\r\n selectChecked: boolean;\r\n groupingKey: string;\r\n level: number;\r\n}\r\n\r\nexport interface IGroupingInfo {\r\n getter: string;\r\n formatter: (g: IGroupInfo) => string;\r\n comparer?: (a, b) => number;\r\n predefinedValues?: any[];\r\n aggregators: any[];\r\n aggregateEmpty?: boolean;\r\n aggregateCollapsed?: boolean;\r\n aggregateChildGroups?: boolean;\r\n collapsed?: boolean;\r\n displayTotalsRow?: boolean;\r\n lazyTotalsCalculation?: boolean;\r\n}\r\n\r\n\r\nconst $ = jQueryReplacement;\r\n\r\nexport interface ISlickDataView<T> {\r\n onRowsChanged: ISlickEvent<any>; // TODO\r\n onRowCountChanged: ISlickEvent<any>;\r\n setGrouping: (groupInfo: IGroupingInfo | IGroupingInfo[]) => void;\r\n getGrouping: () => IGroupingInfo;\r\n refresh: () => void;\r\n sort: (comparer, ascending: boolean) => void;\r\n updateItem: (id: any, item: T) => void;\r\n getRowByItem: (item: T) => number;\r\n getRowById: (id: any) => number;\r\n getItemById: (id: any) => T;\r\n getIdxById: (id: any) => number;\r\n getIdxByItem: (item: T) => number;\r\n getItemByIdx: (idx: number) => T;\r\n getItem: (row: number) => T;\r\n setFilterArgs: (args: any) => void;\r\n setFilter: (filter: (item: T, args: any) => boolean) => void;\r\n beginUpdate(): void;\r\n endUpdate(): void;\r\n setItems(data, objectIdProperty?): void;\r\n\r\n addItem(item: T): void;\r\n collapseAllGroups: (level?: number) => void;\r\n expandAllGroups: (level?: number) => void;\r\n collapseGroup: (...params: string[]) => void;\r\n expandGroup: (...params: string[]) => void;\r\n getFilteredItems: () => T[];\r\n getGroups: () => any; //TODO: type\r\n syncGridSelection: (grid: any, preserveHidden?: boolean, preserveHiddenOnSelectionChange?: boolean) => ISlickEvent<any>;\r\n insertItem: (insertBefore: number, item: T) => void;\r\n deleteItem: (id: any) => void;\r\n\r\n // // methods\r\n // \"setPagingOptions\": setPagingOptions,\r\n // \"getPagingInfo\": getPagingInfo,\r\n // \"getItems\": getItems,\r\n // \"setFilter\": setFilter,\r\n // \"getFilter\": getFilter,\r\n // \"reSort\": reSort,\r\n // \"groupBy\": groupBy,\r\n // \"setAggregators\": setAggregators,\r\n\r\n\r\n // \"mapItemsToRows\": mapItemsToRows,\r\n // \"mapRowsToIds\": mapRowsToIds,\r\n // \"mapIdsToRows\": mapIdsToRows,\r\n // \"setRefreshHints\": setRefreshHints,\r\n // \"setFilterArgs\": setFilterArgs,\r\n // \"refresh\": refresh,\r\n // \"sortedAddItem\": sortedAddItem,\r\n // \"sortedUpdateItem\": sortedUpdateItem,\r\n // \"syncGridSelection\": syncGridSelection,\r\n // \"syncGridCellCssStyles\": syncGridCellCssStyles,\r\n\r\n // // data provider methods\r\n // \"getLength\": getLength,\r\n // \"getItemMetadata\": getItemMetadata,\r\n\r\n // // events\r\n // \"onRowsOrCountChanged\": onRowsOrCountChanged,\r\n // \"onPagingInfoChanged\": onPagingInfoChanged\r\n}\r\n\r\n\r\n/***\r\n * A sample Model implementation.\r\n * Provides a filtered view of the underlying data.\r\n *\r\n * Relies on the data item having an \"id\" property uniquely identifying it.\r\n */\r\nexport function DataView(options?) {\r\n let self = this;\r\n\r\n let defaults = {\r\n groupItemMetadataProvider: null,\r\n inlineFilters: false\r\n };\r\n\r\n\r\n // private\r\n let idProperty = \"id\"; // property holding a unique row id\r\n let items = []; // data by index\r\n let rows = []; // data by row\r\n let idxById = {}; // indexes by id\r\n let rowsById = null; // rows by id; lazy-calculated\r\n let filter = null; // filter function\r\n let updated = null; // updated item ids\r\n let suspend = false; // suspends the recalculation\r\n let sortAsc = true;\r\n // var fastSortField;\r\n let sortComparer;\r\n let refreshHints: IRefreshHint = {};\r\n let prevRefreshHints: IRefreshHint = {};\r\n let filterArgs;\r\n let filteredItems = [];\r\n // let compiledFilter;\r\n // let compiledFilterWithCaching;\r\n let filterCache = [];\r\n\r\n // grouping\r\n let groupingInfoDefaults = {\r\n getter: null,\r\n formatter: null,\r\n comparer (a, b) {\r\n return (a.value === b.value ? 0 :\r\n (a.value > b.value ? 1 : -1)\r\n );\r\n },\r\n predefinedValues: [],\r\n aggregators: [],\r\n aggregateEmpty: false,\r\n aggregateCollapsed: false,\r\n aggregateChildGroups: false,\r\n collapsed: false,\r\n displayTotalsRow: true,\r\n lazyTotalsCalculation: false\r\n };\r\n let groupingInfos = [];\r\n let groups = [];\r\n let toggledGroupsByLevel = [];\r\n let groupingDelimiter = \":|:\";\r\n\r\n let pagesize = 0;\r\n let pagenum = 0;\r\n let totalRows = 0;\r\n\r\n // events\r\n let onRowCountChanged = new Slick.Event();\r\n let onRowsChanged = new Slick.Event();\r\n let onRowsOrCountChanged = new Slick.Event();\r\n let onPagingInfoChanged = new Slick.Event();\r\n\r\n options = $.deepExtend({}, defaults, options);\r\n\r\n\r\n function beginUpdate() {\r\n suspend = true;\r\n }\r\n\r\n function endUpdate() {\r\n suspend = false;\r\n refresh();\r\n }\r\n\r\n function setRefreshHints(hints) {\r\n refreshHints = hints;\r\n }\r\n\r\n function setFilterArgs(args) {\r\n filterArgs = args;\r\n }\r\n\r\n function updateIdxById(startingIndex?: number) {\r\n startingIndex = startingIndex || 0;\r\n let id;\r\n for (let i = startingIndex, l = items.length; i < l; i++) {\r\n id = items[i][idProperty];\r\n if (id === undefined) {\r\n // throw new Error(\"Each data element must implement a unique 'id' property\");\r\n throw new Error(\"Id (\" + idProperty + \") of element at index \" + i + \" was undefined\");\r\n }\r\n idxById[id] = i;\r\n }\r\n }\r\n\r\n function ensureIdUniqueness() {\r\n let id;\r\n for (let i = 0, l = items.length; i < l; i++) {\r\n id = items[i][idProperty];\r\n if (id === undefined) {\r\n throw new Error(\"Id (\" + idProperty + \") of element at index \" + i + \" was undefined\");\r\n } else if (idxById[id] !== i) {\r\n throw new Error(\"Duplicate id (\" + idProperty + \") for \" + id + \" found at index (\" + idxById[id] + \", \" + i + \")\");\r\n }\r\n }\r\n }\r\n\r\n function getItems() {\r\n return items;\r\n }\r\n\r\n function setItems(data, objectIdProperty) {\r\n if (objectIdProperty !== undefined) {\r\n idProperty = objectIdProperty;\r\n }\r\n items = filteredItems = data;\r\n idxById = {};\r\n updateIdxById();\r\n ensureIdUniqueness();\r\n refresh();\r\n }\r\n\r\n function setPagingOptions(args) {\r\n if (args.pageSize != undefined) {\r\n pagesize = args.pageSize;\r\n pagenum = pagesize ? Math.min(pagenum, Math.max(0, Math.ceil(totalRows / pagesize) - 1)) : 0;\r\n }\r\n\r\n if (args.pageNum != undefined) {\r\n pagenum = Math.min(args.pageNum, Math.max(0, Math.ceil(totalRows / pagesize) - 1));\r\n }\r\n\r\n onPagingInfoChanged.notify(getPagingInfo(), null, self);\r\n\r\n refresh();\r\n }\r\n\r\n function getPagingInfo() {\r\n let totalPages = pagesize ? Math.max(1, Math.ceil(totalRows / pagesize)) : 1;\r\n return { pageSize: pagesize, pageNum: pagenum, totalRows, totalPages, dataView: self };\r\n }\r\n\r\n function sort(comparer, ascending) {\r\n sortAsc = ascending;\r\n sortComparer = comparer;\r\n // fastSortField = null;\r\n if (ascending === false) {\r\n items.reverse();\r\n }\r\n items.sort(comparer);\r\n if (ascending === false) {\r\n items.reverse();\r\n }\r\n idxById = {};\r\n updateIdxById();\r\n refresh();\r\n }\r\n\r\n\r\n function reSort() {\r\n if (sortComparer) {\r\n sort(sortComparer, sortAsc);\r\n }\r\n }\r\n\r\n function getFilteredItems() {\r\n return filteredItems;\r\n }\r\n\r\n\r\n function getFilter() {\r\n return filter;\r\n }\r\n\r\n function setFilter(filterFn) {\r\n filter = filterFn;\r\n // if (options.inlineFilters) {\r\n // compiledFilter = compileFilter();\r\n // compiledFilterWithCaching = compileFilterWithCaching();\r\n // }\r\n refresh();\r\n }\r\n\r\n function getGrouping() {\r\n return groupingInfos;\r\n }\r\n\r\n function setGrouping(groupingInfo) {\r\n if (!options.groupItemMetadataProvider) {\r\n options.groupItemMetadataProvider = new ( Slick as any).Data.GroupItemMetadataProvider();\r\n }\r\n\r\n groups = [];\r\n toggledGroupsByLevel = [];\r\n groupingInfo = groupingInfo || [];\r\n groupingInfos = (groupingInfo instanceof Array) ? groupingInfo : [groupingInfo];\r\n\r\n for (let i = 0; i < groupingInfos.length; i++) {\r\n const gi = groupingInfos[i] = $.deepExtend({}, groupingInfoDefaults, groupingInfos[i]);\r\n gi.getterIsAFn = typeof gi.getter === \"function\";\r\n\r\n // pre-compile accumulator loops\r\n gi.compiledAccumulators = [];\r\n let idx = gi.aggregators.length;\r\n while (idx--) {\r\n gi.compiledAccumulators[idx] = compileAccumulatorLoop(gi.aggregators[idx]);\r\n }\r\n\r\n toggledGroupsByLevel[i] = {};\r\n }\r\n\r\n refresh();\r\n }\r\n\r\n /**\r\n * @deprecated Please use {@link setGrouping}.\r\n */\r\n function groupBy(valueGetter, valueFormatter, sortComparer) {\r\n if (valueGetter == null) {\r\n setGrouping([]);\r\n return;\r\n }\r\n\r\n setGrouping({\r\n getter: valueGetter,\r\n formatter: valueFormatter,\r\n comparer: sortComparer\r\n });\r\n }\r\n\r\n /**\r\n * @deprecated Please use {@link setGrouping}.\r\n */\r\n function setAggregators(groupAggregators, includeCollapsed) {\r\n if (!groupingInfos.length) {\r\n throw new Error(\"At least one grouping must be specified before calling setAggregators().\");\r\n }\r\n\r\n groupingInfos[0].aggregators = groupAggregators;\r\n groupingInfos[0].aggregateCollapsed = includeCollapsed;\r\n\r\n setGrouping(groupingInfos);\r\n }\r\n\r\n function getItemByIdx(i) {\r\n return items[i];\r\n }\r\n\r\n function getIdxById(id) {\r\n return idxById[id];\r\n }\r\n\r\n function getIdxByItem(item) {\r\n return idxById[item[idProperty]];\r\n }\r\n\r\n function ensureRowsByIdCache() {\r\n if (!rowsById) {\r\n rowsById = {};\r\n for (let i = 0, l = rows.length; i < l; i++) {\r\n rowsById[rows[i][idProperty]] = i;\r\n }\r\n }\r\n }\r\n\r\n function getRowByItem(item) {\r\n ensureRowsByIdCache();\r\n return rowsById[item[idProperty]];\r\n }\r\n\r\n function getRowById(id) {\r\n ensureRowsByIdCache();\r\n return rowsById[id];\r\n }\r\n\r\n function getItemById(id) {\r\n return items[idxById[id]];\r\n }\r\n\r\n function mapItemsToRows(itemArray) {\r\n let rows = [];\r\n ensureRowsByIdCache();\r\n for (let i = 0, l = itemArray.length; i < l; i++) {\r\n let row = rowsById[itemArray[i][idProperty]];\r\n if (row != null) {\r\n rows[rows.length] = row;\r\n }\r\n }\r\n return rows;\r\n }\r\n\r\n function mapIdsToRows(idArray) {\r\n let rows = [];\r\n ensureRowsByIdCache();\r\n for (let i = 0, l = idArray.length; i < l; i++) {\r\n let row = rowsById[idArray[i]];\r\n if (row != null) {\r\n rows[rows.length] = row;\r\n }\r\n }\r\n return rows;\r\n }\r\n\r\n function mapRowsToIds(rowArray) {\r\n let ids = [];\r\n for (let i = 0, l = rowArray.length; i < l; i++) {\r\n if (rowArray[i] < rows.length) {\r\n ids[ids.length] = rows[rowArray[i]][idProperty];\r\n }\r\n }\r\n return ids;\r\n }\r\n\r\n function updateItem(id, item) {\r\n // see also https://github.com/mleibman/SlickGrid/issues/1082\r\n if (idxById[id] === undefined) {\r\n throw new Error(\"Invalid id\");\r\n }\r\n\r\n // what if the specified item also has an updated idProperty?\r\n // then we'll have to update the index as well, and possibly the `updated` cache too.\r\n if (id !== item[idProperty]) {\r\n // make sure the new id is unique:\r\n let newId = item[idProperty];\r\n if (newId == null) {\r\n throw new Error(\"Cannot update item to associate with a null id\");\r\n }\r\n if (idxById[newId] !== undefined) {\r\n throw new Error(\"Cannot update item to associate with a non-unique id\");\r\n }\r\n idxById[newId] = idxById[id];\r\n delete idxById[id];\r\n\r\n // also update the `updated` hashtable/markercache? Yes, `recalc()` inside `refresh()` needs that one!\r\n if (updated && updated[id]) {\r\n delete updated[id];\r\n }\r\n\r\n // also update the row indexes? no need since the `refresh()`, further down, blows away the `rowsById[]` cache!\r\n\r\n id = newId;\r\n }\r\n items[idxById[id]] = item;\r\n\r\n // also update the rows? no need since the `refresh()`, further down, blows away the `rows[]` cache and recalculates it via `recalc()`!\r\n\r\n if (!updated) {\r\n updated = {};\r\n }\r\n updated[id] = true;\r\n refresh();\r\n }\r\n\r\n function insertItem(insertBefore, item) {\r\n items.splice(insertBefore, 0, item);\r\n updateIdxById(insertBefore);\r\n refresh();\r\n }\r\n\r\n function addItem(item) {\r\n items.push(item);\r\n updateIdxById(items.length - 1);\r\n refresh();\r\n }\r\n\r\n function deleteItem(id) {\r\n let idx = idxById[id];\r\n if (idx === undefined) {\r\n throw new Error(\"Invalid id\");\r\n }\r\n delete idxById[id];\r\n items.splice(idx, 1);\r\n updateIdxById(idx);\r\n refresh();\r\n }\r\n\r\n function sortedAddItem(item) {\r\n if (!sortComparer) {\r\n throw new Error(\"sortedAddItem() requires a sort comparer, use sort()\");\r\n }\r\n insertItem(sortedIndex(item), item);\r\n }\r\n\r\n function sortedUpdateItem(id, item) {\r\n if (idxById[id] === undefined || id !== item[idProperty]) {\r\n throw new Error(\"Invalid or non-matching id \" + idxById[id]);\r\n }\r\n if (!sortComparer) {\r\n throw new Error(\"sortedUpdateItem() requires a sort comparer, use sort()\");\r\n }\r\n let oldItem = getItemById(id);\r\n if (sortComparer(oldItem, item) !== 0) {\r\n // item affects sorting -> must use sorted add\r\n deleteItem(id);\r\n sortedAddItem(item);\r\n } else { // update does not affect sorting -> regular update works fine\r\n updateItem(id, item);\r\n }\r\n }\r\n\r\n function sortedIndex(searchItem) {\r\n let low = 0, high = items.length;\r\n\r\n while (low < high) {\r\n let mid = low + high >>> 1;\r\n if (sortComparer(items[mid], searchItem) === -1) {\r\n low = mid + 1;\r\n } else {\r\n high = mid;\r\n }\r\n }\r\n return low;\r\n }\r\n\r\n function getLength() {\r\n return rows.length;\r\n }\r\n\r\n function getItem(i) {\r\n let item = rows[i];\r\n\r\n // if this is a group row, make sure totals are calculated and update the title\r\n if (item && item.__group && item.totals && !item.totals.initialized) {\r\n let gi = groupingInfos[item.level];\r\n if (!gi.displayTotalsRow) {\r\n calculateTotals(item.totals);\r\n item.title = gi.formatter ? gi.formatter(item) : item.value;\r\n }\r\n } else if (item && item.__groupTotals && !item.initialized) {\r\n calculateTotals(item);\r\n }\r\n\r\n return item;\r\n }\r\n\r\n function getItemMetadata(i) {\r\n let item = rows[i];\r\n if (item === undefined) {\r\n return null;\r\n }\r\n\r\n // overrides for grouping rows\r\n if (item.__group) {\r\n return options.groupItemMetadataProvider.getGroupRowMetadata(item);\r\n }\r\n\r\n // overrides for totals rows\r\n if (item.__groupTotals) {\r\n return options.groupItemMetadataProvider.getTotalsRowMetadata(item);\r\n }\r\n\r\n if (item.__height) {\r\n if (item.getItemMetadata != null) {\r\n return {height: item.__height, ...(item.getItemMetadata || {})};\r\n }\r\n return { height: item.__height };\r\n }\r\n\r\n return item.getItemMetadata != null ? item.getItemMetadata(i, item) : null;\r\n }\r\n\r\n function expandCollapseAllGroups(level, collapse) {\r\n if (level == null) {\r\n for (let i = 0; i < groupingInfos.length; i++) {\r\n toggledGroupsByLevel[i] = {};\r\n groupingInfos[i].collapsed = collapse;\r\n }\r\n } else {\r\n toggledGroupsByLevel[level] = {};\r\n groupingInfos[level].collapsed = collapse;\r\n }\r\n refresh();\r\n }\r\n\r\n /**\r\n * @param level {Number} Optional level to collapse. If not specified, applies to all levels.\r\n */\r\n function collapseAllGroups(level) {\r\n expandCollapseAllGroups(level, true);\r\n }\r\n\r\n /**\r\n * @param level {Number} Optional level to expand. If not specified, applies to all levels.\r\n */\r\n function expandAllGroups(level) {\r\n expandCollapseAllGroups(level, false);\r\n }\r\n\r\n function expandCollapseGroup(level, groupingKey, collapse) {\r\n toggledGroupsByLevel[level][groupingKey] = groupingInfos[level].collapsed ^ collapse;\r\n refresh();\r\n }\r\n\r\n /**\r\n * @param varArgs Either a Slick.Group's \"groupingKey\" property, or a\r\n * variable argument list of grouping values denoting a unique path to the row. For\r\n * example, calling collapseGroup('high', '10%') will collapse the '10%' subgroup of\r\n * the 'high' group.\r\n */\r\n function collapseGroup(varArgs) {\r\n let args = Array.prototype.slice.call(arguments);\r\n let arg0 = args[0];\r\n if (args.length == 1 && arg0.indexOf(groupingDelimiter) != -1) {\r\n expandCollapseGroup(arg0.split(groupingDelimiter).length - 1, arg0, true);\r\n } else {\r\n expandCollapseGroup(args.length - 1, args.join(groupingDelimiter), true);\r\n }\r\n }\r\n\r\n /**\r\n * @param varArgs Either a Slick.Group's \"groupingKey\" property, or a\r\n * variable argument list of grouping values denoting a unique path to the row. For\r\n * example, calling expandGroup('high', '10%') will expand the '10%' subgroup of\r\n * the 'high' group.\r\n */\r\n function expandGroup(varArgs) {\r\n let args = Array.prototype.slice.call(arguments);\r\n let arg0 = args[0];\r\n if (args.length == 1 && arg0.indexOf(groupingDelimiter) != -1) {\r\n expandCollapseGroup(arg0.split(groupingDelimiter).length - 1, arg0, false);\r\n } else {\r\n expandCollapseGroup(args.length - 1, args.join(groupingDelimiter), false);\r\n }\r\n }\r\n\r\n function getGroups() {\r\n return groups;\r\n }\r\n\r\n function extractGroups(rows, parentGroup?) {\r\n let group;\r\n let val;\r\n let groups = [];\r\n let groupsByVal = {};\r\n let r;\r\n let level = parentGroup ? parentGroup.level + 1 : 0;\r\n let gi = groupingInfos[level];\r\n\r\n for (let i = 0, l = gi.predefinedValues.length; i < l; i++) {\r\n val = gi.predefinedValues[i];\r\n group = groupsByVal[val];\r\n if (!group) {\r\n group = new Slick.Group();\r\n group.value = val;\r\n group.level = level;\r\n group.groupingKey = (parentGroup ? parentGroup.groupingKey + groupingDelimiter : \"\") + val;\r\n groups[groups.length] = group;\r\n groupsByVal[val] = group;\r\n }\r\n }\r\n\r\n for (let i = 0, l = rows.length; i < l; i++) {\r\n r = rows[i];\r\n val = gi.getterIsAFn ? gi.getter(r) : r[gi.getter];\r\n group = groupsByVal[val];\r\n if (!group) {\r\n group = new Slick.Group();\r\n group.value = val;\r\n group.level = level;\r\n group.groupingKey = (parentGroup ? parentGroup.groupingKey + groupingDelimiter : \"\") + val;\r\n groups[groups.length] = group;\r\n groupsByVal[val] = group;\r\n }\r\n\r\n group.rows[group.count++] = r;\r\n }\r\n\r\n if (level < groupingInfos.length - 1) {\r\n for (let i = 0; i < groups.length; i++) {\r\n group = groups[i];\r\n group.groups = extractGroups(group.rows, group);\r\n }\r\n }\r\n\r\n groups.sort(groupingInfos[level].comparer);\r\n\r\n return groups;\r\n }\r\n\r\n function calculateTotals(totals) {\r\n let group = totals.group;\r\n let gi = groupingInfos[group.level];\r\n let isLeafLevel = (group.level == groupingInfos.length);\r\n let agg, idx = gi.aggregators.length;\r\n\r\n if (!isLeafLevel && gi.aggregateChildGroups) {\r\n // make sure all the subgroups are calculated\r\n let i = group.groups.length;\r\n while (i--) {\r\n if (!group.groups[i].totals.initialized) {\r\n calculateTotals(group.groups[i].totals);\r\n }\r\n }\r\n }\r\n\r\n while (idx--) {\r\n agg = gi.aggregators[idx];\r\n agg.init();\r\n if (!isLeafLevel && gi.aggregateChildGroups) {\r\n gi.compiledAccumulators[idx].call(agg, group.groups);\r\n } else {\r\n gi.compiledAccumulators[idx].call(agg, group.rows);\r\n }\r\n agg.storeResult(totals);\r\n }\r\n totals.initialized = true;\r\n }\r\n\r\n function addGroupTotals(group) {\r\n let gi = groupingInfos[group.level];\r\n let totals = new Slick.GroupTotals();\r\n totals.group = group;\r\n group.totals = totals;\r\n if (!gi.lazyTotalsCalculation) {\r\n calculateTotals(totals);\r\n }\r\n }\r\n\r\n function addTotals(groups, level?: number) {\r\n level = level || 0;\r\n let gi = groupingInfos[level];\r\n let groupCollapsed = gi.collapsed;\r\n let toggledGroups = toggledGroupsByLevel[level];\r\n let idx = groups.length, g;\r\n while (idx--) {\r\n g = groups[idx];\r\n\r\n if (g.collapsed && !gi.aggregateCollapsed) {\r\n continue;\r\n }\r\n\r\n // do a depth-first aggregation so that parent group aggregators can access subgroup totals.\r\n if (g.groups) {\r\n addTotals(g.groups, level + 1);\r\n }\r\n\r\n if (gi.aggregators.length && (\r\n gi.aggregateEmpty || g.rows.length || (g.groups && g.groups.length))) {\r\n addGroupTotals(g);\r\n }\r\n\r\n g.collapsed = groupCollapsed ^ toggledGroups[g.groupingKey];\r\n g.title = gi.formatter ? gi.formatter(g) : g.value;\r\n }\r\n }\r\n\r\n function flattenGroupedRows(groups, level?: number) {\r\n level = level || 0;\r\n let gi = groupingInfos[level];\r\n let groupedRows = [], rows, gl = 0, g;\r\n for (let i = 0, l = groups.length; i < l; i++) {\r\n g = groups[i];\r\n groupedRows[gl++] = g;\r\n\r\n if (!g.collapsed) {\r\n rows = g.groups ? flattenGroupedRows(g.groups, level + 1) : g.rows;\r\n for (let j = 0, jj = rows.length; j < jj; j++) {\r\n groupedRows[gl++] = rows[j];\r\n }\r\n }\r\n\r\n if (g.totals && gi.displayTotalsRow && (!g.collapsed || gi.aggregateCollapsed)) {\r\n groupedRows[gl++] = g.totals;\r\n }\r\n }\r\n return groupedRows;\r\n }\r\n\r\n function getFunctionInfo(fn) {\r\n let fnRegex = /^function[^(]*\\(([^)]*)\\)\\s*{([\\s\\S]*)}$/;\r\n let matches = fn.toString().match(fnRegex);\r\n return {\r\n params: matches[1].split(\",\"),\r\n body: matches[2]\r\n };\r\n }\r\n\r\n function compileAccumulatorLoop(aggregator) {\r\n let accumulatorInfo = getFunctionInfo(aggregator.accumulate);\r\n let fn: any = new Function(\r\n \"_items\",\r\n \"for (var \" + accumulatorInfo.params[0] + \", _i=0, _il=_items.length; _i<_il; _i++) {\" +\r\n accumulatorInfo.params[0] + \" = _items[_i]; \" +\r\n accumulatorInfo.body +\r\n \"}\"\r\n );\r\n fn.displayName /*= fn.name*/ = \"compiledAccumulatorLoop\";\r\n return fn;\r\n }\r\n\r\n // function compileFilter() {\r\n // let filterInfo = getFunctionInfo(filter);\r\n\r\n // let filterPath1 = \"{ continue _coreloop; }$1\";\r\n // let filterPath2 = \"{ _retval[_idx++] = $item$; continue _coreloop; }$1\";\r\n // // make some allowances for minification - there's only so far we can go with RegEx\r\n // let filterBody = filterInfo.body\r\n // .replace(/return false\\s*([;}]|\\}|$)/gi, filterPath1)\r\n // .replace(/return!1([;}]|\\}|$)/gi, filterPath1)\r\n // .replace(/return true\\s*([;}]|\\}|$)/gi, filterPath2)\r\n // .replace(/return!0([;}]|\\}|$)/gi, filterPath2)\r\n // .replace(/return ([^;}]+?)\\s*([;}]|$)/gi,\r\n // \"{ if ($1) { _retval[_idx++] = $item$; }; continue _coreloop; }$2\");\r\n\r\n // // This preserves the function template code after JS compression,\r\n // // so that replace() commands still work as expected.\r\n // let tpl = [\r\n // // \"function(_items, _args) { \",\r\n // \"var _retval = [], _idx = 0; \",\r\n // \"var $item$, $args$ = _args; \",\r\n // \"_coreloop: \",\r\n // \"for (var _i = 0, _il = _items.length; _i < _il; _i++) { \",\r\n // \"$item$ = _items[_i]; \",\r\n // \"$filter$; \",\r\n // \"} \",\r\n // \"return _retval; \"\r\n // // \"}\"\r\n // ].join(\"\");\r\n // tpl = tpl.replace(/\\$filter\\$/gi, filterBody);\r\n // tpl = tpl.replace(/\\$item\\$/gi, filterInfo.params[0]);\r\n // tpl = tpl.replace(/\\$args\\$/gi, filterInfo.params[1]);\r\n\r\n // let fn: any = new Function(\"_items,_args\", tpl);\r\n // fn.displayName = /*fn.name =*/ \"compiledFilter\";\r\n // return fn;\r\n // }\r\n\r\n // function compileFilterWithCaching() {\r\n // let filterInfo = getFunctionInfo(filter);\r\n\r\n // let filterPath1 = \"{ continue _coreloop; }$1\";\r\n // let filterPath2 = \"{ _cache[_i] = true;_retval[_idx++] = $item$; continue _coreloop; }$1\";\r\n // // make some allowances for minification - there's only so far we can go with RegEx\r\n // let filterBody = filterInfo.body\r\n // .replace(/return false\\s*([;}]|\\}|$)/gi, filterPath1)\r\n // .replace(/return!1([;}]|\\}|$)/gi, filterPath1)\r\n // .replace(/return true\\s*([;}]|\\}|$)/gi, filterPath2)\r\n // .replace(/return!0([;}]|\\}|$)/gi, filterPath2)\r\n // .replace(/return ([^;}]+?)\\s*([;}]|$)/gi,\r\n // \"{ if ((_cache[_i] = $1)) { _retval[_idx++] = $item$; }; continue _coreloop; }$2\");\r\n\r\n // // This preserves the function template code after JS compression,\r\n // // so that replace() commands still work as expected.\r\n // let tpl = [\r\n // // \"function(_items, _args, _cache) { \",\r\n // \"var _retval = [], _idx = 0; \",\r\n // \"var $item$, $args$ = _args; \",\r\n // \"_coreloop: \",\r\n // \"for (var _i = 0, _il = _items.length; _i < _il; _i++) { \",\r\n // \"$item$ = _items[_i]; \",\r\n // \"if (_cache[_i]) { \",\r\n // \"_retval[_idx++] = $item$; \",\r\n // \"continue _coreloop; \",\r\n // \"} \",\r\n // \"$filter$; \",\r\n // \"} \",\r\n // \"return _retval; \"\r\n // // \"}\"\r\n // ].join(\"\");\r\n // tpl = tpl.replace(/\\$filter\\$/gi, filterBody);\r\n // tpl = tpl.replace(/\\$item\\$/gi, filterInfo.params[0]);\r\n // tpl = tpl.replace(/\\$args\\$/gi, filterInfo.params[1]);\r\n\r\n // let fn: any = new Function(\"_items,_args,_cache\", tpl);\r\n // fn.displayName /*= fn.name*/ = \"compiledFilterWithCaching\";\r\n // return fn;\r\n // }\r\n\r\n function uncompiledFilter(items, args) {\r\n let retval = [], idx = 0;\r\n\r\n for (let i = 0, ii = items.length; i < ii; i++) {\r\n if (filter(items[i], args)) {\r\n retval[idx++] = items[i];\r\n }\r\n }\r\n\r\n return retval;\r\n }\r\n\r\n function uncompiledFilterWithCaching(items, args, cache) {\r\n let retval = [], idx = 0, item;\r\n\r\n for (let i = 0, ii = items.length; i < ii; i++) {\r\n item = items[i];\r\n if (cache[i]) {\r\n retval[idx++] = item;\r\n } else if (filter(item, args)) {\r\n retval[idx++] = item;\r\n cache[i] = true;\r\n }\r\n }\r\n\r\n return retval;\r\n }\r\n\r\n function getFilteredAndPagedItems(items) {\r\n if (filter) {\r\n let batchFilter = uncompiledFilter; // options.inlineFilters ? compiledFilter : uncompiledFilter;\r\n let batchFilterWithCaching = uncompiledFilterWithCaching; // options.inlineFilters ? compiledFilterWithCaching : uncompiledFilterWithCaching;\r\n\r\n if (refreshHints.isFilterNarrowing) {\r\n filteredItems = batchFilter(filteredItems, filterArgs);\r\n } else if (refreshHints.isFilterExpanding) {\r\n filteredItems = batchFilterWithCaching(items, filterArgs, filterCache);\r\n } else if (!refreshHints.isFilterUnchanged) {\r\n filteredItems = batchFilter(items, filterArgs);\r\n }\r\n } else {\r\n // special case: if not filtering and not paging, the resulting\r\n // rows collection needs to be a copy so that changes due to sort\r\n // can be caught\r\n filteredItems = pagesize ? items : items.concat();\r\n }\r\n\r\n // get the current page\r\n let paged;\r\n if (pagesize) {\r\n if (filteredItems.length <= pagenum * pagesize) {\r\n if (filteredItems.length === 0) {\r\n pagenum = 0;\r\n } else {\r\n pagenum = Math.floor((filteredItems.length - 1) / pagesize);\r\n }\r\n }\r\n paged = filteredItems.slice(pagesize * pagenum, pagesize * pagenum + pagesize);\r\n } else {\r\n paged = filteredItems;\r\n }\r\n return { totalRows: filteredItems.length, rows: paged };\r\n }\r\n\r\n function getRowDiffs(rows, newRows) {\r\n let item, r, eitherIsNonData, diff = [];\r\n let from = 0, to = newRows.length;\r\n\r\n if (refreshHints && refreshHints.ignoreDiffsBefore) {\r\n from = Math.max(0,\r\n Math.min(newRows.length, refreshHints.ignoreDiffsBefore));\r\n }\r\n\r\n if (refreshHints && refreshHints.ignoreDiffsAfter) {\r\n to = Math.min(newRows.length,\r\n Math.max(0, refreshHints.ignoreDiffsAfter));\r\n }\r\n\r\n for (let i = from, rl = rows.length; i < to; i++) {\r\n if (i >= rl) {\r\n diff[diff.length] = i;\r\n } else {\r\n item = newRows[i];\r\n r = rows[i];\r\n\r\n if ((groupingInfos.length && (eitherIsNonData = (item.__nonDataRow) || (r.__nonDataRow)) &&\r\n item.__group !== r.__group ||\r\n item.__group && !item.equals(r))\r\n || (eitherIsNonData &&\r\n // no good way to compare totals since they are arbitrary DTOs\r\n // deep object comparison is pretty expensive\r\n // always considering them 'dirty' seems easier for the time being\r\n (item.__groupTotals || r.__groupTotals))\r\n || item[idProperty] != r[idProperty]\r\n || (updated && updated[item[idProperty]])\r\n ) {\r\n diff[diff.length] = i;\r\n }\r\n }\r\n }\r\n return diff;\r\n }\r\n\r\n function recalc(_items, second?) {\r\n rowsById = null;\r\n\r\n if (refreshHints.isFilterNarrowing != prevRefreshHints.isFilterNarrowing ||\r\n refreshHints.isFilterExpanding != prevRefreshHints.isFilterExpanding) {\r\n filterCache = [];\r\n }\r\n\r\n let filteredItems = getFilteredAndPagedItems(_items);\r\n totalRows = filteredItems.totalRows;\r\n let newRows = filteredItems.rows;\r\n\r\n groups = [];\r\n if (groupingInfos.length) {\r\n groups = extractGroups(newRows);\r\n if (groups.length) {\r\n addTotals(groups);\r\n newRows = flattenGroupedRows(groups);\r\n }\r\n }\r\n\r\n let diff = getRowDiffs(rows, newRows);\r\n\r\n rows = newRows;\r\n\r\n return diff;\r\n }\r\n\r\n function refresh() {\r\n if (suspend) {\r\n return;\r\n }\r\n\r\n let countBefore = rows.length;\r\n let totalRowsBefore = totalRows;\r\n\r\n let diff = recalc(items, filter); // pass as direct refs to avoid closure perf hit\r\n\r\n // if the current page is no longer valid, go to last page and recalc\r\n // we suffer a performance penalty here, but the main loop (recalc) remains highly optimized\r\n if (pagesize && totalRows < pagenum * pagesize) {\r\n pagenum = Math.max(0, Math.ceil(totalRows / pagesize) - 1);\r\n diff = recalc(items, filter);\r\n }\r\n\r\n updated = null;\r\n prevRefreshHints = refreshHints;\r\n refreshHints = {};\r\n\r\n if (totalRowsBefore !== totalRows) {\r\n onPagingInfoChanged.notify(getPagingInfo(), null, self);\r\n }\r\n if (countBefore !== rows.length) {\r\n onRowCountChanged.notify({ previous: countBefore, current: rows.length, dataView: self, callingOnRowsChanged: (diff.length > 0) }, null, self);\r\n }\r\n if (diff.length > 0) {\r\n onRowsChanged.notify({ rows: diff, dataView: self, calledOnRowCountChanged: (countBefore !== rows.length) }, null, self);\r\n }\r\n if (countBefore !== rows.length || diff.length > 0) {\r\n onRowsOrCountChanged.notify({\r\n rowsDiff: diff, previousRowCount: countBefore, currentRowCount: rows.length,\r\n rowCountChanged: countBefore !== rows.length, rowsChanged: diff.length > 0, dataView: self\r\n }, null, self);\r\n }\r\n }\r\n\r\n /***\r\n * Wires the grid and the DataView together to keep row selection tied to item ids.\r\n * This is useful since, without it, the grid only knows about rows, so if the items\r\n * move around, the same rows stay selected instead of the selection moving along\r\n * with the items.\r\n *\r\n * NOTE: This doesn't work with cell selection model.\r\n *\r\n * @param grid {Slick.Grid} The grid to sync selection with.\r\n * @param preserveHidden {Boolean} Whether to keep selected items that go out of the\r\n * view due to them getting filtered out.\r\n * @param preserveHiddenOnSelectionChange {Boolean} Whether to keep selected items\r\n * that are currently out of the view (see preserveHidden) as selected when selection\r\n * changes.\r\n * @return {Slick.Event} An event that notifies when an internal list of selected row ids\r\n * changes. This is useful since, in combination with the above two options, it allows\r\n * access to the full list selected row ids, and not just the ones visible to the grid.\r\n * @method syncGridSelection\r\n */\r\n function syncGridSelection(grid, preserveHidden, preserveHiddenOnSelectionChange) {\r\n let self = this;\r\n let inHandler;\r\n let selectedRowIds = self.mapRowsToIds(grid.getSelectedRows());\r\n let onSelectedRowIdsChanged = new Slick.Event();\r\n\r\n function setSelectedRowIds(rowIds) {\r\n if (selectedRowIds.join(\",\") == rowIds.join(\",\")) {\r\n return;\r\n }\r\n\r\n selectedRowIds = rowIds;\r\n\r\n onSelectedRowIdsChanged.notify({\r\n grid: grid,\r\n ids: selectedRowIds,\r\n dataView: self\r\n }, new Slick.EventData(), self);\r\n }\r\n\r\n function update() {\r\n if (selectedRowIds.length > 0) {\r\n inHandler = true;\r\n let selectedRows = self.mapIdsToRows(selectedRowIds);\r\n if (!preserveHidden) {\r\n setSelectedRowIds(self.mapRowsToIds(selectedRows));\r\n }\r\n grid.setSelectedRows(selectedRows);\r\n inHandler = false;\r\n }\r\n }\r\n\r\n grid.onSelectedRowsChanged.subscribe(function(e, args) {\r\n if (inHandler) { return; }\r\n let newSelectedRowIds = self.mapRowsToIds(grid.getSelectedRows());\r\n if (!preserveHiddenOnSelectionChange || !grid.getOptions().multiSelect) {\r\n setSelectedRowIds(newSelectedRowIds);\r\n } else {\r\n // keep the ones that are hidden\r\n let existing = [];\r\n for (let i = 0; i < selectedRowIds.length; i++) {\r\n if (self.getRowById(selectedRowIds[i]) === undefined) {\r\n existing.push(selectedRowIds[i]);\r\n }\r\n }\r\n // $.grep(selectedRowIds, function(id) { return self.getRowById(id) === undefined; });\r\n // add the newly selected ones\r\n setSelectedRowIds(existing.concat(newSelectedRowIds));\r\n }\r\n });\r\n\r\n this.onRowsOrCountChanged.subscribe(update);\r\n\r\n return onSelectedRowIdsChanged;\r\n }\r\n\r\n function syncGridCellCssStyles(grid, key) {\r\n let hashById;\r\n let inHandler;\r\n\r\n // since this method can be called after the cell styles have been set,\r\n // get the existing ones right away\r\n storeCellCssStyles(grid.getCellCssStyles(key));\r\n\r\n function storeCellCssStyles(hash) {\r\n hashById = {};\r\n for (let row in hash) {\r\n let id = rows[row][idProperty];\r\n hashById[id] = hash[row];\r\n }\r\n }\r\n\r\n function update() {\r\n if (hashById) {\r\n inHandler = true;\r\n ensureRowsByIdCache();\r\n let newHash = {};\r\n for (let id in hashById) {\r\n let row = rowsById[id];\r\n if (row != undefined) {\r\n newHash[row] = hashById[id];\r\n }\r\n }\r\n grid.setCellCssStyles(key, newHash);\r\n inHandler = false;\r\n }\r\n }\r\n\r\n grid.onCellCssStylesChanged.subscribe(function(e, args) {\r\n if (inHandler) { return; }\r\n if (key != args.key) { return; }\r\n if (args.hash) {\r\n storeCellCssStyles(args.hash);\r\n } else {\r\n // grid.onCellCssStylesChanged.unsubscribe(styleChanged); //styleChanged not declared\r\n self.onRowsOrCountChanged.unsubscribe(update);\r\n }\r\n });\r\n\r\n this.onRowsOrCountChanged.subscribe(update);\r\n }\r\n\r\n $.shallowExtend(this, {\r\n // methods\r\n beginUpdate: beginUpdate,\r\n endUpdate: endUpdate,\r\n setPagingOptions: setPagingOptions,\r\n getPagingInfo: getPagingInfo,\r\n getItems: getItems,\r\n setItems: setItems,\r\n setFilter: setFilter,\r\n getFilter: getFilter,\r\n getFilteredItems: getFilteredItems,\r\n sort: sort,\r\n // \"fastSort\": fastSort,\r\n reSort: reSort,\r\n setGrouping: setGrouping,\r\n getGrouping: getGrouping,\r\n groupBy: groupBy,\r\n setAggregators: setAggregators,\r\n collapseAllGroups: collapseAllGroups,\r\n expandAllGroups: expandAllGroups,\r\n collapseGroup: collapseGroup,\r\n expandGroup: expandGroup,\r\n getGroups: getGroups,\r\n getIdxById: getIdxById,\r\n getIdxByItem: getIdxByItem,\r\n getRowByItem: getRowByItem,\r\n getRowById: getRowById,\r\n getItemById: getItemById,\r\n getItemByIdx: getItemByIdx,\r\n mapItemsToRows: mapItemsToRows,\r\n mapRowsToIds: mapRowsToIds,\r\n mapIdsToRows: mapIdsToRows,\r\n setRefreshHints: setRefreshHints,\r\n setFilterArgs: setFilterArgs,\r\n refresh: refresh,\r\n updateItem: updateItem,\r\n insertItem: insertItem,\r\n addItem: addItem,\r\n deleteItem: deleteItem,\r\n sortedAddItem: sortedAddItem,\r\n sortedUpdateItem: sortedUpdateItem,\r\n syncGridSelection: syncGridSelection,\r\n syncGridCellCssStyles: syncGridCellCssStyles,\r\n\r\n // data provider methods\r\n getLength: getLength,\r\n getItem: getItem,\r\n getItemMetadata: getItemMetadata,\r\n\r\n // events\r\n onRowCountChanged: onRowCountChanged,\r\n onRowsChanged: onRowsChanged,\r\n onRowsOrCountChanged: onRowsOrCountChanged,\r\n onPagingInfoChanged: onPagingInfoChanged\r\n });\r\n}\r\n\r\nexport function AvgAggregator(field) {\r\n this.field_ = field;\r\n\r\n this.init = function() {\r\n this.count_ = 0;\r\n this.nonNullCount_ = 0;\r\n this.sum_ = 0;\r\n };\r\n\r\n this.accumulate = function(item) {\r\n let val = item[this.field_];\r\n this.count_++;\r\n if (val != null && val !== \"\" && !isNaN(val)) {\r\n this.nonNullCount_++;\r\n this.sum_ += parseFloat(val);\r\n }\r\n };\r\n\r\n this.storeResult = function(groupTotals) {\r\n if (!groupTotals.avg) {\r\n groupTotals.avg = {};\r\n }\r\n if (this.nonNullCount_ != 0) {\r\n groupTotals.avg[this.field_] = this.sum_ / this.nonNullCount_;\r\n }\r\n };\r\n}\r\n\r\nexport function MinAggregator(field) {\r\n this.field_ = field;\r\n\r\n this.init = function() {\r\n this.min_ = null;\r\n };\r\n\r\n this.accumulate = function(item) {\r\n let val = item[this.field_];\r\n if (val != null && val !== \"\" && !isNaN(val)) {\r\n if (this.min_ == null || val < this.min_) {\r\n this.min_ = val;\r\n }\r\n }\r\n };\r\n\r\n this.storeResult = function(groupTotals) {\r\n if (!groupTotals.min) {\r\n groupTotals.min = {};\r\n }\r\n groupTotals.min[this.field_] = this.min_;\r\n };\r\n}\r\n\r\nexport function MaxAggregator(field) {\r\n this.field_ = field;\r\n\r\n this.init = function() {\r\n this.max_ = null;\r\n };\r\n\r\n this.accumulate = function(item) {\r\n let val = item[this.field_];\r\n if (val != null && val !== \"\" && !isNaN(val)) {\r\n if (this.max_ == null || val > this.max_) {\r\n this.max_ = val;\r\n }\r\n }\r\n };\r\n\r\n this.storeResult = function(groupTotals) {\r\n if (!groupTotals.max) {\r\n groupTotals.max = {};\r\n }\r\n groupTotals.max[this.field_] = this.max_;\r\n };\r\n}\r\n\r\nexport function SumAggregator(field) {\r\n this.field_ = field;\r\n\r\n this.init = function() {\r\n this.sum_ = null;\r\n };\r\n\r\n this.accumulate = function(item) {\r\n let val = item[this.field_];\r\n if (val != null && val !== \"\" && !isNaN(val)) {\r\n this.sum_ += parseFloat(val);\r\n }\r\n };\r\n\r\n this.storeResult = function(groupTotals) {\r\n if (!groupTotals.sum) {\r\n groupTotals.sum = {};\r\n }\r\n groupTotals.sum[this.field_] = this.sum_;\r\n };\r\n}\r\n\r\n // tODO: add more built-in aggregators\r\n // tODO: merge common aggregators in one to prevent needles iterating\r\n\r\n","import { jQueryReplacement } from \"../core/jq\";\r\nimport { Slick, ISlickColumn, ISlickFormatterResult} from \"./slick.core\";\r\n\r\n\r\nlet $ = jQueryReplacement;\r\n\r\n$.deepExtend(Slick, {\r\n Data: {\r\n GroupItemMetadataProvider: GroupItemMetadataProvider\r\n }\r\n});\r\n\r\n\r\n /***\r\n * Provides item metadata for group (Slick.Group) and totals (Slick.Totals) rows produced by the DataView.\r\n * This metadata overrides the default behavior and formatting of those rows so that they appear and function\r\n * correctly when processed by the grid.\r\n *\r\n * This class also acts as a grid plugin providing event handlers to expand & collapse groups.\r\n * If \"grid.registerPlugin(...)\" is not called, expand & collapse will not work.\r\n *\r\n * @class GroupItemMetadataProvider\r\n * @module Data\r\n * @namespace Slick.Data\r\n * @constructor\r\n * @param options\r\n */\r\n export function GroupItemMetadataProvider(options?) {\r\n var _grid;\r\n var _defaults = {\r\n checkboxSelect: false,\r\n checkboxSelectCssClass: \"slick-group-select-checkbox\",\r\n checkboxSelectPlugin: null,\r\n groupCssClass: \"slick-group\",\r\n groupTitleCssClass: \"slick-group-title\",\r\n totalsCssClass: \"slick-group-totals\",\r\n groupFocusable: true,\r\n totalsFocusable: false,\r\n toggleCssClass: \"slick-group-toggle\",\r\n toggleExpandedCssClass: \"expanded\",\r\n toggleCollapsedCssClass: \"collapsed\",\r\n enableExpandCollapse: true,\r\n groupFormatter: defaultGroupCellFormatter,\r\n totalsFormatter: defaultTotalsCellFormatter\r\n };\r\n\r\n options = $.deepExtend({}, _defaults, options);\r\n\r\n\r\n function defaultGroupCellFormatter(row, cell, value, columnDef, item, grid) {\r\n if (!options.enableExpandCollapse) {\r\n return item.title;\r\n }\r\n\r\n let indentation = item.level * 15 + \"px\";\r\n\r\n return (options.checkboxSelect ? '<span class=\"' + options.checkboxSelectCssClass +\r\n ' ' + (item.selectChecked ? 'checked' : 'unchecked') + '\"></span>' : '') +\r\n \"<span class='\" + options.toggleCssClass + \" \" +\r\n (item.collapsed ? options.toggleCollapsedCssClass : options.toggleExpandedCssClass) +\r\n \"' style='margin-left:\" + indentation +\"'>\" +\r\n \"</span>\" +\r\n \"<span class='\" + options.groupTitleCssClass + \"' level='\" + item.level + \"'>\" +\r\n item.title +\r\n \"</span>\";\r\n }\r\n\r\n function defaultTotalsCellFormatter(row, cell, value, columnDef: ISlickColumn, item, grid) {\r\n let formatter_res;\r\n if (columnDef.groupTotalsFormatter) {\r\n formatter_res = columnDef.groupTotalsFormatter(item, columnDef, grid) || \"\";\r\n } else {\r\n let res = (item.avg && item.avg[columnDef.field]) \r\n || (item.sum && item.sum[columnDef.field])\r\n || (item.max && item.max[columnDef.field])\r\n || (item.min && item.min[columnDef.field]);\r\n\r\n formatter_res = (columnDef.formatter ? columnDef.formatter(row, cell, res, columnDef, item) : \"\");\r\n }\r\n return formatter_res;\r\n //return (Object.prototype.toString.call(formatter_res) !== '[object Object]' ? (<string>formatter_res) : (<ISlickFormatterResult>formatter_res).text);\r\n }\r\n\r\n\r\n function init(grid) {\r\n _grid = grid;\r\n _grid.onClick.subscribe(handleGridClick);\r\n _grid.onKeyDown.subscribe(handleGridKeyDown);\r\n\r\n }\r\n\r\n function destroy() {\r\n if (_grid) {\r\n _grid.onClick.unsubscribe(handleGridClick);\r\n _grid.onKeyDown.unsubscribe(handleGridKeyDown);\r\n }\r\n }\r\n\r\n function handleGridClick(e, args) {\r\n var $target = $(e.target);\r\n var item = this.getDataItem(args.row);\r\n if (item && item instanceof Slick.Group && $target.hasClass(options.toggleCssClass)) {\r\n var range = _grid.getRenderedRange();\r\n this.dataView.setRefreshHints({\r\n ignoreDiffsBefore: range.top,\r\n ignoreDiffsAfter: range.bottom + 1\r\n });\r\n\r\n if ((<any>item).collapsed) {\r\n this.dataView.expandGroup((<any>item).groupingKey);\r\n } else {\r\n this.dataView.collapseGroup((<any>item).groupingKey);\r\n }\r\n\r\n e.stopImmediatePropagation();\r\n e.preventDefault();\r\n }\r\n if (item && item instanceof Slick.Group && $target.hasClass(options.checkboxSelectCssClass)) {\r\n (<any>item).selectChecked = !(<any>item).selectChecked;\r\n $target.removeClass(((<any>item).selectChecked ? \"unchecked\" : \"checked\"));\r\n $target.addClass(((<any>item).selectChecked ? \"checked\" : \"unchecked\"));\r\n // get rowIndexes array\r\n var rowIndexes = _grid.dataView.mapItemsToRows((<any>item).rows);\r\n ((<any>item).selectChecked ? options.checkboxSelectPlugin.selectRows : options.checkboxSelectPlugin.deSelectRows)(rowIndexes);\r\n }\r\n }\r\n\r\n // TODO: add -/+ handling\r\n function handleGridKeyDown(e, args) {\r\n if (options.enableExpandCollapse && (e.which == Slick.keyCode.SPACE)) {\r\n var activeCell = this.getActiveCell();\r\n if (activeCell) {\r\n var item = this.getDataItem(activeCell.row);\r\n if (item && item instanceof Slick.Group) {\r\n var range = _grid.getRenderedRange();\r\n this.dataView.setRefreshHints({\r\n ignoreDiffsBefore: range.top,\r\n ignoreDiffsAfter: range.bottom + 1\r\n });\r\n\r\n if ((<any>item).collapsed) {\r\n this.dataView.expandGroup((<any>item).groupingKey);\r\n } else {\r\n this.dataView.collapseGroup((<any>item).groupingKey);\r\n }\r\n\r\n e.stopImmediatePropagation();\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n }\r\n\r\n function getGroupRowMetadata(item) {\r\n return {\r\n selectable: false,\r\n focusable: options.groupFocusable,\r\n cssClasses: options.groupCssClass,\r\n columns: {\r\n 0: {\r\n colspan: \"*\",\r\n formatter: options.groupFormatter,\r\n editor: null\r\n }\r\n },\r\n height: options.calcGroupHeight ? options.calcGroupHeight(item) : undefined\r\n };\r\n }\r\n\r\n function getTotalsRowMetadata(item) {\r\n return {\r\n selectable: false,\r\n focusable: options.totalsFocusable,\r\n cssClasses: options.totalsCssClass,\r\n formatter: options.totalsFormatter,\r\n editor: null,\r\n height: options.calcTotalsHeight ? options.calcTotalsHeight(item) : undefined\r\n };\r\n }\r\n\r\n\r\n return {\r\n \"init\": init,\r\n \"destroy\": destroy,\r\n \"getGroupRowMetadata\": getGroupRowMetadata,\r\n \"getTotalsRowMetadata\": getTotalsRowMetadata\r\n };\r\n }\r\n","import { jQueryReplacement, IjQueryWrapper } from \"../../core/jq\";\r\nimport { Slick } from \"../slick.core\";\r\nimport './slick.headermenu.css'\r\n\r\n\r\nlet $ = jQueryReplacement;\r\n\r\n // register namespace\r\n $.deepExtend(window, {\r\n \"Slick\": {\r\n \"Plugins\": {\r\n \"HeaderMenu\": HeaderMenu\r\n }\r\n }\r\n });\r\n\r\n /***\r\n * A plugin to add drop-down menus to column headers.\r\n *\r\n * USAGE:\r\n *\r\n * Add the plugin .js & .css files and register it with the grid.\r\n *\r\n * To specify a menu in a column header, extend the column definition like so:\r\n *\r\n * var columns = [\r\n * {\r\n * id: 'myColumn',\r\n * name: 'My column',\r\n *\r\n * // This is the relevant part\r\n * header: {\r\n * menu: {\r\n * items: [\r\n * {\r\n * // menu item options\r\n * },\r\n * {\r\n * // menu item options\r\n * }\r\n * ]\r\n * }\r\n * }\r\n * }\r\n * ];\r\n *\r\n *\r\n * Available menu options:\r\n * tooltip: Menu button tooltip.\r\n *\r\n *\r\n * Available menu item options:\r\n * title: Menu item text.\r\n * divider: Whether the current item is a divider, not an actual command.\r\n * disabled: Whether the item is disabled.\r\n * tooltip: Item tooltip.\r\n * command: A command identifier to be passed to the onCommand event handlers.\r\n * iconCssClass: A CSS class to be added to the menu item icon.\r\n * iconImage: A url to the icon image.\r\n * minWidth: Minimum width that the drop menu will have\r\n * autoAlign: Auto-align drop menu to the left when not enough viewport space to show on the right\r\n * autoAlignOffset: When drop menu is aligned to the left, it might not be perfectly aligned with the header menu icon, if that is the case you can add an offset (positive/negative number to move right/left)\r\n *\r\n *\r\n * The plugin exposes the following events:\r\n * onBeforeMenuShow: Fired before the menu is shown. You can customize the menu or dismiss it by returning false.\r\n * Event args:\r\n * grid: Reference to the grid.\r\n * column: Column definition.\r\n * menu: Menu options. Note that you can change the menu items here.\r\n *\r\n * onCommand: Fired on menu item click for buttons with 'command' specified.\r\n * Event args:\r\n * grid: Reference to the grid.\r\n * column: Column definition.\r\n * command: Button command identified.\r\n * button: Button options. Note that you can change the button options in your\r\n * event handler, and the column header will be automatically updated to\r\n * reflect them. This is useful if you want to implement something like a\r\n * toggle button.\r\n *\r\n *\r\n * @param options {Object} Options:\r\n * buttonCssClass: an extra CSS class to add to the menu button\r\n * buttonImage: a url to the menu button image (default '../images/down.gif')\r\n * @class Slick.Plugins.HeaderButtons\r\n * @constructor\r\n */\r\n export function HeaderMenu(options) {\r\n var _grid;\r\n var _self = this;\r\n var _handler = new Slick.EventHandler();\r\n var _defaults = {\r\n buttonCssClass: null,\r\n buttonImage: null,\r\n minWidth: 100,\r\n autoAlign: true,\r\n autoAlignOffset: 0\r\n };\r\n var $menu: IjQueryWrapper;\r\n var $activeHeaderColumn: IjQueryWrapper;\r\n\r\n\r\n function init(grid) {\r\n options = $.deepExtend({}, _defaults, options);\r\n _grid = grid;\r\n _handler\r\n .subscribe(_grid.onHeaderCellRendered, handleHeaderCellRendered)\r\n .subscribe(_grid.onBeforeHeaderCellDestroy, handleBeforeHeaderCellDestroy);\r\n\r\n // Force the grid to re-render the header now that the events are hooked up.\r\n //_grid.setColumns(_grid.getColumns()); //TODO TODOFIX try to optimize this\r\n\r\n // Hide the menu on outside click.\r\n $(document.body).on(\"mousedown\", handleBodyMouseDown);\r\n }\r\n\r\n function setOptions(newOptions) {\r\n options = $.deepExtend({}, options, newOptions);\r\n }\r\n\r\n\r\n function destroy() {\r\n _handler.unsubscribeAll();\r\n document.body.removeEventListener(\"mousedown\", handleBodyMouseDown);\r\n //$(document.body).off(\"mousedown\", handleBodyMouseDown);\r\n }\r\n\r\n\r\n function handleBodyMouseDown(e) {\r\n if ($menu && $(e.target).closestClass(\"slick-header-menu\").length === 0) { //!$.contains($menu[0], e.target)) {\r\n hideMenu();\r\n }\r\n }\r\n\r\n\r\n function hideMenu() {\r\n if ($menu) {\r\n $menu.remove();\r\n $menu = null;\r\n $activeHeaderColumn\r\n .removeClass(\"slick-header-column-active\");\r\n }\r\n }\r\n\r\n function handleHeaderCellRendered(e, args) {\r\n var column = args.column;\r\n var menu = $.deepExtend({}, (column.header && column.header.menu) || {items:[]});\r\n\r\n if (!column.hideMenu) {\r\n var $el:IjQueryWrapper = $(\"<div></div>\")\r\n .addClass(\"slick-header-menubutton\")\r\n .data(\"column\", column)\r\n .data(\"menu\", menu);\r\n if (column.resizable) {\r\n $el.addClass(\"resize-offset\");\r\n }\r\n\r\n if (options.buttonCssClass) {\r\n $el.addClass(options.buttonCssClass);\r\n }\r\n\r\n if (options.buttonImage) {\r\n $el.css(\"background-image\", \"url(\" + options.buttonImage + \")\");\r\n }\r\n\r\n if (menu.tooltip) {\r\n $el.attr(\"title\", menu.tooltip);\r\n }\r\n\r\n $el\r\n .on(\"click\", showMenu)\r\n .appendTo(args.node);\r\n }\r\n }\r\n\r\n\r\n function handleBeforeHeaderCellDestroy(e, args) {\r\n var column = args.column;\r\n\r\n if (column.header && column.header.menu) {\r\n $(args.node).find(\".slick-header-menubutton\").remove();\r\n }\r\n }\r\n\r\n\r\n function showMenu(e) {\r\n var $menuButton: IjQueryWrapper = $(e.target);\r\n var menu = $.deepExtend({}, $menuButton.data(\"menu\"));\r\n var columnDef = $menuButton.data(\"column\");\r\n\r\n // Let the user modify the menu or cancel altogether,\r\n // or provide alternative menu implementation.\r\n if (_self.onBeforeMenuShow.notify({\r\n \"grid\": _grid,\r\n \"column\": columnDef,\r\n \"menu\": menu\r\n }, e, _self) == false) {\r\n return;\r\n }\r\n\r\n\r\n if (!$menu) {\r\n $menu = $(\"<div class='slick-header-menu' style='min-width: \" + options.minWidth + \"px'></div>\")\r\n .appendTo(_grid.getContainerNode());\r\n }\r\n $menu.empty();\r\n\r\n\r\n // Construct the menu items.\r\n for (var i = 0; i < menu.items.length; i++) {\r\n var item = menu.items[i];\r\n\r\n var $li = $(\"<div class='slick-header-menuitem'></div>\")\r\n .data(\"command\", item.command || '')\r\n .data(\"column\", columnDef)\r\n .data(\"item\", item)\r\n .on(\"click\", handleMenuItemClick)\r\n .appendTo($menu);\r\n\r\n if (item.disabled) {\r\n $li.addClass(\"slick-header-menuitem-disabled\");\r\n }\r\n\r\n if (item.divider) {\r\n $li.addClass(\"slick-header-menuitem-divider\");\r\n continue;\r\n }\r\n\r\n if (item.tooltip) {\r\n $li.attr(\"title\", item.tooltip);\r\n }\r\n\r\n var $icon = $(\"<div class='slick-header-menuicon'></div>\")\r\n .appendTo($li);\r\n\r\n if (item.iconCssClass) {\r\n $icon.addClass(item.iconCssClass);\r\n }\r\n\r\n if (item.iconImage) {\r\n $icon.css(\"background-image\", \"url(\" + item.iconImage + \")\");\r\n }\r\n\r\n $(\"<span class='slick-header-menucontent'></span>\")\r\n .text(item.title)\r\n .appendTo($li);\r\n }\r\n\r\n var leftPos = $menuButton.offset().left;\r\n\r\n // when auto-align is set, it will calculate whether it has enough space in the viewport to show the drop menu on the right (default)\r\n // if there isn't enough space on the right, it will automatically align the drop menu to the left\r\n // to simulate an align left, we actually need to know the width of the drop menu\r\n if (options.autoAlign) {\r\n var gridPos = _grid.getGridPosition();\r\n if ((leftPos + options.minWidth) >= gridPos.width) {\r\n leftPos = leftPos - options.minWidth + options.autoAlignOffset;\r\n }\r\n }\r\n\r\n //$menu\r\n // .offset({ top: $menuButton.offset().top + $menuButton.height(), left: leftPos });\r\n $menu[0].style.top = (/*$menuButton.offset().top +*/ $menuButton.height() as number) + \"px\";\r\n $menu[0].style.left = (leftPos - $(_grid.getContainerNode()).offset().left) + \"px\";\r\n\r\n // Mark the header as active to keep the highlighting.\r\n $activeHeaderColumn = $menuButton.closestClass(\".slick-header-column\");\r\n $activeHeaderColumn\r\n .addClass(\"slick-header-column-active\");\r\n\r\n // Stop propagation so that it doesn't register as a header click event.\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n\r\n\r\n function handleMenuItemClick(e) {\r\n var command = $(e.currentTarget).data(\"command\");\r\n var columnDef = $(e.currentTarget).data(\"column\");\r\n var item = $(e.currentTarget).data(\"item\");\r\n\r\n if (item.disabled || item.divider) {\r\n return;\r\n }\r\n\r\n hideMenu();\r\n\r\n if (command != null && command != '') {\r\n _self.onCommand.notify({\r\n \"grid\": _grid,\r\n \"column\": columnDef,\r\n \"command\": command,\r\n \"item\": item\r\n }, e, _self);\r\n }\r\n\r\n // Stop propagation so that it doesn't register as a header click event.\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n\r\n $.shallowExtend(this, {\r\n \"init\": init,\r\n \"destroy\": destroy,\r\n \"pluginName\": \"HeaderMenu\",\r\n \"setOptions\": setOptions,\r\n\r\n \"onBeforeMenuShow\": new Slick.Event(),\r\n \"onCommand\": new Slick.Event()\r\n });\r\n }\r\n","import \"./slick.headerbuttons.css\";\r\nimport { Slick } from \"../slick.core\";\r\nimport { jQueryReplacement } from \"../../core/jq\";\r\n\r\nlet $ = jQueryReplacement;\r\n\r\n// register namespace\r\n$.deepExtend(window, {\r\n \"Slick\": {\r\n \"Plugins\": {\r\n \"HeaderButtons\": HeaderButtons\r\n }\r\n }\r\n});\r\n\r\n\r\n/***\r\n * A plugin to add custom buttons to column headers.\r\n *\r\n * USAGE:\r\n *\r\n * Add the plugin .js & .css files and register it with the grid.\r\n *\r\n * To specify a custom button in a column header, extend the column definition like so:\r\n *\r\n * var columns = [\r\n * {\r\n * id: 'myColumn',\r\n * name: 'My column',\r\n *\r\n * // This is the relevant part\r\n * header: {\r\n * buttons: [\r\n * {\r\n * // button options\r\n * },\r\n * {\r\n * // button options\r\n * }\r\n * ]\r\n * }\r\n * }\r\n * ];\r\n *\r\n * Available button options:\r\n * cssClass: CSS class to add to the button.\r\n * image: Relative button image path.\r\n * tooltip: Button tooltip.\r\n * showOnHover: Only show the button on hover.\r\n * handler: Button click handler.\r\n * command: A command identifier to be passed to the onCommand event handlers.\r\n *\r\n * The plugin exposes the following events:\r\n * onCommand: Fired on button click for buttons with 'command' specified.\r\n * Event args:\r\n * grid: Reference to the grid.\r\n * column: Column definition.\r\n * command: Button command identified.\r\n * button: Button options. Note that you can change the button options in your\r\n * event handler, and the column header will be automatically updated to\r\n * reflect them. This is useful if you want to implement something like a\r\n * toggle button.\r\n *\r\n *\r\n * @param options {Object} Options:\r\n * buttonCssClass: a CSS class to use for buttons (default 'slick-header-button')\r\n * @class Slick.Plugins.HeaderButtons\r\n * @constructor\r\n */\r\nexport function HeaderButtons(options) {\r\n var _grid;\r\n var _self = this;\r\n var _handler = new Slick.EventHandler();\r\n var _defaults = {\r\n buttonCssClass: \"slick-header-button\"\r\n };\r\n\r\n\r\n function init(grid) {\r\n options = $.deepExtend({}, _defaults, options);\r\n _grid = grid;\r\n _handler\r\n .subscribe(_grid.onHeaderCellRendered, handleHeaderCellRendered)\r\n .subscribe(_grid.onBeforeHeaderCellDestroy, handleBeforeHeaderCellDestroy);\r\n\r\n // Force the grid to re-render the header now that the events are hooked up.\r\n _grid.setColumns(_grid.getColumns());\r\n }\r\n\r\n\r\n function destroy() {\r\n _handler.unsubscribeAll();\r\n }\r\n\r\n\r\n function handleHeaderCellRendered(e, args) {\r\n var column = args.column;\r\n\r\n if (column.header && column.header.buttons) {\r\n // Append buttons in reverse order since they are floated to the right.\r\n var i = column.header.buttons.length;\r\n while (i--) {\r\n var button = column.header.buttons[i];\r\n var btn = $(\"<div></div>\")\r\n .addClass(options.buttonCssClass)\r\n .data(\"column\", column)\r\n .data(\"button\", button);\r\n\r\n if (button.showOnHover) {\r\n btn.addClass(\"slick-header-button-hidden\");\r\n }\r\n\r\n if (button.image) {\r\n btn.css(\"backgroundImage\", \"url(\" + button.image + \")\");\r\n }\r\n if (button.html) {\r\n btn.html(button.html);\r\n }\r\n\r\n if (button.cssClass) {\r\n btn.addClass(button.cssClass);\r\n }\r\n\r\n if (button.tooltip) {\r\n btn.attr(\"title\", button.tooltip);\r\n }\r\n\r\n if (button.command) {\r\n btn.data(\"command\", button.command);\r\n }\r\n\r\n if (button.handler) {\r\n btn.on(\"click\", button.handler);\r\n }\r\n\r\n btn\r\n .on(\"click\", handleButtonClick)\r\n .appendTo(args.node);\r\n }\r\n }\r\n }\r\n\r\n\r\n function handleBeforeHeaderCellDestroy(e, args) {\r\n var column = args.column;\r\n\r\n if (column.header && column.header.buttons) {\r\n // Removing buttons via jQuery will also clean up any event handlers and data.\r\n // NOTE: If you attach event handlers directly or using a different framework,\r\n // you must also clean them up here to avoid memory leaks.\r\n $(args.node).find(\".\" + options.buttonCssClass).remove();\r\n }\r\n }\r\n\r\n\r\n function handleButtonClick(e) {\r\n var command = $(this).data(\"command\");\r\n var columnDef = $(this).data(\"column\");\r\n var button = $(this).data(\"button\");\r\n\r\n if (command != null) {\r\n _self.onCommand.notify({\r\n \"grid\": _grid,\r\n \"column\": columnDef,\r\n \"command\": command,\r\n \"button\": button\r\n }, e, _self);\r\n\r\n // Update the header in case the user updated the button definition in the handler.\r\n _grid.updateColumnHeader(columnDef.id);\r\n }\r\n\r\n // Stop propagation so that it doesn't register as a header click event.\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n\r\n $.shallowExtend(this, {\r\n \"init\": init,\r\n \"destroy\": destroy,\r\n \"pluginName\": \"HeaderButtons\",\r\n\r\n \"onCommand\": new Slick.Event()\r\n });\r\n}\r\n","/*\r\n * Contains basic SlickGrid formatters.\r\n * \r\n * NOTE: These are merely examples. You will most likely need to implement something more\r\n * robust/extensible/localizable/etc. for your use!\r\n */\r\n\r\nimport { ISlickFormatter, ISlickFormatterResult } from './slick.core'\r\nimport { numeric } from '../core/numeric';\r\nimport { date } from '../core/date';\r\n\r\nfunction escapeHTMLChars(text: string): string {\r\n if (text == null) {\r\n return \"\";\r\n }\r\n if (typeof text.replace !== \"function\") {\r\n return text;\r\n }\r\n return text.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\r\n}\r\n\r\nexport let EmptyFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return \"\";\r\n};\r\n\r\nexport let ComponentFormatter = EmptyFormatter;\r\n\r\nexport let YesNoFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return value ? \"Yes\" : \"No\";\r\n};\r\n\r\nexport let CheckboxFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return '<div style=\"text-align:center\">' + (value ? \"✔\" : \"-\") + '</div>'; // ❌\r\n};\r\n\r\nexport let CheckmarkFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return value ? \"✔\" : \"\";\r\n};\r\n\r\nexport let NumericFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): ISlickFormatterResult {\r\n return {\r\n addClasses: [\"right\"],\r\n text: numeric.format(value, columnDef.format)\r\n };\r\n};\r\n\r\nexport let DateFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return date.format(value, columnDef.format);\r\n};\r\n\r\nexport let HtmlFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return value || \"\";\r\n};\r\n\r\nexport let LookupFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n let vl = columnDef.valueList;\r\n if (vl) {\r\n if (Array.isArray(vl)) {\r\n if (vl.length > 0) {\r\n if (typeof (vl[0]) === \"string\") {\r\n return escapeHTMLChars(vl.indexOf(value) >= 0 ? value : \"\"); //TODO: desired?\r\n } else {\r\n const vlList = vl as Array<{ text: string, value: any }>;\r\n return escapeHTMLChars(vlList.filter((x) => x.value === value)[0]?.text);\r\n }\r\n } else {\r\n return \"\";\r\n }\r\n } else {\r\n return escapeHTMLChars(vl[value]);\r\n }\r\n } else {\r\n console.warn(\"No values list found for column \" + columnDef.id);\r\n }\r\n return escapeHTMLChars(value);\r\n};\r\n\r\nexport let MultiLookupFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n if (value == null || value.length === 0) {\r\n return \"\";\r\n }\r\n const vl = columnDef.valueList;\r\n let result = \"\";\r\n if (vl == null) {\r\n console.warn(\"No values list found for column \" + columnDef.id);\r\n return result;\r\n }\r\n if (Array.isArray(vl)) {\r\n if (vl.length > 0) {\r\n if (typeof (vl[0]) === \"string\") {\r\n result = value.filter((v) => vl.indexOf(v) >= 0).join(\", \");\r\n } else {\r\n const vlList = vl as Array<{ text: string, value: any }>;\r\n result = vlList.filter((x) => value.indexOf(x.value) >= 0).map((x) => x.text ?? \"\").join(\", \");\r\n }\r\n }\r\n } else {\r\n result = value.map((v) => vl[v]).filter((v) => v != null).join(\", \");\r\n }\r\n return result || \"\";\r\n};\r\n\r\nexport let TextFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n if (value == null) {\r\n return \"\";\r\n } else {\r\n return escapeHTMLChars(value + \"\");\r\n }\r\n};\r\n\r\nexport let TooltipFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string | ISlickFormatterResult {\r\n if (value == null) {\r\n return \"\";\r\n } else {\r\n const result = escapeHTMLChars(value + \"\");\r\n return {text: result, toolTip: result};\r\n }\r\n};\r\n\r\nexport let MultiLineTextFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): ISlickFormatterResult {\r\n var txt = \"\";\r\n if (value != null) {\r\n txt = escapeHTMLChars(value + \"\");\r\n }\r\n return { text: txt, addClasses: [\"slick-wrap\"] };\r\n};\r\n\r\nfunction pad(nr: number): string {\r\n if (nr < 10) {\r\n return \"0\" + nr.toString();\r\n } else {\r\n return nr.toString();\r\n }\r\n}\r\n\r\nexport let TimeFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return value ? (pad(value.getHours()) + \":\" + pad(value.getMinutes())) : \"\";\r\n};\r\n\r\nexport let DateTimeFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return DateFormatter(row, cell, value, columnDef, dataContext) + \" \" +\r\n TimeFormatter(row, cell, value, columnDef, dataContext);\r\n};\r\n\r\nexport let ButtonFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext): string {\r\n return \"<button class='grid-btn'>...</button>\";\r\n};\r\n","import culture from \"./culture\";\r\n\r\n/*\r\n * contains function to parse and format numeric values\r\n */\r\n\r\ninterface IFormatInfo {\r\n min_comma_places: number;\r\n max_comma_places: number;\r\n min_length: number;\r\n show_sep: boolean;\r\n prefix: string;\r\n suffix: string;\r\n}\r\n\r\n\r\nexport abstract class numeric {\r\n\r\n public static parse(nrAsString: string): number {\r\n if (nrAsString === \"\" || nrAsString === undefined || nrAsString === null) {\r\n return undefined;\r\n }\r\n if (!nrAsString) {\r\n return undefined;\r\n }\r\n if (culture.info.decimalSep && culture.info.decimalSep.length > 1) {\r\n throw \"DecimalSep cannot be more than one character\";\r\n }\r\n if (culture.info.thousandSep && culture.info.thousandSep.length > 1) {\r\n throw \"ThousandSep cannot be more than one character\";\r\n }\r\n var str = \"\";\r\n var comma_sep = culture.info.decimalSep;\r\n for (var i = 0; i < nrAsString.length; i++) {\r\n var c = nrAsString.charAt(i);\r\n if (c === comma_sep) {\r\n str += '.';\r\n }\r\n else if (c === '0' || c === '1' || c === '2' || c === '3' || c === '4' || c === '5' || c === '6' || c === '7' || c === '8' || c === '9' || (c === '-' && str === \"\")) {\r\n str += c;\r\n }\r\n }\r\n return parseFloat(str);\r\n }\r\n\r\n public static format(nr: number, format?: string): string {\r\n if (isNaN(nr) || nr === null || nr === undefined) {\r\n return \"\";\r\n }\r\n if (culture.info.decimalSep && culture.info.decimalSep.length > 1) {\r\n throw \"DecimalSep cannot be more than one character\";\r\n }\r\n if (culture.info.thousandSep && culture.info.thousandSep.length > 1) {\r\n throw \"ThousandSep cannot be more than one character\";\r\n }\r\n\r\n const f = format || culture.info.numberFormat;\r\n let cacheEntry = numeric.formatCache[f];\r\n if (!cacheEntry) {\r\n numeric.formatCache[f] = cacheEntry = numeric.parseNrFormat(f);\r\n }\r\n return numeric.formatNumber(nr, cacheEntry);\r\n }\r\n\r\n private static formatCache: { [_key: string]: IFormatInfo } = {};\r\n\r\n private static parseNrFormat(format: string): IFormatInfo {\r\n let prefix = \"\";\r\n let suffix = \"\";\r\n let show_sep = format.indexOf(',#') > 0 || format.indexOf(',0') > 0;\r\n let min_length = 0;\r\n for (let i = 0; i < format.length; i++) {\r\n if (format.charAt(i) === '.') {\r\n break;\r\n }\r\n if (format.charAt(i) === '0') {\r\n min_length++;\r\n }\r\n if (min_length === 0 && format.charAt(i) !== ',' && format.charAt(i) !== '0' && format.charAt(i) !== '.' && format.charAt(i) !== '#') {\r\n prefix += format.charAt(i);\r\n }\r\n }\r\n let max_comma_places = 0;\r\n let min_comma_places = 0;\r\n let comma_pos = format.indexOf('.');\r\n if (comma_pos >= 0) {\r\n for (let j = comma_pos + 1; j < format.length; j++) {\r\n if (format.charAt(j) === '0') {\r\n min_comma_places++;\r\n }\r\n else if (format.charAt(j) === '#') {\r\n max_comma_places++;\r\n }\r\n else if (format.charAt(j) !== ',' && format.charAt(j) !== '.') {\r\n suffix += format.charAt(j);\r\n }\r\n }\r\n }\r\n max_comma_places += min_comma_places;\r\n return { max_comma_places, min_comma_places, min_length, prefix, suffix, show_sep };\r\n }\r\n\r\n private static formatNumber(nr, format: IFormatInfo) {\r\n //defaults\r\n let comma_separator = culture.info.decimalSep;\r\n let thousand_separator = culture.info.thousandSep;\r\n let cp_min = format.min_comma_places || 0;\r\n let cp_max = format.max_comma_places || 0;\r\n let ml = format.min_length || 0;\r\n //check if number is negative\r\n let negative = nr < 0;\r\n if (negative) {\r\n nr = -nr;\r\n }\r\n //convert number to a string and round\r\n let nr_str_raw = nr.toFixed(cp_max);\r\n let cp = cp_max;\r\n //remove comma-places which are not necessary\r\n let end = nr_str_raw.indexOf('.') + cp_min;\r\n if (end >= 0) {\r\n let x = nr_str_raw.length - 1;\r\n while (x > end) {\r\n if (nr_str_raw.charAt(x) === '0') {\r\n cp--;\r\n nr_str_raw = nr_str_raw.slice(0, -1);\r\n } else {\r\n break;\r\n }\r\n x--;\r\n }\r\n if (nr_str_raw.charAt(x) === '.') {\r\n nr_str_raw = nr_str_raw.slice(0, -1);\r\n }\r\n }\r\n let nr_str = comma_separator !== \".\" ? nr_str_raw.replace(\".\", comma_separator) : nr_str_raw;\r\n let t = cp ? cp + 1 : 0;\r\n // add \"0\" at the front if necessary\r\n while (nr_str.length < ml + t) {\r\n nr_str = \"0\" + nr_str;\r\n }\r\n // insert thousand-separator if necessary\r\n t += 3;\r\n while (nr_str.length > t && format.show_sep) {\r\n nr_str = nr_str.substr(0, nr_str.length - t) + thousand_separator + nr_str.substr(nr_str.length - t);\r\n t += 4;\r\n }\r\n //remove first 0 if necessary\r\n if (ml === 0 && nr_str.charAt(0) === '0') {\r\n nr_str = nr_str.slice(1);\r\n }\r\n //return number\r\n if (negative && parseFloat(nr_str_raw) !== 0) {\r\n return (format.prefix || \"\") + \"-\" + nr_str + (format.suffix || \"\");\r\n }\r\n else {\r\n return (format.prefix || \"\") + nr_str + (format.suffix || \"\");\r\n }\r\n }\r\n}\r\n","let _w: any = window;\r\n\r\n_w._current_culture = \"\";\r\n\r\nlet culture = _w._culture ?? {\r\n\r\n info: { thousandSep: \",\", decimalSep: \".\", dateFormat: \"yy-mm-dd\", numberFormat: \"#,0.####\" },\r\n\r\n /**\r\n * sets a culture\r\n * @param c culture as string for example 'de' or 'en-us'\r\n */\r\n set: function(c: string): void {\r\n var cult_vals = culture.cultures[c.toLowerCase()];\r\n if (cult_vals === undefined)\r\n throw \"unknown culture '\"+c+\"'\";\r\n culture.info.decimalSep = cult_vals[0];\r\n culture.info.thousandSep = cult_vals[1];\r\n culture.info.dateFormat = cult_vals[2];\r\n _w.current_culture = c;\r\n },\r\n\r\n /**\r\n * returns current culture\r\n */\r\n get: function(): string {\r\n return _w.current_culture;\r\n },\r\n cultures: {\r\n// 'ar':['.',',','dd/mm/y'],\r\n// 'bg':[',',' ','d.m.yy \\'г.\\''],\r\n// 'ca':[',','.','dd/mm/yy'],\r\n// 'zh-hans':['.',',','yy/m/d'],\r\n// 'cs':[',',' ','d.m.yy'],\r\n// 'da':[',','.','dd-mm-yy'],\r\n'de':[',','.','dd.mm.yy'],\r\n// 'el':[',','.','d/m/yy'],\r\n// 'es':[',','.','dd/mm/yy'],\r\n// 'fi':[',',' ','d.m.yy'],\r\n// 'fr':[',',' ','dd/mm/yy'],\r\n// 'he':['.',',','dd/mm/yy'],\r\n// 'hu':[',',' ','yy.mm.dd.'],\r\n// 'is':[',','.','d.m.yy'],\r\n// 'it':[',','.','dd/mm/yy'],\r\n// 'ja':['.',',','yy/mm/dd'],\r\n// 'ko':['.',',','yy-mm-dd'],\r\n// 'nl':[',','.','d-m-yy'],\r\n// 'no':[',',' ','dd.mm.yy'],\r\n// 'pl':[',',' ','yy-mm-dd'],\r\n// 'pt':[',','.','dd/mm/yy'],\r\n// 'rm':['.','\\'','dd/mm/yy'],\r\n// 'ro':[',','.','dd.mm.yy'],\r\n// 'ru':[',',' ','dd.mm.yy'],\r\n// 'hr':[',','.','d.m.yy.'],\r\n// 'sk':[',',' ','d. m. yy'],\r\n// 'sq':[',','.','yy-mm-dd'],\r\n// 'sv':[',',' ','yy-mm-dd'],\r\n// 'th':['.',',','d/m/yy'],\r\n// 'tr':[',','.','dd.mm.yy'],\r\n// 'ur':['.',',','dd/mm/yy'],\r\n// 'id':[',','.','dd/mm/yy'],\r\n// 'uk':[',',' ','dd.mm.yy'],\r\n// 'be':[',',' ','dd.mm.yy'],\r\n// 'sl':[',','.','d.m.yy'],\r\n// 'et':[',',' ','d.mm.yy'],\r\n// 'lv':[',',' ','yy.mm.dd.'],\r\n// 'lt':[',','.','yy.mm.dd'],\r\n// 'tg':[',',' ','dd.mm.y'],\r\n// 'fa':['.',',','mm/dd/yy'],\r\n// 'vi':[',','.','dd/mm/yy'],\r\n// 'hy':['.',',','dd.mm.yy'],\r\n// 'az':[',',' ','dd.mm.yy'],\r\n// 'eu':[',','.','yy/mm/dd'],\r\n// 'hsb':[',','.','d. m. yy'],\r\n// 'mk':[',','.','dd.mm.yy'],\r\n// 'tn':['.',',','yy/mm/dd'],\r\n// 'xh':['.',',','yy/mm/dd'],\r\n// 'zu':['.',',','yy/mm/dd'],\r\n// 'af':['.',',','yy/mm/dd'],\r\n// 'ka':[',',' ','dd.mm.yy'],\r\n// 'fo':[',','.','dd-mm-yy'],\r\n// 'hi':['.',',','dd-mm-yy'],\r\n// 'mt':['.',',','dd/mm/yy'],\r\n// 'se':[',',' ','dd.mm.yy'],\r\n// 'ga':['.',',','dd/mm/yy'],\r\n// 'ms':['.',',','dd/mm/yy'],\r\n// 'kk':[',',' ','dd.mm.yy'],\r\n// 'ky':[',',' ','dd.mm.y'],\r\n// 'sw':['.',',','m/d/yy'],\r\n// 'tk':[',',' ','dd.mm.y'],\r\n// 'uz':[',',' ','dd/mm yy'],\r\n// 'tt':[',',' ','dd.mm.yy'],\r\n// 'bn':['.',',','dd-mm-y'],\r\n// 'pa':['.',',','dd-mm-y'],\r\n// 'gu':['.',',','dd-mm-y'],\r\n// 'or':['.',',','dd-mm-y'],\r\n// 'ta':['.',',','dd-mm-yy'],\r\n// 'te':['.',',','dd-mm-y'],\r\n// 'kn':['.',',','dd-mm-y'],\r\n// 'ml':['.',',','dd-mm-y'],\r\n// 'as':['.',',','dd-mm-yy'],\r\n// 'mr':['.',',','dd-mm-yy'],\r\n// 'sa':['.',',','dd-mm-yy'],\r\n// 'mn':[',',' ','y.mm.dd'],\r\n// 'bo':['.',',','yy/m/d'],\r\n// 'cy':['.',',','dd/mm/yy'],\r\n// 'km':['.',',','yy-mm-dd'],\r\n// 'lo':['.',',','dd/mm/yy'],\r\n// 'gl':[',','.','dd/mm/yy'],\r\n// 'kok':['.',',','dd-mm-yy'],\r\n// 'syr':['.',',','dd/mm/yy'],\r\n// 'si':['.',',','yy-mm-dd'],\r\n// 'iu':['.',',','d/mm/yy'],\r\n// 'am':['.',',','d/m/yy'],\r\n// 'tzm':[',','.','dd-mm-yy'],\r\n// 'ne':['.',',','m/d/yy'],\r\n// 'fy':[',','.','d-m-yy'],\r\n// 'ps':[',','،','dd/mm/y'],\r\n// 'fil':['.',',','m/d/yy'],\r\n// 'dv':['.',',','dd/mm/y'],\r\n// 'ha':['.',',','d/m/yy'],\r\n// 'yo':['.',',','d/m/yy'],\r\n// 'quz':[',','.','dd/mm/yy'],\r\n// 'nso':['.',',','yy/mm/dd'],\r\n// 'ba':[',',' ','dd.mm.y'],\r\n// 'lb':[',',' ','dd/mm/yy'],\r\n// 'kl':[',','.','dd-mm-yy'],\r\n// 'ig':['.',',','d/m/yy'],\r\n// 'ii':['.',',','yy/m/d'],\r\n// 'arn':[',','.','dd-mm-yy'],\r\n// 'moh':['.',',','m/d/yy'],\r\n// 'br':[',',' ','dd/mm/yy'],\r\n// 'ug':['.',',','yy-m-d'],\r\n// 'mi':['.',',','dd/mm/yy'],\r\n// 'oc':[',',' ','dd/mm/yy'],\r\n// 'co':[',',' ','dd/mm/yy'],\r\n// 'gsw':[',',' ','dd/mm/yy'],\r\n// 'sah':[',',' ','mm.dd.yy'],\r\n// 'qut':['.',',','dd/mm/yy'],\r\n// 'rw':[',',' ','m/d/yy'],\r\n// 'wo':[',',' ','dd/mm/yy'],\r\n// 'prs':[',','.','dd/mm/y'],\r\n// 'gd':['.',',','dd/mm/yy'],\r\n// 'ar-sa':['.',',','dd/mm/y'],\r\n// 'bg-bg':[',',' ','d.m.yy \\'г.\\''],\r\n// 'ca-es':[',','.','dd/mm/yy'],\r\n// 'zh-tw':['.',',','yy/m/d'],\r\n// 'cs-cz':[',',' ','d.m.yy'],\r\n// 'da-dk':[',','.','dd-mm-yy'],\r\n// 'de-de':[',','.','dd.mm.yy'],\r\n// 'el-gr':[',','.','d/m/yy'],\r\n'en-us':['.',',','m/d/yy'],\r\n// 'fi-fi':[',',' ','d.m.yy'],\r\n// 'fr-fr':[',',' ','dd/mm/yy'],\r\n// 'he-il':['.',',','dd/mm/yy'],\r\n// 'hu-hu':[',',' ','yy.mm.dd.'],\r\n// 'is-is':[',','.','d.m.yy'],\r\n// 'it-it':[',','.','dd/mm/yy'],\r\n// 'ja-jp':['.',',','yy/mm/dd'],\r\n// 'ko-kr':['.',',','yy-mm-dd'],\r\n// 'nl-nl':[',','.','d-m-yy'],\r\n// 'nb-no':[',',' ','dd.mm.yy'],\r\n// 'pl-pl':[',',' ','yy-mm-dd'],\r\n// 'pt-br':[',','.','dd/mm/yy'],\r\n// 'rm-ch':['.','\\'','dd/mm/yy'],\r\n// 'ro-ro':[',','.','dd.mm.yy'],\r\n// 'ru-ru':[',',' ','dd.mm.yy'],\r\n// 'hr-hr':[',','.','d.m.yy.'],\r\n// 'sk-sk':[',',' ','d. m. yy'],\r\n// 'sq-al':[',','.','yy-mm-dd'],\r\n// 'sv-se':[',',' ','yy-mm-dd'],\r\n// 'th-th':['.',',','d/m/yy'],\r\n// 'tr-tr':[',','.','dd.mm.yy'],\r\n// 'ur-pk':['.',',','dd/mm/yy'],\r\n// 'id-id':[',','.','dd/mm/yy'],\r\n// 'uk-ua':[',',' ','dd.mm.yy'],\r\n// 'be-by':[',',' ','dd.mm.yy'],\r\n// 'sl-si':[',','.','d.m.yy'],\r\n// 'et-ee':[',',' ','d.mm.yy'],\r\n// 'lv-lv':[',',' ','yy.mm.dd.'],\r\n// 'lt-lt':[',','.','yy.mm.dd'],\r\n// 'tg-cyrl-tj':[',',' ','dd.mm.y'],\r\n// 'fa-ir':['.',',','mm/dd/yy'],\r\n// 'vi-vn':[',','.','dd/mm/yy'],\r\n// 'hy-am':['.',',','dd.mm.yy'],\r\n// 'az-latn-az':[',',' ','dd.mm.yy'],\r\n// 'eu-es':[',','.','yy/mm/dd'],\r\n// 'hsb-de':[',','.','d. m. yy'],\r\n// 'mk-mk':[',','.','dd.mm.yy'],\r\n// 'tn-za':['.',',','yy/mm/dd'],\r\n// 'xh-za':['.',',','yy/mm/dd'],\r\n// 'zu-za':['.',',','yy/mm/dd'],\r\n// 'af-za':['.',',','yy/mm/dd'],\r\n// 'ka-ge':[',',' ','dd.mm.yy'],\r\n// 'fo-fo':[',','.','dd-mm-yy'],\r\n// 'hi-in':['.',',','dd-mm-yy'],\r\n// 'mt-mt':['.',',','dd/mm/yy'],\r\n// 'se-no':[',',' ','dd.mm.yy'],\r\n// 'ms-my':['.',',','dd/mm/yy'],\r\n// 'kk-kz':[',',' ','dd.mm.yy'],\r\n// 'ky-kg':[',',' ','dd.mm.y'],\r\n// 'sw-ke':['.',',','m/d/yy'],\r\n// 'tk-tm':[',',' ','dd.mm.y'],\r\n// 'uz-latn-uz':[',',' ','dd/mm yy'],\r\n// 'tt-ru':[',',' ','dd.mm.yy'],\r\n// 'bn-in':['.',',','dd-mm-y'],\r\n// 'pa-in':['.',',','dd-mm-y'],\r\n// 'gu-in':['.',',','dd-mm-y'],\r\n// 'or-in':['.',',','dd-mm-y'],\r\n// 'ta-in':['.',',','dd-mm-yy'],\r\n// 'te-in':['.',',','dd-mm-y'],\r\n// 'kn-in':['.',',','dd-mm-y'],\r\n// 'ml-in':['.',',','dd-mm-y'],\r\n// 'as-in':['.',',','dd-mm-yy'],\r\n// 'mr-in':['.',',','dd-mm-yy'],\r\n// 'sa-in':['.',',','dd-mm-yy'],\r\n// 'mn-mn':[',',' ','y.mm.dd'],\r\n// 'bo-cn':['.',',','yy/m/d'],\r\n// 'cy-gb':['.',',','dd/mm/yy'],\r\n// 'km-kh':['.',',','yy-mm-dd'],\r\n// 'lo-la':['.',',','dd/mm/yy'],\r\n// 'gl-es':[',','.','dd/mm/yy'],\r\n// 'kok-in':['.',',','dd-mm-yy'],\r\n// 'syr-sy':['.',',','dd/mm/yy'],\r\n// 'si-lk':['.',',','yy-mm-dd'],\r\n// 'iu-cans-ca':['.',',','d/m/yy'],\r\n// 'am-et':['.',',','d/m/yy'],\r\n// 'ne-np':['.',',','m/d/yy'],\r\n// 'fy-nl':[',','.','d-m-yy'],\r\n// 'ps-af':[',','،','dd/mm/y'],\r\n// 'fil-ph':['.',',','m/d/yy'],\r\n// 'dv-mv':['.',',','dd/mm/y'],\r\n// 'ha-latn-ng':['.',',','d/m/yy'],\r\n// 'yo-ng':['.',',','d/m/yy'],\r\n// 'quz-bo':[',','.','dd/mm/yy'],\r\n// 'nso-za':['.',',','yy/mm/dd'],\r\n// 'ba-ru':[',',' ','dd.mm.y'],\r\n// 'lb-lu':[',',' ','dd/mm/yy'],\r\n// 'kl-gl':[',','.','dd-mm-yy'],\r\n// 'ig-ng':['.',',','d/m/yy'],\r\n// 'ii-cn':['.',',','yy/m/d'],\r\n// 'arn-cl':[',','.','dd-mm-yy'],\r\n// 'moh-ca':['.',',','m/d/yy'],\r\n// 'br-fr':[',',' ','dd/mm/yy'],\r\n// 'ug-cn':['.',',','yy-m-d'],\r\n// 'mi-nz':['.',',','dd/mm/yy'],\r\n// 'oc-fr':[',',' ','dd/mm/yy'],\r\n// 'co-fr':[',',' ','dd/mm/yy'],\r\n// 'gsw-fr':[',',' ','dd/mm/yy'],\r\n// 'sah-ru':[',',' ','mm.dd.yy'],\r\n// 'qut-gt':['.',',','dd/mm/yy'],\r\n// 'rw-rw':[',',' ','m/d/yy'],\r\n// 'wo-sn':[',',' ','dd/mm/yy'],\r\n// 'prs-af':[',','.','dd/mm/y'],\r\n// 'gd-gb':['.',',','dd/mm/yy'],\r\n// 'ar-iq':['.',',','dd/mm/yy'],\r\n// 'zh-cn':['.',',','yy/m/d'],\r\n// 'de-ch':['.','\\'','dd.mm.yy'],\r\n'en-gb':['.',',','dd/mm/yy'],\r\n// 'es-mx':['.',',','dd/mm/yy'],\r\n// 'fr-be':[',','.','d/mm/yy'],\r\n// 'it-ch':['.','\\'','dd.mm.yy'],\r\n// 'nl-be':[',','.','d/mm/yy'],\r\n// 'nn-no':[',',' ','dd.mm.yy'],\r\n// 'pt-pt':[',','.','dd-mm-yy'],\r\n// 'sr-latn-cs':[',','.','d.m.yy'],\r\n// 'sv-fi':[',',' ','d.m.yy'],\r\n// 'az-cyrl-az':[',',' ','dd.mm.yy'],\r\n// 'dsb-de':[',','.','d. m. yy'],\r\n// 'se-se':[',',' ','yy-mm-dd'],\r\n// 'ga-ie':['.',',','dd/mm/yy'],\r\n// 'ms-bn':[',','.','dd/mm/yy'],\r\n// 'uz-cyrl-uz':[',',' ','dd.mm.yy'],\r\n// 'bn-bd':['.',',','dd-mm-y'],\r\n// 'mn-mong-cn':['.',',','yy/m/d'],\r\n// 'iu-latn-ca':['.',',','d/mm/yy'],\r\n// 'tzm-latn-dz':[',','.','dd-mm-yy'],\r\n// 'quz-ec':[',','.','dd/mm/yy'],\r\n// 'ar-eg':['.',',','dd/mm/yy'],\r\n// 'zh-hk':['.',',','d/m/yy'],\r\n// 'de-at':[',','.','dd.mm.yy'],\r\n// 'en-au':['.',',','d/mm/yy'],\r\n// 'es-es':[',','.','dd/mm/yy'],\r\n// 'fr-ca':[',',' ','yy-mm-dd'],\r\n// 'sr-cyrl-cs':[',','.','d.m.yy'],\r\n// 'se-fi':[',',' ','d.m.yy'],\r\n// 'quz-pe':['.',',','dd/mm/yy'],\r\n// 'ar-ly':['.',',','dd/mm/yy'],\r\n// 'zh-sg':['.',',','d/m/yy'],\r\n// 'de-lu':[',','.','dd.mm.yy'],\r\n// 'en-ca':['.',',','dd/mm/yy'],\r\n// 'es-gt':['.',',','dd/mm/yy'],\r\n// 'fr-ch':['.','\\'','dd.mm.yy'],\r\n// 'hr-ba':[',','.','d.m.yy.'],\r\n// 'smj-no':[',',' ','dd.mm.yy'],\r\n// 'ar-dz':['.',',','dd-mm-yy'],\r\n// 'zh-mo':['.',',','d/m/yy'],\r\n// 'de-li':['.','\\'','dd.mm.yy'],\r\n// 'en-nz':['.',',','d/mm/yy'],\r\n// 'es-cr':[',','.','dd/mm/yy'],\r\n// 'fr-lu':[',',' ','dd/mm/yy'],\r\n// 'bs-latn-ba':[',','.','d.m.yy'],\r\n// 'smj-se':[',',' ','yy-mm-dd'],\r\n// 'ar-ma':['.',',','dd-mm-yy'],\r\n// 'en-ie':['.',',','dd/mm/yy'],\r\n// 'es-pa':['.',',','mm/dd/yy'],\r\n// 'fr-mc':[',',' ','dd/mm/yy'],\r\n// 'sr-latn-ba':[',','.','d.m.yy'],\r\n// 'sma-no':[',',' ','dd.mm.yy'],\r\n// 'ar-tn':['.',',','dd-mm-yy'],\r\n// 'en-za':['.',' ','yy/mm/dd'],\r\n// 'es-do':['.',',','dd/mm/yy'],\r\n// 'sr-cyrl-ba':[',','.','d.m.yy'],\r\n// 'sma-se':[',',' ','yy-mm-dd'],\r\n// 'ar-om':['.',',','dd/mm/yy'],\r\n// 'en-jm':['.',',','dd/mm/yy'],\r\n// 'es-ve':[',','.','dd/mm/yy'],\r\n// 'bs-cyrl-ba':[',','.','d.m.yy'],\r\n// 'sms-fi':[',',' ','d.m.yy'],\r\n// 'ar-ye':['.',',','dd/mm/yy'],\r\n// 'en-029':['.',',','mm/dd/yy'],\r\n// 'es-co':[',','.','dd/mm/yy'],\r\n// 'sr-latn-rs':[',','.','d.m.yy'],\r\n// 'smn-fi':[',',' ','d.m.yy'],\r\n// 'ar-sy':['.',',','dd/mm/yy'],\r\n// 'en-bz':['.',',','dd/mm/yy'],\r\n// 'es-pe':['.',',','dd/mm/yy'],\r\n// 'sr-cyrl-rs':[',','.','d.m.yy'],\r\n// 'ar-jo':['.',',','dd/mm/yy'],\r\n// 'en-tt':['.',',','dd/mm/yy'],\r\n// 'es-ar':[',','.','dd/mm/yy'],\r\n// 'sr-latn-me':[',','.','d.m.yy'],\r\n// 'ar-lb':['.',',','dd/mm/yy'],\r\n// 'en-zw':['.',',','m/d/yy'],\r\n// 'es-ec':[',','.','dd/mm/yy'],\r\n// 'sr-cyrl-me':[',','.','d.m.yy'],\r\n// 'ar-kw':['.',',','dd/mm/yy'],\r\n// 'en-ph':['.',',','m/d/yy'],\r\n// 'es-cl':[',','.','dd-mm-yy'],\r\n// 'ar-ae':['.',',','dd/mm/yy'],\r\n// 'es-uy':[',','.','dd/mm/yy'],\r\n// 'ar-bh':['.',',','dd/mm/yy'],\r\n// 'es-py':[',','.','dd/mm/yy'],\r\n// 'ar-qa':['.',',','dd/mm/yy'],\r\n// 'en-in':['.',',','dd-mm-yy'],\r\n// 'es-bo':[',','.','dd/mm/yy'],\r\n// 'en-my':['.',',','d/m/yy'],\r\n// 'es-sv':['.',',','dd/mm/yy'],\r\n// 'en-sg':['.',',','d/m/yy'],\r\n// 'es-hn':['.',',','dd/mm/yy'],\r\n// 'es-ni':['.',',','dd/mm/yy'],\r\n// 'es-pr':['.',',','dd/mm/yy'],\r\n// 'es-us':['.',',','m/d/yy'],\r\n// 'bs-cyrl':[',','.','d.m.yy'],\r\n// 'bs-latn':[',','.','d.m.yy'],\r\n// 'sr-cyrl':[',','.','d.m.yy'],\r\n// 'sr-latn':[',','.','d.m.yy'],\r\n// 'smn':[',',' ','d.m.yy'],\r\n// 'az-cyrl':[',',' ','dd.mm.yy'],\r\n// 'sms':[',',' ','d.m.yy'],\r\n// 'zh':['.',',','yy/m/d'],\r\n// 'nn':[',',' ','dd.mm.yy'],\r\n// 'bs':[',','.','d.m.yy'],\r\n// 'az-latn':[',',' ','dd.mm.yy'],\r\n// 'sma':[',',' ','yy-mm-dd'],\r\n// 'uz-cyrl':[',',' ','dd.mm.yy'],\r\n// 'mn-cyrl':[',',' ','y.mm.dd'],\r\n// 'iu-cans':['.',',','d/m/yy'],\r\n// 'zh-hant':['.',',','d/m/yy'],\r\n// 'nb':[',',' ','dd.mm.yy'],\r\n// 'sr':[',','.','d.m.yy'],\r\n// 'tg-cyrl':[',',' ','dd.mm.y'],\r\n// 'dsb':[',','.','d. m. yy'],\r\n// 'smj':[',',' ','yy-mm-dd'],\r\n// 'uz-latn':[',',' ','dd/mm yy'],\r\n// 'mn-mong':['.',',','yy/m/d'],\r\n// 'iu-latn':['.',',','d/mm/yy'],\r\n// 'tzm-latn':[',','.','dd-mm-yy'],\r\n// 'ha-latn':['.',',','d/m/yy'],\r\n// 'zh-chs':['.',',','yy/m/d'],\r\n// 'zh-cht':['.',',','d/m/yy'],\r\n'':['.',',','yy-mm-dd'] }\r\n};\r\n\r\n_w._culture = culture;\r\n\r\n/**\r\n * culture info for date and number formatting and parsing\r\n */\r\nexport default culture;\r\n","import culture from \"./culture\";\r\n\r\n/*\r\n * contains function to parse and format numeric values\r\n */\r\n\r\n\r\n//*** all following parts are extracted out of jquery-ui library (GPL/MIT license) ***/\r\n\r\nvar _helper = {\r\n _defaults: { shortYearCutoff: \"+10\", dayNames: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"], monthNames: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"], dayNamesShort: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"], monthNamesShort: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"] },\r\n _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),\r\n _daylightSavingAdjust(date) {\r\n if (!date) { return null; }\r\n date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);\r\n return date;\r\n },\r\n _getDaysInMonth(year, month) {\r\n return 32 - _helper._daylightSavingAdjust(new Date(year, month, 32)).getDate();\r\n }\r\n};\r\n\r\n\r\n\r\nexport abstract class date {\r\n\r\n\r\n /* Parse a string value into a date object.\r\nSee formatDate below for the possible formats.\r\n\r\n@param format string - the expected format of the date\r\n@param value string - the date in the above format\r\n@param settings Object - attributes include:\r\nshortYearCutoff number - the cutoff year for determining the century (optional)\r\ndayNamesShort string[7] - abbreviated names of the days from Sunday (optional)\r\ndayNames string[7] - names of the days from Sunday (optional)\r\nmonthNamesShort string[12] - abbreviated names of the months (optional)\r\nmonthNames string[12] - names of the months (optional)\r\n@return Date - the extracted date value or null if value is blank */\r\n public static parse(value: string, format?: string, settings?): Date {\r\n if (value === null) {\r\n return null;\r\n }\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n if (value == \"\") {\r\n return null;\r\n }\r\n format = format || culture.info.dateFormat;\r\n //value = (typeof value == 'object' ? value.toString() : value + '');\r\n let shortYearCutoff = (settings ? settings.shortYearCutoff : null) || _helper._defaults.shortYearCutoff;\r\n shortYearCutoff = (typeof shortYearCutoff != \"string\" ? shortYearCutoff :\r\n new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));\r\n let dayNamesShort = (settings ? settings.dayNamesShort : null) || _helper._defaults.dayNamesShort;\r\n let dayNames = (settings ? settings.dayNames : null) || _helper._defaults.dayNames;\r\n let monthNamesShort = (settings ? settings.monthNamesShort : null) || _helper._defaults.monthNamesShort;\r\n let monthNames = (settings ? settings.monthNames : null) || _helper._defaults.monthNames;\r\n let year = -1;\r\n let month = -1;\r\n let day = -1;\r\n let doy = -1;\r\n let literal = false;\r\n // Check whether a format character is doubled\r\n let lookAhead = function (match) {\r\n let matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);\r\n if (matches) {\r\n iFormat++;\r\n }\r\n return matches;\r\n };\r\n // Extract a number from the string value\r\n let getNumber = function (match) {\r\n let isDoubled = lookAhead(match);\r\n let size = (match == \"@\" ? 14 : (match == \"!\" ? 20 :\r\n (match == \"y\" && isDoubled ? 4 : (match == \"o\" ? 3 : 2))));\r\n let digits = new RegExp(\"^\\\\d{1,\" + size + \"}\");\r\n let num = value.substring(iValue).match(digits);\r\n if (!num) {\r\n throw \"Missing number at position \" + iValue;\r\n }\r\n iValue += num[0].length;\r\n return parseInt(num[0], 10);\r\n };\r\n // Extract a name from the string value and convert to an index\r\n let getName = function (match, shortNames, longNames) {\r\n let names = (lookAhead(match) ? longNames : shortNames);\r\n for (let i = 0; i < names.length; i++) {\r\n if (value.substr(iValue, names[i].length).toLowerCase() == names[i].toLowerCase()) {\r\n iValue += names[i].length;\r\n return i + 1;\r\n }\r\n }\r\n throw new Error(\"Unknown name at position \" + iValue);\r\n };\r\n // Confirm that a literal character matches the string value\r\n let checkLiteral = function () {\r\n if (value.charAt(iValue) != format.charAt(iFormat)) {\r\n throw \"Unexpected literal at position \" + iValue;\r\n }\r\n iValue++;\r\n };\r\n let iValue = 0;\r\n for (var iFormat = 0; iFormat < format.length; iFormat++) {\r\n if (literal) {\r\n if (format.charAt(iFormat) == \"'\" && !lookAhead(\"'\")) {\r\n literal = false;\r\n } else {\r\n checkLiteral();\r\n }\r\n } else {\r\n switch (format.charAt(iFormat)) {\r\n case \"d\":\r\n day = getNumber(\"d\");\r\n break;\r\n case \"D\":\r\n getName(\"D\", dayNamesShort, dayNames);\r\n break;\r\n case \"o\":\r\n doy = getNumber(\"o\");\r\n break;\r\n case \"m\":\r\n month = getNumber(\"m\");\r\n break;\r\n case \"M\":\r\n month = getName(\"M\", monthNamesShort, monthNames);\r\n break;\r\n case \"y\":\r\n year = getNumber(\"y\");\r\n break;\r\n case \"@\":\r\n var date = new Date(getNumber(\"@\"));\r\n year = date.getFullYear();\r\n month = date.getMonth() + 1;\r\n day = date.getDate();\r\n break;\r\n case \"!\":\r\n var date = new Date((getNumber(\"!\") - _helper._ticksTo1970) / 10000);\r\n year = date.getFullYear();\r\n month = date.getMonth() + 1;\r\n day = date.getDate();\r\n break;\r\n case \"'\":\r\n if (lookAhead(\"'\")) {\r\n checkLiteral();\r\n } else {\r\n literal = true;\r\n }\r\n break;\r\n default:\r\n checkLiteral();\r\n }\r\n }\r\n }\r\n if (year == -1) {\r\n year = new Date().getFullYear();\r\n } else if (year < 100) {\r\n year += new Date().getFullYear() - new Date().getFullYear() % 100 +\r\n (year <= shortYearCutoff ? 0 : -100);\r\n }\r\n if (doy > -1) {\r\n month = 1;\r\n day = doy;\r\n do {\r\n let dim = _helper._getDaysInMonth(year, month - 1);\r\n if (day <= dim) {\r\n break;\r\n }\r\n month++;\r\n day -= dim;\r\n } while (true);\r\n }\r\n let result = _helper._daylightSavingAdjust(new Date(year, month - 1, day));\r\n if (result.getFullYear() != year || result.getMonth() + 1 != month || result.getDate() != day) {\r\n throw new Error(\"Invalid date\");\r\n } // E.g. 31/02/*\r\n return result;\r\n }\r\n\r\n /* Format a date object into a string value.\r\nThe format can be combinations of the following:\r\nd - day of month (no leading zero)\r\ndd - day of month (two digit)\r\no - day of year (no leading zeros)\r\noo - day of year (three digit)\r\nD - day name short\r\nDD - day name long\r\nm - month of year (no leading zero)\r\nmm - month of year (two digit)\r\nM - month name short\r\nMM - month name long\r\ny - year (two digit)\r\nyy - year (four digit)\r\n@ - Unix timestamp (ms since 01/01/1970)\r\n! - Windows ticks (100ns since 01/01/0001)\r\n'...' - literal text\r\n'' - single quote\r\n\r\n@param format string - the desired format of the date\r\n@param date Date - the date value to format\r\n@param settings Object - attributes include:\r\ndayNamesShort string[7] - abbreviated names of the days from Sunday (optional)\r\ndayNames string[7] - names of the days from Sunday (optional)\r\nmonthNamesShort string[12] - abbreviated names of the months (optional)\r\nmonthNames string[12] - names of the months (optional)\r\n@return string - the date in the above format */\r\n public static format(date: Date, format?: string, settings?): string {\r\n if (!date || isNaN(date as any)) {\r\n return \"\";\r\n }\r\n format = format || culture.info.dateFormat;\r\n let dayNamesShort = (settings ? settings.dayNamesShort : null) || _helper._defaults.dayNamesShort;\r\n let dayNames = (settings ? settings.dayNames : null) || _helper._defaults.dayNames;\r\n let monthNamesShort = (settings ? settings.monthNamesShort : null) || _helper._defaults.monthNamesShort;\r\n let monthNames = (settings ? settings.monthNames : null) || _helper._defaults.monthNames;\r\n // Check whether a format character is doubled\r\n let lookAhead = function (match) {\r\n let matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);\r\n if (matches) {\r\n iFormat++;\r\n }\r\n return matches;\r\n };\r\n // Format a number, with leading zero if necessary\r\n let formatNumber = function (match, value, len) {\r\n let num = \"\" + value;\r\n if (lookAhead(match)) {\r\n while (num.length < len) {\r\n num = \"0\" + num;\r\n }\r\n }\r\n return num;\r\n };\r\n // Format a name, short or long as requested\r\n let formatName = function (match, value, shortNames, longNames) {\r\n return (lookAhead(match) ? longNames[value] : shortNames[value]);\r\n };\r\n let output = \"\";\r\n let literal = false;\r\n if (date) {\r\n for (var iFormat = 0; iFormat < format.length; iFormat++) {\r\n if (literal) {\r\n if (format.charAt(iFormat) == \"'\" && !lookAhead(\"'\")) {\r\n literal = false;\r\n } else {\r\n output += format.charAt(iFormat);\r\n }\r\n } else {\r\n switch (format.charAt(iFormat)) {\r\n case \"d\":\r\n output += formatNumber(\"d\", date.getDate(), 2);\r\n break;\r\n case \"D\":\r\n output += formatName(\"D\", date.getDay(), dayNamesShort, dayNames);\r\n break;\r\n case \"o\":\r\n output += formatNumber(\"o\",\r\n (date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000, 3);\r\n break;\r\n case \"m\":\r\n output += formatNumber(\"m\", date.getMonth() + 1, 2);\r\n break;\r\n case \"M\":\r\n output += formatName(\"M\", date.getMonth(), monthNamesShort, monthNames);\r\n break;\r\n case \"y\":\r\n output += (lookAhead(\"y\") ? date.getFullYear() :\r\n (date.getFullYear() % 100 < 10 ? \"0\" : \"\") + date.getFullYear() % 100);\r\n break;\r\n case \"@\":\r\n output += date.getTime();\r\n break;\r\n case \"!\":\r\n output += date.getTime() * 10000 + _helper._ticksTo1970;\r\n break;\r\n case \"'\":\r\n if (lookAhead(\"'\")) {\r\n output += \"'\";\r\n } else {\r\n literal = true;\r\n }\r\n break;\r\n default:\r\n output += format.charAt(iFormat);\r\n }\r\n }\r\n }\r\n }\r\n return output;\r\n }\r\n\r\n public static formatTime(value: Date, inputMode: \"HourMinute\" | \"HourMinuteSecond\"): string {\r\n if (inputMode === \"HourMinute\") {\r\n return value ? (pad(value.getHours()) + \":\" + pad(value.getMinutes())) : \"\";\r\n } else if (inputMode === \"HourMinuteSecond\") {\r\n return value ? (pad(value.getHours()) + \":\" + pad(value.getMinutes()) + \":\" + pad(value.getSeconds())) : \"\";\r\n }\r\n return \"\";\r\n }\r\n\r\n public static now(): Date {\r\n return new Date();\r\n }\r\n\r\n public static addSeconds(d, seconds): Date {\r\n const future = new Date(d);\r\n future.setSeconds(d.getSeconds() + seconds);\r\n return future;\r\n }\r\n\r\n public static addMinutes(d, minutes): Date {\r\n const future = new Date(d);\r\n future.setMinutes(d.getMinutes() + minutes);\r\n return future;\r\n }\r\n\r\n public static addHours(d, hours): Date {\r\n const future = new Date(d);\r\n future.setHours(d.getHours() + hours);\r\n return future;\r\n }\r\n\r\n public static addDays(d, days) {\r\n const future = new Date(d);\r\n future.setDate(d.getDate() + days);\r\n return future;\r\n }\r\n\r\n public static getDaysBetween(startDate, endDate): number {\r\n return Math.round((endDate - startDate) / (1000.0 * 3600.0 * 24.0));\r\n }\r\n\r\n public static getMsBetween(startDate, endDate): number {\r\n return endDate.getTime() - startDate.getTime();\r\n }\r\n\r\n public static onlyDate(d: Date): Date {\r\n if (d == null) {\r\n return d;\r\n }\r\n const result = new Date(d);\r\n result.setHours(0, 0, 0, 0);\r\n return result;\r\n }\r\n\r\n public static equal(date1: Date, date2: Date): boolean {\r\n return (date1 && date1.getTime()) === (date2 && date2.getTime());\r\n }\r\n\r\n}\r\n\r\nfunction pad(nr: number): string {\r\n if (nr < 10) {\r\n return \"0\" + nr.toString();\r\n } else {\r\n return nr.toString();\r\n }\r\n}\r\n","import { ISlickColumn } from \"../slick.core\";\r\nimport { UILang } from \"../../core/lang\";\r\nimport { helper } from \"../../core/helper\";\r\nimport { Dialog } from \"../../ui/dialog\";\r\nimport { IJSLGrid, ISlickCreatorOptions } from \"../../index\";\r\nimport { VirtualRenderComponent } from \"../../components/virtual-render/VirtualRenderComponent\";\r\nimport { JSLRender } from \"jsl-render\";\r\n\r\nexport class ExcelFilter {\r\n\r\n private static convertRemToPixels(rem: number) {\r\n return rem * parseFloat(getComputedStyle(document.documentElement).fontSize);\r\n }\r\n\r\n public constructor(private grid: IJSLGrid<any>) {\r\n }\r\n\r\n public async show(col: ISlickColumn): Promise<void> {\r\n let values: { [key: string]: any[] } | string[];\r\n const filters = this.grid.getFilters();\r\n const currentFilters = filters.filter((f) => f.columnId === col.id);\r\n const mode = (this.grid.getOptions() as ISlickCreatorOptions).mode;\r\n if (mode === \"client\") {\r\n // remove any filters for this column\r\n if (currentFilters.length > 0) {\r\n this.grid.clearFilter(col.id);\r\n }\r\n values = this.getDistinctValues(col);\r\n } else {\r\n const filterOptions = (this.grid.getOptions() as ISlickCreatorOptions).getFilterValues;\r\n if (filterOptions == null) {\r\n throw new Error(\"getFilterValues option has to be set when filter mode = server\");\r\n }\r\n values = await filterOptions(col);\r\n }\r\n\r\n let oldCheckedValues = {};\r\n if (currentFilters.length > 0) {\r\n for (const f of currentFilters) {\r\n if ((f as any)._checkedValues) {\r\n oldCheckedValues = (f as any)._checkedValues;\r\n }\r\n if (mode === \"client\") {\r\n filters.push(f);\r\n }\r\n }\r\n if (mode === \"client\") {\r\n this.grid.refreshFilters();\r\n }\r\n }\r\n\r\n const dlg = document.createElement(\"div\");\r\n dlg.classList.add(\"jsl-dialog-overlay\");\r\n dlg.innerHTML = '<div class=\"jsl-dialog\" style=\"width:50vw;min-height:50vh;\"><div class=\"dlg-header\">' + UILang.grid.Filter + '</div><div class=\"dlg-body\" style=\"max-height:calc(100vh - 7.5rem)\"></div>' +\r\n '<div class=\"dlg-footer\">' +\r\n '<button class=\"jsl-button ok-button\">' + UILang.core.Ok + \"</button>\" +\r\n (currentFilters.length > 0 ? ('<button class=\"jsl-button clear-button\">' + UILang.grid.ClearFilter + '</button>') : \"\") +\r\n '<button class=\"jsl-button close-button\">' + UILang.core.Cancel + \"</button>\" +\r\n \"</div></div>\";\r\n const dlgBody = dlg.querySelector(\".dlg-body\") as HTMLElement;\r\n\r\n const id = helper.newDomGuid();\r\n\r\n const search = document.createElement(\"div\");\r\n search.innerHTML = \"<input type='text' placeholder='\" + UILang.grid.Search + \"' />\";\r\n dlgBody.appendChild(search);\r\n\r\n const cbAllContainer = document.createElement(\"div\");\r\n const cbAll: HTMLInputElement = document.createElement(\"input\");\r\n cbAll.type = \"checkbox\";\r\n cbAll.id = id;\r\n cbAllContainer.appendChild(cbAll);\r\n const cbAllLabel: HTMLLabelElement = document.createElement(\"label\");\r\n cbAllLabel.setAttribute(\"for\", id);\r\n cbAllLabel.textContent = UILang.core.All;\r\n cbAllLabel.style.cursor = \"pointer\";\r\n cbAllLabel.style.marginLeft = \"0.2rem\";\r\n cbAllContainer.appendChild(cbAllLabel);\r\n dlgBody.appendChild(cbAllContainer);\r\n\r\n const sortedValues = [];\r\n if (Array.isArray(values)) {\r\n for (const x of values) {\r\n sortedValues.push({ id: [x], txt: x ?? \"\" });\r\n }\r\n } else {\r\n for (const o in values) {\r\n if (values.hasOwnProperty(o)) {\r\n sortedValues.push({ id: values[o], txt: o ?? \"\" });\r\n }\r\n }\r\n }\r\n // TODO: use custom comparer when available\r\n sortedValues.sort((a, b) => a.txt.toLocaleLowerCase() < b.txt.toLocaleLowerCase() ? -1 : (a.txt.toLocaleLowerCase() > b.txt.toLocaleLowerCase() ? 1 : 0));\r\n\r\n let visibleValues = sortedValues;\r\n const checkedValues = { ...oldCheckedValues };\r\n\r\n const cbContainer = document.createElement(\"div\");\r\n dlgBody.appendChild(cbContainer);\r\n const rowHeight = Math.round(ExcelFilter.convertRemToPixels(1.4));\r\n let height = sortedValues.length * rowHeight;\r\n height = Math.min(height, Math.round(window.innerHeight - ExcelFilter.convertRemToPixels(13)));\r\n const vr = new VirtualRenderComponent({\r\n data: visibleValues,\r\n renderRow: (args) => {\r\n args.container.attr.style[\"padding-left\"] = \"1rem\";\r\n args.container.children.push({\r\n tag: \"input\",\r\n attr: {\r\n id: id + \"_\" + args.index,\r\n checked: checkedValues[args.rowData.id[0]] ? \"checked\" : undefined,\r\n change: (_, node) => {\r\n if (node.dom.checked) {\r\n for (const selId of args.rowData.id) {\r\n checkedValues[selId] = true;\r\n }\r\n } else {\r\n for (const selId of args.rowData.id) {\r\n delete checkedValues[selId];\r\n }\r\n }\r\n // check if all values or none are checked\r\n const allChecked = Object.getOwnPropertyNames(checkedValues).length === sortedValues.length;\r\n const allCb: HTMLInputElement = dlgBody.querySelector(\"#\" + id) as HTMLInputElement;\r\n allCb.checked = allChecked;\r\n },\r\n type: \"checkbox\"\r\n }\r\n });\r\n args.container.children.push({\r\n tag: \"label\",\r\n attr: {\r\n for: id + \"_\" + args.index,\r\n style: \"margin-left:0.2rem;cursor:pointer\"\r\n },\r\n raw: true,\r\n content: args.rowData.txt\r\n });\r\n }\r\n ,\r\n rowHeight,\r\n style: \"height:\" + height + \"px\"\r\n });\r\n\r\n const renderer = new JSLRender(cbContainer, false);\r\n renderer.render(vr);\r\n\r\n search.addEventListener(\"input\", (evt) => {\r\n const term = ((evt.target as HTMLInputElement).value ?? \"\").toLowerCase();\r\n if (term) {\r\n visibleValues = sortedValues.filter((x) =>\r\n (x.txt ?? \"\").toLowerCase().indexOf(term) >= 0);\r\n } else {\r\n visibleValues = sortedValues;\r\n }\r\n vr.setData(visibleValues);\r\n renderer.refresh();\r\n });\r\n\r\n cbAll.addEventListener(\"change\", () => {\r\n for (let i = 0; i < visibleValues.length; i++) {\r\n // if (cbAll.checked) {\r\n // checkedValues[visibleValues[i].id] = true;\r\n // } else {\r\n // delete checkedValues[visibleValues[i].id];\r\n // }\r\n if (cbAll.checked) {\r\n for (const selId of visibleValues[i].id) {\r\n checkedValues[selId] = true;\r\n }\r\n } else {\r\n for (const selId of visibleValues[i].id) {\r\n delete checkedValues[selId];\r\n }\r\n }\r\n }\r\n renderer.refresh();\r\n });\r\n\r\n document.body.appendChild(dlg);\r\n const dlgObj = Dialog(dlg, {\r\n autoOpen: true, onClose: () => {\r\n dlg.innerHTML = \"\";\r\n dlg.parentElement.removeChild(dlg);\r\n }\r\n });\r\n\r\n const dlgOkButton = dlg.querySelector(\".dlg-footer .ok-button\");\r\n dlgOkButton.addEventListener(\"click\", (evt) => {\r\n\r\n const selLength = Object.getOwnPropertyNames(checkedValues).length;\r\n const allChecked = selLength === sortedValues.length;\r\n const anyChecked = selLength > 0;\r\n this.grid.clearFilter(col.id, true);\r\n if (!allChecked && anyChecked) {\r\n // something (but not everything) was selected -> filter\r\n const filterObject = {\r\n field: col.field, columnId: col.id, match: mode === \"server\" ? () => true : (item, field) => {\r\n return !!checkedValues[this.grid.getDataItemValueForColumn(item, col)];\r\n }\r\n };\r\n (filterObject as any)._checkedValues = checkedValues;\r\n this.grid.addFilter(filterObject, true);\r\n }\r\n this.grid.refreshFilters();\r\n dlgObj.close();\r\n });\r\n\r\n const dlgCancelButton = dlg.querySelector(\".dlg-footer .close-button\");\r\n dlgCancelButton.addEventListener(\"click\", (evt) => {\r\n dlgObj.close();\r\n });\r\n\r\n const dlgClearButton = dlg.querySelector(\".dlg-footer .clear-button\");\r\n if (dlgClearButton != null) {\r\n dlgClearButton.addEventListener(\"click\", (evt) => {\r\n this.grid.clearFilter(col.id);\r\n dlgObj.close();\r\n });\r\n }\r\n }\r\n\r\n // private updateStateOfAllCheckebox(dlgBody: HTMLElement, id: string) {\r\n // let counter = 0;\r\n // let el: HTMLInputElement;\r\n // const allCb: HTMLInputElement = dlgBody.querySelector(\"#\" + id) as HTMLInputElement;\r\n // // tslint:disable-next-line: no-conditional-assignment\r\n // while (null != (el = dlgBody.querySelector(\"#\" + id + \"_\" + counter) as HTMLInputElement)) {\r\n // if (el.parentElement.style.display !== \"none\" && !el.checked) {\r\n // allCb.checked = false;\r\n // return;\r\n // }\r\n // counter++;\r\n // }\r\n // allCb.checked = true;\r\n // }\r\n\r\n // private checkAllVisibleBoxes(el: HTMLElement, state: boolean) {\r\n // const checkboxes = el.querySelectorAll(\"input\");\r\n // for (let i = 0; i < checkboxes.length; i++) {\r\n // if (checkboxes[i].type === \"checkbox\" &&\r\n // checkboxes[i].parentElement.style.display !== \"none\") {\r\n // checkboxes[i].checked = state;\r\n // }\r\n // }\r\n // }\r\n\r\n private getDistinctValues(col: ISlickColumn): any {\r\n const textToValues = {};\r\n for (let idx = 0, len = this.grid.getDataLength(); idx < len; idx++) {\r\n const item = this.grid.getDataItem(idx);\r\n const value = this.grid.getDataItemValueForColumn(item, col);\r\n const text = this.grid.getFormattedValue(col, value, item);\r\n let valueList = textToValues[text];\r\n if (valueList == null) {\r\n valueList = textToValues[text] = [];\r\n }\r\n if (valueList.indexOf(value) < 0) {\r\n valueList.push(value);\r\n }\r\n }\r\n return textToValues;\r\n }\r\n\r\n\r\n}\r\n","\r\nexport class UILang {\r\n public static core = {\r\n All: \"All\",\r\n Ok: \"Ok\",\r\n Cancel: \"Cancel\"\r\n };\r\n\r\n public static grid = {\r\n Sort: \"Sort\",\r\n Asc: \"Ascending\",\r\n Desc: \"Descending\",\r\n Filter: \"Filter\",\r\n ClearFilter: \"Clear Filter\",\r\n Search: \"Search\"\r\n };\r\n\r\n public static dropDown = {\r\n SelectOption: \"Select an option...\",\r\n SelectOptionMultiple: \"Enter options...\",\r\n NoResults: \"No results\",\r\n NoOptions: \"No options available\",\r\n MaxSelection: \"A maximum of {max} items can be selected\",\r\n AlreadyInUse: \"That tag is already in use\",\r\n Search: \"Search ...\"\r\n };\r\n}\r\n","export abstract class helper {\r\n\r\n public static emptyGuid = \"00000000-0000-0000-0000-000000000000\";\r\n\r\n public static random() {\r\n return (Math.random() * (new Date().getTime() || 1)) % 1;\r\n }\r\n\r\n public static newGuid() {\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) { const r = helper.random() * 16 | 0, v = c == \"x\" ? r : r & 0x3 | 0x8; return v.toString(16); });\r\n }\r\n\r\n public static newSeqGuid() {\r\n let d = new Date().getTime().toString(16);\r\n while (d.length < 12) {\r\n d = \"0\" + d;\r\n }\r\n if (d.length > 12) {\r\n d = d.substring(0, 12);\r\n }\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-\".replace(/[xy]/g, function (c) { var r = helper.random() * 16 | 0, v = c == \"x\" ? r : r & 0x3 | 0x8; return v.toString(16); })\r\n + d;\r\n }\r\n\r\n public static newDomGuid() {\r\n return \"axxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) { const r = helper.random() * 16 | 0, v = c == \"x\" ? r : r & 0x3 | 0x8; return v.toString(16); });\r\n }\r\n\r\n public static isObject(obj) {\r\n return obj ? Object.prototype.toString.call(obj) === \"[object Object]\" : false;\r\n }\r\n\r\n public static isGuid(id) {\r\n if (!id) {\r\n return false;\r\n }\r\n return /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(id);\r\n }\r\n\r\n public static getParams(): any {\r\n var match,\r\n pl = /\\+/g, // Regex for replacing addition symbol with a space\r\n search = /([^&=]+)=?([^&]*)/g,\r\n decode = function (s) { return decodeURIComponent(s.replace(pl, \" \")); },\r\n query = window.location.search.substring(1);\r\n\r\n var urlParams = {};\r\n while (match = search.exec(query))\r\n urlParams[decode(match[1])] = decode(match[2]);\r\n return urlParams;\r\n }\r\n\r\n public static isCyclic(o): boolean {\r\n const seenObjects = [];\r\n\r\n function detect(obj) {\r\n if (obj && typeof obj === 'object') {\r\n if (seenObjects.indexOf(obj) !== -1) {\r\n return true;\r\n }\r\n seenObjects.push(obj);\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key) && detect(obj[key])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n return detect(o);\r\n }\r\n\r\n public static correctDates(data: any): any {\r\n for (let key in data) {\r\n if (data[key] && typeof data[key] === \"object\")\r\n data[key] = helper.correctDates(data[key]);\r\n //else if (data[key] && data[key].toString().substring(0, 6) === \"/Date\\(\")\r\n // data[key] = new Date(parseInt(data[key].substr(6))+ timezone_offset);\r\n else if (data[key] && dateISO.test(data[key].toString())) {\r\n let x = (Date as any).fromString(data[key]);\r\n data[key] = new Date(x.getTime() + (x.getTimezoneOffset() * 60000));\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n}\r\n\r\nvar dateISO = /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.*/i;\r\n\r\n(function () {\r\n\r\n var d = window.Date as any;\r\n var regexIso8601 = /^(\\d{4})-(\\d{2})-(\\d{2})((T)(\\d{2}):(\\d{2})(:(\\d{2})(\\.\\d*)?)?)?(Z)?$/;\r\n\r\n\r\n d._myparse = function (v) {\r\n\r\n if (v.charAt(v.length - 1) !== \"Z\")\r\n v += \"Z\";\r\n var m = regexIso8601.exec(v);\r\n\r\n if (m) {\r\n return new Date(Date.UTC(+m[1], +m[2] - 1, +m[3], +m[6] || 0, +m[7] || 0, +m[9] || 0, parseInt((+m[10]) * 1000 as any) || 0));\r\n //return Date.UTC(\r\n // m[1],\r\n // (m[2] || 1) - 1,\r\n // m[3] || 1,\r\n // m[4] - (m[8] ? m[8] + m[9] : 0) || 0,\r\n // m[5] - (m[8] ? m[8] + m[10] : 0) || 0,\r\n // m[6] || 0,\r\n // ((m[7] || 0) + '00').substr(0, 3)\r\n //);\r\n }\r\n\r\n return d.parse.apply(this, arguments);\r\n };\r\n\r\n\r\n d.fromString = function (v) {\r\n return d._myparse(v);\r\n };\r\n\r\n})();\r\n","import \"./dialog.css\";\r\n\r\nexport interface IDialogOptions {\r\n autoOpen?: boolean;\r\n autoFocus?: string;\r\n modal?: boolean;\r\n closeOnEscape?: boolean;\r\n OkOnEnter?: boolean;\r\n closeOnOverlayClick?: boolean;\r\n onClose?: () => void | boolean;\r\n onOpen?: () => void;\r\n}\r\n\r\nconst defaultOptions: IDialogOptions = {\r\n autoOpen: false,\r\n autoFocus: \"input,button,textarea\",\r\n closeOnOverlayClick: true,\r\n modal: true,\r\n closeOnEscape: true\r\n};\r\n\r\nexport class JSLDialog {\r\n\r\n private overlay: HTMLElement;\r\n private el: HTMLElement;\r\n\r\n private onKeydownEvent: (args: any) => void;\r\n\r\n constructor(el: HTMLElement, private options: IDialogOptions) {\r\n this.overlay = el;\r\n this.el = el.firstElementChild as HTMLElement;\r\n if (this.options.closeOnOverlayClick) {\r\n this.overlay.addEventListener(\"mousedown\", (evt) => {\r\n if (evt.target === this.overlay) {\r\n this.close();\r\n }\r\n });\r\n this.overlay.addEventListener(\"touchstart\", (evt) => {\r\n if (evt.target === this.overlay) {\r\n this.close();\r\n }\r\n });\r\n }\r\n }\r\n\r\n public open(modal?: boolean) {\r\n\r\n if ((modal !== undefined && !modal) || !this.options.modal) {\r\n this.overlay.style.background = \"transparent\";\r\n this.overlay.style.pointerEvents = \"none\";\r\n }\r\n\r\n this.overlay.style.display = \"block\";\r\n\r\n const $footer = this.el.querySelector(\".dlg-footer\");\r\n const $body = this.el.querySelector(\".dlg-body\");\r\n if ($footer != null && $body != null) {\r\n // TODO ?\r\n }\r\n if (this.options.autoFocus) {\r\n setTimeout(() => {\r\n const firstInput = this.el.querySelector(this.options.autoFocus) as HTMLInputElement;\r\n if (firstInput != null) {\r\n firstInput.focus();\r\n }\r\n }, 0);\r\n }\r\n\r\n if (this.options.closeOnEscape || this.options.OkOnEnter) {\r\n this.onKeydownEvent = (args) => {\r\n if (args.keyCode === 27 && this.options.closeOnEscape) { // escape\r\n this.close();\r\n } else if (args.keyCode === 13 && this.options.OkOnEnter) { // ok\r\n const ok_btn: HTMLButtonElement | HTMLLinkElement = this.el.querySelector(\".dlg-ok-btn\");\r\n if (ok_btn != null) {\r\n ok_btn.click();\r\n }\r\n }\r\n };\r\n document.addEventListener(\"keydown\", this.onKeydownEvent);\r\n }\r\n\r\n if (this.options.onOpen) {\r\n this.options.onOpen();\r\n }\r\n }\r\n\r\n public close() {\r\n if (this.options.onClose) {\r\n if (this.options.onClose() === false) {\r\n return;\r\n }\r\n }\r\n this.overlay.style.display = \"none\";\r\n\r\n if (this.onKeydownEvent != null) {\r\n document.removeEventListener(\"keydown\", this.onKeydownEvent);\r\n }\r\n }\r\n\r\n public getOverlay() {\r\n return this.overlay;\r\n }\r\n\r\n}\r\n\r\nexport function Dialog(input: HTMLElement | string, options?: IDialogOptions): JSLDialog {\r\n\r\n const o = { ...defaultOptions, ...options };\r\n\r\n let el: HTMLElement;\r\n\r\n if (typeof input === \"string\") {\r\n el = document.querySelector(input);\r\n } else {\r\n el = input;\r\n }\r\n\r\n const result = new JSLDialog(el, o);\r\n\r\n if (!o.autoOpen) {\r\n el.style.display = \"none\";\r\n } else {\r\n result.open();\r\n }\r\n return result;\r\n\r\n}\r\n","import \"./VirtualRenderStyle.scss\";\r\nimport { IJSLComponent, IJSLVNode, JSLRender } from \"jsl-render\";\r\n\r\nexport interface IVirtualArg {\r\n index: number;\r\n rowData: any;\r\n container: IJSLVNode;\r\n}\r\n\r\nexport interface IVirtualRenderOptions {\r\n data: any[];\r\n renderRow: (args: IVirtualArg) => string | IJSLVNode | IJSLComponent | void;\r\n rowHeight?: number;\r\n rowTag?: string;\r\n bufferSizeInPx?: number;\r\n viewportSizeInPX?: number;\r\n class?: string;\r\n style?: string;\r\n}\r\n\r\nexport class VirtualRenderComponent implements IJSLComponent {\r\n\r\n public State: {scrollPos: number, renderer?: JSLRender} = { scrollPos: 0};\r\n\r\n private options: IVirtualRenderOptions;\r\n\r\n constructor(options: IVirtualRenderOptions) {\r\n const defaultOptions: IVirtualRenderOptions = {\r\n data: null,\r\n renderRow: null,\r\n bufferSizeInPx: 200,\r\n rowHeight: 20,\r\n rowTag: \"div\",\r\n viewportSizeInPX: window.innerHeight\r\n };\r\n this.options = { ...defaultOptions, ...options };\r\n }\r\n\r\n public isEqual(node: IJSLComponent): boolean {\r\n return (this as any).__proto__ === (node as any).__proto__;\r\n }\r\n\r\n public setData(data: any[]) {\r\n this.options.data = data;\r\n }\r\n\r\n public onInit(renderer: JSLRender) {\r\n this.State.renderer = renderer;\r\n }\r\n\r\n public render(): IJSLVNode {\r\n const o = this.options;\r\n const vrBody = {\r\n tag: \"div\",\r\n attr: { class: \"v-r-child\", style: \"height:\" + (o.data.length * o.rowHeight) + \"px;position:relative\" },\r\n children: this.getChildren()\r\n };\r\n const vrContainer = {\r\n tag: \"div\", attr: {\r\n class: \"v-r-comp \" + (o.class ?? \"\"),\r\n style: \"overflow-y:auto;\" + (o.style ?? \"\"),\r\n scroll: (e, node: IJSLVNode) => {\r\n const newScrollPos = node.dom.scrollTop;\r\n if (Math.abs(this.State.scrollPos - newScrollPos) < o.bufferSizeInPx) {\r\n return false;\r\n }\r\n this.State.scrollPos = newScrollPos;\r\n vrBody.children = this.getChildren();\r\n (node.children[0] as IJSLVNode).children = [{tag: \"dummy\"}];\r\n (this.State.renderer as any).updateNode(node.children[0], vrBody);\r\n return false;\r\n }\r\n }, children: [vrBody]\r\n };\r\n return vrContainer;\r\n }\r\n\r\n // public scrollRowToTop(idx: number) {\r\n\r\n // }\r\n\r\n // public scrollRowToCenter(idx: number) {\r\n\r\n // }\r\n\r\n // public scrollRowToBottom(idx: number) {\r\n\r\n // }\r\n\r\n private getChildren() {\r\n const o = this.options;\r\n const children = [];\r\n const viewport = {\r\n top: Math.floor((this.State.scrollPos - o.bufferSizeInPx) / o.rowHeight),\r\n bottom: Math.ceil((this.State.scrollPos + o.viewportSizeInPX + o.bufferSizeInPx) / o.rowHeight)\r\n };\r\n for (let idx = viewport.top; idx < viewport.bottom; idx++) {\r\n if (idx < 0 || idx >= o.data.length) {\r\n continue;\r\n }\r\n const node: IJSLVNode = {\r\n tag: o.rowTag, attr: {\r\n style: {\r\n top: (idx * o.rowHeight) + \"px\",\r\n height: o.rowHeight + \"px\",\r\n position: \"absolute\",\r\n left: \"0\",\r\n right: \"0\"\r\n }\r\n }, children: []\r\n };\r\n const result = o.renderRow({ index: idx, container: node, rowData: o.data[idx] });\r\n if (typeof result === \"string\") {\r\n node.content = result;\r\n } else if (result != null) {\r\n node.children.push(result as (IJSLVNode | IJSLComponent));\r\n }\r\n\r\n children.push(node);\r\n }\r\n return children;\r\n }\r\n\r\n}\r\n","/*\r\n * Contains basic SlickGrid editors.\r\n */\r\n\r\nimport { numeric } from \"../core/numeric\";\r\nimport { handleKeydownLRNav, handleKeydownLRNoNav } from \"./slick.editors.nav\";\r\n\r\nexport function TextEditor(args) {\r\n var input: HTMLInputElement;\r\n var defaultValue;\r\n var scope = this;\r\n\r\n this.init = function () {\r\n var navOnLR = args.grid.getOptions().editorCellNavOnLRKeys;\r\n input = document.createElement(\"input\");\r\n input.type = \"text\";\r\n input.className = \"editor-text\";\r\n if (args.column.maxLength > 0) {\r\n input.maxLength = args.column.maxLength;\r\n }\r\n input.addEventListener(\"keydown\", navOnLR ? handleKeydownLRNav : handleKeydownLRNoNav);\r\n args.container.appendChild(input);\r\n input.focus();\r\n input.select();\r\n };\r\n\r\n this.destroy = function () {\r\n input.parentElement.removeChild(input);\r\n };\r\n\r\n this.focus = function () {\r\n input.focus();\r\n };\r\n\r\n this.getValue = function () {\r\n return input.value;\r\n };\r\n\r\n this.setValue = function (val) {\r\n input.value = val;\r\n };\r\n\r\n this.loadValue = function (item) {\r\n defaultValue = item[args.column.field] || \"\";\r\n input.value = defaultValue;\r\n input.defaultValue = defaultValue;\r\n input.select();\r\n };\r\n\r\n this.serializeValue = function () {\r\n return input.value;\r\n };\r\n\r\n this.applyValue = function (item, state) {\r\n item[args.column.field] = state;\r\n };\r\n\r\n this.isValueChanged = function () {\r\n return (!(input.value == \"\" && defaultValue == null)) && (input.value != defaultValue);\r\n };\r\n\r\n this.validate = function () {\r\n if (args.column.validator) {\r\n var validationResults = args.column.validator(input.value);\r\n if (!validationResults.valid) {\r\n return validationResults;\r\n }\r\n }\r\n\r\n return {\r\n valid: true,\r\n msg: null\r\n };\r\n };\r\n\r\n this.init();\r\n}\r\n\r\nexport function MultiLineTextEditor(args) {\r\n var input: HTMLTextAreaElement;\r\n var defaultValue;\r\n var scope = this;\r\n\r\n this.init = function () {\r\n var navOnLR = args.grid.getOptions().editorCellNavOnLRKeys;\r\n input = document.createElement(\"textarea\");\r\n if (args.column.maxLength > 0) {\r\n input.maxLength = args.column.maxLength;\r\n }\r\n input.className = \"editor-text\";\r\n input.addEventListener(\"keydown\", navOnLR ? handleKeydownLRNav : handleKeydownLRNoNav);\r\n args.container.appendChild(input);\r\n input.focus();\r\n input.select();\r\n };\r\n\r\n this.destroy = function () {\r\n input.parentElement.removeChild(input);\r\n };\r\n\r\n this.focus = function () {\r\n input.focus();\r\n };\r\n\r\n this.getValue = function () {\r\n return input.value;\r\n };\r\n\r\n this.setValue = function (val) {\r\n input.value = val;\r\n };\r\n\r\n this.loadValue = function (item) {\r\n defaultValue = item[args.column.field] || \"\";\r\n input.value = defaultValue;\r\n input.defaultValue = defaultValue;\r\n input.select();\r\n };\r\n\r\n this.serializeValue = function () {\r\n return input.value;\r\n };\r\n\r\n this.applyValue = function (item, state) {\r\n item[args.column.field] = state;\r\n };\r\n\r\n this.isValueChanged = function () {\r\n return (!(input.value == \"\" && defaultValue == null)) && (input.value != defaultValue);\r\n };\r\n\r\n this.validate = function () {\r\n if (args.column.validator) {\r\n var validationResults = args.column.validator(input.value);\r\n if (!validationResults.valid) {\r\n return validationResults;\r\n }\r\n }\r\n\r\n return {\r\n valid: true,\r\n msg: null\r\n };\r\n };\r\n\r\n this.init();\r\n}\r\n\r\n\r\nexport function NumericEditor(args) {\r\n var input: HTMLInputElement;\r\n var defaultValue;\r\n var scope = this;\r\n\r\n this.init = function () {\r\n var navOnLR = args.grid.getOptions().editorCellNavOnLRKeys;\r\n input = document.createElement(\"input\");\r\n input.type = \"text\";\r\n input.className = \"editor-text right\";\r\n input.addEventListener(\"keydown\", navOnLR ? handleKeydownLRNav : handleKeydownLRNoNav);\r\n args.container.appendChild(input);\r\n input.focus();\r\n input.select();\r\n };\r\n\r\n this.destroy = function () {\r\n input.parentElement.removeChild(input);\r\n };\r\n\r\n this.focus = function () {\r\n input.focus();\r\n };\r\n\r\n // function getDecimalPlaces() {\r\n // // returns the number of fixed decimal places or null\r\n // var rtn = args.column.editorFixedDecimalPlaces;\r\n // if (typeof rtn == 'undefined') {\r\n // rtn = (<any>FloatEditor).DefaultDecimalPlaces;\r\n // }\r\n // return (!rtn && rtn!==0 ? null : rtn);\r\n // }\r\n\r\n this.loadValue = function (item) {\r\n defaultValue = item[args.column.field];\r\n let val_as_str = numeric.format(defaultValue, args.column.format);\r\n input.value = val_as_str;\r\n input.select();\r\n };\r\n\r\n this.serializeValue = function () {\r\n return numeric.parse(input.value);\r\n };\r\n\r\n this.applyValue = function (item, state) {\r\n item[args.column.field] = state;\r\n };\r\n\r\n this.isValueChanged = function () {\r\n return numeric.parse(input.value) !== defaultValue;\r\n };\r\n\r\n this.validate = function () {\r\n if (input.value !== \"\" && numeric.parse(input.value) === undefined) {\r\n return {\r\n valid: false,\r\n msg: \"Please enter a valid number\"\r\n };\r\n }\r\n\r\n if (args.column.validator) {\r\n var validationResults = args.column.validator(numeric.parse(input.value));\r\n if (!validationResults.valid) {\r\n return validationResults;\r\n }\r\n }\r\n\r\n return {\r\n valid: true,\r\n msg: null\r\n };\r\n };\r\n\r\n this.init();\r\n}\r\n\r\nexport function BooleanEditor(args) {\r\n var $select: HTMLSelectElement;\r\n var defaultValue;\r\n var scope = this;\r\n\r\n this.init = function () {\r\n $select = document.createElement(\"select\");\r\n $select.setAttribute(\"tabIndex\", \"0\");\r\n $select.className = \"editor-yesno\"; // <OPTION value='-'>-</OPTION>\r\n $select.innerHTML = \"<OPTION value='yes'>✔</OPTION><OPTION value='no'>-</OPTION>\";\r\n args.container.appendChild($select);\r\n args.container.style.textAlign = \"center\";\r\n $select.focus();\r\n };\r\n\r\n this.destroy = function () {\r\n $select.parentElement.removeChild($select);\r\n };\r\n\r\n this.focus = function () {\r\n $select.focus();\r\n };\r\n\r\n this.loadValue = function (item) {\r\n defaultValue = item[args.column.field];\r\n $select.value = defaultValue == null ? \"-\" : (defaultValue ? \"yes\" : \"no\");\r\n $select.focus();\r\n //$select.select();\r\n };\r\n\r\n this.serializeValue = function () {\r\n if ($select.value === \"-\") {\r\n return null;\r\n }\r\n return ($select.value === \"yes\");\r\n };\r\n\r\n this.applyValue = function (item, state) {\r\n item[args.column.field] = state;\r\n };\r\n\r\n this.isValueChanged = function () {\r\n if ($select.value === \"-\" && defaultValue == null) {\r\n return false;\r\n }\r\n var v = $select.value === \"yes\";\r\n return (v !== defaultValue);\r\n };\r\n\r\n this.validate = function () {\r\n return {\r\n valid: true,\r\n msg: null\r\n };\r\n };\r\n\r\n this.init();\r\n}\r\n\r\n","\r\n\r\nexport let keyCodes = {\r\n LEFT: 37,\r\n RIGHT: 39\r\n};\r\n\r\n/*\r\n * Depending on the value of Grid option 'editorCellNavOnLRKeys', us \r\n * Navigate to the cell on the left if the cursor is at the beginning of the input string\r\n * and to the right cell if it's at the end. Otherwise, move the cursor within the text\r\n */\r\nexport function handleKeydownLRNav(e) {\r\n var cursorPosition = e.target.selectionStart;\r\n var textLength = e.target.value.length;\r\n if ((e.which === keyCodes.LEFT && cursorPosition > 0) ||\r\n e.which === keyCodes.RIGHT && cursorPosition < textLength) {\r\n e.stopImmediatePropagation();\r\n }\r\n}\r\n\r\nexport function handleKeydownLRNoNav(e) {\r\n if (e.which === keyCodes.LEFT || e.which === keyCodes.RIGHT) {\r\n e.stopImmediatePropagation();\r\n }\r\n}\r\n","import \"./slick.tree.css\";\r\nimport { IJSLGrid, ISlickCreatorOptions } from \"./slick.creator\";\r\nimport { ISlickFormatter } from \"./slick.core\";\r\n\r\nexport interface IGridTreeOptions {\r\n parentColumn: string;\r\n indentInRem?: number;\r\n enableCollapsing?: boolean;\r\n hiddenStateField?: string;\r\n collapsedStateField?: string;\r\n expandIconHTML?: string;\r\n collapseIconHTML?: string;\r\n}\r\n\r\nexport let IndentFormatter: ISlickFormatter = function (row, cell, value, columnDef, dataContext, grid): string {\r\n let result = \"\";\r\n const hierachy: GridTree<any> = (grid as any)._hierachy;\r\n if (hierachy != null) {\r\n const options = hierachy.getOptions();\r\n const level = hierachy.getLevel(dataContext);\r\n if (level > 0) {\r\n result += \"<span class='jsl-indent' style='min-width:\" + (level * hierachy.getOptions().indentInRem) + \"rem;'></span>\";\r\n }\r\n if (options.enableCollapsing) {\r\n const hasChildren = hierachy.hasChildren(dataContext);\r\n if (hasChildren) {\r\n if (dataContext[options.collapsedStateField]) {\r\n result += \"<span class='jsl-toggle'>\" + options.expandIconHTML + \"</span>\";\r\n } else {\r\n result += \"<span class='jsl-toggle'>\" + options.collapseIconHTML + \"</span>\";\r\n }\r\n } else {\r\n result += \"<span class='jsl-toggle-spacer'></span>\";\r\n }\r\n }\r\n }\r\n if (value != null) {\r\n result += (value + \"\").replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\r\n }\r\n return result;\r\n};\r\n\r\nexport class GridTree<T> {\r\n\r\n private primaryKey: string;\r\n\r\n private options: IGridTreeOptions;\r\n\r\n constructor(private grid: IJSLGrid<T>, o: IGridTreeOptions) {\r\n this.options = {\r\n ...{\r\n enableCollapsing: true,\r\n indentInRem: 1,\r\n hiddenStateField: \"_hidden_by_h\",\r\n collapsedStateField: \"_callapsed\",\r\n expandIconHTML: \"▶\", // \"˃\",\r\n collapseIconHTML: \"▼\" // \"˅\"\r\n }, ...o\r\n };\r\n this.primaryKey = (this.grid.getOptions() as ISlickCreatorOptions).primaryKey;\r\n (grid as any)._hierachy = this;\r\n grid.refresh();\r\n this.initEvents();\r\n }\r\n\r\n public getOptions() {\r\n return this.options;\r\n }\r\n\r\n public getLevel(item: T): number {\r\n let level = 0;\r\n let parent = this.getParent(item);\r\n while (parent != null) {\r\n parent = this.getParent(parent);\r\n level++;\r\n }\r\n return level;\r\n }\r\n\r\n public getParent(item: T): T {\r\n return this.grid.dataView.getItemById(item[this.options.parentColumn]);\r\n }\r\n\r\n public hasChildren(item: T): boolean {\r\n return this.rowHasChildren(this.grid.dataView.getIdxByItem(item));\r\n }\r\n\r\n public getDirectChildren(item: T): T[] {\r\n const id = item[this.primaryKey];\r\n const result = [];\r\n const data = this.grid.getData();\r\n for (let i = 0; i < data.length; i++) {\r\n const pid = data[i][this.options.parentColumn];\r\n if (pid === id) {\r\n result.push(data[i]);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n public getAllChildren(item: T): T[] {\r\n const parentid = item[this.primaryKey];\r\n const result = [];\r\n const data = this.grid.getData();\r\n for (let i = 0; i < data.length; i++) {\r\n if (data[i][this.options.parentColumn] === parentid) {\r\n result.push(data[i]);\r\n result.push(...this.getAllChildren(data[i]));\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n public rowHasChildren(row: number): boolean {\r\n const data = this.grid.getData();\r\n if (data.length > row + 1) {\r\n return data[row + 1][this.options.parentColumn] === data[row][this.primaryKey];\r\n }\r\n return false;\r\n }\r\n\r\n public toggleExpand(item: T): void {\r\n if (item[this.options.collapsedStateField]) {\r\n this.expand(item);\r\n } else {\r\n this.collapse(item);\r\n }\r\n }\r\n\r\n public expand(item: T): void {\r\n item[this.options.collapsedStateField] = false;\r\n const data = this.grid.getData();\r\n let i = this.grid.dataView.getIdxByItem(item);\r\n while (i < data.length) {\r\n data[i][this.options.hiddenStateField] = false;\r\n if (this.rowHasChildren(i)) {\r\n if (data[i][this.options.collapsedStateField]) {\r\n //skip children\r\n i += this.getAllChildren(data[i]).length;\r\n }\r\n }\r\n i++;\r\n }\r\n this.grid.refreshData();\r\n }\r\n\r\n public indent(rows: T[]) {\r\n const realRows = this.filterChildren(rows);\r\n const data = this.grid.getData();\r\n //get indexes of rows\r\n const indexes = [];\r\n for (let i = 0; i < realRows.length; i++) {\r\n indexes.push(this.grid.dataView.getIdxByItem(realRows[i]));\r\n }\r\n //sort indexes\r\n indexes.sort((a, b) => a > b ? 1 : (a < b ? -1 : 0));\r\n //change parents to indent rows\r\n for (let i = 0; i < indexes.length; i++) {\r\n const rowIdx = indexes[i];\r\n const parentID = data[rowIdx][this.options.parentColumn];\r\n for (let tmp = rowIdx - 1; tmp >= 0; tmp--) {\r\n if (data[tmp][this.options.parentColumn] === parentID) {\r\n data[rowIdx][this.options.parentColumn] = data[tmp][this.primaryKey];\r\n break;\r\n }\r\n }\r\n }\r\n this.grid.refreshData();\r\n }\r\n\r\n public outdent(rows: T[]) {\r\n const rows2 = this.filterChildren(rows);\r\n const data = this.grid.getData();\r\n for (let i = 0; i < rows2.length; i++) {\r\n const row = rows2[i];\r\n const oldparent = row[this.options.parentColumn];\r\n if (oldparent) {\r\n const newparent = data[this.grid.dataView.getIdxById(oldparent)][this.options.parentColumn];\r\n row[this.options.parentColumn] = newparent;\r\n //make all subsequent items with same ParentID have current row as new parentid\r\n let idx = this.grid.dataView.getIdxById(row[this.primaryKey]);\r\n while (++idx < data.length) {\r\n if (data[idx][this.options.parentColumn] === oldparent) {\r\n data[idx][this.options.parentColumn] = row[this.primaryKey];\r\n }\r\n //TODO: optimize -> break sooner\r\n }\r\n }\r\n }\r\n this.grid.refreshData();\r\n }\r\n\r\n public filterChildren(rows: T[]): T[] {\r\n const result = [];\r\n\r\n const dict: any = {};\r\n\r\n for (let i = 0; i < rows.length; i++) {\r\n dict[rows[i][this.primaryKey]] = true;\r\n }\r\n\r\n for (let i = 0; i < rows.length; i++) {\r\n const row = rows[i];\r\n const parentid = row[this.options.parentColumn];\r\n if (!parentid || !dict[parentid]) {\r\n result.push(row);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n public collapse(item: T): void {\r\n item[this.options.collapsedStateField] = true;\r\n const children = this.getAllChildren(item);\r\n for (let i = 0; i < children.length; i++) {\r\n children[i][this.options.hiddenStateField] = true;\r\n }\r\n this.grid.refreshData();\r\n }\r\n\r\n private initEvents() {\r\n // collapse / expand click events\r\n if (this.options.enableCollapsing) {\r\n this.grid.onClick.subscribe((e, args) => {\r\n if (e.target.classList.contains(\"jsl-toggle\")) {\r\n e.stopImmediatePropagation();\r\n this.toggleExpand(this.grid.dataView.getItem(args.row));\r\n }\r\n });\r\n }\r\n\r\n // filters\r\n const hiddenFilter = {\r\n field: this.options.hiddenStateField,\r\n match: (itm, field) => {\r\n return !itm[this.options.hiddenStateField];\r\n }\r\n };\r\n this.grid.addFilter(hiddenFilter);\r\n\r\n }\r\n\r\n}\r\n","import { jQueryReplacement } from '../../core/jq'\r\nimport { Slick } from '../slick.core'\r\n\r\n\r\nlet $ = jQueryReplacement;\r\n\r\n// register namespace\r\n$.deepExtend(Slick, {\r\n \"CellRangeDecorator\": CellRangeDecorator\r\n});\r\n\r\n/***\r\n * Displays an overlay on top of a given cell range.\r\n *\r\n * TODO:\r\n * Currently, it blocks mouse events to DOM nodes behind it.\r\n * Use FF and WebKit-specific \"pointer-events\" CSS style, or some kind of event forwarding.\r\n * Could also construct the borders separately using 4 individual DIVs.\r\n *\r\n * @param {Grid} grid\r\n * @param {Object} options\r\n */\r\nexport function CellRangeDecorator(grid, options) {\r\n var _elem;\r\n var _defaults = {\r\n selectionCssClass: 'slick-range-decorator',\r\n selectionCss: {\r\n \"zIndex\": \"9999\",\r\n \"border\": \"2px dashed red\"\r\n },\r\n offset: {\r\n top: -1,\r\n left: -1,\r\n height: -2,\r\n width: -2\r\n }\r\n };\r\n\r\n options = $.deepExtend({}, _defaults, options);\r\n\r\n\r\n function show(range) {\r\n if (!_elem) {\r\n _elem = $(\"<div></div>\"/*, {css: options.selectionCss}*/)\r\n .addClass(options.selectionCssClass)\r\n .css(\"position\", \"absolute\")\r\n .appendTo(grid.getActiveCanvasNode());\r\n if (options.selectionCss) {\r\n for (let key in options.selectionCss) {\r\n _elem.css(key, options.selectionCss[key]);\r\n }\r\n }\r\n }\r\n\r\n var from = grid.getCellNodeBox(range.fromRow, range.fromCell);\r\n var to = grid.getCellNodeBox(range.toRow, range.toCell);\r\n _elem.css({\r\n top: from.top + options.offset.top,\r\n left: from.left + options.offset.left,\r\n height: to.bottom - from.top + options.offset.height,\r\n width: to.right - from.left + options.offset.width\r\n });\r\n\r\n return _elem;\r\n }\r\n\r\n function hide() {\r\n if (_elem) {\r\n _elem.remove();\r\n _elem = null;\r\n }\r\n }\r\n\r\n $.shallowExtend(this, {\r\n \"pluginName\": \"CellRangeDecorator\",\r\n \"show\": show,\r\n \"hide\": hide\r\n });\r\n}","import { jQueryReplacement } from '../../core/jq'\r\nimport { Slick, Range } from '../slick.core'\r\nimport { CellRangeDecorator } from './slick.cellrangedecorator';\r\n\r\nlet $ = jQueryReplacement;\r\n\r\n// register namespace\r\n$.deepExtend(window, {\r\n \"Slick\": {\r\n \"CellRangeSelector\": CellRangeSelector\r\n }\r\n});\r\n\r\nexport function CellRangeSelector(options) {\r\n var _grid;\r\n var _currentlySelectedRange;\r\n var _canvas;\r\n var _gridOptions;\r\n var _$activeCanvas;\r\n var _dragging;\r\n var _decorator;\r\n var _self = this;\r\n var _handler = new Slick.EventHandler();\r\n var _defaults = {\r\n selectionCss: {\r\n \"border\": \"2px dashed blue\"\r\n }\r\n };\r\n\r\n // Frozen row & column variables\r\n var _rowOffset;\r\n var _columnOffset;\r\n var _isRightCanvas;\r\n var _isBottomCanvas;\r\n\r\n // Scrollings\r\n var _scrollTop = 0;\r\n var _scrollLeft = 0;\r\n\r\n function init(grid) {\r\n options = $.deepExtend({}, _defaults, options);\r\n _decorator = options.cellDecorator || new CellRangeDecorator(grid, options);\r\n _grid = grid;\r\n _canvas = _grid.getCanvasNode();\r\n _gridOptions = _grid.getOptions();\r\n _handler\r\n .subscribe(_grid.onScroll, handleScroll)\r\n .subscribe(_grid.onDragInit, handleDragInit)\r\n .subscribe(_grid.onDragStart, handleDragStart)\r\n .subscribe(_grid.onDrag, handleDrag)\r\n .subscribe(_grid.onDragEnd, handleDragEnd);\r\n }\r\n\r\n function destroy() {\r\n _handler.unsubscribeAll();\r\n }\r\n\r\n function getCellDecorator() {\r\n return _decorator;\r\n }\r\n\r\n function handleScroll(e, args) {\r\n _scrollTop = args.scrollTop;\r\n _scrollLeft = args.scrollLeft;\r\n }\r\n\r\n function handleDragInit(e, dd) {\r\n // Set the active canvas node because the decorator needs to append its\r\n // box to the correct canvas\r\n _$activeCanvas = $(_grid.getActiveCanvasNode(e));\r\n\r\n var c = _$activeCanvas.offset();\r\n\r\n _rowOffset = 0;\r\n _columnOffset = 0;\r\n _isBottomCanvas = _$activeCanvas.hasClass('grid-canvas-bottom');\r\n\r\n if (_gridOptions.frozenRow > -1 && _isBottomCanvas) {\r\n _rowOffset = (_gridOptions.frozenBottom) ? $('.grid-canvas-bottom').height() : $('.grid-canvas-top').height();\r\n }\r\n\r\n _isRightCanvas = _$activeCanvas.hasClass('grid-canvas-right');\r\n\r\n if (_gridOptions.frozenColumn > -1 && _isRightCanvas) {\r\n _columnOffset = $('.grid-canvas-left').width();\r\n }\r\n\r\n // prevent the grid from cancelling drag'n'drop by default\r\n e.stopImmediatePropagation();\r\n }\r\n\r\n function handleDragStart(e, dd) {\r\n var cell = _grid.getCellFromEvent(e);\r\n if (_self.onBeforeCellRangeSelected.notify(cell) !== false) {\r\n if (_grid.canCellBeSelected(cell.row, cell.cell)) {\r\n _dragging = true;\r\n e.stopImmediatePropagation();\r\n }\r\n }\r\n if (!_dragging) {\r\n return;\r\n }\r\n\r\n _grid.focus();\r\n\r\n var startX = dd.startX - $(_canvas).offset().left;\r\n if (_gridOptions.frozenColumn >= 0 && _isRightCanvas) {\r\n startX += _scrollLeft;\r\n }\r\n\r\n var startY = dd.startY - $(_canvas).offset().top;\r\n if (_gridOptions.frozenRow >= 0 && _isBottomCanvas) {\r\n startY += _scrollTop;\r\n }\r\n\r\n var start = _grid.getCellFromPoint(startX, startY);\r\n\r\n dd.range = { start: start, end: {} };\r\n _currentlySelectedRange = dd.range;\r\n return _decorator.show(new Range(start.row, start.cell));\r\n }\r\n\r\n function handleDrag(e, dd) {\r\n if (!_dragging) {\r\n return;\r\n }\r\n e.stopImmediatePropagation();\r\n\r\n var end = _grid.getCellFromPoint(\r\n e.pageX - _$activeCanvas.offset().left + _columnOffset,\r\n e.pageY - _$activeCanvas.offset().top + _rowOffset\r\n );\r\n // ... frozen column(s), \r\n if (_gridOptions.frozenColumn >= 0 && (!_isRightCanvas && (end.cell > _gridOptions.frozenColumn)) || (_isRightCanvas && (end.cell <= _gridOptions.frozenColumn))) {\r\n return;\r\n }\r\n\r\n // ... or frozen row(s)\r\n if (_gridOptions.frozenRow >= 0 && (!_isBottomCanvas && (end.row >= _gridOptions.frozenRow)) || (_isBottomCanvas && (end.row < _gridOptions.frozenRow))) {\r\n return;\r\n }\r\n\r\n // ... or regular grid (without any frozen options)\r\n if (!_grid.canCellBeSelected(end.row, end.cell)) {\r\n return;\r\n }\r\n\r\n dd.range.end = end;\r\n\r\n _decorator.show(new Slick.Range(dd.range.start.row, dd.range.start.cell, end.row, end.cell));\r\n }\r\n\r\n function handleDragEnd(e, dd) {\r\n if (!_dragging) {\r\n return;\r\n }\r\n\r\n _dragging = false;\r\n e.stopImmediatePropagation();\r\n\r\n _decorator.hide();\r\n _self.onCellRangeSelected.notify({\r\n range: new Slick.Range(\r\n dd.range.start.row,\r\n dd.range.start.cell,\r\n dd.range.end.row,\r\n dd.range.end.cell\r\n )\r\n });\r\n }\r\n\r\n function getCurrentRange() {\r\n return _currentlySelectedRange;\r\n }\r\n\r\n $.shallowExtend(this, {\r\n \"init\": init,\r\n \"destroy\": destroy,\r\n \"pluginName\": \"CellRangeSelector\",\r\n\r\n \"getCellDecorator\": getCellDecorator,\r\n \"getCurrentRange\": getCurrentRange,\r\n\r\n \"onBeforeCellRangeSelected\": new Slick.Event(),\r\n \"onCellRangeSelected\": new Slick.Event()\r\n });\r\n}\r\n","import { jQueryReplacement } from '../../core/jq'\r\nimport { Slick, Range } from '../slick.core'\r\nimport { CellRangeSelector } from './slick.cellrangeselector';\r\n\r\n\r\nlet $ = jQueryReplacement;\r\n\r\n// register namespace\r\n$.deepExtend(window, {\r\n \"Slick\": {\r\n \"CellSelectionModel\": CellSelectionModel\r\n }\r\n});\r\n\r\nexport function CellSelectionModel(options?) {\r\n var _grid;\r\n var _canvas;\r\n var _ranges = [];\r\n var _self = this;\r\n var _selector;\r\n\r\n if (typeof options === \"undefined\" || typeof options.cellRangeSelector === \"undefined\") {\r\n _selector = new CellRangeSelector({\r\n \"selectionCss\": {\r\n \"border\": \"2px solid black\"\r\n }\r\n });\r\n } else {\r\n _selector = options.cellRangeSelector;\r\n }\r\n\r\n var _options;\r\n var _defaults = {\r\n selectActiveCell: true\r\n };\r\n\r\n function init(grid) {\r\n _options = $.deepExtend({}, _defaults, options);\r\n _grid = grid;\r\n _canvas = _grid.getCanvasNode();\r\n _grid.onActiveCellChanged.subscribe(handleActiveCellChange);\r\n _grid.onKeyDown.subscribe(handleKeyDown);\r\n grid.registerPlugin(_selector);\r\n _selector.onCellRangeSelected.subscribe(handleCellRangeSelected);\r\n _selector.onBeforeCellRangeSelected.subscribe(handleBeforeCellRangeSelected);\r\n }\r\n\r\n function destroy() {\r\n _grid.onActiveCellChanged.unsubscribe(handleActiveCellChange);\r\n _grid.onKeyDown.unsubscribe(handleKeyDown);\r\n _selector.onCellRangeSelected.unsubscribe(handleCellRangeSelected);\r\n _selector.onBeforeCellRangeSelected.unsubscribe(handleBeforeCellRangeSelected);\r\n _grid.unregisterPlugin(_selector);\r\n }\r\n\r\n function removeInvalidRanges(ranges) {\r\n var result = [];\r\n\r\n for (var i = 0; i < ranges.length; i++) {\r\n var r = ranges[i];\r\n if (_grid.canCellBeSelected(r.fromRow, r.fromCell) && _grid.canCellBeSelected(r.toRow, r.toCell)) {\r\n result.push(r);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function rangesAreEqual(range1, range2) {\r\n var areDifferent = (range1.length !== range2.length);\r\n if (!areDifferent) {\r\n for (var i = 0; i < range1.length; i++) {\r\n if (\r\n range1[i].fromCell !== range2[i].fromCell\r\n || range1[i].fromRow !== range2[i].fromRow\r\n || range1[i].toCell !== range2[i].toCell\r\n || range1[i].toRow !== range2[i].toRow\r\n ) {\r\n areDifferent = true;\r\n break;\r\n }\r\n }\r\n }\r\n return !areDifferent;\r\n }\r\n\r\n function setSelectedRanges(ranges) {\r\n // simple check for: empty selection didn't change, prevent firing onSelectedRangesChanged\r\n if ((!_ranges || _ranges.length === 0) && (!ranges || ranges.length === 0)) { return; }\r\n\r\n // if range has not changed, don't fire onSelectedRangesChanged\r\n const rangeHasChanged = !rangesAreEqual(_ranges, ranges);\r\n\r\n _ranges = removeInvalidRanges(ranges);\r\n if (rangeHasChanged) { _self.onSelectedRangesChanged.notify(_ranges); }\r\n }\r\n\r\n function getSelectedRanges() {\r\n return _ranges;\r\n }\r\n\r\n function handleBeforeCellRangeSelected(e, args) {\r\n if (_grid.getEditorLock().isActive()) {\r\n e.stopPropagation();\r\n return false;\r\n }\r\n }\r\n\r\n function handleCellRangeSelected(e, args) {\r\n _grid.setActiveCell(args.range.fromRow, args.range.fromCell, false, false, true);\r\n setSelectedRanges([args.range]);\r\n }\r\n\r\n let lastActiveCell;\r\n\r\n function handleActiveCellChange(e, args) {\r\n if (_options.selectActiveCell && args.row != null && args.cell != null) {\r\n\r\n const metaKey = e.ctrlKey || e.metaKey;\r\n if (metaKey) {\r\n const ranges = getSelectedRanges().slice();\r\n ranges.push(new Range(args.row, args.cell));\r\n setSelectedRanges(ranges);\r\n lastActiveCell = {row: args.row, cell: args.cell};\r\n } else if (e.shiftKey) {\r\n const ranges = getSelectedRanges().slice();\r\n if (ranges.length > 0) {\r\n const currentRange = ranges.pop();\r\n if (lastActiveCell == null) {\r\n lastActiveCell = {row: currentRange.fromRow, cell: currentRange.fromCell};\r\n }\r\n const newRange = new Range(Math.min(lastActiveCell.row, args.row),\r\n Math.min(lastActiveCell.cell, args.cell),\r\n Math.max(lastActiveCell.row, args.row),\r\n Math.max(lastActiveCell.cell, args.cell));\r\n ranges.push(newRange);\r\n } else {\r\n ranges.push(new Range(args.row, args.cell));\r\n lastActiveCell = {row: args.row, cell: args.cell};\r\n }\r\n setSelectedRanges(ranges);\r\n } else {\r\n setSelectedRanges([new Range(args.row, args.cell)]);\r\n lastActiveCell = {row: args.row, cell: args.cell};\r\n }\r\n } else if (!_options.selectActiveCell) {\r\n // clear the previous selection once the cell changes\r\n setSelectedRanges([]);\r\n }\r\n }\r\n\r\n function handleKeyDown(e) {\r\n /***\r\n * Кey codes\r\n * 37 left\r\n * 38 up\r\n * 39 right\r\n * 40 down\r\n */\r\n var ranges, last;\r\n var active = _grid.getActiveCell();\r\n var metaKey = e.ctrlKey || e.metaKey;\r\n if (active && e.shiftKey && !metaKey && !e.altKey &&\r\n (e.which == 37 || e.which == 39 || e.which == 38 || e.which == 40)) {\r\n\r\n ranges = getSelectedRanges().slice();\r\n if (!ranges.length)\r\n ranges.push(new Range(active.row, active.cell));\r\n\r\n // keyboard can work with last range only\r\n last = ranges.pop();\r\n\r\n // can't handle selection out of active cell\r\n if (!last.contains(active.row, active.cell))\r\n last = new Range(active.row, active.cell);\r\n\r\n var dRow = last.toRow - last.fromRow,\r\n dCell = last.toCell - last.fromCell,\r\n // walking direction\r\n dirRow = active.row == last.fromRow ? 1 : -1,\r\n dirCell = active.cell == last.fromCell ? 1 : -1;\r\n\r\n if (e.which == 37) {\r\n dCell -= dirCell;\r\n } else if (e.which == 39) {\r\n dCell += dirCell;\r\n } else if (e.which == 38) {\r\n dRow -= dirRow;\r\n } else if (e.which == 40) {\r\n dRow += dirRow;\r\n }\r\n\r\n // define new selection range\r\n var new_last = new Slick.Range(active.row, active.cell, active.row + dirRow * dRow, active.cell + dirCell * dCell);\r\n if (removeInvalidRanges([new_last]).length) {\r\n ranges.push(new_last);\r\n var viewRow = dirRow > 0 ? new_last.toRow : new_last.fromRow;\r\n var viewCell = dirCell > 0 ? new_last.toCell : new_last.fromCell;\r\n _grid.scrollRowIntoView(viewRow);\r\n _grid.scrollCellIntoView(viewRow, viewCell);\r\n }\r\n else\r\n ranges.push(last);\r\n\r\n setSelectedRanges(ranges);\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n }\r\n\r\n $.shallowExtend(this, {\r\n \"getSelectedRanges\": getSelectedRanges,\r\n \"setSelectedRanges\": setSelectedRanges,\r\n\r\n \"init\": init,\r\n \"destroy\": destroy,\r\n \"pluginName\": \"CellSelectionModel\",\r\n\r\n \"onSelectedRangesChanged\": new Slick.Event()\r\n });\r\n} "],"names":["_slickCore","exports","_slickCreator","_slickDataview","_slickEditorsCore","_slickFormatters","_slickGrid","_slickGroupitemmetadataprovider","_slickTree","_slickCellrangedecorator","_slickCellrangeselector","_slickCellselectionmodel","_slickHeadermenu","_slickRowselectionmodel","Slick","export","Range1","require","Event","push","fn","countHandlers","handlers","length","this","unsubscribe","i","splice","notify","args","e","scope","returnValue","isPropagationStopped","isImmediatePropagationStopped","call","EventData","subscribe","event","handler","unsubscribeAll","NonDataItem","Group","GroupTotals","EditorLock","SPACE","BACKSPACE","DELETE","END","ENTER","HOME","INSERT","LEFT","PAGE_DOWN","PAGE_UP","TAB","stopPropagation","stopImmediatePropagation","fromRow","fromCell","toRow","toCell","undefined","Math","min","max","isSingleRow","isSingleCell","contains","row","cell","toString","__nonDataRow","__group","level","count","value","title","collapsed","selectChecked","totals","rows","groups","groupingKey","__groupTotals","group","initialized","prototype","equals","getParentWithClass","el","c","stopAt","classList","parentElement","jQWrapper","elements","_elements","empty","x","innerHTML","appendTo","selector","HTMLElement","appendChild","j","append","add","css","key","indexOf","style","window","getComputedStyle","keyEl","hasOwnProperty","attr","closestClass","name","result","jQueryReplacement","match","remove","parentNode","removeChild","data","html","text","innerText","height","cssHeight","parseInt","isNaN","offsetHeight","width","offsetWidth","removeClass","names","split","nIdx","offset","rect","getBoundingClientRect","top","document","body","scrollTop","left","scrollLeft","children","cidx","on","eventname","fnc","addEventListener","toggleClass","state","find","found","querySelectorAll","slideDown","speed","done","display","slideUp","addClass","hasClass","index","node","previousElementSibling","tmp","createElement","firstElementChild","q","nodeType","Node","ELEMENT_NODE","deepExtend","out","a","arguments","obj","Array","isArray","each","array","shallowExtend","rest","interopDefault","__esModule","default","defineInteropFlag","Object","defineProperty","exportAll","source","dest","keys","forEach","enumerable","get","destName","createJSLGrid","$","_jq","columns","option","formulaObjects","headerMenu","headerButtons","formulas","container","customCommandHandler","grid","dataView","filters","CreateColumnGroups","options","getOptions","columns1","getColumns","frozenColumn","$preHeaderPanel","getPreHeaderPanel","renderHeaderGroups","getPreHeaderPanelRight","preHeaderPanel","start","end","getHeadersWidth","headerColumnWidthDiff","getHeaderColumnWidthDiff","header","lastColumnGroup","widthTotal","m","columnGroup","storeColumnSettings","cols","colSettings","map","id","localStorage","setItem","saveColumnsKey","JSON","stringify","triggerFormula","column","item","f","l","sort","sortAsc","comparer","sortByVisibleValue","b","formatter","getDataItemValueForColumn","y","xStr","yStr","toLocaleLowerCase","refreshData","setItems","refresh","invalidate","getFormattedValue","TextFormatter","formatterResult","getItem","calcLengthInternal","convertElement","w","charWidth","isHTML","measureElement","position","whiteSpace","columnId","dontrefresh","refreshFilters","noColumnHeaderRefresh","mode","setFilter","filterArray","field","orResult","onFiltersChanged","sanitizeColumns","explicitInitialization","querySelector","Error","showColumnGroups","createPreHeaderPanel","showPreHeaderPanel","editCommandHandler","editCommand","oldVal","execute","updateItem","primaryKey","onAfterEdit","oldValue","newValue","handleEditCommand","groupItemMetadataProvider","GroupItemMetadataProvider","groupItemOptions","DataView","inlineFilters","SlickGrid","registerPlugin","setSelectionModel","RowSelectionModel","onHeaderCellRendered","columnHasFilter","onSort","sortCol","onRowsChanged","invalidateRows","render","onRowCountChanged","updateRowCount","onAddNewRow","provideDefaultValues","addItem","showHeaderMenu","HeaderMenu","onBeforeMenuShow","menu","sortable","items","_lang","UILang","Sort","Asc","command","Desc","filterable","Filter","filter","ClearFilter","onCommand","sortCols","multiColumnSort","showFilterDialog","show","clearFilter","_slickHeaderbuttons","HeaderButtons","init","setTimeout","onColumnsResized","onColumnsReordered","parse","setColumns","loadColumnSettings","setHeight","resizeCanvas","getHeight","setData","newData","getData","addFormula","usedColumns","getContentWidth","fitToContent","idx","len","getDataLength","triggerAllFormulas","val","refreshDataItem","updateRow","getRowByItem","addFilter","setFilters","getFilters","getSelectedRows","selRows","rowIdx","toPush","scrollbarDimensions","maxSupportedCssHeight","th","h","ph","n","cj","$container","$focusSink","$focusSink2","$headerScroller","$headers","$headerRow","$headerRowScroller","$headerRowSpacerL","$headerRowSpacerR","$footerRow","$footerRowScroller","$footerRowSpacerL","$footerRowSpacerR","$preHeaderPanelScroller","$preHeaderPanelSpacer","$preHeaderPanelR","$preHeaderPanelScrollerR","$topPanelScroller","$topPanel","$viewport","$canvas","$style","$boundAncestors","stylesheet","columnCssRulesL","columnCssRulesR","viewportH","viewportW","canvasWidth","canvasWidthL","canvasWidthR","headersWidth","headersWidthL","headersWidthR","viewportHasHScroll","viewportHasVScroll","absoluteColumnMinWidth","$activeCanvasNode","$activeViewportNode","activePosX","activeRow","activeCell","serializedEditorValue","editController","selectionModel","$paneHeaderL","$paneHeaderR","$paneTopL","$paneTopR","$paneBottomL","$paneBottomR","$headerScrollerL","$headerScrollerR","$headerL","$headerR","$headerRowScrollerL","$headerRowScrollerR","$footerRowScrollerL","$footerRowScrollerR","$headerRowL","$headerRowR","$footerRowL","$footerRowR","$topPanelScrollerL","$topPanelScrollerR","$topPanelL","$topPanelR","$viewportTopL","$viewportTopR","$viewportBottomL","$viewportBottomR","$canvasTopL","$canvasTopR","$canvasBottomL","$canvasBottomR","$viewportScrollContainerX","$viewportScrollContainerY","$headerScrollContainer","$headerRowScrollContainer","$footerRowScrollContainer","scrollEventHandler","$hiddenParents","defaults","alwaysShowVerticalScroll","alwaysShowHorizontalScroll","alwaysAllowHorizontalScroll","rowHeight","defaultColumnWidth","enableAddRow","leaveSpaceForNewRows","editable","autoEdit","suppressActiveCellChangeOnEdit","enableCellNavigation","enableColumnReorder","asyncEditorLoading","asyncEditorLoadDelay","forceFitColumns","enableAsyncPostRender","asyncPostRenderDelay","enableAsyncPostRenderCleanup","asyncPostRenderCleanupDelay","autoHeight","editorLock","GlobalEditorLock","showHeaderRow","headerRowHeight","createFooterRow","showFooterRow","footerRowHeight","preHeaderPanelHeight","showTopPanel","topPanelHeight","formatterFactory","editorFactory","cellFlashingCssClass","selectedCellCssClass","multiSelect","enableTextSelectionOnCells","dataItemColumnValueExtractor","frozenBottom","frozenRow","fullWidthRows","numberedMultiColumnSort","tristateMultiColumnSort","sortColNumberInSeparateSpan","defaultFormatter","columnDef","dataContext","replace","forceSyncScrolling","addNewRowCssClass","preserveCopiedSelectionOnPaste","showCellSelection","viewportClass","minRowBuffer","emulatePagingWhenScrolling","editorCellNavOnLRKeys","doPaging","resizeDelta","dragDelta","columnDefaults","resizable","minWidth","rerenderOnResize","headerCssClass","defaultSortAsc","focusable","selectable","page","vScrollDir","uid","round","random","self","cellWidthDiff","cellHeightDiff","jQueryNewWidthBehaviour","hasFrozenRows","frozenRowsHeight","actualFrozenRow","paneTopH","paneBottomH","viewportTopH","topPanelH","headerRowH","footerRowH","tabbingDirection","activeCellNode","currentEditor","rowsCache","rowPositionCache","numVisibleRows","prevScrollTop","lastRenderedScrollTop","lastRenderedScrollLeft","prevScrollLeft","selectedRows","plugins","cellCssClasses","columnsById","sortColumns","columnPosLeft","columnPosRight","pagingActive","pagingIsLastPage","scrollThrottle","action","minPeriod_ms","dequeue","queued","unblock","blockAndExecute","blocked","ActionThrottle","h_editorLoader","h_postrender","h_postrenderCleanup","postProcessedRows","postProcessToRow","postProcessFromRow","postProcessedCleanupQueue","cssShow","visibility","oldProps","finishInitialization","dragStartX","dragStartY","isDown","getViewportWidth","getViewportHeight","h1","v","n1","parseFloat","r","measureCellPaddingAndBorder","$target","jquery","target","tagName","preventDefault","cacheRowPositions","setFrozenOptions","setPaneVisibility","setScroller","setOverflow","updateColumnCaches","createColumnHeaders","createColumnFooter","ctrlPressed","metaKey","ctrlKey","$col","getEditorLock","commitCurrentEdit","sortColumn","hadSortCol","shiftKey","setSortColumns","trigger","col","getColumnIndex","_resizable","Resizable","onResize","_eventhandler","EventHandler","evt","processColumnResize","onStart","startColumnResize","onStop","finishColumnResize","mouseDownFnc","arg","lastChild","pageX","touches","dragColStartX","draggedEl","dragGhost","className","offsetLeft","clientHeight","clientWidth","ghostContent","processColumnDrag","finishColumnDrag","startColumnDragging","setupColumnMoveAndResize","createCssRules","elem","scrollWidth","scrollHeight","$elem","handleActiveCellPositionChange","bindAncestorScrollEvents","handleScroll","preventScroll","handleHeaderContextMenu","handleHeaderClick","handleKeyDown","handleClick","handleDblClick","handleContextMenu","dragStartedDD","delta","dd","getCellFromEvent","cellExists","onDragInit","handleDragInit","pageY","handleMouseUp","_dd","abs","dragging","propagates","startX","startY","onDragStart","handleDragStart","handleDrag","onDragEnd","handleDragEnd","removeEventListener","old","hasFrozenColumns","unregisterPlugin","plugin","destroy","setActiveCanvasNode","element","setActiveViewportNode","measureScrollbar","$outerdiv","$innerdiv","dim","includeScrollbar","ii","getCanvasWidth","availableWidth","totalRowWidth","updateCanvasWidth","forceColumnWidthsUpdate","widthChanged","oldCanvasWidth","oldCanvasWidthL","oldCanvasWidthR","applyColumnWidths","onBeforeFooterRowCellDestroy","footerRowCell","onFooterRowCellRendered","onMouseEnter","onMouseLeave","onBeforeHeaderCellDestroy","onBeforeHeaderRowCellDestroy","$headerTarget","$headerRowTarget","div","toolTip","resizeHandleWidth","sortIndicator","numIndicator","headerRowCell","onHeaderRowCellRendered","getImpactedColumns","limit","impactedColumns","prevEl","nextEl","nextElementSibling","prevWidth","nextWidth","draggedDistance","insertBefore","changedTouches","$colsL","$colsR","reorderedIds","concat","reorderedColumns","applyColumnResort","minPageX","maxPageX","colIdx","columnElements","shrinkLeewayOnRight","stretchLeewayOnRight","previousWidth","maxWidth","shrinkLeewayOnLeft","stretchLeewayOnLeft","currentX","actualMinWidth","d","newCanvasWidthL","k","j1","j2","applyColumnHeaderWidths","syncColumnCellResize","newWidth","invalidateAllRows","getVBoxDelta","$el","getRowTop","dataLength","type","rules","styleSheet","cssText","join","createTextNode","getColumnCssRules","sheets","styleSheets","ownerNode","matches","columnIdx","cssRules","selectorText","exec","substr","removeCssRules","tmp_fnc","apply","_isImmediatePropagationStopped","_isPropagationStopped","autosizeColumns","prevTotal","widths","shrinkLeeway","total","availWidth","shrinkProportion","absMinWidth","shrinkSize","floor","growProportion","growSize","currentWidth","reRender","onAutosizeColumns","headers","rule","right","numberCols","headerColumnEls","columnIndex","handleSelectedRangesChanged","ranges","previousSelectedRows","slice","arr1","arr2","hash","canCellBeSelected","setCellCssStyles","onSelectedRowsChanged","updateColumnProps","widthRequest","columnDefinitions","validateAndEnforceOptions","getLength","getDataLengthIncludingAddNew","getDataItem","variableRowHeight","getRowFromPosition","rowsInPosCache","ar","compare_fn","cmp","binarySearch","pos","cacheEntry","bottom","scrollTo","oldOffset","newScrollTop","cleanupRows","getVisibleRange","rowNode","updateRowPositions","onViewportChanged","getFormatter","rowMetadata","getItemMetadata","columnOverrides","getEditor","columnMetadata","editor","fields","appendRowHtml","range","dataLoading","rowCss","metadata","cssClasses","onAppendRow","colspan","frozenRowOffset","getFrozenRowOffset","rowHtml","getRowHeight","L","R","columnData","leftPx","alwaysRenderColumn","rightPx","appendCellHtml","stringResult","cellCss","cssClass","addlCssClasses","addClasses","cellRenderQueue","cellColSpans","rangeToKeep","removeFrozenRow","removeRowFromCache","startPostProcessingCleanup","makeActiveCellNormal","onBeforeRemoveRow","dom","rl","invalidateRow","applyFormatResultToCellNode","cellNode","suppressRemove","removeClasses","ensureCellNodesInRowsCache","cellNodesByColumnIdx","loadValue","onAppendCell","invalidatePostProcessingResults","fullHeight","preHeaderH","ceil","paneBottomTop","offsetTop","dataLengthIncludingAddNew","numberOfRows","oldH","tempViewportH","oldViewportHasVScroll","r1","resetActiveCell","rowH","oldScrollTopInRange","viewportTop","viewportLeft","getRenderedRangeFromVisibleRange","buffer","minBuffer","lastNode","lastElementChild","pop","cleanUpCells","cellToRemove","cellsToRemove","cleanUpAndRenderCells","cellsAdded","stringArray","processedRows","btm","processedRow","renderRows","needToReselectCell","xRight","i1","ii1","xChild","xChildRight","nodes","childNodes","idx1","cIdx","getCellNode","startPostProcessing","clearTimeout","asyncPostProcessRows","asyncPostProcessCleanupRows","visible","rendered","renderedFrozenRows","onRendered","startRow","endRow","isMouseWheel","vScrollDist","maxScrollDistanceY","maxScrollDistanceX","hScrollDist","dx","dy","enqueue","onScroll","_handleScroll","processedStatus","asyncPostRender","groupId","shift","entry","actionType","asyncPostRenderCleanup","updateCellCssStylesOnRenderedRows","addedHash","removedHash","addedRowHash","removedRowHash","prevHash","onKeyDown","keyCode","altKey","keyCaptureList","which","handled","navigateTop","navigateRowStart","navigateBottom","navigateRowEnd","navigatePrev","ESCAPE","isActive","navigatePageDown","navigateLeft","RIGHT","navigateRight","UP","navigateUp","DOWN","navigateDown","navigateNext","makeActiveCellEditable","error","activeElement","setFocus","onClick","scrollRowIntoView","setActiveCellInternal","preClickModeOn","suppressActiveCellChangedEvent","$cell","onContextMenu","onDblClick","gotoCell","$header","onHeaderContextMenu","onHeaderClick","getCellFromPoint","cls","getRowBottom","rowOffset","getCellFromNode","focus","scrollCellIntoView","getColspan","scrollRight","newCell","opt_editMode","$activeCellNode","$activeCellOffset","isBottom","isCellPotentiallyEditable","onActiveCellChanged","getActiveCell","readonly","onBeforeCellEditorDestroy","userAgent","toLowerCase","selection","sel","getSelection","removeAllRanges","clearTextSelection","deactivate","onBeforeEditCell","activate","useEditor","suppressClearOnEdit","columnMetaData","gridPosition","absBox","commitChanges","commitEditAndNavDown","commitChangesOnly","commitEditAndSetFocus","cancelEditAndSetFocus","serializeValue","cancelCurrentEdit","box","offsetParent","onActiveCellPositionChanged","hide","cellBox","viewportScrollH","rowNumber","rowBottom","rowAtTop","rowAtBottom","scrollPage","dir","deltaRows","prevCell","canCellBeActive","prevActivePosX","navigatePageUp","num_rows","findFirstFocusableCell","lastFocusableCell","gotoRight","posX","gotoLeft","firstFocusableCell","prev","gotoUp","findLastFocusableCell","lastSelectableCell","gotoRowStart","gotoRowEnd","navigate","gotoPrev","gotoNext","forceEdit","isValueChanged","validate","valid","onCellChange","serializedValue","applyValue","newItem","unshift","pluginName","ascending","suppressRender","scrollToTop","model","onSelectedRangesChanged","setSelectedRanges","Range","lastCell","rowsToRanges","pagingInfo","pageSize","pageNum","totalPages","currentActiveCell","columnIdOrIdx","rowIndex","getActiveCellPosition","y1","x1","y2","targetHeader","targetIndex","$rtn","eq","$footerRowTarget","$footer","times","remaining","toggleCellClass","onBeforeDestroy","all_parents","hiddenParents","p","cacheCssForHiddenInit","supportedHeight","testUpTo","navigator","test","getMaxSupportedCssHeight","msMaxTouchPoints","headerL","headerR","headerRowScrollerL","headerRowScrollerR","headerRowSpacerL","headerRowSpacerR","headerRowL","headerRowR","topPanelScrollerL","topPanelScrollerR","cloneNode","Grid","ResizeContainer","defaultOptions","resizeHandlePrefix","startSize","mouseDownContainer","resizeX","resizeY","extractArg","mouseMove","mouseUp","raiseEvt","gridX","minHeight","maxHeight","gridY","[object Object]","options1","CustomEvent","CustomEvent1","params","bubbles","cancelable","detail","createEvent","initCustomEvent","Element","click","res","fnc1","val2","console","warn","_grid","_inHandler","_options","_ranges","_self","_handler","_defaults","selectActiveRow","wrapHandler","rangesToRows","handleActiveCellChange","active","from","to","getRowsRange","setActiveCell","o","last","MinAggregator","SumAggregator","sortComparer","filterArgs","idProperty","idxById","rowsById","updated","refreshHints","prevRefreshHints","filteredItems","filterCache","getter","predefinedValues","aggregators","aggregateEmpty","aggregateChildGroups","displayTotalsRow","lazyTotalsCalculation","groupingInfos","toggledGroupsByLevel","groupingDelimiter","pagesize","pagenum","totalRows","onRowsOrCountChanged","startingIndex","getPagingInfo","reverse","setGrouping","groupingInfo","Data","gi","getterIsAFn","newId","deleteItem","sortedAddItem","searchItem","high","mid","low","sortedIndex","expandCollapseAllGroups","collapse","expandCollapseGroup","extractGroups","rows1","parentGroup","groups1","l1","groupsByVal","i2","calculateTotals","agg","isLeafLevel","compiledAccumulators","storeResult","addGroupTotals","g","aggregateCollapsed","addTotals","groupCollapsed","toggledGroups","flattenGroupedRows","groupedRows","gl","jj","compileAccumulatorLoop","aggregator","accumulatorInfo","getFunctionInfo","accumulate","Function","displayName","items1","retval","uncompiledFilterWithCaching","cache","recalc","_items","second","isFilterNarrowing","isFilterExpanding","filteredItems1","batchFilter","uncompiledFilter","batchFilterWithCaching","isFilterUnchanged","paged","getFilteredAndPagedItems","newRows","diff","eitherIsNonData","ignoreDiffsAfter","getRowDiffs","suspend","countBefore","totalRowsBefore","onPagingInfoChanged","previous","callingOnRowsChanged","beginUpdate","endUpdate","setPagingOptions","getItems","objectIdProperty","filterFn","getFilter","getFilteredItems","valueGetter","valueFormatter","sortComparer1","groupAggregators","includeCollapsed","varArgs","arg0","itemArray","ensureRowsByIdCache","rowArray","ids","idArray","hints","insertItem","updateIdxById","getItemById","oldItem","preserveHidden","preserveHiddenOnSelectionChange","inHandler","self1","selectedRowIds","mapRowsToIds","setSelectedRowIds","rowIds","existing","getRowById","newSelectedRowIds","onSelectedRowIdsChanged","hashById","storeCellCssStyles","update","newHash","getCellCssStyles","onCellCssStylesChanged","__height","count_","nonNullCount_","field_","groupTotals","avg","min_","checkboxSelect","checkboxSelectPlugin","groupCssClass","checkboxSelectCssClass","toggleCssClass","toggleCollapsedCssClass","toggleExpandedCssClass","indentation","groupTitleCssClass","groupTotalsFormatter","formatter_res","sum","getRenderedRange","setRefreshHints","ignoreDiffsBefore","collapseGroup","mapItemsToRows","selectRows","deSelectRows","rowIndexes","enableExpandCollapse","expandGroup","handleGridClick","handleGridKeyDown","0","groupFormatter","handleBodyMouseDown","$menu","hideMenu","$activeHeaderColumn","handleHeaderCellRendered","buttonCssClass","buttonImage","showMenu","handleBeforeHeaderCellDestroy","newOptions","Plugins","EmptyFormatter","ComponentFormatter","YesNoFormatter","CheckboxFormatter","CheckmarkFormatter","NumericFormatter","DateFormatter","HtmlFormatter","LookupFormatter","MultiLookupFormatter","TooltipFormatter","MultiLineTextFormatter","TimeFormatter","DateTimeFormatter","ButtonFormatter","escapeHTMLChars","_numeric","numeric","format","vl","valueList","txt","pad","nr","getHours","getMinutes","nrAsString","info","decimalSep","_cultureDefault","thousandSep","str","comma_sep","charAt","numberFormat","formatCache","parseNrFormat","formatNumber","prefix","suffix","show_sep","min_length","max_comma_places","min_comma_places","comma_pos","comma_separator","thousand_separator","cp_min","cp_max","ml","negative","nr_str_raw","toFixed","cp","nr_str","t","_w","_current_culture","culture","_culture","dateFormat","set","cult_vals","cultures","current_culture","de","en-us","en-gb","date2","date","settings","shortYearCutoff","_helper","Date","getFullYear","dayNamesShort","monthNamesShort","monthNames","iFormat","lookAhead","RegExp","num","iValue","getName","shortNames","longNames","literal","doy","getNumber","month","day","date1","getDate","year","_ticksTo1970","getMonth","checkLiteral","_getDaysInMonth","_daylightSavingAdjust","dayNames","output","formatName","getDay","getTime","inputMode","getSeconds","ExcelFilter","rem","documentElement","fontSize","values","currentFilters","getDistinctValues","filterOptions","getFilterValues","oldCheckedValues","_checkedValues","dlg","core","Ok","Cancel","dlgBody","helper","newDomGuid","search","Search","cbAllContainer","cbAll","cbAllLabel","setAttribute","textContent","All","cursor","marginLeft","sortedValues","visibleValues","checkedValues","cbContainer","convertRemToPixels","innerHeight","vr","_virtualRenderComponent","VirtualRenderComponent","renderRow","tag","checked","rowData","change","_","selId","selId1","allChecked","getOwnPropertyNames","for","raw","content","renderer","_jslRender","JSLRender","term","dlgObj","_dialog","Dialog","autoOpen","onClose","selLength","anyChecked","filterObject","close","dlgClearButton","textToValues","dropDown","SelectOption","SelectOptionMultiple","NoResults","NoOptions","MaxSelection","AlreadyInUse","substring","pl","decode","s","decodeURIComponent","query","location","urlParams","seenObjects","detect","correctDates","dateISO","fromString","getTimezoneOffset","emptyGuid","regexIso8601","_myparse","UTC","JSLDialog","autoFocus","closeOnOverlayClick","modal","closeOnEscape","overlay","background","pointerEvents","firstInput","OkOnEnter","onKeydownEvent","ok_btn","onOpen","input","el1","open","State","scrollPos","bufferSizeInPx","rowTag","viewportSizeInPX","__proto__","vrBody","class","getChildren","scroll","newScrollPos","updateNode","viewport","TextEditor","MultiLineTextEditor","NumericEditor","BooleanEditor","navOnLR","maxLength","_slickEditorsNav","handleKeydownLRNav","handleKeydownLRNoNav","select","defaultValue","validator","val_as_str","msg","$select","keyCodes","parcelHelpers","selectionStart","textLength","IndentFormatter","GridTree","hierachy","_hierachy","getLevel","indentInRem","enableCollapsing","hasChildren","collapsedStateField","expandIconHTML","collapseIconHTML","hiddenStateField","initEvents","parent","getParent","parentColumn","rowHasChildren","getIdxByItem","parentid","getAllChildren","expand","realRows","filterChildren","indexes","parentID","rows2","oldparent","newparent","getIdxById","dict","toggleExpand","hiddenFilter","itm","CellRangeDecorator","zIndex","border","_elem","selectionCss","getCellNodeBox","CellRangeSelector","_currentlySelectedRange","_canvas","_gridOptions","_$activeCanvas","_dragging","_decorator","_rowOffset","_columnOffset","_isRightCanvas","_isBottomCanvas","_scrollTop","_scrollLeft","getActiveCanvasNode","onBeforeCellRangeSelected","onCellRangeSelected","cellDecorator","getCanvasNode","onDrag","CellSelectionModel","_selector","cellRangeSelector","selectActiveCell","removeInvalidRanges","rangeHasChanged","range1","range2","areDifferent","rangesAreEqual","getSelectedRanges","handleBeforeCellRangeSelected","handleCellRangeSelected","lastActiveCell","currentRange","newRange","dRow","dCell","dirCell","dirRow","new_last","viewRow","viewCell"],"version":3,"file":"index.js.map"}
|