jsl-ui 9.0.2 → 9.3.2

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"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","sources":["index.ts","core/culture.ts","node_modules/@parcel/transformer-js/src/esmodule-helpers.js","core/date.ts","core/helper.ts","core/jq.ts","core/numeric.ts","core/polyfills.ts","interaction/resizable.ts","interaction/eventhandler.ts","interaction/moveable.ts","ui/date.picker.ts","ui/date.picker/date-picker-options.ts","ui/date.picker/lib/date-manip.ts","ui/date.picker/lib/fns.ts","ui/date.picker/mode/index.ts","ui/date.picker/mode/modal-mode.ts","ui/date.picker/mode/base-mode.ts","ui/date.picker/views/day-picker.ts","ui/date.picker/lib/dom.ts","ui/date.picker/views/month-picker.ts","ui/date.picker/views/year-picker.ts","ui/date.picker/mode/dropdown-mode.ts","ui/date.picker/mode/permanent-mode.ts","ui/date.picker/lib/emitter.ts","ui/dialog.ts","ui/drop.down.ts","core/lang.ts","ui/number.input.ts","components/notification/Notification.ts","grid/slick.core.ts","grid/slick.creator.ts","grid/slick.grid.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","grid/filterDialogs/excelFilter.ts","components/virtual-render/VirtualRenderComponent.ts","grid/slick.editors.core.ts","grid/slick.editors.nav.ts","grid/slick.editors.date.ts","grid/slick.editors.lookup.ts","components/select/SelectComponent.ts","components/select/SelectDDAreaComponent.ts","components/auto-suggest/AutoSuggestComponent.ts","ui/auto.suggest.ts","grid/plugins/slick.cellrangedecorator.ts","grid/plugins/slick.cellrangeselector.ts","grid/plugins/slick.cellselectionmodel.ts","components/progress/ProgressComponent.ts","components/date/DateComponent.ts","components/time/TimeComponent.ts","components/date-time/DateTimeComponent.ts","components/expander/ExpanderComponent.ts","components/loading/LoadingComponent.ts","components/form-field/FormComponent.ts","components/form-field/FormFieldComponent.ts","components/grid/GridComponent.ts","components/tree-view/TreeViewComponent.ts","components/tabs/TabsComponent.ts","components/number/NumberComponent.ts","components/dialog/DialogComponent.ts","components/button/ButtonComponent.ts","components/input/InputComponent.ts","components/checkbox/CheckBoxComponent.ts","components/IntervalComponent.ts","components/stack-panel/StackPanelComponent.ts","components/stack-panel/SplitterComponent.ts","grid/slick.tree.ts","components/navigation/NavigationComponent.ts","components/ribbon-menu/RibbonMenuComponent.ts"],"sourcesContent":["import \"./ui/base.css\";\r\nexport * from \"./core/culture\";\r\nexport * from \"./core/date\";\r\nexport * from \"./core/helper\";\r\nexport * from \"./core/jq\";\r\nexport * from \"./core/numeric\";\r\nimport \"./core/polyfills\";\r\n\r\nexport * from \"./interaction/resizable\";\r\nexport * from \"./interaction/moveable\";\r\nexport * from \"./interaction/eventhandler\";\r\n\r\n// export * from \"./ui/accordion\";\r\nexport * from \"./ui/date.picker\";\r\nexport * from \"./ui/dialog\";\r\nexport * from \"./ui/drop.down\";\r\nexport * from \"./ui/number.input\";\r\n// export * from \"./ui/tabs\";\r\n\r\nexport * from \"./components/notification/Notification\";\r\n\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.editors.date\";\r\nexport * from \"./grid/slick.editors.lookup\";\r\nexport * from \"./grid/slick.formatters\";\r\nexport * from \"./grid/slick.grid\";\r\nexport * from \"./grid/slick.groupitemmetadataprovider\";\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\r\nexport * from \"./components/progress/ProgressComponent\";\r\nexport * from \"./components/date/DateComponent\";\r\nexport * from \"./components/time/TimeComponent\";\r\nexport * from \"./components/date-time/DateTimeComponent\";\r\nexport * from \"./components/expander/ExpanderComponent\";\r\nexport * from \"./components/loading/LoadingComponent\";\r\nexport * from \"./components/form-field/FormComponent\";\r\nexport * from \"./components/form-field/FormFieldComponent\";\r\nexport * from \"./components/grid/GridComponent\";\r\nexport * from \"./components/tree-view/TreeViewComponent\";\r\nexport * from \"./components/tabs/TabsComponent\";\r\nexport * from \"./components/number/NumberComponent\";\r\n// export * from \"./components/drop-down/DropDownComponent\";\r\nexport * from \"./components/dialog/DialogComponent\";\r\nexport * from \"./components/auto-suggest/AutoSuggestComponent\";\r\nexport * from \"./components/button/ButtonComponent\";\r\nexport * from \"./components/input/InputComponent\";\r\nexport * from \"./components/checkbox/CheckBoxComponent\";\r\nexport * from \"./components/IntervalComponent\";\r\nexport * from \"./components/select/SelectComponent\";\r\nexport * from \"./components/stack-panel/StackPanelComponent\";\r\nexport * from \"./components/stack-panel/SplitterComponent\";\r\n// export * from \"./components/date-range/DateRangeComponent\";\r\n// export * from \"./grid/filterDialogs/dateRangeFilter\";\r\nexport * from \"./grid/filterDialogs/excelFilter\";\r\nexport * from \"./grid/slick.tree\";\r\nexport * from \"./components/navigation/NavigationComponent\";\r\nexport * from \"./components/notification/Notification\";\r\nexport * from \"./components/ribbon-menu/RibbonMenuComponent\";\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","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 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","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 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","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","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","// 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","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","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 \"./moveable.css\";\r\nimport \"../core/polyfills\";\r\nimport { EventHandler } from \"./eventhandler\";\r\n\r\nexport interface IMoveEventArg {\r\n x: number;\r\n y: number;\r\n target: HTMLElement;\r\n evt: MouseEvent;\r\n cancelEvent: () => void;\r\n}\r\n\r\nexport interface IMoveableOptions {\r\n moveDelta?: number;\r\n onStart?: EventHandler<IMoveEventArg>;\r\n onStop?: EventHandler<IMoveEventArg>;\r\n onMove?: EventHandler<IMoveEventArg>;\r\n gridX?: number;\r\n gridY?: number;\r\n selector?: string;\r\n handleSelector?: string; // TODO!!!\r\n direction?: \"x\" | \"y\" | \"both\";\r\n}\r\n\r\nconst defaultOptions: IMoveableOptions = {\r\n onStart: new EventHandler<IMoveEventArg>(),\r\n onStop: new EventHandler<IMoveEventArg>(),\r\n onMove: new EventHandler<IMoveEventArg>(),\r\n direction: \"both\",\r\n moveDelta: 0\r\n};\r\n\r\nexport class MoveableContainer {\r\n\r\n private element: HTMLElement;\r\n\r\n private resizeX: boolean = false;\r\n private resizeY: boolean = false;\r\n\r\n private initialX: number = null;\r\n private initialY: number = null;\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: IMoveableOptions) {\r\n if (options.direction === \"x\" || options.direction === \"both\") {\r\n this.resizeX = true;\r\n }\r\n if (options.direction === \"y\" || options.direction === \"both\") {\r\n this.resizeY = true;\r\n }\r\n this.init();\r\n }\r\n\r\n private init(): void {\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 let directChild = target;\r\n while (directChild.parentElement != null && directChild.parentElement !== this.container) {\r\n directChild = directChild.parentElement;\r\n }\r\n if (directChild.parentElement == null) {\r\n return;\r\n }\r\n if (this.options.selector != null && !directChild.matches(this.options.selector)) {\r\n return;\r\n }\r\n\r\n this.element = directChild;\r\n let canceled = false;\r\n const args = {\r\n evt,\r\n target: this.element,\r\n x: this.element.offsetLeft,\r\n y: this.element.offsetTop,\r\n cancelEvent: () => { canceled = true; }\r\n };\r\n this.options.onStart.notify(args);\r\n if (canceled) {\r\n return;\r\n }\r\n\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n evt.stopImmediatePropagation();\r\n\r\n this.initialX = this.extractArg<number>(evt, \"clientX\") - this.element.offsetLeft;\r\n this.initialY = this.extractArg<number>(evt, \"clientY\") - this.element.offsetTop;\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 let x = 0;\r\n if (this.resizeX) {\r\n const val: number = this.extractArg<number>(evt, \"clientX\");\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.moveDelta) {\r\n //if (!this.options.gridX || Math.round(val) % this.options.gridX === 0) {\r\n x = val - this.initialX;\r\n if (this.options.gridX) {\r\n x = Math.round(x / this.options.gridX) * this.options.gridX;\r\n }\r\n if (x < 0) {\r\n x = 0;\r\n }\r\n const maxX = this.container.clientWidth - this.element.offsetWidth;\r\n if (x > maxX) {\r\n x = maxX;\r\n }\r\n this.element.style.left = x + \"px\";\r\n raiseEvt = true;\r\n this.startSize = null;\r\n //}\r\n }\r\n }\r\n let y = 0;\r\n if (this.resizeY) {\r\n const val: number = this.extractArg<number>(evt, \"clientY\");\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.moveDelta) {\r\n //if (!this.options.gridY || Math.round(val) % this.options.gridY === 0) {\r\n y = val - this.initialY;\r\n if (this.options.gridY) {\r\n y = Math.round(y / this.options.gridY) * this.options.gridY;\r\n }\r\n if (y < 0) {\r\n y = 0;\r\n }\r\n const maxY = this.container.clientHeight - this.element.offsetHeight;\r\n if (y > maxY) {\r\n y = maxY;\r\n }\r\n this.element.style.top = y + \"px\";\r\n raiseEvt = true;\r\n this.startSize = null;\r\n //}\r\n }\r\n }\r\n if (raiseEvt) {\r\n this.options.onMove.notify({\r\n evt,\r\n target: this.element,\r\n x,\r\n y,\r\n cancelEvent: () => { }\r\n });\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({\r\n evt,\r\n target: this.element,\r\n x: this.element.offsetLeft,\r\n y: this.element.offsetTop,\r\n cancelEvent: () => { }\r\n });\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 Moveable(selector: HTMLElement | string, options?: IMoveableOptions): MoveableContainer {\r\n return new MoveableContainer(typeof selector === \"string\" ?\r\n document.querySelector(selector) :\r\n selector,\r\n { ...defaultOptions, ...options });\r\n}\r\n","import DatePickerOptions from './date.picker/date-picker-options';\r\nimport Mode from './date.picker/mode/index';\r\nimport Emitter from './date.picker/lib/emitter';\r\nimport './date.picker/css/tiny-date-picker.css';\r\n\r\n\r\nexport interface IDatePickerLangOptions {\r\n days: string[];\r\n months: string[];\r\n today: string;\r\n close: string;\r\n clear: string;\r\n}\r\n\r\nexport interface IDatePickerOptions {\r\n lang?: IDatePickerLangOptions; // Configures the label text, defaults to English\r\n mode?: 'dp-modal' | 'dp-below' | 'dp-permanent'; // The date picker mode, defaults to 'dp-modal'\r\n hilightedDate?: string | Date; // The date to hilight if no date is selected\r\n min?: string | Date; // The minimum selectable date (inclusive, default 100 years ago)\r\n max?: string | Date; // The maximum selectable date (inclusive, default 100 years from now)\r\n format?: (d: Date) => string; // Formats a date for displaying to user\r\n parse?: (s: string) => Date; // Parses a date, the complement of the \"format\" function\r\n dateClass?: (d: Date) => string; // Associates a custom CSS class with a date\r\n inRange?: (d: Date) => boolean; // Indicates whether or not a date is selectable\r\n dayOffset?: number; // dayOffset {number} specifies which day of the week is considered the first. By default,\r\n // this is 0 (Sunday). Set it to 1 for Monday, 2 for Tuesday, etc.\r\n}\r\n\r\n/**\r\n* The state values for the date picker\r\n*\r\n* @typedef {Object} DatePickerState\r\n* @property {string} view - The current view 'day' | 'month' | 'year'\r\n* @property {Date} selectedDate - The date which has been selected by the user\r\n* @property {Date} hilightedDate - The date which is currently hilighted / active\r\n*/\r\n\r\n/**\r\n* An instance of TinyDatePicker\r\n*\r\n* @typedef {Object} DatePicker\r\n* @property {DatePickerState} state - The values currently displayed.\r\n* @property {function} on - Adds an event handler\r\n* @property {function} off - Removes an event handler\r\n* @property {function} setState - Changes the current state of the date picker\r\n* @property {function} open - Opens the date picker\r\n* @property {function} close - Closes the date picker\r\n* @property {function} destroy - Destroys the date picker (removing all handlers from the input, too)\r\n*/\r\n\r\nexport interface IDatePicker {\r\n on(name: \"open\"|\"close\"|\"statechange\"|\"select\", handler: (e:any, dp:IDatePicker) => void): any;\r\n off(name?: \"open\"|\"close\"|\"statechange\"|\"select\", handler?: any): void;\r\n open(): void;\r\n close(): void;\r\n destroy(): void;\r\n setState(state: {selectedDate?: Date; view?: string; hilightedDate?: Date; }): void;\r\n readonly state: {selectedDate?: Date; view?: string; hilightedDate?: Date; };\r\n isVisible(): boolean;\r\n}\r\n\r\n/**\r\n * TinyDatePicker constructs a new date picker for the specified input\r\n *\r\n * @param {HTMLElement | string} input The input or CSS selector associated with the datepicker\r\n * @param {DatePickerOptions} opts The options for initializing the date picker\r\n * @returns {DatePicker}\r\n */\r\nexport function DatePicker(input: HTMLElement | string, opts?: IDatePickerOptions): IDatePicker {\r\n var emitter = Emitter();\r\n var options = DatePickerOptions(opts);\r\n var mode = Mode(input, emit, options);\r\n var me = {\r\n get state() {\r\n return mode.state;\r\n },\r\n on: emitter.on,\r\n off: emitter.off,\r\n setState: mode.setState,\r\n open: mode.open,\r\n close: mode.close,\r\n destroy: mode.destroy,\r\n isVisible: mode.isVisible\r\n };\r\n\r\n function emit(evt) {\r\n emitter.emit(evt, me);\r\n }\r\n\r\n return me;\r\n}\r\n","/**\r\n * @file Responsible for sanitizing and creating date picker options.\r\n */\r\n\r\nimport {now, shiftYear, dateOrParse} from './lib/date-manip';\r\nimport {cp} from './lib/fns';\r\nimport {date} from './../../core/date'\r\n\r\nvar english = {\r\n days: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\r\n months: [\r\n 'January',\r\n 'February',\r\n 'March',\r\n 'April',\r\n 'May',\r\n 'June',\r\n 'July',\r\n 'August',\r\n 'September',\r\n 'October',\r\n 'November',\r\n 'December',\r\n ],\r\n today: 'Today',\r\n clear: 'Clear',\r\n close: 'Close',\r\n};\r\n\r\n/**\r\n * DatePickerOptions constructs a new date picker options object, overriding\r\n * default values with any values specified in opts.\r\n *\r\n * @param {DatePickerOptions} opts\r\n * @returns {DatePickerOptions}\r\n */\r\nexport default function DatePickerOptions(opts) {\r\n opts = opts || {};\r\n opts = cp(defaults(), opts);\r\n var parse = dateOrParse(opts.parse);\r\n opts.lang = cp(english, opts.lang);\r\n opts.parse = parse;\r\n opts.inRange = makeInRangeFn(opts);\r\n opts.min = parse(opts.min || shiftYear(now(), -100));\r\n opts.max = parse(opts.max || shiftYear(now(), 100));\r\n opts.hilightedDate = opts.parse(opts.hilightedDate);\r\n\r\n return opts;\r\n}\r\n\r\nfunction defaults() {\r\n return {\r\n lang: english,\r\n\r\n // Possible values: dp-modal, dp-below, dp-permanent\r\n mode: 'dp-below',\r\n\r\n // The date to hilight initially if the date picker has no\r\n // initial value.\r\n hilightedDate: now(),\r\n\r\n format: function (dt) {\r\n return date.format(dt);\r\n //return (dt.getMonth() + 1) + '/' + dt.getDate() + '/' + dt.getFullYear();\r\n },\r\n\r\n parse: function (str) {\r\n //var date = new Date(str);\r\n var d = date.parse(str);\r\n return !d ? now() : d;\r\n },\r\n\r\n dateClass: function () { },\r\n\r\n inRange: function () {\r\n return true;\r\n },\r\n\r\n appendTo: document.body,\r\n\r\n dayOffset: 1\r\n };\r\n}\r\n\r\nfunction makeInRangeFn(opts) {\r\n var inRange = opts.inRange; // Cache this version, and return a variant\r\n\r\n return function (dt, dp) {\r\n return inRange(dt, dp) && opts.min <= dt && opts.max >= dt;\r\n };\r\n}\r\n","/**\r\n * @file A generic set of mutation-free date functions.\r\n */\r\n\r\n/**\r\n * now returns the current date without any time values\r\n *\r\n * @returns {Date}\r\n */\r\nexport function now() {\r\n var dt = new Date();\r\n dt.setHours(0, 0, 0, 0);\r\n return dt;\r\n}\r\n\r\n/**\r\n * dateEq compares two dates\r\n *\r\n * @param {Date} date1 the first date\r\n * @param {Date} date2 the second date\r\n * @returns {boolean}\r\n */\r\nexport function datesEq(date1, date2) {\r\n return (date1 && date1.toDateString()) === (date2 && date2.toDateString());\r\n}\r\n\r\n/**\r\n * shiftDay shifts the specified date by n days\r\n *\r\n * @param {Date} dt\r\n * @param {number} n\r\n * @returns {Date}\r\n */\r\nexport function shiftDay(dt, n) {\r\n dt = new Date(dt);\r\n dt.setDate(dt.getDate() + n);\r\n return dt;\r\n}\r\n\r\n/**\r\n * shiftMonth shifts the specified date by a specified number of months\r\n *\r\n * @param {Date} dt\r\n * @param {number} n\r\n * @param {boolean} wrap optional, if true, does not change year\r\n * value, defaults to false\r\n * @returns {Date}\r\n */\r\nexport function shiftMonth(dt, n, wrap?: boolean) {\r\n dt = new Date(dt);\r\n\r\n var dayOfMonth = dt.getDate();\r\n var month = dt.getMonth() + n;\r\n\r\n dt.setDate(1);\r\n dt.setMonth(wrap ? (12 + month) % 12 : month);\r\n dt.setDate(dayOfMonth);\r\n\r\n // If dayOfMonth = 31, but the target month only has 30 or 29 or whatever...\r\n // head back to the max of the target month\r\n if (dt.getDate() < dayOfMonth) {\r\n dt.setDate(0);\r\n }\r\n\r\n return dt;\r\n}\r\n\r\n/**\r\n * shiftYear shifts the specified date by n years\r\n *\r\n * @param {Date} dt\r\n * @param {number} n\r\n * @returns {Date}\r\n */\r\nexport function shiftYear(dt, n) {\r\n dt = new Date(dt);\r\n dt.setFullYear(dt.getFullYear() + n);\r\n return dt;\r\n}\r\n\r\n/**\r\n * setYear changes the specified date to the specified year\r\n *\r\n * @param {Date} dt\r\n * @param {number} year\r\n */\r\nexport function setYear(dt, year) {\r\n dt = new Date(dt);\r\n dt.setFullYear(year);\r\n return dt;\r\n}\r\n\r\n/**\r\n * setMonth changes the specified date to the specified month\r\n *\r\n * @param {Date} dt\r\n * @param {number} month\r\n */\r\nexport function setMonth(dt, month) {\r\n return shiftMonth(dt, month - dt.getMonth());\r\n}\r\n\r\n/**\r\n * dateOrParse creates a function which, given a date or string, returns a date\r\n *\r\n * @param {function} parse the function used to parse strings\r\n * @returns {function}\r\n */\r\nexport function dateOrParse(parse) {\r\n return function (dt) {\r\n return dropTime(typeof dt === 'string' ? parse(dt) : dt);\r\n };\r\n}\r\n\r\n/**\r\n * constrainDate returns dt or min/max depending on whether dt is out of bounds (inclusive)\r\n *\r\n * @export\r\n * @param {Date} dt\r\n * @param {Date} min\r\n * @param {Date} max\r\n * @returns {Date}\r\n */\r\nexport function constrainDate(dt, min, max) {\r\n return (dt < min) ? min :\r\n (dt > max) ? max :\r\n dt;\r\n}\r\n\r\nfunction dropTime(dt) {\r\n dt = new Date(dt);\r\n dt.setHours(0, 0, 0, 0);\r\n return dt;\r\n}\r\n","/**\r\n * @file Utility functions for function manipulation.\r\n */\r\n\r\n/**\r\n * bufferFn buffers calls to fn so they only happen every ms milliseconds\r\n *\r\n * @param {number} ms number of milliseconds\r\n * @param {function} fn the function to be buffered\r\n * @returns {function}\r\n */\r\nexport function bufferFn(ms, fn) {\r\n var timeout = undefined;\r\n return function () {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(fn, ms);\r\n };\r\n}\r\n\r\n/**\r\n * noop is a function which does nothing at all.\r\n */\r\nexport function noop() { }\r\n\r\n/**\r\n * copy properties from object o2 to object o1.\r\n *\r\n * @params {Object} o1\r\n * @params {Object} o2\r\n * @returns {Object}\r\n */\r\nexport function cp(...params) {\r\n var args = arguments;\r\n var o1 = args[0];\r\n for (var i = 1; i < args.length; ++i) {\r\n var o2 = args[i] || {};\r\n for (var key in o2) {\r\n o1[key] = o2[key];\r\n }\r\n }\r\n return o1;\r\n}\r\n","/**\r\n * @file Defines the various date picker modes (modal, dropdown, permanent)\r\n */\r\n\r\nimport ModalMode from './modal-mode';\r\nimport DropdownMode from './dropdown-mode';\r\nimport PermanentMode from './permanent-mode';\r\n\r\nexport default function Mode(input, emit, opts) {\r\n input = input && input.tagName ? input : document.querySelector(input);\r\n\r\n if (opts.mode === 'dp-modal') {\r\n return ModalMode(input, emit, opts);\r\n }\r\n\r\n if (opts.mode === 'dp-below') {\r\n return DropdownMode(input, emit, opts);\r\n }\r\n\r\n if (opts.mode === 'dp-permanent') {\r\n return PermanentMode(input, emit, opts);\r\n }\r\n}\r\n","/**\r\n * @file Defines the modal date picker behavior.\r\n */\r\nimport BaseMode from './base-mode';\r\n\r\nexport default function ModalMode(input, emit, opts) {\r\n var dp = BaseMode(input, emit, opts);\r\n\r\n // In modal mode, users really shouldn't be able to type in\r\n // the input, as all input is done via the calendar.\r\n input.readonly = true;\r\n\r\n // In modal mode, we need to know when the user has tabbed\r\n // off the end of the calendar, and set focus to the original\r\n // input. To do this, we add a special element to the DOM.\r\n // When the user tabs off the bottom of the calendar, they\r\n // will tab onto this element.\r\n dp.containerHTML += '<a href=\"#\" class=\"dp-focuser\">.</a>';\r\n\r\n return dp;\r\n}\r\n","/**\r\n * @file Defines the base date picker behavior, overridden by various modes.\r\n */\r\nimport dayPicker from '../views/day-picker';\r\nimport monthPicker from '../views/month-picker';\r\nimport yearPicker from '../views/year-picker';\r\nimport { bufferFn, noop } from '../lib/fns';\r\nimport { on, CustomEvent, Key } from '../lib/dom';\r\nimport { constrainDate } from '../lib/date-manip';\r\n\r\nvar views = {\r\n day: dayPicker,\r\n year: yearPicker,\r\n month: monthPicker\r\n};\r\n\r\nexport default function BaseMode(input, emit, opts) {\r\n var detatchInputEvents; // A function that detaches all events from the input\r\n var closing = false; // A hack to prevent calendar from re-opening when closing.\r\n var selectedDate: Date; // The currently selected date\r\n var dp = {\r\n // The root DOM element for the date picker, initialized on first open.\r\n el: undefined,\r\n opts: opts,\r\n shouldFocusOnBlur: true,\r\n shouldFocusOnRender: true,\r\n state: initialState(),\r\n adjustPosition: noop,\r\n containerHTML: '<div class=\"dp\"></div>',\r\n\r\n attachToDom: function () {\r\n opts.appendTo.appendChild(dp.el);\r\n },\r\n\r\n updateInput: function (selectedDate) {\r\n var e = new CustomEvent('change', { bubbles: true });\r\n e.simulated = true;\r\n input.value = selectedDate ? opts.format(selectedDate) : '';\r\n input.dispatchEvent(e);\r\n },\r\n\r\n computeSelectedDate: function () {\r\n return opts.parse(input.value);\r\n },\r\n\r\n currentView: function () {\r\n return views[dp.state.view];\r\n },\r\n\r\n open: function () {\r\n if (closing) {\r\n return;\r\n }\r\n\r\n if (!dp.el) {\r\n dp.el = createContainerElement(opts, dp.containerHTML);\r\n attachContainerEvents(dp);\r\n }\r\n\r\n selectedDate = constrainDate(dp.computeSelectedDate(), opts.min, opts.max);\r\n dp.state.hilightedDate = selectedDate || opts.hilightedDate;\r\n dp.state.view = 'day';\r\n\r\n dp.attachToDom();\r\n dp.render();\r\n\r\n emit('open');\r\n },\r\n\r\n isVisible: function () {\r\n return !!dp.el && !!dp.el.parentNode;\r\n },\r\n\r\n hasFocus: function () {\r\n var focused = document.activeElement;\r\n return dp.el &&\r\n dp.el.contains(focused) &&\r\n focused.className.indexOf('dp-focuser') < 0;\r\n },\r\n\r\n shouldHide: function () {\r\n return dp.isVisible();\r\n },\r\n\r\n close: function (becauseOfBlur?: boolean) {\r\n var el = dp.el;\r\n\r\n if (!dp.isVisible()) {\r\n return;\r\n }\r\n\r\n if (el) {\r\n var parent = el.parentNode;\r\n parent && parent.removeChild(el);\r\n }\r\n\r\n closing = true;\r\n\r\n if (becauseOfBlur && dp.shouldFocusOnBlur) {\r\n focusInput(input);\r\n }\r\n\r\n // When we close, the input often gains refocus, which\r\n // can then launch the date picker again, so we buffer\r\n // a bit and don't show the date picker within N ms of closing\r\n setTimeout(function () {\r\n closing = false;\r\n }, 100);\r\n\r\n emit('close');\r\n },\r\n\r\n destroy: function () {\r\n dp.close();\r\n detatchInputEvents();\r\n },\r\n\r\n render: function () {\r\n if (!dp.el) {\r\n return;\r\n }\r\n\r\n var hadFocus = dp.hasFocus();\r\n var html = dp.currentView().render(dp);\r\n html && (dp.el.firstChild.innerHTML = html);\r\n\r\n dp.adjustPosition();\r\n\r\n if (hadFocus || dp.shouldFocusOnRender) {\r\n focusCurrent(dp);\r\n }\r\n },\r\n\r\n // Conceptually similar to setState in React, updates\r\n // the view state and re-renders.\r\n setState: function (state) {\r\n for (var key in state) {\r\n dp.state[key] = state[key];\r\n }\r\n\r\n emit('statechange');\r\n dp.render();\r\n },\r\n };\r\n\r\n detatchInputEvents = attachInputEvents(input, dp);\r\n\r\n // Builds the initial view state\r\n // selectedDate is a special case and causes changes to hilightedDate\r\n // hilightedDate is set on open, so remains undefined initially\r\n // view is the current view (day, month, year)\r\n function initialState() {\r\n return {\r\n get selectedDate() {\r\n return selectedDate;\r\n },\r\n set selectedDate(dt) {\r\n if (dt && !opts.inRange(dt)) {\r\n return;\r\n }\r\n\r\n if (dt) {\r\n selectedDate = new Date(dt);\r\n dp.state.hilightedDate = selectedDate;\r\n } else {\r\n selectedDate = dt;\r\n }\r\n\r\n dp.updateInput(selectedDate);\r\n emit('select');\r\n dp.close();\r\n },\r\n view: 'day',\r\n hilightedDate: undefined\r\n };\r\n }\r\n\r\n return dp;\r\n}\r\n\r\nfunction createContainerElement(opts, containerHTML) {\r\n var el = document.createElement('div');\r\n\r\n el.className = opts.mode;\r\n el.innerHTML = containerHTML;\r\n\r\n return el;\r\n}\r\n\r\nfunction attachInputEvents(input, dp) {\r\n var bufferShow = bufferFn(5, function () {\r\n if (dp.shouldHide()) {\r\n dp.close();\r\n } else {\r\n dp.open();\r\n }\r\n });\r\n\r\n var off = [\r\n on('blur', input, bufferFn(150, function () {\r\n if (!dp.hasFocus()) {\r\n dp.close(true);\r\n }\r\n })),\r\n\r\n on('mousedown', input, function () {\r\n if (input === document.activeElement && !dp.isVisible()) {\r\n bufferShow();\r\n }\r\n }),\r\n\r\n on('focus', input, bufferShow),\r\n\r\n on('input', input, function (e) {\r\n try {\r\n var date = dp.opts.parse(e.target.value);\r\n dp.setState({\r\n hilightedDate: date\r\n });\r\n } catch (e) {\r\n //ignore invalid dates while input\r\n }\r\n }),\r\n ];\r\n\r\n // Unregister all events that were registered above.\r\n return function () {\r\n off.forEach(function (f) {\r\n f();\r\n });\r\n };\r\n}\r\n\r\nfunction focusCurrent(dp) {\r\n var current = dp.el.querySelector('.dp-current');\r\n return current && current.focus();\r\n}\r\n\r\nfunction attachContainerEvents(dp) {\r\n var el = dp.el;\r\n var calEl = el.querySelector('.dp');\r\n\r\n // Hack to get iOS to show active CSS states\r\n el.ontouchstart = noop;\r\n\r\n function onClick(e) {\r\n e.target.className.split(' ').forEach(function (evt) {\r\n var handler = dp.currentView().onClick[evt];\r\n handler && handler(e, dp);\r\n });\r\n }\r\n\r\n // The calender fires a blur event *every* time we redraw\r\n // this means we need to buffer the blur event to see if\r\n // it still has no focus after redrawing, and only then\r\n // do we return focus to the input. A possible other approach\r\n // would be to set context.redrawing = true on redraw and\r\n // set it to false in the blur event.\r\n on('blur', calEl, bufferFn(150, function () {\r\n if (!dp.hasFocus()) {\r\n dp.close(true);\r\n }\r\n }));\r\n\r\n on('keydown', el, function (e) {\r\n if (e.keyCode === Key.enter) {\r\n onClick(e);\r\n } else {\r\n dp.currentView().onKeyDown(e, dp);\r\n }\r\n });\r\n\r\n // If the user clicks in non-focusable space, but\r\n // still within the date picker, we don't want to\r\n // hide, so we need to hack some things...\r\n on('mousedown', calEl, function (e) {\r\n e.target.focus && e.target.focus(); // IE hack\r\n if (document.activeElement !== e.target) {\r\n e.preventDefault();\r\n focusCurrent(dp);\r\n }\r\n });\r\n\r\n on('click', el, onClick);\r\n}\r\n\r\nfunction focusInput(input) {\r\n // When the modal closes, we need to focus the original input so the\r\n // user can continue tabbing from where they left off.\r\n input.focus();\r\n\r\n // iOS zonks out if we don't blur the input, so...\r\n if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !(<any>window).MSStream) {\r\n input.blur();\r\n }\r\n}\r\n","/**\r\n * @file Manages the calendar / day-picker view.\r\n */\r\n\r\nimport {Key} from '../lib/dom';\r\nimport {now, datesEq, shiftMonth, shiftDay} from '../lib/date-manip';\r\n\r\nexport default {\r\n onKeyDown: keyDown,\r\n onClick: {\r\n 'dp-day': selectDay,\r\n 'dp-next': gotoNextMonth,\r\n 'dp-prev': gotoPrevMonth,\r\n 'dp-today': selectToday,\r\n 'dp-clear': clear,\r\n 'dp-close': close,\r\n 'dp-cal-month': showMonthPicker,\r\n 'dp-cal-year': showYearPicker,\r\n },\r\n render: render\r\n};\r\n\r\n/**\r\n * view renders the calendar (day picker) as an HTML string.\r\n *\r\n * @param {DatePickerContext} context the date picker being rendered\r\n * @returns {string}\r\n */\r\nfunction render(dp) {\r\n var opts = dp.opts;\r\n var lang = opts.lang;\r\n var state = dp.state;\r\n var dayNames = lang.days;\r\n var dayOffset = opts.dayOffset || 0;\r\n var selectedDate = state.selectedDate;\r\n var hilightedDate = state.hilightedDate;\r\n var hilightedMonth = hilightedDate.getMonth();\r\n var today = now().getTime();\r\n\r\n return (\r\n '<div class=\"dp-cal\">' +\r\n '<header class=\"dp-cal-header\">' +\r\n '<button tabindex=\"-1\" type=\"button\" class=\"dp-prev\">Prev</button>' +\r\n '<button tabindex=\"-1\" type=\"button\" class=\"dp-cal-month\">' +\r\n lang.months[hilightedMonth] +\r\n '</button>' +\r\n '<button tabindex=\"-1\" type=\"button\" class=\"dp-cal-year\">' +\r\n hilightedDate.getFullYear() +\r\n '</button>' +\r\n '<button tabindex=\"-1\" type=\"button\" class=\"dp-next\">Next</button>' +\r\n '</header>' +\r\n '<div class=\"dp-days\">' +\r\n dayNames.map(function (name, i) {\r\n return (\r\n '<span class=\"dp-col-header\">' + dayNames[(i + dayOffset) % dayNames.length] + '</span>'\r\n );\r\n }).join('') +\r\n mapDays(hilightedDate, dayOffset, function (date) {\r\n var isNotInMonth = date.getMonth() !== hilightedMonth;\r\n var isDisabled = !opts.inRange(date);\r\n var isToday = date.getTime() === today;\r\n var className = 'dp-day';\r\n className += (isNotInMonth ? ' dp-edge-day' : '');\r\n className += (datesEq(date, hilightedDate) ? ' dp-current' : '');\r\n className += (datesEq(date, selectedDate) ? ' dp-selected' : '');\r\n className += (isDisabled ? ' dp-day-disabled' : '');\r\n className += (isToday ? ' dp-day-today' : '');\r\n className += ' ' + opts.dateClass(date, dp);\r\n\r\n return (\r\n '<button tabindex=\"-1\" type=\"button\" class=\"' + className + '\" data-date=\"' + date.getTime() + '\">' +\r\n date.getDate() +\r\n '</button>'\r\n );\r\n }) +\r\n '</div>' +\r\n '<footer class=\"dp-cal-footer\">' +\r\n '<button tabindex=\"-1\" type=\"button\" class=\"dp-today\">' + lang.today + '</button>' +\r\n '<button tabindex=\"-1\" type=\"button\" class=\"dp-clear\">' + lang.clear + '</button>' +\r\n '<button tabindex=\"-1\" type=\"button\" class=\"dp-close\">' + lang.close + '</button>' +\r\n '</footer>' +\r\n '</div>'\r\n );\r\n}\r\n\r\n/**\r\n * keyDown handles the key down event for the day-picker\r\n *\r\n * @param {Event} e\r\n * @param {DatePickerContext} dp\r\n */\r\nfunction keyDown(e, dp) {\r\n var key = e.keyCode;\r\n var shiftBy =\r\n (key === Key.left) ? -1 :\r\n (key === Key.right) ? 1 :\r\n (key === Key.up) ? -7 :\r\n (key === Key.down) ? 7 :\r\n 0;\r\n\r\n if (key === Key.esc) {\r\n dp.close();\r\n } else if (shiftBy) {\r\n e.preventDefault();\r\n dp.setState({\r\n hilightedDate: shiftDay(dp.state.hilightedDate, shiftBy)\r\n });\r\n }\r\n}\r\n\r\nfunction selectToday(e, dp) {\r\n dp.setState({\r\n selectedDate: now(),\r\n });\r\n}\r\n\r\nfunction clear(e, dp) {\r\n dp.setState({\r\n selectedDate: null,\r\n });\r\n}\r\n\r\nfunction close(e, dp) {\r\n dp.close();\r\n}\r\n\r\nfunction showMonthPicker(e, dp) {\r\n dp.setState({\r\n view: 'month'\r\n });\r\n}\r\n\r\nfunction showYearPicker(e, dp) {\r\n dp.setState({\r\n view: 'year'\r\n });\r\n}\r\n\r\nfunction gotoNextMonth(e, dp) {\r\n var hilightedDate = dp.state.hilightedDate;\r\n dp.setState({\r\n hilightedDate: shiftMonth(hilightedDate, 1)\r\n });\r\n}\r\n\r\nfunction gotoPrevMonth(e, dp) {\r\n var hilightedDate = dp.state.hilightedDate;\r\n dp.setState({\r\n hilightedDate: shiftMonth(hilightedDate, -1)\r\n });\r\n}\r\n\r\nfunction selectDay(e, dp) {\r\n dp.setState({\r\n selectedDate: new Date(parseInt(e.target.getAttribute('data-date'))),\r\n });\r\n}\r\n\r\nfunction mapDays(currentDate, dayOffset, fn) {\r\n var result = '';\r\n var iter = new Date(currentDate);\r\n iter.setDate(1);\r\n iter.setDate(1 - iter.getDay() + dayOffset);\r\n\r\n // If we are showing monday as the 1st of the week,\r\n // and the monday is the 2nd of the month, the sunday won't\r\n // show, so we need to shift backwards\r\n if (dayOffset && iter.getDate() === dayOffset + 1) {\r\n iter.setDate(dayOffset - 6);\r\n }\r\n\r\n // We are going to have 6 weeks always displayed to keep a consistent\r\n // calendar size\r\n for (var day = 0; day < (6 * 7); ++day) {\r\n result += fn(iter);\r\n iter.setDate(iter.getDate() + 1);\r\n }\r\n\r\n return result;\r\n}\r\n","import \"../../../core/polyfills\";\r\n\r\n/**\r\n * @file Helper functions for dealing with dom elements.\r\n */\r\n\r\nexport var Key = {\r\n left: 37,\r\n up: 38,\r\n right: 39,\r\n down: 40,\r\n enter: 13,\r\n esc: 27,\r\n};\r\n\r\n/**\r\n * on attaches an event handler to the specified element, and returns an\r\n * off function which can be used to remove the handler.\r\n *\r\n * @param {string} evt the name of the event to handle\r\n * @param {HTMLElement} el the element to attach to\r\n * @param {function} handler the event handler\r\n * @returns {function} the off function\r\n */\r\nexport function on(evt, el, handler) {\r\n el.addEventListener(evt, handler, true);\r\n\r\n return function () {\r\n el.removeEventListener(evt, handler, true);\r\n };\r\n}\r\n\r\nexport var CustomEvent = (window as any).CustomEvent;","/**\r\n * @file Manages the month-picker view.\r\n */\r\n\r\nimport {Key} from '../lib/dom';\r\nimport {shiftMonth, setMonth} from '../lib/date-manip';\r\n\r\nexport default {\r\n onKeyDown: keyDown,\r\n onClick: {\r\n 'dp-month': onChooseMonth\r\n },\r\n render: render\r\n};\r\n\r\nfunction onChooseMonth(e, dp) {\r\n dp.setState({\r\n hilightedDate: setMonth(dp.state.hilightedDate, parseInt(e.target.getAttribute('data-month'))),\r\n view: 'day',\r\n });\r\n}\r\n\r\n/**\r\n * render renders the month picker as an HTML string\r\n *\r\n * @param {DatePickerContext} dp the date picker context\r\n * @returns {string}\r\n */\r\nfunction render(dp) {\r\n var opts = dp.opts;\r\n var lang = opts.lang;\r\n var months = lang.months;\r\n var currentDate = dp.state.hilightedDate;\r\n var currentMonth = currentDate.getMonth();\r\n\r\n return (\r\n '<div class=\"dp-months\">' +\r\n months.map(function (month, i) {\r\n var className = 'dp-month';\r\n className += (currentMonth === i ? ' dp-current' : '');\r\n\r\n return (\r\n '<button tabindex=\"-1\" type=\"button\" class=\"' + className + '\" data-month=\"' + i + '\">' +\r\n month +\r\n '</button>'\r\n );\r\n }).join('') +\r\n '</div>'\r\n );\r\n}\r\n\r\n/**\r\n * keyDown handles keydown events that occur in the month picker\r\n *\r\n * @param {Event} e\r\n* @param {DatePickerContext} dp\r\n */\r\nfunction keyDown(e, dp) {\r\n var key = e.keyCode;\r\n var shiftBy =\r\n (key === Key.left) ? -1 :\r\n (key === Key.right) ? 1 :\r\n (key === Key.up) ? -3 :\r\n (key === Key.down) ? 3 :\r\n 0;\r\n\r\n if (key === Key.esc) {\r\n dp.setState({\r\n view: 'day',\r\n });\r\n } else if (shiftBy) {\r\n e.preventDefault();\r\n dp.setState({\r\n hilightedDate: shiftMonth(dp.state.hilightedDate, shiftBy, true)\r\n });\r\n }\r\n}\r\n","/**\r\n * @file Manages the year-picker view.\r\n */\r\n\r\nimport {Key} from '../lib/dom';\r\nimport {setYear, shiftYear, constrainDate} from '../lib/date-manip';\r\n\r\nexport default {\r\n render: render,\r\n onKeyDown: keyDown,\r\n onClick: {\r\n 'dp-year': onChooseYear\r\n },\r\n};\r\n\r\n/**\r\n * view renders the year picker as an HTML string.\r\n *\r\n * @param {DatePickerContext} dp the date picker context\r\n * @returns {string}\r\n */\r\nfunction render(dp) {\r\n var state = dp.state;\r\n var currentYear = state.hilightedDate.getFullYear();\r\n var selectedYear = state.selectedDate.getFullYear();\r\n\r\n return (\r\n '<div class=\"dp-years\">' +\r\n mapYears(dp, function (year) {\r\n var className = 'dp-year';\r\n className += (year === currentYear ? ' dp-current' : '');\r\n className += (year === selectedYear ? ' dp-selected' : '');\r\n\r\n return (\r\n '<button tabindex=\"-1\" type=\"button\" class=\"' + className + '\" data-year=\"' + year + '\">' +\r\n year +\r\n '</button>'\r\n );\r\n }) +\r\n '</div>'\r\n );\r\n}\r\n\r\nfunction onChooseYear(e, dp) {\r\n dp.setState({\r\n hilightedDate: setYear(dp.state.hilightedDate, parseInt(e.target.getAttribute('data-year'))),\r\n view: 'day',\r\n });\r\n}\r\n\r\nfunction keyDown(e, dp) {\r\n var key = e.keyCode;\r\n var opts = dp.opts;\r\n var shiftBy =\r\n (key === Key.left || key === Key.up) ? 1 :\r\n (key === Key.right || key === Key.down) ? -1 :\r\n 0;\r\n\r\n if (key === Key.esc) {\r\n dp.setState({\r\n view: 'day',\r\n });\r\n } else if (shiftBy) {\r\n e.preventDefault();\r\n var shiftedYear = shiftYear(dp.state.hilightedDate, shiftBy);\r\n\r\n dp.setState({\r\n hilightedDate: constrainDate(shiftedYear, opts.min, opts.max),\r\n });\r\n }\r\n}\r\n\r\nfunction mapYears(dp, fn) {\r\n var result = '';\r\n var max = dp.opts.max.getFullYear();\r\n\r\n for (var i = max; i >= dp.opts.min.getFullYear(); --i) {\r\n result += fn(i);\r\n }\r\n\r\n return result;\r\n}\r\n","/**\r\n * @file Defines the dropdown date picker behavior.\r\n */\r\n\r\nimport BaseMode from './base-mode';\r\n\r\nexport default function DropdownMode(input, emit, opts) {\r\n var dp = BaseMode(input, emit, opts);\r\n\r\n dp.shouldFocusOnBlur = false;\r\n\r\n Object.defineProperty(dp, 'shouldFocusOnRender', {\r\n get: function() {\r\n return input !== document.activeElement;\r\n }\r\n });\r\n\r\n dp.adjustPosition = function () {\r\n autoPosition(input, dp);\r\n };\r\n\r\n return dp;\r\n}\r\n\r\nfunction autoPosition(input, dp) {\r\n var inputPos = input.getBoundingClientRect();\r\n var win = window;\r\n\r\n adjustCalY(dp, inputPos, win);\r\n adjustCalX(dp, inputPos, win);\r\n\r\n dp.el.style.visibility = '';\r\n}\r\n\r\nfunction adjustCalX(dp, inputPos, win) {\r\n var cal = dp.el;\r\n var scrollLeft = win.pageXOffset;\r\n var inputLeft = inputPos.left + scrollLeft;\r\n var maxRight = win.innerWidth + scrollLeft;\r\n var offsetWidth = cal.offsetWidth;\r\n var calRight = inputLeft + offsetWidth;\r\n var shiftedLeft = maxRight - offsetWidth;\r\n var left = calRight > maxRight && shiftedLeft > 0 ? shiftedLeft : inputLeft;\r\n\r\n cal.style.left = left + 'px';\r\n}\r\n\r\nfunction adjustCalY(dp, inputPos, win) {\r\n var cal = dp.el;\r\n var scrollTop = win.pageYOffset;\r\n var inputTop = scrollTop + inputPos.top;\r\n var calHeight = cal.offsetHeight;\r\n var belowTop = inputTop + inputPos.height + 8;\r\n var aboveTop = inputTop - calHeight - 8;\r\n var isAbove = (aboveTop > 0 && belowTop + calHeight > scrollTop + win.innerHeight);\r\n var top = isAbove ? aboveTop : belowTop;\r\n\r\n if (cal.classList) {\r\n cal.classList.toggle('dp-is-above', isAbove);\r\n cal.classList.toggle('dp-is-below', !isAbove);\r\n }\r\n cal.style.top = top + 'px';\r\n}\r\n","/**\r\n * @file Defines the permanent date picker behavior.\r\n */\r\nimport {noop} from '../lib/fns';\r\nimport BaseMode from './base-mode';\r\n\r\nexport default function PermanentMode(root, emit, opts) {\r\n var dp = BaseMode(root, emit, opts);\r\n\r\n dp.close = noop;\r\n dp.updateInput = noop;\r\n dp.shouldFocusOnRender = opts.shouldFocusOnRender;\r\n\r\n dp.computeSelectedDate = function () {\r\n return opts.hilightedDate;\r\n };\r\n\r\n dp.attachToDom = function () {\r\n root.appendChild(dp.el);\r\n };\r\n\r\n dp.open();\r\n\r\n return dp;\r\n}\r\n","/**\r\n * @file Defines simple event emitter behavior.\r\n */\r\n\r\n/**\r\n * Emitter constructs a new emitter object which has on/off methods.\r\n *\r\n * @returns {EventEmitter}\r\n */\r\nexport default function Emitter() {\r\n var handlers = {};\r\n\r\n function onOne(name, handler) {\r\n (handlers[name] = (handlers[name] || [])).push(handler);\r\n }\r\n\r\n function onMany(fns) {\r\n for (var name in fns) {\r\n onOne(name, fns[name]);\r\n }\r\n }\r\n\r\n return {\r\n on: function (name, handler) {\r\n if (handler) {\r\n onOne(name, handler);\r\n } else {\r\n onMany(name);\r\n }\r\n\r\n return this;\r\n },\r\n\r\n emit: function (name, arg) {\r\n (handlers[name] || []).forEach(function (handler) {\r\n handler(name, arg);\r\n });\r\n },\r\n\r\n off: function (name, handler) {\r\n if (!name) {\r\n handlers = {};\r\n } else if (!handler) {\r\n handlers[name] = [];\r\n } else {\r\n handlers[name] = (handlers[name] || []).filter(function (h) {\r\n return h !== handler;\r\n });\r\n }\r\n\r\n return this;\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","/*!\r\n * Selectr 2.4.12\r\n * http://mobius.ovh/docs/selectr\r\n *\r\n * Released under the MIT license\r\n */\r\n\r\nimport \"./drop.down.css\";\r\nimport { UILang } from \"../core/lang\";\r\n\r\nlet Selectr;\r\n\r\nexport interface IDropDown {\r\n setValue: (value: string | string[]) => void;\r\n getValue: (toObject?: boolean, toJson?: boolean) => string | string[];\r\n // search\r\n add: (data: { value: string, text: string } | Array<{ value: string, text: string }>, skipDuplicate?: boolean) => void;\r\n remove: (element: number | string | any[]) => void;\r\n removeAll: () => void;\r\n serialize: (toJson?: boolean) => any;\r\n open: () => void;\r\n close: () => void;\r\n toggle: () => void;\r\n clear: () => void;\r\n // reset\r\n disable: (submitValue?: boolean) => void;\r\n enable: () => void;\r\n destroy: () => void;\r\n}\r\n\r\n\r\n\r\n(function () {\r\n\r\n /**\r\n * Event Emitter\r\n */\r\n var Events = function () { };\r\n\r\n /**\r\n * Event Prototype\r\n * @type {Object}\r\n */\r\n Events.prototype = {\r\n /**\r\n * Add custom event listener\r\n * @param {String} event Event type\r\n * @param {Function} func Callback\r\n * @return {Void}\r\n */\r\n on: function (event, func) {\r\n this._events = this._events || {};\r\n this._events[event] = this._events[event] || [];\r\n this._events[event].push(func);\r\n },\r\n\r\n /**\r\n * Remove custom event listener\r\n * @param {String} event Event type\r\n * @param {Function} func Callback\r\n * @return {Void}\r\n */\r\n off: function (event, func) {\r\n this._events = this._events || {};\r\n if (event in this._events === false) return;\r\n this._events[event].splice(this._events[event].indexOf(func), 1);\r\n },\r\n\r\n /**\r\n * Fire a custom event\r\n * @param {String} event Event type\r\n * @return {Void}\r\n */\r\n emit: function (event /* , args... */) {\r\n this._events = this._events || {};\r\n if (event in this._events === false) return;\r\n for (var i = 0; i < this._events[event].length; i++) {\r\n this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Event mixin\r\n * @param {Object} obj\r\n * @return {Object}\r\n */\r\n (<any>Events).mixin = function (obj) {\r\n var props = ['on', 'off', 'emit'];\r\n for (var i = 0; i < props.length; i++) {\r\n if (typeof obj === 'function') {\r\n obj.prototype[props[i]] = Events.prototype[props[i]];\r\n } else {\r\n obj[props[i]] = Events.prototype[props[i]];\r\n }\r\n }\r\n return obj;\r\n };\r\n\r\n /**\r\n * Helpers\r\n * @type {Object}\r\n */\r\n var util = {\r\n escapeRegExp: function (str) {\r\n // source from lodash 3.0.0\r\n var _reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\r\n var _reHasRegExpChar = new RegExp(_reRegExpChar.source);\r\n return (str && _reHasRegExpChar.test(str)) ? str.replace(_reRegExpChar, '\\\\$&') : str;\r\n },\r\n extend: function (src, props) {\r\n for (var prop in props) {\r\n if (props.hasOwnProperty(prop)) {\r\n var val = props[prop];\r\n if (val && Object.prototype.toString.call(val) === \"[object Object]\") {\r\n src[prop] = src[prop] || {};\r\n util.extend(src[prop], val);\r\n } else {\r\n src[prop] = val;\r\n }\r\n }\r\n }\r\n return src;\r\n },\r\n each: function (a, b, c?) {\r\n if (\"[object Object]\" === Object.prototype.toString.call(a)) {\r\n for (var d in a) {\r\n if (Object.prototype.hasOwnProperty.call(a, d)) {\r\n b.call(c, d, a[d], a);\r\n }\r\n }\r\n } else {\r\n for (var e = 0, f = a.length; e < f; e++) {\r\n b.call(c, e, a[e], a);\r\n }\r\n }\r\n },\r\n createElement: function (e, a) {\r\n var d = document,\r\n el = d.createElement(e);\r\n if (a && \"[object Object]\" === Object.prototype.toString.call(a)) {\r\n var i;\r\n for (i in a) {\r\n if (a[i] !== undefined) {\r\n if (i in el) el[i] = a[i];\r\n else if (\"html\" === i) el.innerHTML = a[i];\r\n else el.setAttribute(i, a[i]);\r\n }\r\n }\r\n }\r\n return el;\r\n },\r\n hasClass: function (a, b) {\r\n if (a) {\r\n // if (a.classList == null) {\r\n // debugger;\r\n // }\r\n return a.classList ? a.classList.contains(b) : !!a.className && !!a.className.match(new RegExp(\"(\\\\s|^)\" + b + \"(\\\\s|$)\"));\r\n }\r\n },\r\n addClass: function (a, b) {\r\n if (!util.hasClass(a, b)) {\r\n if (a.classList) {\r\n a.classList.add(b);\r\n } else {\r\n a.className = a.className.trim() + \" \" + b;\r\n }\r\n }\r\n },\r\n removeClass: function (a, b) {\r\n if (util.hasClass(a, b)) {\r\n if (a.classList) {\r\n a.classList.remove(b);\r\n } else {\r\n a.className = a.className.replace(new RegExp(\"(^|\\\\s)\" + b.split(\" \").join(\"|\") + \"(\\\\s|$)\", \"gi\"), \" \");\r\n }\r\n }\r\n },\r\n closest: function (el, fn) {\r\n return el && el !== document.body && (fn(el) ? el : util.closest(el.parentNode, fn));\r\n },\r\n isInt: function (val) {\r\n return typeof val === 'number' && isFinite(val) && Math.floor(val) === val;\r\n },\r\n debounce: function (a, b, c?) {\r\n var d;\r\n return function () {\r\n var e = this,\r\n f = arguments,\r\n g = function () {\r\n d = null;\r\n if (!c) a.apply(e, f);\r\n },\r\n h = c && !d;\r\n clearTimeout(d);\r\n d = setTimeout(g, b);\r\n if (h) {\r\n a.apply(e, f);\r\n }\r\n };\r\n },\r\n rect: function (el, abs?) {\r\n var w = window;\r\n var r = el.getBoundingClientRect();\r\n var x = abs ? w.pageXOffset : 0;\r\n var y = abs ? w.pageYOffset : 0;\r\n\r\n return {\r\n bottom: r.bottom + y,\r\n height: r.height,\r\n left: r.left + x,\r\n right: r.right + x,\r\n top: r.top + y,\r\n width: r.width\r\n };\r\n },\r\n includes: function (a, b) {\r\n return a.indexOf(b) > -1;\r\n },\r\n startsWith: function (a, b) {\r\n return a.substr(0, b.length) === b;\r\n },\r\n truncate: function (el) {\r\n while (el.firstChild) {\r\n el.removeChild(el.firstChild);\r\n }\r\n },\r\n toDom: function (item) {\r\n var elementData = {\r\n class: \"jsl-option\",\r\n role: \"treeitem\",\r\n \"aria-selected\": false,\r\n html: item.html,\r\n textContent: item.html ? undefined : item.text\r\n };\r\n var opt = util.createElement(\"li\", elementData);\r\n opt.idx = item.idx;\r\n if (item.disabled) {\r\n opt.disabled = true;\r\n util.addClass(opt, \"disabled\");\r\n }\r\n if (item.active) {\r\n util.addClass(opt, \"active\");\r\n }\r\n if (item.selected) {\r\n util.addClass(opt, \"selected\");\r\n opt.selected = true;\r\n }\r\n return opt;\r\n }\r\n };\r\n\r\n\r\n function isset(obj, prop) {\r\n return obj.hasOwnProperty(prop) && (obj[prop] === true || obj[prop].length);\r\n }\r\n\r\n /**\r\n * Append an item to the list\r\n * @param {Object} item\r\n * @param {Object} custom\r\n * @return {Void}\r\n */\r\n function appendItem(vitem, parent, custom) {\r\n var item = vitem.dom = util.toDom(vitem);\r\n if (vitem.optgroup && vitem.optgroup.parentNode == null) {\r\n parent.appendChild(vitem.optgroup);\r\n }\r\n parent.appendChild(item);\r\n // if (item.parentNode) {\r\n // if (!item.parentNode.parentNode) {\r\n // parent.appendChild(item.parentNode);\r\n // }\r\n // } else \r\n // {\r\n // parent.appendChild(item);\r\n // }\r\n\r\n // util.removeClass(item, \"excluded\");\r\n if (!custom) {\r\n // remove any <span> highlighting, without xss\r\n item.textContent = item.textContent;\r\n }\r\n }\r\n\r\n /**\r\n * Render the item list\r\n * @return {Void}\r\n */\r\n var render = function () {\r\n if (this.items.length) {\r\n var f = document.createDocumentFragment();\r\n\r\n if (this.config.pagination) {\r\n var pages = this.pages.slice(0, this.pageIndex);\r\n\r\n util.each(pages, function (i, items) {\r\n util.each(items, function (j, item) {\r\n appendItem(item, f, this.customOption);\r\n }, this);\r\n }, this);\r\n } else {\r\n util.each(this.items, function (i, item) {\r\n appendItem(item, f, this.customOption);\r\n }, this);\r\n }\r\n\r\n // highlight first selected option if any; first option otherwise\r\n if (f.childElementCount || f.childNodes.length) {\r\n removeActive(this.tree);\r\n this.navIndex = (<any>(\r\n f.querySelector(\".jsl-option.selected\") ||\r\n f.querySelector(\".jsl-option\")\r\n )).idx;\r\n if (!this.config.multiple) {\r\n util.addClass(this.items[this.navIndex].dom, \"active\");\r\n this.items[this.navIndex].active = true;\r\n }\r\n }\r\n\r\n this.tree.appendChild(f);\r\n }\r\n };\r\n\r\n /**\r\n * Dismiss / close the dropdown\r\n * @param {obj} e\r\n * @return {void}\r\n */\r\n var dismiss = function (e) {\r\n var target = e.target;\r\n if (!this.container.contains(target) && (this.opened || util.hasClass(this.container, \"notice\"))) {\r\n this.close();\r\n }\r\n };\r\n\r\n /**\r\n * Build a list item from the HTMLOptionElement\r\n * @param {int} i HTMLOptionElement index\r\n * @param {HTMLOptionElement} option\r\n * @param {bool} group Has parent optgroup\r\n * @return {void}\r\n */\r\n var createItem = function (option, data) {\r\n data = data || option;\r\n var elementData = {\r\n class: \"jsl-option\",\r\n role: \"treeitem\",\r\n \"aria-selected\": option.selected,\r\n html: undefined,\r\n textContent: undefined\r\n };\r\n\r\n if (this.customOption) {\r\n elementData.html = this.config.renderOption(data); // asume xss prevention in custom render function\r\n } else {\r\n elementData.textContent = option.textContent; // treat all as plain text\r\n }\r\n // var opt = util.createElement(\"li\",elementData);\r\n var opt = { idx: 0, disabled: option.disabled, html: elementData.html, text: elementData.textContent, parent: null, selected: option.selected };\r\n\r\n opt.idx = option.idx;\r\n opt.parent = option.parent;\r\n\r\n this.items.push(opt);\r\n\r\n if (option.defaultSelected) {\r\n this.defaultSelected.push(option.idx);\r\n }\r\n\r\n // if (option.disabled) {\r\n // opt.disabled = true;\r\n // // util.addClass(opt, \"disabled\");\r\n // }\r\n // if (option.selected) {\r\n // opt.selected = true;\r\n // // util.addClass(opt, \"selected\");\r\n // }\r\n\r\n return opt;\r\n };\r\n\r\n var removeActive = function (container) {\r\n var items = container.querySelectorAll(\"li.active\");\r\n for (let i = 0; i < items.length; i++) {\r\n items[i].classList.remove(\"active\");\r\n }\r\n }\r\n\r\n /**\r\n * Build the container\r\n * @return {Void}\r\n */\r\n var build = function () {\r\n\r\n this.requiresPagination = this.config.pagination && this.config.pagination > 0;\r\n\r\n // Set width\r\n if (isset(this.config, \"width\")) {\r\n if (util.isInt(this.config.width)) {\r\n this.width = this.config.width + \"px\";\r\n } else {\r\n if (this.config.width === \"auto\") {\r\n this.width = \"100%\";\r\n } else { // if (util.includes(this.config.width, \"%\")) {\r\n this.width = this.config.width;\r\n }\r\n }\r\n }\r\n\r\n this.container = util.createElement(\"div\", {\r\n class: \"jsl-container\"\r\n });\r\n\r\n // Custom className\r\n if (this.config.customClass) {\r\n util.addClass(this.container, this.config.customClass);\r\n }\r\n\r\n // Mobile device\r\n if (this.mobileDevice) {\r\n util.addClass(this.container, \"jsl-mobile\");\r\n } else {\r\n util.addClass(this.container, \"jsl-desktop\");\r\n }\r\n\r\n // Hide the HTMLSelectElement and prevent focus\r\n this.el.tabIndex = -1;\r\n\r\n // Native dropdown\r\n if (this.config.nativeDropdown || this.mobileDevice) {\r\n util.addClass(this.el, \"jsl-visible\");\r\n } else {\r\n util.addClass(this.el, \"jsl-hidden\");\r\n }\r\n\r\n this.selected = util.createElement(\"div\", {\r\n class: \"jsl-selected\",\r\n disabled: this.disabled,\r\n tabIndex: 0,\r\n \"aria-expanded\": false\r\n });\r\n\r\n this.label = util.createElement(this.el.multiple ? \"ul\" : \"span\", {\r\n class: \"jsl-label\"\r\n });\r\n\r\n var dropdown = util.createElement(\"div\", {\r\n class: \"jsl-options-container\"\r\n });\r\n\r\n this.tree = util.createElement(\"ul\", {\r\n class: \"jsl-options\",\r\n role: \"tree\",\r\n \"aria-hidden\": true,\r\n \"aria-expanded\": false\r\n });\r\n\r\n this.notice = util.createElement(\"div\", {\r\n class: \"jsl-notice\"\r\n });\r\n\r\n this.el.setAttribute(\"aria-hidden\", true);\r\n\r\n if (this.disabled) {\r\n this.el.disabled = true;\r\n }\r\n\r\n if (this.el.multiple) {\r\n util.addClass(this.label, \"jsl-tags\");\r\n util.addClass(this.container, \"multiple\");\r\n\r\n // Collection of tags\r\n this.tags = [];\r\n\r\n // Collection of selected values\r\n // #93 defaultSelected = false did not work as expected\r\n this.selectedValues = (this.config.defaultSelected) ? this.getSelectedProperties('value') : [];\r\n\r\n // Collection of selected indexes\r\n this.selectedIndexes = this.getSelectedProperties('idx');\r\n } else {\r\n // #93 defaultSelected = false did not work as expected\r\n // these values were undefined\r\n this.selectedValue = null;\r\n this.selectedIndex = -1;\r\n }\r\n\r\n this.selected.appendChild(this.label);\r\n\r\n if (this.config.clearable) {\r\n this.selectClear = util.createElement(\"button\", {\r\n class: \"jsl-clear\",\r\n type: \"button\"\r\n });\r\n\r\n this.container.appendChild(this.selectClear);\r\n\r\n util.addClass(this.container, \"clearable\");\r\n }\r\n\r\n if (this.config.taggable) {\r\n var li = util.createElement('li', {\r\n class: 'input-tag'\r\n });\r\n this.input = util.createElement(\"input\", {\r\n class: \"jsl-tag-input\",\r\n placeholder: this.config.tagPlaceholder,\r\n tagIndex: 0,\r\n autocomplete: \"off\",\r\n autocorrect: \"off\",\r\n autocapitalize: \"off\",\r\n spellcheck: \"false\",\r\n role: \"textbox\",\r\n type: \"search\"\r\n });\r\n\r\n li.appendChild(this.input);\r\n this.label.appendChild(li);\r\n util.addClass(this.container, \"taggable\");\r\n\r\n this.tagSeperators = [\",\"];\r\n if (this.config.tagSeperators) {\r\n this.tagSeperators = this.tagSeperators.concat(this.config.tagSeperators);\r\n var _aTempEscapedSeperators = [];\r\n for (var _nTagSeperatorStepCount = 0; _nTagSeperatorStepCount < this.tagSeperators.length; _nTagSeperatorStepCount++) {\r\n _aTempEscapedSeperators.push(util.escapeRegExp(this.tagSeperators[_nTagSeperatorStepCount]));\r\n }\r\n this.tagSeperatorsRegex = new RegExp(_aTempEscapedSeperators.join('|'), 'i');\r\n } else {\r\n this.tagSeperatorsRegex = new RegExp(',', 'i');\r\n }\r\n }\r\n\r\n if (this.config.searchable) {\r\n this.input = util.createElement(\"input\", {\r\n class: \"jsl-input\",\r\n tagIndex: -1,\r\n autocomplete: \"off\",\r\n autocorrect: \"off\",\r\n autocapitalize: \"off\",\r\n spellcheck: \"false\",\r\n role: \"textbox\",\r\n // type: \"search\",\r\n type: \"text\",\r\n placeholder: this.config.messages.searchPlaceholder\r\n });\r\n this.inputClear = util.createElement(\"button\", {\r\n class: \"jsl-input-clear\",\r\n type: \"button\"\r\n });\r\n this.inputContainer = util.createElement(\"div\", {\r\n class: \"jsl-input-container\"\r\n });\r\n\r\n this.inputContainer.appendChild(this.input);\r\n this.inputContainer.appendChild(this.inputClear);\r\n dropdown.appendChild(this.inputContainer);\r\n }\r\n\r\n dropdown.appendChild(this.notice);\r\n dropdown.appendChild(this.tree);\r\n\r\n // List of items for the dropdown\r\n this.items = [];\r\n\r\n // Establish options\r\n this.options = [];\r\n\r\n // Check for options in the element\r\n if (this.el.options.length) {\r\n this.options = [].slice.call(this.el.options);\r\n }\r\n\r\n // Element may have optgroups so\r\n // iterate element.children instead of element.options\r\n var group: any = false,\r\n j = 0;\r\n if (this.el.children.length) {\r\n util.each(this.el.children, function (i, element) {\r\n if (element.nodeName === \"OPTGROUP\") {\r\n\r\n group = util.createElement(\"ul\", {\r\n class: \"jsl-optgroup\",\r\n role: \"group\",\r\n html: \"<li class='jsl-optgroup--label'>\" + element.label + \"</li>\"\r\n });\r\n\r\n util.each(element.children, function (x, el) {\r\n el.idx = j;\r\n var itm = createItem.call(this, el, group);\r\n itm.optgroup = group;\r\n // group.appendChild(util.toDom(itm));\r\n j++;\r\n }, this);\r\n } else {\r\n element.idx = j;\r\n createItem.call(this, element);\r\n j++;\r\n }\r\n }, this);\r\n }\r\n\r\n // Options defined by the data option\r\n if (this.config.data && Array.isArray(this.config.data)) {\r\n this.data = [];\r\n var optgroup: any = false,\r\n option;\r\n\r\n group = false;\r\n j = 0;\r\n\r\n util.each(this.config.data, function (i, opt) {\r\n // Check for group options\r\n if (isset(opt, \"children\")) {\r\n optgroup = util.createElement(\"optgroup\", {\r\n label: opt.text\r\n });\r\n\r\n group = util.createElement(\"ul\", {\r\n class: \"jsl-optgroup\",\r\n role: \"group\",\r\n html: \"<li class='jsl-optgroup--label'>\" + opt.text + \"</li>\"\r\n });\r\n\r\n util.each(opt.children, function (x, data) {\r\n\r\n option = new Option(data.text, data.value, false, data.hasOwnProperty(\"selected\") && data.selected === true);\r\n\r\n option.disabled = isset(data, \"disabled\");\r\n\r\n this.options.push(option);\r\n\r\n optgroup.appendChild(option);\r\n\r\n option.idx = j;\r\n\r\n var itm = createItem.call(this, option, data);\r\n itm.optgroup = group;\r\n // group.appendChild(util.toDom(itm));\r\n\r\n this.data[j] = data;\r\n\r\n j++;\r\n }, this);\r\n\r\n this.el.appendChild(optgroup);\r\n } else {\r\n\r\n option = new Option(opt.text, opt.value, false, opt.hasOwnProperty(\"selected\") && opt.selected === true);\r\n\r\n option.disabled = isset(opt, \"disabled\");\r\n\r\n this.options.push(option);\r\n\r\n option.idx = j;\r\n\r\n createItem.call(this, option, opt);\r\n\r\n this.data[j] = opt;\r\n\r\n j++;\r\n }\r\n }, this);\r\n }\r\n\r\n this.setSelected(true);\r\n\r\n var first;\r\n this.navIndex = 0;\r\n for (var i = 0; i < this.items.length; i++) {\r\n first = this.items[i];\r\n if (!first.disabled) {\r\n first.active = true;\r\n this.navIndex = i;\r\n break;\r\n }\r\n // if (!util.hasClass(first, \"disabled\")) {\r\n\r\n // util.addClass(first, \"active\");\r\n // this.navIndex = i;\r\n // break;\r\n // }\r\n }\r\n\r\n // Check for pagination / infinite scroll\r\n this.pageIndex = 1;\r\n // Create the pages\r\n this.paginate();\r\n\r\n this.container.appendChild(this.selected);\r\n this.container.appendChild(dropdown);\r\n\r\n this.placeEl = util.createElement(\"div\", {\r\n class: \"jsl-placeholder\"\r\n });\r\n\r\n // Set the placeholder\r\n this.setPlaceholder();\r\n\r\n this.selected.appendChild(this.placeEl);\r\n\r\n // Disable if required\r\n if (this.disabled) {\r\n this.disable();\r\n }\r\n\r\n this.el.parentNode.insertBefore(this.container, this.el);\r\n this.container.appendChild(this.el);\r\n };\r\n\r\n /**\r\n * Navigate through the dropdown\r\n * @param {obj} e\r\n * @return {void}\r\n */\r\n var navigate = function (e) {\r\n e = e || window.event;\r\n\r\n // Filter out the keys we don\"t want\r\n if (!this.items.length || !this.opened || !util.includes([13, 38, 40], e.which)) {\r\n this.navigating = false;\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n\r\n if (e.which === 13) {\r\n\r\n if (this.noResults || (this.config.taggable && this.input.value.length > 0)) {\r\n return false;\r\n }\r\n\r\n return this.change(this.navIndex);\r\n }\r\n\r\n var direction, prevEl = this.items[this.navIndex];\r\n var lastIndex = this.navIndex;\r\n\r\n switch (e.which) {\r\n case 38:\r\n direction = 0;\r\n if (this.navIndex > 0) {\r\n this.navIndex--;\r\n }\r\n break;\r\n case 40:\r\n direction = 1;\r\n if (this.navIndex < this.items.length - 1) {\r\n this.navIndex++;\r\n }\r\n }\r\n\r\n this.navigating = true;\r\n\r\n function validForSelection(itm) {\r\n if (itm == null || itm.dom == null) {\r\n return false;\r\n }\r\n return !util.hasClass(itm.dom, \"disabled\") && !util.hasClass(itm.dom, \"excluded\");\r\n }\r\n\r\n // Instead of wasting memory holding a copy of this.items\r\n // with disabled / excluded options omitted, skip them instead\r\n // while (util.hasClass(this.items[this.navIndex], \"disabled\") || util.hasClass(this.items[this.navIndex], \"excluded\")) {\r\n while (!validForSelection(this.items[this.navIndex])) {\r\n if (this.navIndex > 0 && this.navIndex < this.items.length - 1) {\r\n if (direction) {\r\n this.navIndex++;\r\n } else {\r\n this.navIndex--;\r\n }\r\n } else {\r\n this.navIndex = lastIndex;\r\n break;\r\n }\r\n\r\n if (this.searching) {\r\n if (this.navIndex > this.tree.lastElementChild.idx) {\r\n this.navIndex = this.tree.lastElementChild.idx;\r\n break;\r\n } else if (this.navIndex < this.tree.firstElementChild.idx) {\r\n this.navIndex = this.tree.firstElementChild.idx;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Autoscroll the dropdown during navigation\r\n var r = util.rect(this.items[this.navIndex].dom);\r\n\r\n if (!direction) {\r\n if (this.navIndex === 0) {\r\n this.tree.scrollTop = 0;\r\n } else if (r.top - this.optsRect.top < 0) {\r\n this.tree.scrollTop = this.tree.scrollTop + (r.top - this.optsRect.top);\r\n }\r\n } else {\r\n if (this.navIndex === 0) {\r\n this.tree.scrollTop = 0;\r\n } else if ((r.top + r.height) > (this.optsRect.top + this.optsRect.height)) {\r\n this.tree.scrollTop = this.tree.scrollTop + ((r.top + r.height) - (this.optsRect.top + this.optsRect.height));\r\n }\r\n\r\n // Load another page if needed\r\n if (this.navIndex === this.tree.childElementCount - 1 && this.requiresPagination) {\r\n load.call(this);\r\n }\r\n }\r\n\r\n if (prevEl) {\r\n removeActive(this.tree);\r\n prevEl.active = false;\r\n }\r\n\r\n util.addClass(this.items[this.navIndex].dom, \"active\");\r\n this.items[this.navIndex].active = true;\r\n };\r\n\r\n /**\r\n * Add a tag\r\n * @param {HTMLElement} item\r\n */\r\n var addTag = function (item) {\r\n var that = this,\r\n r;\r\n\r\n var docFrag = document.createDocumentFragment();\r\n var option = this.options[item.idx];\r\n var data = this.data ? this.data[item.idx] : option;\r\n var elementData = { class: \"jsl-tag\", html: undefined, textContent: undefined };\r\n if (this.customSelected) {\r\n elementData.html = this.config.renderSelection(data); // asume xss prevention in custom render function\r\n } else {\r\n elementData.textContent = option.textContent;\r\n }\r\n var tag = util.createElement(\"li\", elementData);\r\n var btn = util.createElement(\"button\", {\r\n class: \"jsl-tag-remove\",\r\n type: \"button\"\r\n });\r\n\r\n tag.appendChild(btn);\r\n\r\n // Set property to check against later\r\n tag.idx = item.idx;\r\n tag.tag = option.value;\r\n\r\n this.tags.push(tag);\r\n\r\n if (this.config.sortSelected) {\r\n\r\n var tags = this.tags.slice();\r\n\r\n // Deal with values that contain numbers\r\n r = function (val, arr) {\r\n val.replace(/(\\d+)|(\\D+)/g, function (that, $1, $2) {\r\n arr.push([$1 || Infinity, $2 || \"\"]);\r\n });\r\n };\r\n\r\n tags.sort(function (a, b) {\r\n var x = [],\r\n y = [],\r\n ac, bc;\r\n if (that.config.sortSelected === true) {\r\n ac = a.tag;\r\n bc = b.tag;\r\n } else if (that.config.sortSelected === 'text') {\r\n ac = a.textContent;\r\n bc = b.textContent;\r\n }\r\n\r\n r(ac, x);\r\n r(bc, y);\r\n\r\n while (x.length && y.length) {\r\n var ax = x.shift();\r\n var by = y.shift();\r\n var nn = (ax[0] - by[0]) || ax[1].localeCompare(by[1]);\r\n if (nn) return nn;\r\n }\r\n\r\n return x.length - y.length;\r\n });\r\n\r\n util.each(tags, function (i, tg) {\r\n docFrag.appendChild(tg);\r\n });\r\n\r\n this.label.innerHTML = \"\";\r\n\r\n } else {\r\n docFrag.appendChild(tag);\r\n }\r\n\r\n if (this.config.taggable) {\r\n this.label.insertBefore(docFrag, this.input.parentNode);\r\n } else {\r\n this.label.appendChild(docFrag);\r\n }\r\n };\r\n\r\n /**\r\n * Remove a tag\r\n * @param {HTMLElement} item\r\n * @return {void}\r\n */\r\n var removeTag = function (item) {\r\n var tag = false;\r\n\r\n util.each(this.tags, function (i, t) {\r\n if (t.idx === item.idx) {\r\n tag = t;\r\n }\r\n }, this);\r\n\r\n if (tag) {\r\n this.label.removeChild(tag);\r\n this.tags.splice(this.tags.indexOf(tag), 1);\r\n }\r\n };\r\n\r\n /**\r\n * Load the next page of items\r\n * @return {void}\r\n */\r\n var load = function () {\r\n // sometimes atBottom = false when atBottom < 0.xxx pixel smaller than \"this.pageIndex < this.pages.length\"\r\n var margin = 1; // solution: add a bit of margin\r\n var tree = this.tree;\r\n var scrollTop = tree.scrollTop;\r\n var scrollHeight = tree.scrollHeight;\r\n var offsetHeight = tree.offsetHeight;\r\n var atBottom = scrollTop + margin >= (scrollHeight - offsetHeight);\r\n\r\n if ((atBottom && this.pageIndex < this.pages.length)) {\r\n var f = document.createDocumentFragment();\r\n util.each(this.pages[this.pageIndex], function (i, item) {\r\n appendItem(item, f, this.customOption);\r\n }, this);\r\n\r\n tree.appendChild(f);\r\n\r\n this.pageIndex++;\r\n\r\n this.emit(\"selectr.paginate\", {\r\n items: this.items.length,\r\n total: this.data.length,\r\n page: this.pageIndex,\r\n pages: this.pages.length\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Clear a search\r\n * @return {void}\r\n */\r\n var clearSearch = function () {\r\n this.searchResults = null;\r\n if (this.config.searchable || this.config.taggable) {\r\n this.input.value = null;\r\n this.searching = false;\r\n if (this.config.searchable) {\r\n util.removeClass(this.inputContainer, \"active\");\r\n }\r\n\r\n if (util.hasClass(this.container, \"notice\")) {\r\n util.removeClass(this.container, \"notice\");\r\n util.addClass(this.container, \"open\");\r\n this.input.focus();\r\n }\r\n\r\n util.each(this.items, function (i, item) {\r\n // Items that didn't match need the class\r\n // removing to make them visible again\r\n if (item.dom) {\r\n util.removeClass(item.dom, \"excluded\");\r\n }\r\n // Remove the span element for underlining matched items\r\n if (!this.customOption) {\r\n // without xss\r\n item.textContent = item.textContent;\r\n }\r\n }, this);\r\n this.pageIndex = 1;\r\n this.paginate();\r\n }\r\n };\r\n\r\n // /**\r\n // * Query matching for searches.\r\n // * Wraps matching text in a span.jsl-match.\r\n // *\r\n // * @param {string} query\r\n // * @param {HTMLOptionElement} option element\r\n // * @return {bool} true if matched; false otherwise\r\n // */\r\n // var match = function (query, option) {\r\n // var text = option.textContent;\r\n // var RX = new RegExp(query, \"ig\");\r\n // var result = RX.exec(text);\r\n // if (result) {\r\n // // #102 stop xss\r\n // option.innerHTML = \"\";\r\n // var span = document.createElement(\"span\");\r\n // span.classList.add(\"jsl-match\");\r\n // span.textContent = result[0];\r\n // option.appendChild(document.createTextNode(text.substring(0, result.index)));\r\n // option.appendChild(span);\r\n // option.appendChild(document.createTextNode(text.substring(RX.lastIndex)));\r\n // return true;\r\n // }\r\n // return false;\r\n // };\r\n\r\n // Main Lib\r\n Selectr = function (el: string | HTMLElement, config?) {\r\n\r\n if (!el) {\r\n throw new Error(\"You must supply either a HTMLSelectElement or a CSS3 selector string.\");\r\n }\r\n\r\n this.el = el;\r\n\r\n // CSS3 selector string\r\n if (typeof el === \"string\") {\r\n this.el = document.querySelector(el);\r\n }\r\n\r\n if (this.el === null) {\r\n throw new Error(\"The element you passed to Selectr can not be found.\");\r\n }\r\n\r\n if (this.el.nodeName.toLowerCase() !== \"select\") {\r\n throw new Error(\"The element you passed to Selectr is not a HTMLSelectElement.\");\r\n }\r\n\r\n this.render(config);\r\n };\r\n\r\n /**\r\n * Render the instance\r\n * @param {object} config\r\n * @return {void}\r\n */\r\n Selectr.prototype.render = function (config) {\r\n\r\n if (this.rendered) return;\r\n\r\n /**\r\n * Default configuration options\r\n * @type {Object}\r\n */\r\n var defaultConfig = {\r\n /**\r\n * Emulates browser behaviour by selecting the first option by default\r\n * @type {Boolean}\r\n */\r\n defaultSelected: true,\r\n\r\n /**\r\n * Sets the width of the container\r\n * @type {String}\r\n */\r\n width: \"auto\",\r\n\r\n /**\r\n * Enables/ disables the container\r\n * @type {Boolean}\r\n */\r\n disabled: false,\r\n\r\n /**\r\n * Enables/ disables logic for mobile\r\n * @type {Boolean}\r\n */\r\n disabledMobile: true,\r\n\r\n /**\r\n * Enables / disables the search function\r\n * @type {Boolean}\r\n */\r\n searchable: true,\r\n\r\n /**\r\n * Enable disable the clear button\r\n * @type {Boolean}\r\n */\r\n clearable: false,\r\n\r\n /**\r\n * Sort the tags / multiselect options\r\n * @type {Boolean}\r\n */\r\n sortSelected: false,\r\n\r\n /**\r\n * Allow deselecting of select-one options\r\n * @type {Boolean}\r\n */\r\n allowDeselect: false,\r\n\r\n /**\r\n * Close the dropdown when scrolling (@AlexanderReiswich, #11)\r\n * @type {Boolean}\r\n */\r\n closeOnScroll: false,\r\n\r\n /**\r\n * Allow the use of the native dropdown (@jonnyscholes, #14)\r\n * @type {Boolean}\r\n */\r\n nativeDropdown: false,\r\n\r\n /**\r\n * Allow the use of native typing behavior for toggling, searching, selecting\r\n * @type {boolean}\r\n */\r\n nativeKeyboard: false,\r\n\r\n /**\r\n * Set the main placeholder\r\n * @type {String}\r\n */\r\n placeholder: UILang.dropDown.SelectOption,\r\n\r\n /**\r\n * Allow the tagging feature\r\n * @type {Boolean}\r\n */\r\n taggable: false,\r\n\r\n /**\r\n * Set the tag input placeholder (@labikmartin, #21, #22)\r\n * @type {String}\r\n */\r\n tagPlaceholder: UILang.dropDown.SelectOptionMultiple,\r\n\r\n messages: {\r\n noResults: UILang.dropDown.NoResults,\r\n noOptions: UILang.dropDown.NoOptions,\r\n maxSelections: UILang.dropDown.MaxSelection,\r\n tagDuplicate: UILang.dropDown.AlreadyInUse,\r\n searchPlaceholder: UILang.dropDown.Search\r\n }\r\n };\r\n\r\n // add instance reference (#87)\r\n this.el.selectr = this;\r\n\r\n // Merge defaults with user set config\r\n this.config = util.extend(defaultConfig, config);\r\n\r\n // Store type\r\n this.originalType = this.el.type;\r\n\r\n // Store tabIndex\r\n this.originalIndex = this.el.tabIndex;\r\n\r\n // Store defaultSelected options for form reset\r\n this.defaultSelected = [];\r\n\r\n // Store the original option count\r\n this.originalOptionCount = this.el.options.length;\r\n\r\n if (this.config.multiple || this.config.taggable) {\r\n this.el.multiple = true;\r\n }\r\n\r\n // Disabled?\r\n this.disabled = isset(this.config, \"disabled\");\r\n\r\n this.opened = false;\r\n\r\n if (this.config.taggable) {\r\n this.config.searchable = false;\r\n }\r\n\r\n this.navigating = false;\r\n\r\n this.mobileDevice = false;\r\n\r\n if (!this.config.disabledMobile && /Android|webOS|iPhone|iPad|BlackBerry|Windows Phone|Opera Mini|IEMobile|Mobile/i.test(navigator.userAgent)) {\r\n this.mobileDevice = true;\r\n }\r\n\r\n this.customOption = this.config.hasOwnProperty(\"renderOption\") && typeof this.config.renderOption === \"function\";\r\n this.customSelected = this.config.hasOwnProperty(\"renderSelection\") && typeof this.config.renderSelection === \"function\";\r\n\r\n this.supportsEventPassiveOption = this.detectEventPassiveOption();\r\n\r\n // Enable event emitter\r\n (Events as any).mixin(this);\r\n\r\n build.call(this);\r\n\r\n this.bindEvents();\r\n\r\n this.update();\r\n\r\n this.optsRect = util.rect(this.tree);\r\n\r\n this.rendered = true;\r\n\r\n // Fixes macOS Safari bug #28\r\n if (!this.el.multiple) {\r\n this.el.selectedIndex = this.selectedIndex;\r\n }\r\n\r\n var that = this;\r\n setTimeout(function () {\r\n that.emit(\"selectr.init\");\r\n }, 20);\r\n };\r\n\r\n Selectr.prototype.getSelected = function () {\r\n var selected = this.el.querySelectorAll('option:checked');\r\n return selected;\r\n };\r\n\r\n Selectr.prototype.getSelectedProperties = function (prop) {\r\n var selected = this.getSelected();\r\n var values = [].slice.call(selected)\r\n .map(function (option) { return option[prop]; })\r\n .filter(function (i) { return i !== null && i !== undefined; });\r\n return values;\r\n };\r\n\r\n /**\r\n * Feature detection: addEventListener passive option\r\n * https://dom.spec.whatwg.org/#dom-addeventlisteneroptions-passive\r\n * https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\r\n */\r\n Selectr.prototype.detectEventPassiveOption = function () {\r\n var supportsPassiveOption = false;\r\n try {\r\n var opts = Object.defineProperty({}, 'passive', {\r\n get: function () {\r\n supportsPassiveOption = true;\r\n }\r\n });\r\n window.addEventListener('test', null, opts);\r\n } catch (e) { }\r\n return supportsPassiveOption;\r\n };\r\n\r\n /**\r\n * Attach the required event listeners\r\n */\r\n Selectr.prototype.bindEvents = function () {\r\n\r\n var that = this;\r\n\r\n this.events = {};\r\n\r\n this.events.dismiss = dismiss.bind(this);\r\n this.events.navigate = navigate.bind(this);\r\n this.events.reset = this.reset.bind(this);\r\n\r\n if (this.config.nativeDropdown || this.mobileDevice) {\r\n\r\n this.container.addEventListener(\"touchstart\", function (e) {\r\n if (e.changedTouches[0].target === that.el) {\r\n that.toggle();\r\n }\r\n }, this.supportsEventPassiveOption ? { passive: true } : false);\r\n\r\n this.container.addEventListener(\"click\", function (e) {\r\n if (e.target === that.el) {\r\n that.toggle();\r\n }\r\n });\r\n\r\n var getChangedOptions = function (last, current) {\r\n var added = [], removed = last.slice(0);\r\n var idx;\r\n for (var i = 0; i < current.length; i++) {\r\n idx = removed.indexOf(current[i]);\r\n if (idx > -1)\r\n removed.splice(idx, 1);\r\n else\r\n added.push(current[i]);\r\n }\r\n return [added, removed];\r\n };\r\n\r\n // Listen for the change on the native select\r\n // and update accordingly\r\n this.el.addEventListener(\"change\", function (e) {\r\n if (e.__selfTriggered) {\r\n return;\r\n }\r\n if (that.el.multiple) {\r\n var indexes = that.getSelectedProperties('idx');\r\n var changes = getChangedOptions(that.selectedIndexes, indexes);\r\n\r\n util.each(changes[0], function (i, idx) {\r\n that.select(idx);\r\n }, that);\r\n\r\n util.each(changes[1], function (i, idx) {\r\n that.deselect(idx);\r\n }, that);\r\n\r\n } else {\r\n if (that.el.selectedIndex > -1) {\r\n that.select(that.el.selectedIndex);\r\n }\r\n }\r\n });\r\n\r\n }\r\n\r\n // Open the dropdown with Enter key if focused\r\n if (this.config.nativeDropdown) {\r\n this.container.addEventListener(\"keydown\", function (e) {\r\n if (e.key === \"Enter\" && that.selected === document.activeElement) {\r\n // show native dropdown\r\n that.toggle();\r\n // focus on it\r\n setTimeout(function () {\r\n that.el.focus();\r\n }, 200);\r\n }\r\n });\r\n }\r\n\r\n // Non-native dropdown\r\n this.selected.addEventListener(\"click\", function (e) {\r\n\r\n if (!that.disabled) {\r\n that.toggle();\r\n }\r\n\r\n e.preventDefault();\r\n });\r\n\r\n if (this.config.nativeKeyboard) {\r\n var typing = '';\r\n var typingTimeout = null;\r\n\r\n this.selected.addEventListener(\"keydown\", function (e) {\r\n // Do nothing if disabled, not focused, or modifier keys are pressed\r\n if (\r\n that.disabled ||\r\n that.selected !== document.activeElement ||\r\n (e.altKey || e.ctrlKey || e.metaKey)\r\n ) {\r\n return;\r\n }\r\n\r\n // Open the dropdown on [enter], [ ], [↓], and [↑] keys\r\n if (\r\n e.key === \" \" ||\r\n (!that.opened && [\"Enter\", \"ArrowUp\", \"ArrowDown\"].indexOf(e.key) > -1)\r\n ) {\r\n that.toggle();\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return;\r\n }\r\n\r\n // Type to search if multiple; type to select otherwise\r\n // make sure e.key is a single, printable character\r\n // .length check is a short-circut to skip checking keys like \"ArrowDown\", etc.\r\n // prefer \"codePoint\" methods; they work with the full range of unicode\r\n if (\r\n e.key.length <= 2 &&\r\n String[String.fromCodePoint ? \"fromCodePoint\" : \"fromCharCode\"](\r\n e.key[(<any>String).codePointAt ? \"codePointAt\" : \"charCodeAt\"](0)\r\n ) === e.key\r\n ) {\r\n if (that.config.multiple) {\r\n that.open();\r\n if (that.config.searchable) {\r\n that.input.value = e.key;\r\n that.input.focus();\r\n that.search(null, that.options.exactSearch);\r\n }\r\n } else {\r\n if (typingTimeout) {\r\n clearTimeout(typingTimeout);\r\n }\r\n typing += e.key;\r\n var found = that.search(typing, that.options.exactSearch);\r\n if (found && found.length) {\r\n that.clear();\r\n that.setValue(found[0].value);\r\n }\r\n setTimeout(function () { typing = ''; }, 1000);\r\n }\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return;\r\n }\r\n });\r\n\r\n // Close the dropdown on [esc] key\r\n this.container.addEventListener(\"keyup\", function (e) {\r\n if (that.opened && e.key === \"Escape\") {\r\n that.close();\r\n e.stopPropagation();\r\n\r\n // keep focus so we can re-open easily if desired\r\n that.selected.focus();\r\n }\r\n });\r\n }\r\n\r\n // Remove tag\r\n this.label.addEventListener(\"click\", function (e) {\r\n if (!that.disabled && util.hasClass(e.target, \"jsl-tag-remove\")) {\r\n that.deselect(e.target.parentNode.idx);\r\n }\r\n });\r\n\r\n // Clear input\r\n if (this.selectClear) {\r\n this.selectClear.addEventListener(\"click\", this.clear.bind(this));\r\n }\r\n\r\n // Prevent text selection\r\n this.tree.addEventListener(\"mousedown\", function (e) {\r\n e.preventDefault();\r\n });\r\n\r\n // Select / deselect items\r\n this.tree.addEventListener(\"click\", function (e) {\r\n var item = util.closest(e.target, function (el) {\r\n return el && util.hasClass(el, \"jsl-option\");\r\n });\r\n\r\n if (item) {\r\n if (!util.hasClass(item, \"disabled\")) {\r\n if (util.hasClass(item, \"selected\")) {\r\n if (that.el.multiple || !that.el.multiple && that.config.allowDeselect) {\r\n that.deselect(item.idx);\r\n }\r\n } else {\r\n that.select(item.idx);\r\n }\r\n\r\n if (that.opened && !that.el.multiple) {\r\n that.close();\r\n }\r\n }\r\n }\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n\r\n // Mouseover list items\r\n this.tree.addEventListener(\"mouseover\", function (e) {\r\n if (util.hasClass(e.target, \"jsl-option\")) {\r\n if (!util.hasClass(e.target, \"disabled\")) {\r\n removeActive(that.tree);\r\n util.addClass(e.target, \"active\");\r\n\r\n that.navIndex = -1;\r\n for (let idx = 0; idx < that.items.length; idx++) {\r\n if (that.items[idx].dom === e.target) {\r\n that.navIndex = idx;\r\n }\r\n }\r\n // that.navIndex = [].slice.call(that.items).indexOf(e.target);\r\n }\r\n }\r\n });\r\n\r\n // Searchable\r\n if (this.config.searchable) {\r\n // Show / hide the search input clear button\r\n\r\n this.input.addEventListener(\"focus\", function (e) {\r\n that.searching = true;\r\n });\r\n\r\n this.input.addEventListener(\"blur\", function (e) {\r\n that.searching = false;\r\n });\r\n\r\n this.input.addEventListener(\"input\", function (e) {\r\n that.search();\r\n\r\n if (!that.config.taggable) {\r\n // Show / hide the search input clear button\r\n if (this.value.length) {\r\n util.addClass(this.parentNode, \"active\");\r\n } else {\r\n util.removeClass(this.parentNode, \"active\");\r\n }\r\n }\r\n });\r\n\r\n // Clear the search input\r\n this.inputClear.addEventListener(\"click\", function (e) {\r\n that.input.value = null;\r\n clearSearch.call(that);\r\n\r\n if (!that.tree.childElementCount) {\r\n render.call(that);\r\n }\r\n });\r\n }\r\n\r\n if (this.config.taggable) {\r\n this.input.addEventListener(\"keyup\", function (e) {\r\n\r\n that.search();\r\n\r\n if (that.config.taggable && this.value.length) {\r\n var _sVal = this.value.trim();\r\n\r\n if (_sVal.length && (e.which === 13 || that.tagSeperatorsRegex.test(_sVal))) {\r\n var _sGrabbedTagValue = _sVal.replace(that.tagSeperatorsRegex, '');\r\n _sGrabbedTagValue = util.escapeRegExp(_sGrabbedTagValue);\r\n _sGrabbedTagValue = _sGrabbedTagValue.trim();\r\n\r\n var _oOption;\r\n if (_sGrabbedTagValue.length) {\r\n _oOption = that.add({\r\n value: _sGrabbedTagValue,\r\n textContent: _sGrabbedTagValue,\r\n selected: true\r\n }, true);\r\n }\r\n\r\n if (_oOption) {\r\n that.close();\r\n clearSearch.call(that);\r\n } else {\r\n this.value = '';\r\n that.setMessage(that.config.messages.tagDuplicate);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n this.update = util.debounce(function () {\r\n // Optionally close dropdown on scroll / resize (#11)\r\n if (that.opened && that.config.closeOnScroll) {\r\n that.close();\r\n }\r\n if (that.width) {\r\n that.container.style.width = that.width;\r\n }\r\n that.invert();\r\n }, 50);\r\n\r\n if (this.requiresPagination) {\r\n this.paginateItems = util.debounce(function () {\r\n load.call(this);\r\n }, 50);\r\n\r\n this.tree.addEventListener(\"scroll\", this.paginateItems.bind(this));\r\n }\r\n\r\n // Dismiss when clicking outside the container\r\n document.addEventListener(\"click\", this.events.dismiss);\r\n this.container.addEventListener(\"keydown\", this.events.navigate);\r\n\r\n window.addEventListener(\"resize\", this.update);\r\n window.addEventListener(\"scroll\", this.update);\r\n\r\n // remove event listeners on destroy()\r\n this.on('selectr.destroy', function () {\r\n document.removeEventListener(\"click\", this.events.dismiss);\r\n this.container.removeEventListener(\"keydown\", this.events.navigate);\r\n window.removeEventListener(\"resize\", this.update);\r\n window.removeEventListener(\"scroll\", this.update);\r\n });\r\n\r\n // Listen for form.reset() (@ambrooks, #13)\r\n if (this.el.form) {\r\n this.el.form.addEventListener(\"reset\", this.events.reset);\r\n\r\n // remove listener on destroy()\r\n this.on('selectr.destroy', function () {\r\n this.el.form.removeEventListener(\"reset\", this.events.reset);\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Check for selected options\r\n * @param {bool} reset\r\n */\r\n Selectr.prototype.setSelected = function (reset) {\r\n\r\n // Select first option as with a native select-one element - #21, #24\r\n if (!this.config.data && !this.el.multiple && this.el.options.length) {\r\n // Browser has selected the first option by default\r\n if (this.el.selectedIndex === 0) {\r\n if (!this.el.options[0].defaultSelected && !this.config.defaultSelected) {\r\n this.el.selectedIndex = -1;\r\n }\r\n }\r\n\r\n this.selectedIndex = this.el.selectedIndex;\r\n\r\n if (this.selectedIndex > -1) {\r\n this.select(this.selectedIndex);\r\n }\r\n }\r\n\r\n // If we're changing a select-one to select-multiple via the config\r\n // and there are no selected options, the first option will be selected by the browser\r\n // Let's prevent that here.\r\n if (this.config.multiple && this.originalType === \"select-one\" && !this.config.data) {\r\n if (this.el.options[0].selected && !this.el.options[0].defaultSelected) {\r\n this.el.options[0].selected = false;\r\n }\r\n }\r\n\r\n util.each(this.options, function (i, option) {\r\n if (option.selected && option.defaultSelected) {\r\n this.select(option.idx);\r\n }\r\n }, this);\r\n\r\n if (this.config.selectedValue) {\r\n this.setValue(this.config.selectedValue);\r\n }\r\n\r\n if (this.config.data) {\r\n\r\n\r\n if (!this.el.multiple && this.config.defaultSelected && this.el.selectedIndex < 0 && this.config.data.length > 0) {\r\n this.select(0);\r\n }\r\n\r\n var j = 0;\r\n util.each(this.config.data, function (i, opt) {\r\n // Check for group options\r\n if (isset(opt, \"children\")) {\r\n util.each(opt.children, function (x, item) {\r\n if (item.hasOwnProperty(\"selected\") && item.selected === true) {\r\n this.select(j);\r\n }\r\n j++;\r\n }, this);\r\n } else {\r\n if (opt.hasOwnProperty(\"selected\") && opt.selected === true) {\r\n this.select(j);\r\n }\r\n j++;\r\n }\r\n }, this);\r\n }\r\n };\r\n\r\n /**\r\n * Destroy the instance\r\n * @return {void}\r\n */\r\n Selectr.prototype.destroy = function () {\r\n\r\n if (!this.rendered) return;\r\n\r\n this.emit(\"selectr.destroy\");\r\n\r\n // Revert to select-single if programtically set to multiple\r\n if (this.originalType === 'select-one') {\r\n this.el.multiple = false;\r\n }\r\n\r\n if (this.config.data) {\r\n this.el.innerHTML = \"\";\r\n }\r\n\r\n // Remove the className from select element\r\n util.removeClass(this.el, 'jsl-hidden');\r\n\r\n // Replace the container with the original select element\r\n this.container.parentNode.replaceChild(this.el, this.container);\r\n\r\n this.rendered = false;\r\n\r\n // remove reference\r\n delete this.el.selectr;\r\n };\r\n\r\n /**\r\n * Change an options state\r\n * @param {Number} index\r\n * @return {void}\r\n */\r\n Selectr.prototype.change = function (index) {\r\n var item = this.items[index],\r\n option = this.options[index];\r\n\r\n if (option.disabled) {\r\n return;\r\n }\r\n\r\n if (option.selected && util.hasClass(item, \"selected\")) {\r\n this.deselect(index);\r\n } else {\r\n this.select(index);\r\n }\r\n\r\n if (this.opened && !this.el.multiple) {\r\n this.close();\r\n }\r\n };\r\n\r\n /**\r\n * Select an option\r\n * @param {Number} index\r\n * @return {void}\r\n */\r\n Selectr.prototype.select = function (index) {\r\n\r\n var item = this.items[index],\r\n options = [].slice.call(this.el.options),\r\n option = this.options[index];\r\n\r\n if (this.el.multiple) {\r\n if (util.includes(this.selectedIndexes, index)) {\r\n return false;\r\n }\r\n\r\n if (this.config.maxSelections && this.tags.length === this.config.maxSelections) {\r\n this.setMessage(this.config.messages.maxSelections.replace(\"{max}\", this.config.maxSelections), true);\r\n return false;\r\n }\r\n\r\n this.selectedValues.push(option.value);\r\n this.selectedIndexes.push(index);\r\n\r\n addTag.call(this, item);\r\n } else {\r\n var data = this.data ? this.data[index] : option;\r\n if (this.customSelected) {\r\n this.label.innerHTML = this.config.renderSelection(data);\r\n } else {\r\n // no xss\r\n this.label.textContent = option.textContent;\r\n }\r\n\r\n this.selectedValue = option.value;\r\n this.selectedIndex = index;\r\n\r\n util.each(this.options, function (i, o) {\r\n var opt = this.items[i];\r\n\r\n if (i !== index) {\r\n if (o) {\r\n util.removeClass(o, \"selected\");\r\n o.removeAttribute(\"selected\");\r\n }\r\n opt.selected = false;\r\n opt.active = false;\r\n }\r\n }, this);\r\n }\r\n\r\n if (!util.includes(options, option)) {\r\n this.el.add(option);\r\n }\r\n\r\n item.selected = true;\r\n // item.dom.setAttribute(\"aria-selected\", true);\r\n\r\n // util.addClass(item.dom, \"selected\");\r\n util.addClass(this.container, \"has-selected\");\r\n\r\n option.selected = true;\r\n option.setAttribute(\"selected\", \"\");\r\n\r\n this.emit(\"selectr.change\", option);\r\n\r\n this.emit(\"selectr.select\", option);\r\n\r\n // fire native change event\r\n if (\"createEvent\" in document) {\r\n var evt = document.createEvent(\"HTMLEvents\");\r\n evt.initEvent(\"change\", true, true);\r\n (<any>evt).__selfTriggered = true;\r\n this.el.dispatchEvent(evt);\r\n } else {\r\n this.el.fireEvent(\"onchange\");\r\n }\r\n };\r\n\r\n /**\r\n * Deselect an option\r\n * @param {Number} index\r\n * @return {void}\r\n */\r\n Selectr.prototype.deselect = function (index, force) {\r\n var item = this.items[index],\r\n option = this.options[index];\r\n\r\n if (this.el.multiple) {\r\n var selIndex = this.selectedIndexes.indexOf(index);\r\n this.selectedIndexes.splice(selIndex, 1);\r\n\r\n var valIndex = this.selectedValues.indexOf(option.value);\r\n this.selectedValues.splice(valIndex, 1);\r\n\r\n removeTag.call(this, item);\r\n\r\n if (!this.tags.length) {\r\n util.removeClass(this.container, \"has-selected\");\r\n }\r\n } else {\r\n\r\n if (!force && !this.config.clearable && !this.config.allowDeselect) {\r\n return false;\r\n }\r\n\r\n this.label.innerHTML = \"\";\r\n this.selectedValue = null;\r\n\r\n this.el.selectedIndex = this.selectedIndex = -1;\r\n\r\n util.removeClass(this.container, \"has-selected\");\r\n }\r\n\r\n this.items[index].selected = false;\r\n if (this.items[index].dom) {\r\n this.items[index].dom.setAttribute(\"aria-selected\", false);\r\n util.removeClass(this.items[index].dom, \"selected\");\r\n this.items[index].dom.selected = false;\r\n }\r\n\r\n option.selected = false;\r\n\r\n option.removeAttribute(\"selected\");\r\n\r\n this.emit(\"selectr.change\", null);\r\n\r\n this.emit(\"selectr.deselect\", option);\r\n\r\n // fire native change event\r\n if (\"createEvent\" in document) {\r\n var evt = document.createEvent(\"HTMLEvents\");\r\n evt.initEvent(\"change\", true, true);\r\n (<any>evt).__selfTriggered = true;\r\n this.el.dispatchEvent(evt);\r\n } else {\r\n this.el.fireEvent(\"onchange\");\r\n }\r\n };\r\n\r\n /**\r\n * Programmatically set selected values\r\n * @param {String|Array} value - A string or an array of strings\r\n */\r\n Selectr.prototype.setValue = function (value) {\r\n var isArray = Array.isArray(value);\r\n\r\n if (!isArray) {\r\n value = value.toString().trim();\r\n }\r\n\r\n // Can't pass array to select-one\r\n if (!this.el.multiple && isArray) {\r\n return false;\r\n }\r\n\r\n util.each(this.options, function (i, option) {\r\n if (isArray && (value.indexOf(option.value) > -1) || option.value === value) {\r\n this.change(option.idx);\r\n }\r\n }, this);\r\n };\r\n\r\n /**\r\n * Set the selected value(s)\r\n * @param {bool} toObject Return only the raw values or an object\r\n * @param {bool} toJson Return the object as a JSON string\r\n * @return {mixed} Array or String\r\n */\r\n Selectr.prototype.getValue = function (toObject, toJson) {\r\n var value;\r\n\r\n if (this.el.multiple) {\r\n if (toObject) {\r\n if (this.selectedIndexes.length) {\r\n value = {};\r\n value.values = [];\r\n util.each(this.selectedIndexes, function (i, index) {\r\n var option = this.options[index];\r\n value.values[i] = {\r\n value: option.value,\r\n text: option.textContent\r\n };\r\n }, this);\r\n }\r\n } else {\r\n value = this.selectedValues.slice();\r\n }\r\n } else {\r\n if (toObject) {\r\n var option = this.options[this.selectedIndex];\r\n value = {\r\n value: option.value,\r\n text: option.textContent\r\n };\r\n } else {\r\n value = this.selectedValue;\r\n }\r\n }\r\n\r\n if (toObject && toJson) {\r\n value = JSON.stringify(value);\r\n }\r\n\r\n return value;\r\n };\r\n\r\n /**\r\n * Add a new option or options\r\n * @param {object} data\r\n */\r\n Selectr.prototype.add = function (data, checkDuplicate) {\r\n if (data) {\r\n this.data = this.data || [];\r\n this.items = this.items || [];\r\n this.options = this.options || [];\r\n\r\n if (Array.isArray(data)) {\r\n // We have an array on items\r\n util.each(data, function (i, obj) {\r\n this.add(obj, checkDuplicate);\r\n }, this);\r\n }\r\n // User passed a single object to the method\r\n // or Selectr passed an object from an array\r\n else if (\"[object Object]\" === Object.prototype.toString.call(data)) {\r\n\r\n if (checkDuplicate) {\r\n var dupe = false;\r\n\r\n util.each(this.options, function (i, option) {\r\n if (option.value.toLowerCase() === data.value.toLowerCase()) {\r\n dupe = true;\r\n }\r\n });\r\n\r\n if (dupe) {\r\n return false;\r\n }\r\n }\r\n\r\n var option = util.createElement('option', data);\r\n\r\n this.data.push(data);\r\n\r\n // Add the new option to the list\r\n this.options.push(option);\r\n\r\n // Add the index for later use\r\n option.idx = this.options.length > 0 ? this.options.length - 1 : 0;\r\n\r\n // Create a new item\r\n createItem.call(this, option);\r\n\r\n // Select the item if required\r\n if (data.selected) {\r\n this.select(option.idx);\r\n }\r\n\r\n // We may have had an empty select so update\r\n // the placeholder to reflect the changes.\r\n this.setPlaceholder();\r\n\r\n return option;\r\n }\r\n\r\n // Recount the pages\r\n if (this.config.pagination) {\r\n this.paginate();\r\n }\r\n\r\n return true;\r\n }\r\n };\r\n\r\n /**\r\n * Remove an option or options\r\n * @param {Mixed} o Array, integer (index) or string (value)\r\n * @return {Void}\r\n */\r\n Selectr.prototype.remove = function (o) {\r\n var options = [];\r\n if (Array.isArray(o)) {\r\n util.each(o, function (i, opt) {\r\n if (util.isInt(opt)) {\r\n options.push(this.getOptionByIndex(opt));\r\n } else if (typeof opt === \"string\") {\r\n options.push(this.getOptionByValue(opt));\r\n }\r\n }, this);\r\n\r\n } else if (util.isInt(o)) {\r\n options.push(this.getOptionByIndex(o));\r\n } else if (typeof o === \"string\") {\r\n options.push(this.getOptionByValue(o));\r\n }\r\n\r\n if (options.length) {\r\n var index;\r\n util.each(options, function (i, option) {\r\n index = option.idx;\r\n\r\n // Remove the HTMLOptionElement\r\n this.el.remove(option);\r\n\r\n // Remove the reference from the option array\r\n this.options.splice(index, 1);\r\n\r\n // If the item has a parentNode (group element) it needs to be removed\r\n // otherwise the render function will still append it to the dropdown\r\n var parentNode = this.items[index].parentNode;\r\n\r\n if (parentNode) {\r\n parentNode.removeChild(this.items[index]);\r\n }\r\n\r\n // Remove reference from the items array\r\n this.items.splice(index, 1);\r\n\r\n // Reset the indexes\r\n util.each(this.options, function (i, opt) {\r\n opt.idx = i;\r\n this.items[i].idx = i;\r\n }, this);\r\n }, this);\r\n\r\n // We may have had an empty select now so update\r\n // the placeholder to reflect the changes.\r\n this.setPlaceholder();\r\n\r\n // Recount the pages\r\n if (this.config.pagination) {\r\n this.paginate();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Remove all options\r\n */\r\n Selectr.prototype.removeAll = function () {\r\n\r\n // Clear any selected options\r\n this.clear(true);\r\n\r\n // Remove the HTMLOptionElements\r\n util.each(this.el.options, function (i, option) {\r\n this.el.remove(option);\r\n }, this);\r\n\r\n // Empty the dropdown\r\n util.truncate(this.tree);\r\n\r\n // Reset variables\r\n this.items = [];\r\n this.options = [];\r\n this.data = [];\r\n\r\n this.navIndex = 0;\r\n\r\n if (this.requiresPagination) {\r\n this.requiresPagination = false;\r\n\r\n this.pageIndex = 1;\r\n this.pages = [];\r\n }\r\n\r\n // Update the placeholder\r\n this.setPlaceholder();\r\n };\r\n\r\n /**\r\n * Perform a search\r\n * @param {string}|{null} query The query string (taken from user input if null)\r\n * @param {boolean} anchor Anchor search to beginning of strings (defaults to false)?\r\n * @return {Array} Search results, as an array of {text, value} objects\r\n */\r\n Selectr.prototype.search = function (string, anchor) {\r\n if (this.navigating) {\r\n return;\r\n }\r\n\r\n // we're only going to alter the DOM for \"live\" searches\r\n var live = false;\r\n if (!string) {\r\n string = this.input.value;\r\n live = true;\r\n\r\n // Remove message and clear dropdown\r\n this.removeMessage();\r\n util.truncate(this.tree);\r\n }\r\n var results = [];\r\n var f = document.createDocumentFragment();\r\n\r\n string = string.trim().toLowerCase();\r\n\r\n if (string.length > 0) {\r\n var compare = anchor ? util.startsWith : util.includes;\r\n\r\n var counter = 0;\r\n this.searchResults = [];\r\n util.each(this.options, function (i, option) {\r\n var item = this.items[option.idx];\r\n var matches = compare(option.textContent.trim().toLowerCase(), string);\r\n\r\n if (matches && !option.disabled) {\r\n results.push({ text: option.textContent, value: option.value });\r\n if (live) {\r\n this.searchResults.push(item);\r\n if (counter < 50) {\r\n appendItem(item, f, this.customOption);\r\n counter++;\r\n util.removeClass(item.dom, \"excluded\");\r\n }\r\n\r\n // // Underline the matching results\r\n // if (!this.customOption) {\r\n // match(string, option);\r\n // }\r\n }\r\n } else if (live && item.dom) {\r\n util.addClass(item.dom, \"excluded\");\r\n }\r\n }, this);\r\n\r\n if (live) {\r\n // Append results\r\n if (!f.childElementCount && !f.childNodes.length) {\r\n if (!this.config.taggable) {\r\n this.noResults = true;\r\n this.setMessage(this.config.messages.noResults);\r\n }\r\n } else {\r\n // Highlight top result (@binary-koan #26)\r\n var prevEl = this.items[this.navIndex];\r\n var firstEl = f.querySelector(\".jsl-option:not(.excluded)\");\r\n this.noResults = false;\r\n\r\n removeActive(this.tree);\r\n // prevEl.active = false;\r\n this.navIndex = (<any>firstEl).idx;\r\n util.addClass(firstEl, \"active\");\r\n }\r\n\r\n this.tree.appendChild(f);\r\n }\r\n } else {\r\n clearSearch.call(this);\r\n render.call(this);\r\n return [];\r\n }\r\n this.pageIndex = 1;\r\n this.paginate();\r\n return results;\r\n };\r\n\r\n /**\r\n * Toggle the dropdown\r\n * @return {void}\r\n */\r\n Selectr.prototype.toggle = function () {\r\n if (!this.disabled) {\r\n if (this.opened) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Open the dropdown\r\n * @return {void}\r\n */\r\n Selectr.prototype.open = function () {\r\n\r\n var that = this;\r\n\r\n if (!this.options.length) {\r\n return false;\r\n }\r\n\r\n if (!this.opened) {\r\n this.emit(\"selectr.open\");\r\n }\r\n\r\n this.opened = true;\r\n\r\n if (this.mobileDevice || this.config.nativeDropdown) {\r\n util.addClass(this.container, \"native-open\");\r\n\r\n if (this.config.data) {\r\n // Dump the options into the select\r\n // otherwise the native dropdown will be empty\r\n util.each(this.options, function (i, option) {\r\n this.el.add(option);\r\n }, this);\r\n }\r\n\r\n return;\r\n }\r\n\r\n util.addClass(this.container, \"open\");\r\n\r\n render.call(this);\r\n\r\n this.invert();\r\n\r\n this.tree.scrollTop = 0;\r\n\r\n util.removeClass(this.container, \"notice\");\r\n\r\n this.selected.setAttribute(\"aria-expanded\", true);\r\n\r\n this.tree.setAttribute(\"aria-hidden\", false);\r\n this.tree.setAttribute(\"aria-expanded\", true);\r\n\r\n if (this.config.searchable && !this.config.taggable) {\r\n setTimeout(function () {\r\n that.input.focus();\r\n // Allow tab focus\r\n that.input.tabIndex = 0;\r\n }, 10);\r\n }\r\n };\r\n\r\n /**\r\n * Close the dropdown\r\n * @return {void}\r\n */\r\n Selectr.prototype.close = function () {\r\n\r\n if (this.opened) {\r\n this.emit(\"selectr.close\");\r\n }\r\n\r\n this.opened = false;\r\n this.navigating = false;\r\n\r\n if (this.mobileDevice || this.config.nativeDropdown) {\r\n util.removeClass(this.container, \"native-open\");\r\n return;\r\n }\r\n\r\n var notice = util.hasClass(this.container, \"notice\");\r\n\r\n if (this.config.searchable && !notice) {\r\n this.input.blur();\r\n // Disable tab focus\r\n this.input.tabIndex = -1;\r\n this.searching = false;\r\n }\r\n\r\n if (notice) {\r\n util.removeClass(this.container, \"notice\");\r\n this.notice.textContent = \"\";\r\n }\r\n\r\n util.removeClass(this.container, \"open\");\r\n util.removeClass(this.container, \"native-open\");\r\n\r\n this.selected.setAttribute(\"aria-expanded\", false);\r\n\r\n this.tree.setAttribute(\"aria-hidden\", true);\r\n this.tree.setAttribute(\"aria-expanded\", false);\r\n\r\n util.truncate(this.tree);\r\n clearSearch.call(this);\r\n };\r\n\r\n\r\n /**\r\n * Enable the element\r\n * @return {void}\r\n */\r\n Selectr.prototype.enable = function () {\r\n this.disabled = false;\r\n this.el.disabled = false;\r\n\r\n this.selected.tabIndex = this.originalIndex;\r\n\r\n if (this.el.multiple) {\r\n util.each(this.tags, function (i, t) {\r\n t.lastElementChild.tabIndex = 0;\r\n });\r\n }\r\n\r\n util.removeClass(this.container, \"jsl-disabled\");\r\n };\r\n\r\n /**\r\n * Disable the element\r\n * @param {boolean} container Disable the container only (allow value submit with form)\r\n * @return {void}\r\n */\r\n Selectr.prototype.disable = function (container) {\r\n if (!container) {\r\n this.el.disabled = true;\r\n }\r\n\r\n this.selected.tabIndex = -1;\r\n\r\n if (this.el.multiple) {\r\n util.each(this.tags, function (i, t) {\r\n t.lastElementChild.tabIndex = -1;\r\n });\r\n }\r\n\r\n this.disabled = true;\r\n util.addClass(this.container, \"jsl-disabled\");\r\n };\r\n\r\n\r\n /**\r\n * Reset to initial state\r\n * @return {void}\r\n */\r\n Selectr.prototype.reset = function () {\r\n if (!this.disabled) {\r\n this.clear();\r\n\r\n this.setSelected(true);\r\n\r\n util.each(this.defaultSelected, function (i, idx) {\r\n this.select(idx);\r\n }, this);\r\n\r\n this.emit(\"selectr.reset\");\r\n }\r\n };\r\n\r\n /**\r\n * Clear all selections\r\n * @return {void}\r\n */\r\n Selectr.prototype.clear = function (force, isClearLast) {\r\n\r\n if (this.el.multiple) {\r\n // Loop over the selectedIndexes so we don't have to loop over all the options\r\n // which can be costly if there are a lot of them\r\n\r\n if (this.selectedIndexes.length) {\r\n // Copy the array or we'll get an error\r\n var indexes = this.selectedIndexes.slice();\r\n\r\n if (isClearLast) {\r\n this.deselect(indexes.slice(-1)[0]);\r\n } else {\r\n util.each(indexes, function (i, idx) {\r\n this.deselect(idx);\r\n }, this);\r\n }\r\n }\r\n } else {\r\n if (this.selectedIndex > -1) {\r\n this.deselect(this.selectedIndex, force);\r\n }\r\n }\r\n\r\n this.emit(\"selectr.clear\");\r\n };\r\n\r\n /**\r\n * Return serialised data\r\n * @param {boolean} toJson\r\n * @return {mixed} Returns either an object or JSON string\r\n */\r\n Selectr.prototype.serialise = function (toJson) {\r\n var data = [];\r\n util.each(this.options, function (i, option) {\r\n var obj = {\r\n value: option.value,\r\n text: option.textContent,\r\n selected: undefined,\r\n disabled: undefined\r\n };\r\n\r\n if (option.selected) {\r\n obj.selected = true;\r\n }\r\n if (option.disabled) {\r\n obj.disabled = true;\r\n }\r\n data[i] = obj;\r\n });\r\n\r\n return toJson ? JSON.stringify(data) : data;\r\n };\r\n\r\n /**\r\n * Localised version of serialise() method\r\n */\r\n Selectr.prototype.serialize = function (toJson) {\r\n return this.serialise(toJson);\r\n };\r\n\r\n /**\r\n * Sets the placeholder\r\n * @param {String} placeholder\r\n */\r\n Selectr.prototype.setPlaceholder = function (placeholder) {\r\n // Set the placeholder\r\n placeholder = placeholder || this.config.placeholder || this.el.getAttribute(\"placeholder\");\r\n\r\n if (!this.options.length) {\r\n placeholder = this.config.messages.noOptions;\r\n }\r\n\r\n this.placeEl.innerHTML = placeholder;\r\n };\r\n\r\n /**\r\n * Paginate the option list\r\n * @return {Array}\r\n */\r\n Selectr.prototype.paginate = function () {\r\n if (!this.requiresPagination) {\r\n return;\r\n }\r\n var items = this.searching ? this.searchResults : this.items;\r\n if (items.length) {\r\n var that = this;\r\n this.pages = items.map(function (v, i) {\r\n return i % that.config.pagination === 0 ? items.slice(i, i + that.config.pagination) : null;\r\n }).filter(function (pages) {\r\n return pages;\r\n });\r\n\r\n return this.pages;\r\n }\r\n };\r\n\r\n /**\r\n * Display a message\r\n * @param {String} message The message\r\n */\r\n Selectr.prototype.setMessage = function (message, close) {\r\n if (close) {\r\n this.close();\r\n }\r\n util.addClass(this.container, \"notice\");\r\n this.notice.textContent = message;\r\n };\r\n\r\n /**\r\n * Dismiss the current message\r\n */\r\n Selectr.prototype.removeMessage = function () {\r\n util.removeClass(this.container, \"notice\");\r\n this.notice.innerHTML = \"\";\r\n };\r\n\r\n /**\r\n * Keep the dropdown within the window\r\n * @return {void}\r\n */\r\n Selectr.prototype.invert = function () {\r\n var rt = util.rect(this.selected),\r\n oh = this.tree.parentNode.offsetHeight,\r\n wh = window.innerHeight,\r\n doInvert = rt.top + rt.height + oh > wh;\r\n\r\n if (doInvert) {\r\n util.addClass(this.container, \"inverted\");\r\n this.isInverted = true;\r\n } else {\r\n util.removeClass(this.container, \"inverted\");\r\n this.isInverted = false;\r\n }\r\n\r\n this.optsRect = util.rect(this.tree);\r\n };\r\n\r\n /**\r\n * Get an option via it's index\r\n * @param {Integer} index The index of the HTMLOptionElement required\r\n * @return {HTMLOptionElement}\r\n */\r\n Selectr.prototype.getOptionByIndex = function (index) {\r\n return this.options[index];\r\n };\r\n\r\n /**\r\n * Get an option via it's value\r\n * @param {String} value The value of the HTMLOptionElement required\r\n * @return {HTMLOptionElement}\r\n */\r\n Selectr.prototype.getOptionByValue = function (value) {\r\n var option = false;\r\n\r\n for (var i = 0, l = this.options.length; i < l; i++) {\r\n if (this.options[i].value.trim() === value.toString().trim()) {\r\n option = this.options[i];\r\n break;\r\n }\r\n }\r\n\r\n return option;\r\n };\r\n\r\n})();\r\n\r\nexport interface IDropDownOptions {\r\n defaultSelected?: boolean;\r\n multiple?: boolean;\r\n data?: any[];\r\n pagination?: number;\r\n sortSelected?: boolean;\r\n searchable?: boolean;\r\n clearable?: boolean;\r\n allowDeselect?: boolean;\r\n width?: number | string;\r\n placeholder?: string;\r\n taggable?: boolean;\r\n maxSelections?: number;\r\n tagSeperators?: string[];\r\n tagPlaceholder?: string;\r\n renderOption?: (option: any) => string;\r\n renderSelection?: (option: any) => string;\r\n closeOnScroll?: boolean;\r\n customClass?: string;\r\n messages?: { [index: string]: string };\r\n}\r\n\r\nexport let DropDown = function (input: string | HTMLElement, config?: IDropDownOptions): IDropDown {\r\n return new Selectr(input, config);\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","import \"./number.input.css\";\r\nimport { numeric } from \"../core/numeric\";\r\nimport { EventHandler } from \"../interaction/eventhandler\";\r\n\r\nexport interface INumberInputOptions {\r\n enabled?: boolean;\r\n format?: string;\r\n formatOnBlur?: boolean;\r\n commitOnEnter?: boolean;\r\n placeholder?: boolean | string;\r\n value?: number;\r\n onChange?: EventHandler<number> | ((value?: number) => void);\r\n}\r\n\r\nconst defaultOptions = { format: \"0.###\", formatOnBlur: true, commitOnEnter: true, placeholder: false, enabled: true };\r\n\r\nexport function NumberInput(input: HTMLInputElement | string, options?: INumberInputOptions): HTMLInputElement {\r\n\r\n let el: HTMLInputElement;\r\n\r\n const o = { ...defaultOptions, ...options };\r\n o.onChange = EventHandler.Create(o.onChange);\r\n\r\n if (typeof input === \"string\") {\r\n el = document.querySelector<HTMLInputElement>(input);\r\n } else {\r\n el = input;\r\n }\r\n\r\n if (o.value || o.value === 0) {\r\n el.value = numeric.format(o.value, o.format);\r\n }\r\n if (o.placeholder !== false) {\r\n if (o.placeholder === true) {\r\n el.placeholder = numeric.format(0, o.format);\r\n } else {\r\n el.placeholder = o.placeholder;\r\n }\r\n }\r\n\r\n el.classList.add(\"jsl-number\");\r\n\r\n if (o.enabled === false) {\r\n el.setAttribute(\"disabled\", \"disabled\");\r\n } else {\r\n if (o.formatOnBlur) {\r\n el.addEventListener(\"blur\", (evt) => {\r\n const val = numeric.parse(el.value);\r\n el.value = numeric.format(val, o.format);\r\n });\r\n }\r\n if (o.onChange != null) {\r\n el.addEventListener(\"change\", (evt) => {\r\n (o.onChange as EventHandler<number>).notify(numeric.parse(el.value));\r\n });\r\n }\r\n el.addEventListener(\"keydown\", (evt) => {\r\n if (evt.which === 13) {\r\n if (o.formatOnBlur) {\r\n const val = numeric.parse(el.value);\r\n el.value = numeric.format(val, o.format);\r\n }\r\n (o.onChange as EventHandler<number>).notify(numeric.parse(el.value));\r\n }\r\n });\r\n }\r\n return el;\r\n}\r\n","import \"./Notification.scss\";\r\nimport { IJSLVNode, IJSLComponent, JSLRender } from \"jsl-render\";\r\nimport { helper } from \"../../core/helper\";\r\n\r\nexport interface INotificationOptions {\r\n content: string | IJSLVNode | IJSLComponent;\r\n closeOnClick?: boolean;\r\n timeOut?: number;\r\n class?: string;\r\n style?: string;\r\n}\r\n\r\nexport class Notification {\r\n\r\n public static show(options: INotificationOptions): void {\r\n if (Notification.container == null) {\r\n Notification.createContainer();\r\n }\r\n // add\r\n const notification: IJSLVNode = {\r\n tag: \"div\",\r\n attr: { id: helper.newDomGuid(), style: options.style, class: \"jsl-notification \" + (options.class || \"\") },\r\n animation: { attr: \"opacity\", from: 0, to: 1, duration: 600 },\r\n children: [\r\n typeof options.content === \"string\" ? {tag: \"div\", content: options.content} : options.content\r\n ]\r\n };\r\n Notification.containerVNode.children.push(notification);\r\n Notification.renderer.refresh();\r\n // remove\r\n if (options.timeOut) {\r\n setTimeout(() => {\r\n const idx = Notification.containerVNode.children.indexOf(notification);\r\n if (idx >= 0) {\r\n Notification.containerVNode.children.splice(idx, 1);\r\n }\r\n Notification.renderer.refresh();\r\n }, options.timeOut);\r\n }\r\n if ((options.closeOnClick ?? true) === true) {\r\n notification.attr.click = () => {\r\n const idx = Notification.containerVNode.children.indexOf(notification);\r\n if (idx >= 0) {\r\n Notification.containerVNode.children.splice(idx, 1);\r\n }\r\n };\r\n }\r\n }\r\n\r\n public static clearAll(): void {\r\n Notification.containerVNode.children = [];\r\n Notification.renderer.refresh();\r\n }\r\n\r\n private static container: HTMLDivElement;\r\n private static containerVNode: IJSLVNode;\r\n private static renderer: JSLRender;\r\n\r\n private static createContainer(): void {\r\n Notification.container = document.createElement(\"div\");\r\n document.body.appendChild(Notification.container);\r\n Notification.container.className = \"jsl-notification-container\";\r\n Notification.containerVNode = { tag: \"div\", children: [] };\r\n Notification.renderer = new JSLRender(Notification.container, false);\r\n Notification.renderer.render(Notification.containerVNode);\r\n }\r\n}\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","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, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\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 });\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 });\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 { 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, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\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 { 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","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 { handleKeydownLRNav, handleKeydownLRNoNav } from \"./slick.editors.nav\";\r\nimport { DatePicker, IDatePicker } from \"../ui/date.picker\";\r\nimport { date } from \"../core/date\";\r\n\r\nexport function DateEditor(args) {\r\n var input;\r\n var defaultValue;\r\n var scope = this;\r\n var datePicker: IDatePicker;\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 input.addEventListener(\"keydown\", navOnLR ? handleKeydownLRNav : handleKeydownLRNoNav);\r\n args.container.appendChild(input);\r\n datePicker = DatePicker(input, { mode: 'dp-below' });\r\n datePicker.on(\"close\", () => {\r\n input.focus();\r\n input.select();\r\n });\r\n input.focus();\r\n };\r\n\r\n this.destroy = function () {\r\n datePicker.destroy();\r\n input.remove();\r\n };\r\n\r\n this.show = function () {\r\n //so far not necessary\r\n };\r\n\r\n this.hide = function () {\r\n datePicker.close();\r\n };\r\n\r\n this.position = function (position) {\r\n //so far not necessary\r\n };\r\n\r\n this.focus = function () {\r\n input.focus();\r\n };\r\n\r\n this.loadValue = function (item) {\r\n defaultValue = date.onlyDate(item[args.column.field]);\r\n let val_as_str = date.format(defaultValue, args.column.format);\r\n input.value = val_as_str;\r\n input.select();\r\n\r\n };\r\n\r\n this.serializeValue = function () {\r\n return date.onlyDate(date.parse(input.value, args.column.format));\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)) && !date.equal(date.onlyDate(date.parse(input.value, args.column.format)), defaultValue);\r\n };\r\n\r\n this.validate = function () {\r\n if (args.column.validator) {\r\n var validationResults = args.column.validator(date.onlyDate(date.parse(input.value, args.column.format)));\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","import { JSLRender, IJSLVNode } from \"jsl-render\";\r\nimport { SelectComponent, ISelectRenderArg } from \"../components/select/SelectComponent\";\r\nimport { AutoSuggestComponent } from \"../components/auto-suggest/AutoSuggestComponent\";\r\n\r\n/*\r\n * Contains extended SlickGrid editors.\r\n */\r\n\r\n\r\nexport function MultiLookupEditor(args) {\r\n var select: SelectComponent;\r\n var defaultValue;\r\n // var scope = this;\r\n\r\n this.init = function () {\r\n // input = document.createElement(\"select\");\r\n args.container.addEventListener(\"keydown\", function (e) {\r\n if (e.which === 38 || e.which === 40) {\r\n e.stopImmediatePropagation();\r\n }\r\n // if (e.which === 13) {\r\n // e.stopImmediatePropagation();\r\n // }\r\n });\r\n\r\n let vl: string[] | { [key: string]: string } = args.column.valueList;\r\n let data = [];\r\n if (vl) {\r\n if (Array.isArray(vl)) {\r\n for (const element of vl) {\r\n if (typeof element === \"string\") {\r\n data.push({ text: element, value: element });\r\n } else {\r\n data.push(element);\r\n }\r\n }\r\n } else {\r\n for (const key in vl) {\r\n if (!vl.hasOwnProperty(key)) {\r\n continue;\r\n }\r\n data.push({ text: vl[key], value: key });\r\n }\r\n }\r\n } else {\r\n console.warn(\"No value list found for column \" + args.column.id);\r\n }\r\n\r\n select = new SelectComponent({\r\n data,\r\n dropdownWidth: args.column.width + \"px\",\r\n multiple: true,\r\n style: \"min-width:0;width:100%;position:absolute;top:0;right:0;bottom:0;left:0;\",\r\n openOnEnter: false,\r\n ...args.column.editorOptions\r\n });\r\n new JSLRender(args.container).render(select);\r\n //dropdown = DropDown(input, { data: data, multiple: true, searchable: false, defaultSelected: false });\r\n };\r\n\r\n this.destroy = function () {\r\n // TODO ? - or not?\r\n // dropdown.destroy();\r\n // input.parentElement.removeChild(input);\r\n };\r\n\r\n this.focus = function () {\r\n select.show();\r\n };\r\n\r\n this.getValue = function () {\r\n return select.getValue();\r\n };\r\n\r\n this.setValue = function (val) {\r\n select.setValue(val);\r\n };\r\n\r\n this.loadValue = function (item) {\r\n defaultValue = item[args.column.field] || [];\r\n select.setValue(defaultValue);\r\n setTimeout(function () { select.show(); }, 1);\r\n };\r\n\r\n this.serializeValue = function () {\r\n return select.getValue();\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 const a = defaultValue || [];\r\n const b = select.getValue() || [];\r\n return a.toString() !== b.toString();\r\n };\r\n\r\n this.validate = function () {\r\n if (args.column.validator) {\r\n var validationResults = args.column.validator(select.getValue());\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 interface ILookupEditorOptions {\r\n enableSearch?: boolean;\r\n class?: string;\r\n placeholder?: boolean;\r\n allowEmpty?: boolean;\r\n rowHeight?: number;\r\n onRender?: (args: ISelectRenderArg) => void | IJSLVNode;\r\n matchSearch?: (data: any, term: string) => boolean;\r\n}\r\n\r\nexport function LookupEditor(args) {\r\n // var input: HTMLDivElement;\r\n var dropdown: SelectComponent;\r\n var defaultValue;\r\n var scope = this;\r\n var reposition = true;\r\n\r\n this.keyCaptureList = function(which) {\r\n if (which === 13) {\r\n dropdown.show();\r\n return false;\r\n }\r\n if (which === 38 || which === 40) {\r\n if (dropdown.isExpanded()) {\r\n return false;\r\n }\r\n }\r\n };\r\n\r\n this.init = function () {\r\n // input = document.createElement(\"div\");\r\n\r\n let vl: string[] | { [key: string]: string } = args.column.valueList;\r\n let data = [];\r\n if (vl) {\r\n if (Array.isArray(vl)) {\r\n for (const element of vl) {\r\n if (typeof element === \"string\") {\r\n data.push({ text: element, value: element });\r\n } else {\r\n data.push(element);\r\n }\r\n }\r\n } else {\r\n for (const key in vl) {\r\n if (!vl.hasOwnProperty(key)) {\r\n continue;\r\n }\r\n data.push({ text: vl[key], value: key });\r\n }\r\n }\r\n } else {\r\n console.warn(\"No value list found for column \" + args.column.id);\r\n }\r\n // args.container.appendChild(input);\r\n dropdown = new SelectComponent({\r\n data,\r\n dropdownWidth: args.column.width + \"px\",\r\n style: \"min-width:0;width:100%;position:absolute;top:0;right:0;bottom:0;left:0;\",\r\n openOnEnter: false,\r\n // onAppend: (dom) => {\r\n // (args.grid as ISlickGrid<any>).getContainerNode().appendChild(dom);\r\n // },\r\n onChange: (e) => {\r\n args.commitChangesOnly();\r\n // args.grid.getEditorLock().commitChangesOnly();\r\n },\r\n ...args.column.editorOptions\r\n });\r\n //dropdown = DropDown(input, { ...{ data, searchable: false, defaultSelected: false, pagination: 100 }, ...args.column.editorOptions });\r\n new JSLRender(args.container, false).render(dropdown);\r\n // dropdown.show();\r\n };\r\n\r\n this.show = function () {\r\n reposition = true;\r\n // if (dropdown.isExpanded()) {\r\n // const dd = document.querySelector(\".sel-comp-dd\") as HTMLDivElement;\r\n // dd.style.display = \"\";\r\n // }\r\n };\r\n\r\n this.hide = function () {\r\n reposition = false;\r\n };\r\n\r\n this.position = function (position) {\r\n if (dropdown.isExpanded() && reposition) {\r\n const dd = document.querySelector(\".sel-comp-dd\") as HTMLDivElement;\r\n if (dd.classList.contains(\"sel-comp-dd-up\")) {\r\n dd.style.top = (position.top - dd.getBoundingClientRect().height) + \"px\";\r\n } else {\r\n dd.style.top = (position.top + args.grid.getOptions().rowHeight) + \"px\";\r\n }\r\n dd.style.left = (position.left) + \"px\";\r\n }\r\n };\r\n\r\n this.destroy = function () {\r\n dropdown.destroy();\r\n // input.parentElement.removeChild(input);\r\n };\r\n\r\n this.focus = function () {\r\n // input.focus();\r\n dropdown.show();\r\n };\r\n\r\n this.getValue = function () {\r\n return dropdown.getValue();\r\n };\r\n\r\n this.setValue = function (val) {\r\n dropdown.setValue(val != null ? val.toString() : val);\r\n };\r\n\r\n this.loadValue = function (item) {\r\n defaultValue = item[args.column.field];\r\n dropdown.setValue(defaultValue);\r\n };\r\n\r\n this.serializeValue = function () {\r\n return dropdown.getValue();\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 (dropdown.getValue() !== defaultValue);\r\n };\r\n\r\n this.validate = function () {\r\n if (args.column.validator) {\r\n var validationResults = args.column.validator(dropdown.getValue());\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\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nexport function AutoSuggestEditor(args) {\r\n // var input: HTMLDivElement;\r\n var dropdown: AutoSuggestComponent;\r\n var defaultValue;\r\n var scope = this;\r\n var reposition = true;\r\n\r\n this.keyCaptureList = function(which) {\r\n // if (which === 13) {\r\n // dropdown.show();\r\n // return false;\r\n // }\r\n if (which === 38 || which === 40) {\r\n // if (dropdown.isExpanded()) {\r\n return false;\r\n // }\r\n }\r\n };\r\n\r\n this.init = function () {\r\n // input = document.createElement(\"div\");\r\n\r\n let vl: string[] | { [key: string]: string } = args.column.valueList;\r\n let data = [];\r\n if (vl) {\r\n if (Array.isArray(vl)) {\r\n for (const element of vl) {\r\n if (typeof element === \"string\") {\r\n data.push({ text: element, value: element });\r\n } else {\r\n data.push(element);\r\n }\r\n }\r\n } else {\r\n for (const key in vl) {\r\n if (!vl.hasOwnProperty(key)) {\r\n continue;\r\n }\r\n data.push({ text: vl[key], value: key });\r\n }\r\n }\r\n } else {\r\n console.warn(\"No value list found for column \" + args.column.id);\r\n }\r\n\r\n // dropdown = new SelectComponent({\r\n // data,\r\n // dropdownWidth: args.column.width + \"px\",\r\n // style: \"min-width:0;width:100%;position:absolute;top:0;right:0;bottom:0;left:0;\",\r\n // openOnEnter: false,\r\n // // onAppend: (dom) => {\r\n // // (args.grid as ISlickGrid<any>).getContainerNode().appendChild(dom);\r\n // // },\r\n // ...args.column.editorOptions\r\n // });\r\n dropdown = new AutoSuggestComponent({\r\n style: \"min-width:0;width:100%;position:absolute;top:0;right:0;bottom:0;left:0;box-sizing:border-box;\",\r\n source: (val: string, suggest: (items: any[]) => void) => {\r\n const term = (val || \"\").toLowerCase();\r\n suggest(data.filter((x) => {\r\n return term === \"\" || x.text.toLowerCase().indexOf(term) >= 0;\r\n }).map((x) => x.text));\r\n },\r\n cache: false\r\n });\r\n\r\n new JSLRender(args.container, false).render(dropdown);\r\n dropdown.focus();\r\n };\r\n\r\n this.show = function () {\r\n reposition = true;\r\n };\r\n\r\n this.hide = function () {\r\n reposition = false;\r\n };\r\n\r\n this.position = function (position) {\r\n // if (dropdown.isExpanded() && reposition) {\r\n // const dd = document.querySelector(\".sel-comp-dd\") as HTMLDivElement;\r\n // if (dd.classList.contains(\"sel-comp-dd-up\")) {\r\n // dd.style.top = (position.top - dd.getBoundingClientRect().height) + \"px\";\r\n // } else {\r\n // dd.style.top = (position.top + args.grid.getOptions().rowHeight) + \"px\";\r\n // }\r\n // dd.style.left = (position.left) + \"px\";\r\n // }\r\n };\r\n\r\n this.destroy = function () {\r\n dropdown.getRef()?.destroy();\r\n };\r\n\r\n this.focus = function () {\r\n dropdown.focus();\r\n };\r\n\r\n this.getValue = function () {\r\n return dropdown.getValue();\r\n };\r\n\r\n this.setValue = function (val) {\r\n // dropdown.setValue(val != null ? val.toString() : val);\r\n dropdown.setValue(val || \"\");\r\n };\r\n\r\n this.loadValue = function (item) {\r\n defaultValue = item[args.column.field];\r\n // dropdown.setValue(defaultValue);\r\n dropdown.setValue(defaultValue || \"\");\r\n };\r\n\r\n this.serializeValue = function () {\r\n return dropdown.getValue();\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 (dropdown.getValue() !== defaultValue);\r\n };\r\n\r\n this.validate = function () {\r\n if (args.column.validator) {\r\n var validationResults = args.column.validator(dropdown.getValue());\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","import \"./SelectStyle.scss\";\r\nimport { IJSLComponent, IJSLVNode, JSLRender } from \"jsl-render\";\r\nimport { SelectDDAreaComponent } from \"./SelectDDAreaComponent\";\r\nimport { EventHandler } from \"../../interaction/eventhandler\";\r\nimport { IDataConverter } from \"../../interaction/dataconverter\";\r\n\r\nexport interface ISelectRenderArg<T = any> {\r\n data: T;\r\n node: IJSLVNode;\r\n isFocused: boolean;\r\n isSelected: boolean;\r\n isCurrent: boolean; // true if the current onRender call is for the currently selected entry inside the dropdown box header\r\n}\r\n\r\nexport interface ISelectComponentOptions<T = any, TValue = any, TBinding = any> {\r\n data: T[];\r\n style?: string;\r\n class?: string;\r\n placehoder?: string;\r\n rowHeight?: number;\r\n textColumn?: string;\r\n keyColumn?: string;\r\n dropdownWidth?: string;\r\n dropdownHeight?: string;\r\n dropdownClass?: string;\r\n dropDirection?: \"up\" | \"down\" | \"auto\";\r\n enableSearch?: boolean;\r\n enableAnimation?: boolean;\r\n allowEmpty?: boolean;\r\n onRender?: (args: ISelectRenderArg<T>) => void | IJSLVNode;\r\n matchSearch?: (data: T, term: string) => boolean;\r\n onAppend?: (dom: HTMLDivElement) => void; // use this to append to other container than \"body\"\r\n enableKeyboard?: boolean;\r\n multiple?: boolean;\r\n enabled?: boolean;\r\n bindTo?: TBinding;\r\n property?: keyof TBinding;\r\n converter?: IDataConverter<any, TValue>;\r\n bindMode?: \"toModel\" | \"fromModel\" | \"both\";\r\n onChange?: EventHandler<TValue, T> | ((keyValue?: TValue, item?: T) => void);\r\n value?: TValue;\r\n openOnEnter?: boolean;\r\n focusFirstItem?: boolean;\r\n openOnFocus?: boolean;\r\n autoShrink?: boolean;\r\n}\r\n\r\nexport class SelectComponent<T = any, TValue = any, TBinding = any> implements IJSLComponent {\r\n\r\n private static ENTER_KEY = 13;\r\n\r\n private expanded = false;\r\n private doNotFocus = false;\r\n\r\n private options: ISelectComponentOptions<T, TValue, TBinding>;\r\n private dropdownArea: HTMLDivElement;\r\n private dom: HTMLDivElement;\r\n private renderer: JSLRender;\r\n\r\n private focused: T;\r\n private selected: T | T[];\r\n\r\n public constructor(o: ISelectComponentOptions<T, TValue, TBinding>) {\r\n const defaultOptions: ISelectComponentOptions<T, TValue, TBinding> = {\r\n data: undefined,\r\n keyColumn: \"value\",\r\n textColumn: \"text\",\r\n dropdownHeight: \"10rem\",\r\n dropDirection: \"auto\",\r\n enableSearch: true,\r\n enableAnimation: true,\r\n enableKeyboard: true,\r\n rowHeight: 28,\r\n allowEmpty: true,\r\n enabled: true,\r\n openOnEnter: true,\r\n focusFirstItem: true,\r\n autoShrink: true,\r\n bindMode: \"toModel\",\r\n onAppend: (dom: HTMLDivElement) => {\r\n document.body.appendChild(dom);\r\n },\r\n onRender: o.multiple ? (args: ISelectRenderArg) => {\r\n if (args.isCurrent) {\r\n args.node.content = args.data.map((d) => d[this.options.textColumn]).join(\", \");\r\n } else {\r\n args.node.content = args.data[this.options.textColumn];\r\n }\r\n } : (args: ISelectRenderArg) => {\r\n args.node.content = args.data[this.options.textColumn];\r\n },\r\n matchSearch: (data: T, term: string) => ((data[this.options.textColumn] ?? \"\").toString().toLowerCase().indexOf(term.toLowerCase()) >= 0)\r\n };\r\n this.options = { ...defaultOptions, ...o };\r\n this.options.onChange = EventHandler.Create(o.onChange);\r\n if (this.options.bindTo != null && this.options.property != null && this.options.value == null) {\r\n this.options.value = (this.options.converter?.toUI ?\r\n this.options.converter.toUI(this.options.bindTo[this.options.property]) :\r\n this.options.bindTo[this.options.property]) as TValue;\r\n }\r\n this.setValue(this.options.value);\r\n }\r\n\r\n public render(): IJSLVNode {\r\n\r\n if (this.options.bindMode !== \"toModel\" && this.options.bindTo != null && this.options.property != null) {\r\n const value = this.options.converter?.toUI ?\r\n this.options.converter.toUI(this.options.bindTo[this.options.property]) :\r\n this.options.bindTo[this.options.property];\r\n if (value != null) {\r\n if (this.options.multiple) {\r\n this.selected = this.options.data.filter((x) => (value as unknown as any[]).indexOf(x[this.options.keyColumn]) >= 0);\r\n } else {\r\n this.selected = this.options.data.filter((x) => x[this.options.keyColumn] === value)[0];\r\n }\r\n } else {\r\n this.selected = this.options.multiple ? [] : null;\r\n }\r\n }\r\n\r\n return {\r\n tag: \"div\", attr: {\r\n style: this.options.style,\r\n class: \"select-comp \" + (this.expanded ? \"expanded \" : \"\") + (!this.options.enabled ? \"disabled \" : \"\") + (this.options.class ?? \"\"),\r\n mousedown: (e: MouseEvent) => { if (this.expanded || e.which === 3) { return; } { this.doNotFocus = true; this.show(); } }\r\n },\r\n children: [this.renderSelection(), {\r\n tag: \"button\", attr: {\r\n disabled: this.options.enabled ? undefined : \"disabled\",\r\n class: \"sel-expander\", keydown: (e: KeyboardEvent) => {\r\n if (this.options.openOnEnter && this.options.enabled) {\r\n if (e.which === SelectComponent.ENTER_KEY) {\r\n this.toggle();\r\n } else if (!this.expanded) {\r\n if (e.key && e.key.length === 1) {\r\n this.show(e.key);\r\n }\r\n }\r\n }\r\n }, focus: (e) => {\r\n if (!this.doNotFocus && this.options.openOnFocus && this.options.enabled) {\r\n this.toggle();\r\n }\r\n if (this.doNotFocus) {\r\n this.doNotFocus = false;\r\n }\r\n }\r\n }, content: this.expanded ? \"▲\" : \"▼\"\r\n }]\r\n };\r\n }\r\n\r\n public onCreate(node: IJSLVNode) {\r\n this.dom = node.dom as HTMLDivElement;\r\n }\r\n\r\n public onUpdate(node: IJSLVNode) {\r\n this.dom = node.dom as HTMLDivElement;\r\n }\r\n\r\n public onInit(renderer: JSLRender) {\r\n this.renderer = renderer;\r\n }\r\n\r\n public toggle() {\r\n this.expanded = !this.expanded;\r\n if (this.expanded) {\r\n this.show();\r\n } else {\r\n this.close();\r\n }\r\n }\r\n\r\n public isExpanded(): boolean {\r\n return this.expanded;\r\n }\r\n\r\n public show(searchTxt?: string) {\r\n if (!this.options.enabled) {\r\n return;\r\n }\r\n this.expanded = true;\r\n const dimension = this.dom.getBoundingClientRect();\r\n const left = Math.round(dimension.left + window.pageXOffset);\r\n const top = Math.round(dimension.top + window.pageYOffset);\r\n this.dropdownArea = document.createElement(\"div\");\r\n this.dropdownArea.className = \"sel-comp-dd \" + (this.options.dropdownClass ?? \"\");\r\n this.dropdownArea.style.width = this.options.dropdownWidth || (Math.round(dimension.width) + \"px\");\r\n this.dropdownArea.style.height = this.options.dropdownHeight;\r\n this.dropdownArea.style.left = left + \"px\";\r\n if (this.options.dropDirection === \"up\") {\r\n this.dropdownArea.style.top = \"calc(\" + top + \"px - \" + this.options.dropdownHeight + \")\";\r\n this.dropdownArea.classList.add(\"sel-comp-dd-up\");\r\n } else {\r\n this.dropdownArea.style.top = Math.round(top + dimension.height) + \"px\";\r\n this.dropdownArea.classList.add(\"sel-comp-dd-down\");\r\n }\r\n this.options.onAppend(this.dropdownArea);\r\n\r\n const ddDimension = this.dropdownArea.getBoundingClientRect();\r\n if (this.options.dropDirection === \"auto\") {\r\n // check if there is enought room for dropdown at bottom\r\n if (ddDimension.bottom > window.innerHeight) {\r\n // position \"up\"\r\n this.dropdownArea.style.top = \"calc(\" + Math.round(top) + \"px - \" + this.options.dropdownHeight + \")\";\r\n this.dropdownArea.classList.add(\"sel-comp-dd-up\");\r\n this.dropdownArea.classList.remove(\"sel-comp-dd-down\");\r\n }\r\n }\r\n\r\n const ddAreaComp = new SelectDDAreaComponent(this.options, this, {\r\n renderHeight: ddDimension.height - 2,\r\n searchTxt\r\n });\r\n if (this.options.autoShrink) {\r\n ddAreaComp.onRender.subscribe((data) => {\r\n let ddHeight;\r\n if (this.options.enableSearch) {\r\n ddHeight = Math.min((data.length * this.options.rowHeight + 4), ddDimension.height - 2) + \"px + 1.8rem\";\r\n this.dropdownArea.style.height = \"calc(\" + ddHeight + \")\";\r\n } else {\r\n ddHeight = Math.min((data.length * this.options.rowHeight + 4), ddDimension.height - 2) + \"px\";\r\n this.dropdownArea.style.height = ddHeight;\r\n }\r\n if (this.dropdownArea.classList.contains(\"sel-comp-dd-up\")) {\r\n this.dropdownArea.style.top = \"calc(\" + Math.round(top) + \"px - (\" + ddHeight + \"))\";\r\n }\r\n });\r\n }\r\n new JSLRender(this.dropdownArea, false).render(ddAreaComp);\r\n\r\n requestAnimationFrame(() => {\r\n const s = (this.dropdownArea.querySelector(\".sel-search input\") as HTMLInputElement);\r\n s.focus();\r\n s.selectionStart = s.selectionEnd = s.value.length;\r\n });\r\n\r\n }\r\n\r\n public destroy() {\r\n const x = document.querySelector(\".sel-comp-dd\");\r\n if (x != null && x.parentElement != null) {\r\n try {\r\n x.parentElement.removeChild(x);\r\n } catch (ex) {\r\n // under certain conditions the child may not be in the parentElements child collection anymore, although the child node still has that element as its parent (e.g. blur event handler) - weird JavaScript stuff eh\r\n }\r\n }\r\n this.expanded = false;\r\n }\r\n\r\n public close() {\r\n this.expanded = false;\r\n this.focused = null;\r\n this.doNotFocus = true;\r\n try {\r\n if (this.dropdownArea?.parentElement != null) {\r\n this.dropdownArea.parentElement.removeChild(this.dropdownArea);\r\n }\r\n if (this.renderer != null) {\r\n this.renderer.refresh();\r\n }\r\n (this.dom.querySelector(\".sel-expander\") as HTMLButtonElement).focus();\r\n } catch (e) {\r\n // https://stackoverflow.com/questions/21926083/failed-to-execute-removechild-on-node\r\n }\r\n }\r\n\r\n public setFocus(item: T) {\r\n this.focused = item;\r\n }\r\n\r\n public getFocus(): T {\r\n return this.focused;\r\n }\r\n\r\n public getValue(): any {\r\n if (this.selected == null) {\r\n return null;\r\n }\r\n if (this.options.multiple) {\r\n return (this.selected as any[]).map((itm) => itm[this.options.keyColumn]);\r\n } else {\r\n return this.selected[this.options.keyColumn];\r\n }\r\n }\r\n\r\n public setValue(value: any): void {\r\n if (value != null) {\r\n if (this.options.multiple) {\r\n this.selected = this.options.data.filter((x) => (value as any[]).indexOf(x[this.options.keyColumn]) >= 0);\r\n } else {\r\n this.selected = this.options.data.filter((x) => x[this.options.keyColumn] === value)[0];\r\n }\r\n } else {\r\n this.selected = this.options.multiple ? [] : null;\r\n }\r\n if (this.renderer != null) {\r\n this.renderer.refresh();\r\n }\r\n }\r\n\r\n public getSelected(): T | T[] {\r\n return this.selected;\r\n }\r\n\r\n public setSelected(item: T | T[]) {\r\n if (this.options.multiple) {\r\n if (item == null) {\r\n this.selected = [];\r\n } else {\r\n if (Array.isArray(item)) {\r\n this.selected = item;\r\n } else {\r\n (this.selected as any[]).push(item);\r\n }\r\n }\r\n } else {\r\n this.selected = item;\r\n }\r\n const value = this.getValue();\r\n if (this.options.bindMode !== \"fromModel\" && this.options.bindTo != null && this.options.property != null) {\r\n this.options.bindTo[this.options.property] =\r\n this.options.converter?.toData ? this.options.converter.toData(value) : value;\r\n }\r\n if (this.options.onChange != null) {\r\n (this.options.onChange as EventHandler<TValue, T>).notify(value, this.selected as T);\r\n }\r\n this.renderer.refresh();\r\n }\r\n\r\n public focus(): void {\r\n if (this.dom == null) {\r\n requestAnimationFrame(() => {\r\n if (this.dom != null) {\r\n (this.dom.querySelector(\".sel-expander\") as HTMLButtonElement)?.focus();\r\n }\r\n });\r\n } else {\r\n (this.dom.querySelector(\".sel-expander\") as HTMLButtonElement)?.focus();\r\n }\r\n }\r\n\r\n public hasSelection(): boolean {\r\n if (this.options.multiple) {\r\n return (this.selected as any[]).length > 0;\r\n }\r\n return this.selected != null;\r\n }\r\n\r\n protected renderSelection(): IJSLVNode {\r\n let node: IJSLVNode;\r\n if (this.hasSelection()) {\r\n node = { tag: \"div\", attr: { class: \"sel-dd-item\" } };\r\n const res = this.options.onRender({\r\n isSelected: true,\r\n isCurrent: true,\r\n isFocused: false,\r\n data: this.selected as T,\r\n node\r\n });\r\n if (res != null) {\r\n node.children = [res as IJSLVNode];\r\n }\r\n }\r\n let clearbtn: IJSLVNode;\r\n if (this.options.allowEmpty) {\r\n clearbtn = {\r\n tag: \"button\", content: \"✗\", attr: {\r\n disabled: this.options.enabled ? undefined : \"disabled\",\r\n title: \"clear\", class: \"clear-btn\", mousedown: (e: MouseEvent) => {\r\n if (!this.options.enabled) {\r\n return;\r\n }\r\n e.stopImmediatePropagation();\r\n this.setSelected(null);\r\n },\r\n click: (e: MouseEvent) => {\r\n this.setSelected(null);\r\n }\r\n }\r\n };\r\n }\r\n return {\r\n tag: \"div\", attr: { class: \"sel-result\" }, content: node != null ? undefined : this.options.placehoder,\r\n children: node == null ? undefined : [node, clearbtn]\r\n };\r\n }\r\n\r\n\r\n}\r\n","import { IJSLComponent, IJSLVNode, JSLRender } from \"jsl-render\";\r\nimport { ISelectComponentOptions, SelectComponent, ISelectRenderArg } from \"./SelectComponent\";\r\nimport { VirtualRenderComponent } from \"../virtual-render/VirtualRenderComponent\";\r\nimport { EventHandler } from \"../../interaction/eventhandler\";\r\n\r\nfunction isInternetExplorer(): boolean {\r\n return window.navigator.userAgent.indexOf(\"MSIE \") > 0 || !!window.navigator.userAgent.match(/Trident.*rv\\:11\\./);\r\n}\r\n\r\ninterface IDDArguments {\r\n renderHeight: number;\r\n searchTxt: string;\r\n}\r\n\r\nexport class SelectDDAreaComponent implements IJSLComponent {\r\n\r\n private static ESCAPE_KEY = 27;\r\n private static DOWN_KEY = 40;\r\n private static UP_KEY = 38;\r\n private static ENTER_KEY = 13;\r\n private static TAB_KEY = 9;\r\n\r\n public onRender = new EventHandler<any[]>();\r\n\r\n private filteredData: any[];\r\n\r\n private dom: HTMLDivElement;\r\n private scrollContainer: HTMLDivElement;\r\n private isScrolling = false;\r\n\r\n public constructor(private options: ISelectComponentOptions<any>, private component: SelectComponent, private args: IDDArguments) {\r\n if (args.searchTxt) {\r\n this.search(args.searchTxt);\r\n }\r\n this.focusFirst();\r\n }\r\n\r\n public onCreate(node: IJSLVNode) {\r\n this.dom = node.dom as HTMLDivElement;\r\n this.scrollContainer = this.dom.querySelector(\".sel-dd-items\") as HTMLDivElement;\r\n\r\n let item = this.component.getSelected();\r\n if (item != null) {\r\n if (Array.isArray(item)) {\r\n item = item[0];\r\n }\r\n if (item != null) {\r\n const d = this.filteredData ?? this.options.data;\r\n const idx = d.indexOf(item);\r\n this.scrollContainer.scrollTop = this.options.rowHeight * idx;\r\n }\r\n }\r\n\r\n //bugfix for IE -> blur event of search box is called when user clicks scroll bar\r\n if (isInternetExplorer()) {\r\n this.scrollContainer.addEventListener(\"scroll\", (e) => {\r\n this.isScrolling = true;\r\n setTimeout(() => {\r\n this.isScrolling = false;\r\n (this.dom.querySelector(\".sel-search input\") as HTMLInputElement).focus();\r\n }, 20);\r\n });\r\n this.scrollContainer.addEventListener(\"mousedown\", (e: MouseEvent) => {\r\n if (e.offsetX > this.scrollContainer.clientWidth || e.offsetY > this.scrollContainer.clientHeight) {\r\n this.isScrolling = true;\r\n setTimeout(() => {\r\n this.isScrolling = false;\r\n (this.dom.querySelector(\".sel-search input\") as HTMLInputElement).focus();\r\n }, 20);\r\n }\r\n });\r\n }\r\n }\r\n\r\n public render(): IJSLVNode {\r\n const data = this.filteredData ?? this.options.data;\r\n this.onRender.notify(data);\r\n const ddNode: IJSLVNode = {\r\n tag: \"div\", animation: this.options.enableAnimation ? { attr: \"opacity\", from: \"0\", to: \"1\", duration: 400 } : undefined, children: [\r\n {\r\n tag: \"div\", attr: { class: \"sel-search\", style: this.options.enableSearch ? undefined : \"height:0;padding:0;margin:0;border:none;\" },\r\n children: [\r\n {\r\n tag: \"input\", attr: {\r\n type: \"text\", value: this.args.searchTxt, placeholder: \"Search\", blur: (e) => {\r\n e.preventDefault();\r\n if (isInternetExplorer()) {\r\n requestAnimationFrame(() => {\r\n if (!this.isScrolling) {\r\n this.component.close();\r\n }\r\n });\r\n } else {\r\n this.component.close();\r\n }\r\n return false;\r\n }, input: (e, node: IJSLVNode) => {\r\n if (!this.options.enableSearch) {\r\n return false;\r\n }\r\n const term = (node.dom as HTMLInputElement).value;\r\n if (!term) {\r\n this.clearSearch();\r\n } else {\r\n this.search(term);\r\n }\r\n }, keydown: (e: KeyboardEvent, node: IJSLVNode) => {\r\n if (!this.options.enableKeyboard) {\r\n return;\r\n }\r\n if (e.which === SelectDDAreaComponent.ESCAPE_KEY) {\r\n node.dom.blur();\r\n } else if (e.which === SelectDDAreaComponent.DOWN_KEY) {\r\n this.navigateDown();\r\n } else if (e.which === SelectDDAreaComponent.UP_KEY) {\r\n this.navigateUp();\r\n } else if (e.which === SelectDDAreaComponent.ENTER_KEY) { // TODO: multiselect\r\n let focus = this.component.getFocus();\r\n if (focus == null) {\r\n // if only 1 result is left then auto select this entry\r\n const d = this.filteredData ?? this.options.data;\r\n if (d.length === 1) {\r\n focus = d[0];\r\n }\r\n }\r\n\r\n if (this.options.multiple) {\r\n if (focus != null) {\r\n const currentSelection = this.component.getSelected() as any[];\r\n if (currentSelection.indexOf(focus) >= 0) {\r\n currentSelection.splice(currentSelection.indexOf(focus), 1);\r\n } else {\r\n currentSelection.push(focus);\r\n }\r\n this.component.setSelected(currentSelection);\r\n }\r\n } else {\r\n if (focus != null) {\r\n this.component.setSelected(focus);\r\n }\r\n node.dom.blur();\r\n }\r\n } else if (e.which === SelectDDAreaComponent.TAB_KEY) {\r\n e.preventDefault();\r\n node.dom.blur();\r\n }\r\n }\r\n }\r\n }\r\n ]\r\n },\r\n new VirtualRenderComponent({\r\n class: \"sel-dd-items\" + (this.options.multiple ? \" multiple\" : \"\"), data,\r\n style: this.options.enableSearch ? \"height:calc(100% - 1.8rem)\" : \"height:100%\",\r\n viewportSizeInPX: this.args.renderHeight + 20,\r\n bufferSizeInPx: 20,\r\n renderRow: (args) => {\r\n const result: IJSLVNode = { tag: \"div\", attr: { class: \"sel-dd-item\" } };\r\n const renderArg: ISelectRenderArg = {\r\n data: args.rowData,\r\n node: result,\r\n isFocused: this.component.getFocus() === args.rowData,\r\n isSelected: this.options.multiple ?\r\n (this.component.getSelected() as any[]).indexOf(args.rowData) >= 0 :\r\n this.component.getSelected() === args.rowData,\r\n isCurrent: false\r\n };\r\n if (renderArg.isFocused) {\r\n result.attr.class += \" focused\";\r\n }\r\n if (renderArg.isSelected) {\r\n result.attr.class += \" selected\";\r\n }\r\n result.attr.mousedown = (evt: MouseEvent) => {\r\n if (this.options.multiple) {\r\n evt.preventDefault(),\r\n evt.stopPropagation();\r\n evt.stopImmediatePropagation();\r\n const currentSelection = this.component.getSelected() as any[];\r\n if (currentSelection.indexOf(args.rowData) >= 0) {\r\n currentSelection.splice(currentSelection.indexOf(args.rowData), 1);\r\n this.component.setSelected(currentSelection);\r\n } else {\r\n this.component.setSelected(args.rowData);\r\n }\r\n } else {\r\n this.component.setSelected(args.rowData);\r\n }\r\n };\r\n const res = this.options.onRender(renderArg);\r\n if (res != null) {\r\n result.children = [res as IJSLVNode];\r\n }\r\n return result;\r\n },\r\n rowHeight: this.options.rowHeight\r\n })\r\n ]\r\n };\r\n return ddNode;\r\n }\r\n\r\n public navigateDown() {\r\n const d = this.filteredData ?? this.options.data;\r\n let selItem = this.component.getFocus() ?? this.component.getSelected();\r\n if (selItem == null) {\r\n this.component.setFocus(d[0]);\r\n return;\r\n }\r\n if (Array.isArray(selItem)) {\r\n selItem = selItem[0];\r\n }\r\n const idx = d.indexOf(selItem);\r\n if (idx < 0) {\r\n this.component.setFocus(d[0]);\r\n } else if (idx < d.length - 1) {\r\n this.component.setFocus(d[idx + 1]);\r\n this.scrollContainer.scrollTop = this.options.rowHeight * idx;\r\n // this.scrollContainer.scrollTop += this.options.rowHeight; // TODO: fune tuning needed when currently selected item is already outside of bounds\r\n }\r\n }\r\n\r\n public navigateUp() {\r\n const d = this.filteredData ?? this.options.data;\r\n let selItem = this.component.getFocus() ?? this.component.getSelected();\r\n if (selItem == null) {\r\n this.component.setFocus(d[0]);\r\n return;\r\n }\r\n if (Array.isArray(selItem)) {\r\n selItem = selItem[0];\r\n }\r\n const idx = d.indexOf(selItem);\r\n if (idx > 0) {\r\n this.component.setFocus(d[idx - 1]);\r\n this.scrollContainer.scrollTop = this.options.rowHeight * (idx - 1);\r\n // this.scrollContainer.scrollTop -= this.options.rowHeight; // TODO: fune tuning needed when currently selected item is already outside of bounds\r\n return;\r\n }\r\n this.component.setFocus(d[0]);\r\n }\r\n\r\n public search(term: string) {\r\n const oldLen = this.filteredData?.length ?? 0;\r\n this.filteredData = this.options.data.filter((d) => this.options.matchSearch(d, term));\r\n const newLen = this.filteredData?.length ?? 0;\r\n if (oldLen !== newLen && this.scrollContainer != null) {\r\n this.scrollContainer.scrollTop = 0;\r\n }\r\n this.focusFirst();\r\n }\r\n\r\n public clearSearch() {\r\n this.filteredData = null;\r\n this.focusFirst();\r\n }\r\n\r\n private focusFirst() {\r\n if (this.options.focusFirstItem && (this.component.getSelected() == null || this.component.getSelected().length === 0)) /* TODO multiselect */ {\r\n this.component.setFocus((this.filteredData ?? this.options.data)[0]);\r\n }\r\n }\r\n\r\n}\r\n","import { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\nimport { IAutoSuggestOptions, AutoSuggest, IAutoSuggest } from \"../../ui/auto.suggest\";\r\nimport { helper } from \"../../core/helper\";\r\n\r\nexport interface IAutoSuggestComponentOptions extends IAutoSuggestOptions {\r\n // id?: string;´\r\n value?: string;\r\n class?: string;\r\n style?: string;\r\n placeholder?: string;\r\n}\r\n\r\nexport class AutoSuggestComponent implements IJSLComponent {\r\n\r\n private ref: IAutoSuggest;\r\n private dom: HTMLInputElement;\r\n\r\n public constructor(private options: IAutoSuggestComponentOptions) {\r\n // this.id = this.options.id ?? helper.newDomGuid();\r\n }\r\n\r\n public render(): IJSLVNode {\r\n return {\r\n tag: \"input\",\r\n attr: { value: this.options.value, class: this.options.class, style: this.options.style, placeholder: this.options.placeholder ?? \"\" }\r\n };\r\n }\r\n\r\n public getRef(): IAutoSuggest {\r\n return this.ref;\r\n }\r\n\r\n public getValue(): string {\r\n if (this.dom == null) {\r\n return \"\";\r\n }\r\n return this.dom.value;\r\n }\r\n\r\n public setValue(val: string): void {\r\n if (this.dom == null) {\r\n return;\r\n }\r\n this.dom.value = val;\r\n }\r\n\r\n public focus(): void {\r\n if (this.dom == null) {\r\n return;\r\n }\r\n this.dom.focus();\r\n }\r\n\r\n public onCreate(node: IJSLVNode) {\r\n this.dom = node.dom as HTMLInputElement;\r\n AutoSuggest(node.dom, this.options);\r\n }\r\n\r\n public onUpdate(node: IJSLVNode) {\r\n this.dom = node.dom as HTMLInputElement;\r\n }\r\n\r\n public onRemove() {\r\n if (this.ref != null) {\r\n this.ref.destroy();\r\n }\r\n }\r\n\r\n}\r\n","import \"./auto.suggest.css\";\r\n\r\n\r\n// tslint:disable: no-conditional-assignment\r\n// tslint:disable: only-arrow-functions\r\n// tslint:disable: quotemark\r\n\r\n/*\r\n JavaScript autoComplete v1.0.4\r\n Copyright (c) 2014 Simon Steinberger / Pixabay\r\n GitHub: https://github.com/Pixabay/JavaScript-autoComplete\r\n License: http://www.opensource.org/licenses/mit-license.php\r\n*/\r\n\r\nexport interface IAutoSuggestOptions {\r\n selector?: HTMLElement | string;\r\n source: (val: string, suggest: (items: any[]) => void) => void;\r\n minChars?: number;\r\n delay?: number;\r\n offsetLeft?: number;\r\n offsetTop?: number;\r\n cache?: boolean;\r\n menuClass?: string;\r\n renderItem?: (item: any, search: string) => string;\r\n onSelect?: (e: any, term: string, dom: HTMLElement) => void;\r\n}\r\n\r\nexport interface IAutoSuggest {\r\n destroy: () => void;\r\n // TODO: are there any more?\r\n}\r\n\r\nlet autoComplete = (function() {\r\n\r\n function autoComplete(options: IAutoSuggestOptions) {\r\n\r\n // helpers\r\n function hasClass(el, className) { return el.classList.contains(className); }\r\n\r\n function addEvent(el, type, handler) {\r\n el.addEventListener(type, handler);\r\n }\r\n function removeEvent(el, type, handler) {\r\n // if (el.removeEventListener) not working in IE11\r\n el.removeEventListener(type, handler);\r\n }\r\n function live(elClass, event, cb, context) {\r\n addEvent(context || document, event, function(e) {\r\n let found: boolean;\r\n let el = e.target || e.srcElement;\r\n while (el && !(found = hasClass(el, elClass))) { el = el.parentElement; }\r\n if (found) { cb.call(el, e); }\r\n });\r\n }\r\n\r\n const o: IAutoSuggestOptions = {\r\n selector: \"\",\r\n source: function (val, s) { return []; },\r\n minChars: 0,\r\n delay: 150,\r\n offsetLeft: 0,\r\n offsetTop: 1,\r\n cache: false,\r\n menuClass: '',\r\n renderItem: function(item, search) {\r\n // escape special characters\r\n search = search.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\r\n var re = new RegExp(\"(\" + search.split(' ').join('|') + \")\", \"gi\");\r\n return '<div class=\"autocomplete-suggestion\" data-val=\"' + item + '\">' + item.replace(re, \"<b>$1</b>\") + '</div>';\r\n },\r\n onSelect: function(e, term, item) { }\r\n };\r\n for (const k in options) { if (options.hasOwnProperty(k)) { o[k] = options[k]; } }\r\n\r\n // init\r\n let elems = typeof o.selector === 'object' ? [o.selector] : document.querySelectorAll(o.selector as string);\r\n for (let i = 0; i < elems.length; i++) {\r\n let that: any = elems[i];\r\n\r\n // create suggestions container \"sc\"\r\n that.sc = document.createElement('div');\r\n that.sc.className = 'autocomplete-suggestions ' + o.menuClass;\r\n\r\n that.autocompleteAttr = that.getAttribute('autocomplete');\r\n that.setAttribute('autocomplete', 'off');\r\n that.cache = {};\r\n that.last_val = '';\r\n\r\n that.updateSC = function(resize, next) {\r\n var rect = that.getBoundingClientRect();\r\n that.sc.style.left = Math.round(rect.left + (window.pageXOffset || document.documentElement.scrollLeft) + o.offsetLeft) + 'px';\r\n that.sc.style.top = Math.round(rect.bottom + (window.pageYOffset || document.documentElement.scrollTop) + o.offsetTop) + 'px';\r\n that.sc.style.width = Math.round(rect.right - rect.left) + 'px'; // outerWidth\r\n if (!resize) {\r\n that.sc.style.display = 'block';\r\n if (!that.sc.maxHeight) {\r\n that.sc.maxHeight = parseInt((window.getComputedStyle ? getComputedStyle(that.sc, null) : that.sc.currentStyle).maxHeight, 10);\r\n }\r\n if (!that.sc.suggestionHeight) { that.sc.suggestionHeight = that.sc.querySelector('.autocomplete-suggestion').offsetHeight; }\r\n if (that.sc.suggestionHeight) {\r\n if (!next) { that.sc.scrollTop = 0; } else {\r\n var scrTop = that.sc.scrollTop, selTop = next.getBoundingClientRect().top - that.sc.getBoundingClientRect().top;\r\n if (selTop + that.sc.suggestionHeight - that.sc.maxHeight > 0) {\r\n that.sc.scrollTop = selTop + that.sc.suggestionHeight + scrTop - that.sc.maxHeight;\r\n } else if (selTop < 0) {\r\n that.sc.scrollTop = selTop + scrTop;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n addEvent(window, 'resize', that.updateSC);\r\n document.body.appendChild(that.sc);\r\n\r\n live('autocomplete-suggestion', 'mouseleave', function(e) {\r\n const sel = that.sc.querySelector('.autocomplete-suggestion.selected');\r\n if (sel) { setTimeout(function() { sel.className = sel.className.replace('selected', ''); }, 20); }\r\n }, that.sc);\r\n\r\n live('autocomplete-suggestion', 'mouseover', function(e) {\r\n const sel = that.sc.querySelector('.autocomplete-suggestion.selected');\r\n if (sel) { sel.className = sel.className.replace('selected', ''); }\r\n this.className += ' selected';\r\n }, that.sc);\r\n\r\n live('autocomplete-suggestion', 'mousedown', function(e) {\r\n // window.setTimeout(() => {\r\n if (hasClass(this, 'autocomplete-suggestion')) { // else outside click\r\n const v = this.getAttribute('data-val');\r\n that.value = v;\r\n o.onSelect(e, v, this);\r\n that.sc.style.display = 'none';\r\n }\r\n // }, 1000);\r\n }, that.sc);\r\n\r\n that.blurHandler = function() {\r\n //var over_sb;\r\n //try { over_sb = document.querySelector('.autocomplete-suggestions:hover'); } catch (e) { over_sb = 0; }\r\n //if (!over_sb) {\r\n that.last_val = that.value;\r\n that.sc.style.display = 'none';\r\n //setTimeout(function() { that.sc.style.display = 'none'; }, 350); // hide suggestions on fast input\r\n //} else if (that !== document.activeElement) { setTimeout(function() { that.focus(); }, 200); }\r\n };\r\n addEvent(that, 'blur', that.blurHandler);\r\n\r\n var suggest = function(data) {\r\n var val = that.value;\r\n that.cache[val] = data;\r\n if (data.length && val.length >= o.minChars) {\r\n var s = '';\r\n for (var i = 0; i < data.length; i++) { s += o.renderItem(data[i], val); }\r\n that.sc.innerHTML = s;\r\n that.updateSC(0);\r\n } else {\r\n that.sc.style.display = 'none';\r\n }\r\n };\r\n\r\n that.keydownHandler = function(e) {\r\n var key = window.event ? e.keyCode : e.which;\r\n // down (40), up (38)\r\n if ((key === 40 || key === 38) && that.sc.innerHTML) {\r\n var next, sel = that.sc.querySelector('.autocomplete-suggestion.selected');\r\n if (!sel) {\r\n next = (key == 40) ? that.sc.querySelector('.autocomplete-suggestion') : that.sc.childNodes[that.sc.childNodes.length - 1]; // first : last\r\n next.className += ' selected';\r\n that.value = next.getAttribute('data-val');\r\n } else {\r\n next = (key == 40) ? sel.nextSibling : sel.previousSibling;\r\n if (next) {\r\n sel.className = sel.className.replace('selected', '');\r\n next.className += ' selected';\r\n that.value = next.getAttribute('data-val');\r\n } else { sel.className = sel.className.replace('selected', ''); that.value = that.last_val; next = 0; }\r\n }\r\n that.updateSC(0, next);\r\n return false;\r\n } else if (key == 27) { that.value = that.last_val; that.sc.style.display = 'none'; } else if (key == 13 || key == 9) {\r\n var sel = that.sc.querySelector('.autocomplete-suggestion.selected');\r\n if (sel && that.sc.style.display != 'none') { o.onSelect(e, sel.getAttribute('data-val'), sel); setTimeout(function() { that.sc.style.display = 'none'; }, 20); }\r\n }\r\n };\r\n addEvent(that, 'keydown', that.keydownHandler);\r\n\r\n that.keyupHandler = function(e) {\r\n var key = window.event ? e.keyCode : e.which;\r\n if (!key || (key < 35 || key > 40) && key != 13 && key != 27) {\r\n var val = that.value;\r\n if (val.length >= o.minChars) {\r\n if (val != that.last_val) {\r\n that.last_val = val;\r\n clearTimeout(that.timer);\r\n if (o.cache) {\r\n if (val in that.cache) { suggest(that.cache[val]); return; }\r\n // no requests if previous suggestions were empty\r\n for (var i = 1; i < val.length - o.minChars; i++) {\r\n var part = val.slice(0, val.length - i);\r\n if (part in that.cache && !that.cache[part].length) { suggest([]); return; }\r\n }\r\n }\r\n that.timer = setTimeout(function() { o.source(val, suggest); }, o.delay);\r\n }\r\n } else {\r\n that.last_val = val;\r\n that.sc.style.display = 'none';\r\n }\r\n }\r\n };\r\n addEvent(that, 'keyup', that.keyupHandler);\r\n\r\n that.focusHandler = function(e) {\r\n that.last_val = '\\n';\r\n that.keyupHandler(e);\r\n };\r\n if (!o.minChars) { addEvent(that, 'focus', that.focusHandler); }\r\n }\r\n\r\n // public destroy method\r\n this.destroy = function() {\r\n for (var i = 0; i < elems.length; i++) {\r\n var that: any = elems[i];\r\n removeEvent(window, 'resize', that.updateSC);\r\n removeEvent(that, 'blur', that.blurHandler);\r\n removeEvent(that, 'focus', that.focusHandler);\r\n removeEvent(that, 'keydown', that.keydownHandler);\r\n removeEvent(that, 'keyup', that.keyupHandler);\r\n if (that.autocompleteAttr) {\r\n that.setAttribute('autocomplete', that.autocompleteAttr);\r\n } else {\r\n that.removeAttribute('autocomplete');\r\n }\r\n document.body.removeChild(that.sc);\r\n that = null;\r\n }\r\n };\r\n }\r\n return autoComplete;\r\n})();\r\n\r\nexport function AutoSuggest(input: HTMLElement | string, opts: IAutoSuggestOptions): IAutoSuggest {\r\n return new autoComplete({selector: input, ...opts});\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} ","import \"./ProgressStyle.scss\";\r\nimport { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\nimport { numeric } from \"../../core/numeric\";\r\n\r\nexport interface IProgressComponentOptions {\r\n color?: string;\r\n showPercent?: boolean;\r\n percentFormat?: string;\r\n class?: string;\r\n style?: string;\r\n}\r\n\r\nexport class ProgressComponent implements IJSLComponent {\r\n\r\n public constructor(private progress: number, private options?: IProgressComponentOptions) {\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 render(): IJSLVNode {\r\n let style = \"width: \" + this.progress + \"%\";\r\n if (this.options?.color) {\r\n style += \";background:\" + this.options.color;\r\n }\r\n if (this.options?.style) {\r\n style += \";\" + this.options.style;\r\n }\r\n let content = \"\";\r\n if (this.options?.showPercent) {\r\n content = numeric.format(this.progress, this.options?.percentFormat ?? \"0. %\");\r\n }\r\n return {\r\n tag: \"div\",\r\n attr: { class: \"progress-comp \" + (this.options?.class ?? \"\") },\r\n children: [{\r\n tag: \"div\",\r\n attr: { class: \"bar\", style },\r\n content\r\n }]\r\n };\r\n }\r\n\r\n public setProgress(progress: number): void {\r\n this.progress = progress;\r\n }\r\n\r\n public getProgress(): number {\r\n return this.progress;\r\n }\r\n\r\n}\r\n","import { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\nimport { DatePicker, IDatePickerOptions, IDatePicker } from \"../../ui/date.picker\";\r\nimport { date } from \"../../core/date\";\r\nimport { helper } from \"../../core/helper\";\r\nimport { EventHandler } from \"../../interaction/eventhandler\";\r\nimport { IDataConverter } from \"../../interaction/dataconverter\";\r\n\r\nexport interface IDateComponentOptions<T = any> extends IDatePickerOptions {\r\n id?: string;\r\n class?: string;\r\n style?: string;\r\n placeholder?: string;\r\n value?: Date;\r\n onChange?: EventHandler<Date> | ((v?: Date) => void);\r\n bindTo?: T;\r\n property?: keyof T;\r\n bindMode?: \"toModel\" | \"fromModel\" | \"both\";\r\n converter?: IDataConverter<any, Date>;\r\n enabled?: boolean;\r\n}\r\n\r\nexport class DateComponent<T = any> implements IJSLComponent {\r\n\r\n private options: IDateComponentOptions<T>;\r\n private ref: IDatePicker;\r\n private currentDom: HTMLInputElement;\r\n\r\n public constructor(options: IDateComponentOptions<T>) {\r\n this.options = { ...{ enabled: true, id: helper.newDomGuid(), bindMode: \"toModel\" }, ...options };\r\n if (this.options.bindTo != null && this.options.property != null && this.options.value == null) {\r\n this.options.value = (this.options.converter?.toUI ?\r\n this.options.converter.toUI(this.options.bindTo[this.options.property]) :\r\n this.options.bindTo[this.options.property]) as Date;\r\n }\r\n this.options.onChange = EventHandler.Create(this.options.onChange);\r\n }\r\n\r\n get onChange(): EventHandler<Date> {\r\n return this.options.onChange as EventHandler<Date>;\r\n }\r\n\r\n public render(): IJSLVNode {\r\n let val = this.options.value;\r\n if (this.options.bindMode !== \"toModel\" && this.options.bindTo != null && this.options.property != null) {\r\n const current = this.getValue();\r\n const newVal = (this.options.converter?.toUI ?\r\n this.options.converter.toUI(this.options.bindTo[this.options.property]) :\r\n this.options.bindTo[this.options.property]) as Date;\r\n const newValStr = date.format(newVal);\r\n if (newValStr !== current) {\r\n val = newVal;\r\n if (this.currentDom != null) {\r\n this.currentDom.value = newValStr;\r\n }\r\n }\r\n }\r\n return {\r\n tag: \"input\",\r\n attr: {\r\n id: this.options.id,\r\n class: this.options.class,\r\n style: this.options.style,\r\n disabled: !this.options.enabled ? \"disabled\" : undefined,\r\n placeholder: this.options.placeholder,\r\n value: date.format(val),\r\n change: this.raiseEvent,\r\n }\r\n };\r\n }\r\n\r\n public getValue(): string {\r\n if (this.currentDom == null) {\r\n return \"\";\r\n }\r\n return this.currentDom.value;\r\n }\r\n\r\n public getValueAsDate(): Date {\r\n if (this.currentDom == null) {\r\n return null;\r\n }\r\n if (this.options.parse) {\r\n return this.options.parse(this.currentDom.value);\r\n }\r\n return date.parse(this.currentDom.value);\r\n }\r\n\r\n public getRef(): IDatePicker {\r\n return this.ref;\r\n }\r\n\r\n public onCreate(node: IJSLVNode) {\r\n this.currentDom = node.dom as HTMLInputElement;\r\n this.ref = DatePicker(this.currentDom, this.options);\r\n }\r\n\r\n public onUpdate(node: IJSLVNode) {\r\n this.currentDom = node.dom as HTMLInputElement;\r\n }\r\n\r\n public onRemove() {\r\n if (this.ref != null) {\r\n this.ref.destroy();\r\n }\r\n }\r\n\r\n private raiseEvent(e: any, node: IJSLVNode) {\r\n if (this.options.enabled) {\r\n const val = date.parse((node.dom as HTMLInputElement).value);\r\n if (this.options.bindTo && this.options.bindMode !== \"fromModel\" && this.options.property) {\r\n this.options.bindTo[this.options.property] =\r\n this.options.converter?.toData ? this.options.converter.toData(val) : val;\r\n }\r\n (this.options.onChange as EventHandler<Date>).notify(val);\r\n }\r\n }\r\n\r\n}\r\n","import \"./TimeComponent.scss\";\r\nimport { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\nimport { EventHandler } from \"../../interaction/eventhandler\";\r\nimport { IDataConverter } from \"../../interaction/dataconverter\";\r\nimport { helper } from \"../../core/helper\";\r\nimport { date } from \"../../core/date\";\r\n\r\nexport interface ITimeComponentOptions<T> {\r\n id?: string;\r\n class?: string;\r\n style?: string;\r\n placeholder?: string;\r\n value?: Date;\r\n onChange?: EventHandler<Date> | ((v?: Date) => void);\r\n bindTo?: T;\r\n property?: keyof T;\r\n bindMode?: \"toModel\" | \"fromModel\" | \"both\";\r\n converter?: IDataConverter<any, Date>;\r\n enabled?: boolean;\r\n inputMode?: \"HourMinute\" | \"HourMinuteSecond\";\r\n}\r\n\r\nexport class TimeComponent<T = any> implements IJSLComponent {\r\n\r\n private options: ITimeComponentOptions<T>;\r\n\r\n private currentDom: HTMLInputElement;\r\n\r\n public constructor(options: ITimeComponentOptions<T>) {\r\n this.options = {\r\n ...{\r\n enabled: true,\r\n id: helper.newDomGuid(),\r\n inputMode: \"HourMinute\",\r\n bindMode: \"toModel\",\r\n placeholder: options?.inputMode === \"HourMinuteSecond\" ? \"__:__:__\" : \"__:__\"\r\n }, ...options\r\n };\r\n if (this.options.bindTo != null && this.options.bindMode !== \"fromModel\" && this.options.property != null && this.options.value == null) {\r\n this.options.value = (this.options.converter?.toUI ?\r\n this.options.converter.toUI(this.options.bindTo[this.options.property]) :\r\n this.options.bindTo[this.options.property]) as Date;\r\n }\r\n this.options.onChange = EventHandler.Create(this.options.onChange);\r\n }\r\n\r\n public render(): IJSLVNode {\r\n let val = this.options.value;\r\n if (this.options.bindMode !== \"toModel\" && this.options.bindTo != null && this.options.property != null) {\r\n const current = this.getValue();\r\n const newVal = (this.options.converter?.toUI ?\r\n this.options.converter.toUI(this.options.bindTo[this.options.property]) :\r\n this.options.bindTo[this.options.property]) as Date;\r\n const newValStr = date.formatTime(newVal, this.options.inputMode);\r\n if (newValStr !== current) {\r\n val = newVal;\r\n if (this.currentDom != null) {\r\n this.currentDom.value = newValStr;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n tag: \"input\", attr: {\r\n id: this.options.id,\r\n enabled: this.options.enabled,\r\n value: date.formatTime(val, this.options.inputMode),\r\n class: \"time-comp \" + (this.options.class ?? \"\"),\r\n style: this.options.style,\r\n placeholder: this.options.placeholder,\r\n change: this.raiseChangeEvent\r\n }\r\n };\r\n }\r\n\r\n public onCreate(node: IJSLVNode) {\r\n this.currentDom = node.dom as HTMLInputElement;\r\n }\r\n\r\n public onUpdate(node: IJSLVNode) {\r\n this.currentDom = node.dom as HTMLInputElement;\r\n }\r\n\r\n public getValue(): string {\r\n if (this.currentDom == null) {\r\n return \"\";\r\n }\r\n return this.currentDom.value;\r\n }\r\n\r\n public getValueAsDate(datePart: Date): Date {\r\n const x = datePart ? new Date(datePart.getTime()) : new Date();\r\n try {\r\n const parts = this.getValue().split(\":\");\r\n x.setHours(parseInt(parts[0], 10));\r\n if (parts.length > 1) {\r\n x.setMinutes(parseInt(parts[1], 10));\r\n } else {\r\n x.setMinutes(0);\r\n }\r\n if (this.options.inputMode === \"HourMinuteSecond\" && parts.length > 2) {\r\n x.setSeconds(parseInt(parts[2], 10));\r\n } else {\r\n x.setSeconds(0);\r\n }\r\n } catch (e) {\r\n console.log(e);\r\n this.currentDom.value = \"\";\r\n x.setHours(0);\r\n x.setMinutes(0);\r\n x.setSeconds(0);\r\n }\r\n return x;\r\n }\r\n\r\n private raiseChangeEvent(e: any, node: IJSLVNode) {\r\n if (this.options.enabled) {\r\n const val = this.getValueAsDate(this.options.value);\r\n if (this.options.bindTo && this.options.bindMode !== \"fromModel\" && this.options.property) {\r\n this.options.bindTo[this.options.property] =\r\n this.options.converter?.toData ? this.options.converter.toData(val) : val;\r\n }\r\n (this.options.onChange as EventHandler<Date>).notify(val);\r\n }\r\n }\r\n\r\n}\r\n","import \"./DateTimeStyle.scss\";\r\nimport { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\nimport { EventHandler } from \"../../interaction/eventhandler\";\r\nimport { IDateComponentOptions, DateComponent } from \"../date/DateComponent\";\r\nimport { TimeComponent, ITimeComponentOptions } from \"../time/TimeComponent\";\r\n\r\nexport interface IDateTimeComponentOptions<T> extends IDateComponentOptions<T>, ITimeComponentOptions<T> {}\r\n\r\nexport class DateTimeComponent<T = any> implements IJSLComponent {\r\n\r\n private options: IDateTimeComponentOptions<T>;\r\n\r\n private dateComp: DateComponent<T>;\r\n\r\n private timeComp: TimeComponent<T>;\r\n\r\n public constructor(options: IDateTimeComponentOptions<T>) {\r\n if (options.bindMode && options.bindMode !== \"toModel\") {\r\n throw new Error(\"Currently DateTimeComponent only supports toModel as bindMode\");\r\n }\r\n this.options = {...options};\r\n this.options.onChange = EventHandler.Create(this.options.onChange);\r\n const optionsCopy = {...options};\r\n optionsCopy.bindTo = null;\r\n optionsCopy.property = null;\r\n optionsCopy.converter = null;\r\n optionsCopy.onChange = () => {\r\n const val = this.getValueAsDate();\r\n if (this.options.bindTo && options.property) {\r\n this.options.bindTo[options.property] =\r\n this.options.converter?.toData ? this.options.converter.toData(val) : val;\r\n }\r\n (this.options.onChange as EventHandler<Date>).notify(val);\r\n };\r\n this.dateComp = new DateComponent(optionsCopy);\r\n this.timeComp = new TimeComponent(optionsCopy);\r\n }\r\n\r\n public render(): IJSLVNode {\r\n return {tag: \"div\", attr: {class: \"date-time-comp\"}, children: [\r\n this.dateComp, this.timeComp\r\n ]};\r\n }\r\n\r\n public getValue(): string {\r\n return this.dateComp.getValue() + \" \" + this.timeComp.getValue();\r\n }\r\n\r\n public getValueAsDate(): Date {\r\n return this.timeComp.getValueAsDate(this.dateComp.getValueAsDate());\r\n }\r\n\r\n // private raiseEvent(e: any, node: IJSLVNode) {\r\n // if (this.options.enabled) {\r\n // const val = date.parse((node.dom as HTMLInputElement).value);\r\n // if (this.options.bindTo && this.options.property) {\r\n // this.options.bindTo[this.options.property] =\r\n // this.options.converter?.toData ? this.options.converter.toData(val) : val;\r\n // }\r\n // (this.options.onChange as EventHandler<Date>).notify(val);\r\n // }\r\n // }\r\n\r\n}\r\n","import \"./ExpanderStyle.scss\";\r\nimport { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\n\r\nexport interface IExpanderOptions {\r\n header: IJSLVNode | string | IJSLComponent;\r\n body: IJSLVNode | string | IJSLComponent;\r\n expanded?: boolean;\r\n onToggle?: (isExpanding: boolean) => void | boolean;\r\n expandedIcon?: IJSLVNode;\r\n collapsedIcon?: IJSLVNode;\r\n isToggleOnHeader?: boolean;\r\n class?: string;\r\n style?: string;\r\n iconSize?: string;\r\n}\r\n\r\nexport class ExpanderComponent implements IJSLComponent {\r\n\r\n public State = { expanded: false, waitingForAnimation: false };\r\n\r\n private options: IExpanderOptions;\r\n\r\n public constructor(optionsOrHeader: IExpanderOptions | IJSLVNode | string | IJSLComponent, body?: IJSLVNode | string | IJSLComponent, expanded?: boolean) {\r\n if (body != null) {\r\n // old syntax\r\n this.options = { header: optionsOrHeader as IJSLVNode | string | IJSLComponent, body, expanded: expanded ?? true };\r\n } else {\r\n this.options = optionsOrHeader as IExpanderOptions;\r\n this.options.expanded = this.options.expanded ?? true;\r\n }\r\n this.State.expanded = this.options.expanded;\r\n }\r\n\r\n public getIcon(expanded: boolean): IJSLVNode {\r\n return {\r\n tag: \"span\", attr: {\r\n class: \"expand-collapse-icon\", style: \"padding:0 0.2rem 0 0.2rem;\"\r\n },\r\n raw: true,\r\n content: \"<svg style='\" +\r\n \"min-width:\" + (this.options.iconSize ?? \"1.5rem\") + \"; min-height:\" + (this.options.iconSize ?? \"1.5rem\") +\r\n \";max-width:\" + (this.options.iconSize ?? \"1.5rem\") + \"; max-height:\" + (this.options.iconSize ?? \"1.5rem\") + \";' \" +\r\n \"xml:space='preserve' width='1024px' height='1024px' shape-rendering='geometricPrecision' text-rendering='geometricPrecision' image-rendering='optimizeQuality' fill-rule='nonzero' clip-rule='evenodd' viewBox='0 0 10240 10240'>\" +\r\n (expanded\r\n ? \"<path id='curve0' fill='#FFFFFF' d='M1273 3989l3621 3620c124,125 328,125 452,0l3621 -3620c124,-125 124,-328 0,-453l-905 -905c-125,-125 -328,-125 -453,0l-2489 2489 -2489 -2489c-125,-125 -328,-125 -453,0l-905 905c-124,125 -124,328 0,453z'/>\"\r\n : \"<path id='curve0' fill='#FFFFFF' d='M3989 1273l3620 3621c125,124 125,328 0,452l-3620 3621c-125,124 -328,124 -453,0l-905 -905c-125,-125 -125,-328 0,-453l2489 -2489 -2489 -2489c-125,-125 -125,-328 0,-453l905 -905c125,-124 328,-124 453,0z'/>\"\r\n ) +\r\n \"</svg>\"\r\n };\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 render(): IJSLVNode {\r\n const animate = this.State.waitingForAnimation;\r\n\r\n this.State.waitingForAnimation = false;\r\n return {\r\n tag: \"div\", attr: { class: \"expander-comp \" + (this.options.class || \"\"), style: this.options.style ?? \"\" }, children: [\r\n {\r\n tag: \"div\", attr: {\r\n class: \"header\",\r\n click: (evt) => { if (this.options.isToggleOnHeader ?? true) { evt.stopPropagation(); this.toggleExpand(); } },\r\n },\r\n children: [\r\n {\r\n tag: \"span\", attr: { class: \"toggler\", click: (evt) => { evt.stopPropagation(); this.toggleExpand(); } },\r\n children: [this.State.expanded\r\n ? (this.options.expandedIcon ?? this.getIcon(true))\r\n : (this.options.collapsedIcon ?? this.getIcon(false))\r\n ]\r\n },\r\n { tag: \"span\", attr: { class: \"content\" }, children: [this.toNode(this.options.header)] }\r\n ]\r\n },\r\n {\r\n tag: \"div\", attr: { class: \"body\", style: this.State.expanded ? undefined : {display: \"none\"} },\r\n animation: (animate ? { attr: \"opacity\", from: \"0\", to: \"1\", duration: 500 } : undefined),\r\n children: [this.toNode(this.options.body)]\r\n }\r\n ]\r\n };\r\n }\r\n\r\n private toggleExpand() {\r\n const newVal = !this.State.expanded;\r\n if (this.options.onToggle != null) {\r\n if (this.options.onToggle(newVal) === false) {\r\n return;\r\n }\r\n }\r\n if (newVal) {\r\n this.State.waitingForAnimation = true;\r\n }\r\n this.State.expanded = newVal;\r\n }\r\n\r\n private toNode(content: IJSLVNode | string | IJSLComponent): IJSLVNode | IJSLComponent {\r\n if (typeof content === \"string\") {\r\n return { tag: \"div\", content };\r\n }\r\n return content;\r\n }\r\n}\r\n","import \"./LoadingStyle.css\";\r\nimport { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\n\r\nexport class LoadingComponent implements IJSLComponent {\r\n\r\n\r\n constructor(private sizeInRem?: number) {\r\n if (sizeInRem == null) {\r\n this.sizeInRem = 6;\r\n }\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 render(): IJSLVNode {\r\n\r\n return {\r\n tag: \"div\",\r\n attr: {style: \"font-size:\" + this.sizeInRem + \"rem\"},\r\n content: \"<div class='lds-dual-ring'></div>\",\r\n raw: true\r\n };\r\n\r\n }\r\n\r\n}\r\n","import { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\n\r\nexport interface IFormComponentOptions {\r\n class?: string;\r\n style?: string;\r\n}\r\n\r\nexport class FormComponent implements IJSLComponent {\r\n\r\n public constructor(private children: Array<IJSLVNode | IJSLComponent>, private options?: IFormComponentOptions) { }\r\n\r\n public render(): IJSLVNode {\r\n return {\r\n tag: \"form\",\r\n attr: { class: this.options?.class, style: this.options?.style },\r\n children: this.children\r\n };\r\n }\r\n\r\n public validate(): boolean {\r\n let valid = true;\r\n for (const c of this.children) {\r\n if ((c as any).validate && !(c as any).validate()) {\r\n valid = false;\r\n }\r\n }\r\n return valid;\r\n }\r\n}\r\n","import \"./FormFieldStyle.scss\";\r\nimport { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\nimport { IDatePickerOptions, DatePicker, IDatePicker } from \"../../ui/date.picker\";\r\nimport { INumberInputOptions, NumberInput } from \"../../ui/number.input\";\r\nimport { helper } from \"../../core/helper\";\r\nimport { AutoSuggest } from \"../../ui/auto.suggest\";\r\nimport { IAutoSuggestOptions } from \"../../ui/auto.suggest\";\r\n\r\nexport interface IFormFieldOptions {\r\n id?: string;\r\n label: string;\r\n type?: \"text\" | \"password\" | \"date\" | \"number\" | \"autosuggest\";\r\n dateOptions?: IDatePickerOptions;\r\n numberOptions?: INumberInputOptions;\r\n autoSuggestOptions?: IAutoSuggestOptions;\r\n maxLength?: number;\r\n class?: string;\r\n required?: boolean;\r\n onValidate?: (val: string) => boolean | string;\r\n onBlur?: (evt: any, input: IJSLVNode) => void;\r\n onFocus?: (evt: any, input: IJSLVNode) => void;\r\n onInput?: (evt: any, input: IJSLVNode) => void;\r\n}\r\n\r\nexport class FormFieldComponent implements IJSLComponent {\r\n\r\n private id: string;\r\n private type: string;\r\n private datepickerRef: IDatePicker;\r\n private validationMessage: string;\r\n\r\n public constructor(private options: IFormFieldOptions) {\r\n this.id = options.id || helper.newDomGuid();\r\n this.type = this.options.type === \"password\" ? \"password\" : \"text\";\r\n }\r\n\r\n public render(): IJSLVNode {\r\n\r\n return {\r\n tag: \"div\",\r\n attr: { class: \"form-field \" + (this.options.class ?? \"\") },\r\n children: [{\r\n tag: \"div\",\r\n attr: { class: \"form-field__control\" + (this.validationMessage ? \" failed__valid\" : \"\") },\r\n children: [\r\n {\r\n tag: \"label\",\r\n attr: { for: this.id, class: \"form-field__label\" },\r\n content: this.options.label +\r\n (this.options.required ? \" *\" : \"\") +\r\n (this.validationMessage ? (\" \" + (this.validationMessage ?? \"\")) : \"\")\r\n },\r\n {\r\n tag: \"input\",\r\n attr: {\r\n id: this.id,\r\n type: this.type,\r\n maxLength: this.options.maxLength,\r\n class: \"form-field__input\",\r\n blur: this.setInActive,\r\n focus: this.setActive,\r\n input: this.onInput\r\n }\r\n }\r\n ]\r\n }]\r\n };\r\n\r\n }\r\n\r\n public onCreate(node: IJSLVNode) {\r\n const InputDom = node.dom.firstElementChild.children[1] as HTMLInputElement;\r\n if (this.options.type === \"number\") {\r\n NumberInput(InputDom, this.options.numberOptions);\r\n } else if (this.options.type === \"date\") {\r\n this.datepickerRef = DatePicker(InputDom, this.options.dateOptions);\r\n } else if (this.options.type === \"autosuggest\") {\r\n AutoSuggest(InputDom, this.options.autoSuggestOptions);\r\n }\r\n }\r\n\r\n public onRemove(node: IJSLVNode) {\r\n if (this.datepickerRef != null) {\r\n this.datepickerRef.destroy();\r\n }\r\n }\r\n\r\n public validate(): boolean {\r\n const value = this.getValue();\r\n if (this.options.required && !value) {\r\n this.validationMessage = \" \";\r\n return false;\r\n }\r\n if (this.options.onValidate) {\r\n const validationResult = this.options.onValidate(value);\r\n if (validationResult === false) {\r\n this.validationMessage = \" \";\r\n return false;\r\n }\r\n if (validationResult !== true) {\r\n this.validationMessage = validationResult;\r\n return false;\r\n }\r\n }\r\n this.validationMessage = null;\r\n return true;\r\n }\r\n\r\n public getValue(): string {\r\n return (document.getElementById(this.id) as HTMLInputElement)?.value;\r\n }\r\n\r\n public setValue(value: string): void {\r\n const el = (document.getElementById(this.id) as HTMLInputElement);\r\n if (el == null) {\r\n return;\r\n }\r\n el.value = value || \"\";\r\n if (value) {\r\n el.parentElement.classList.add(\"form-field--is-filled\");\r\n } else {\r\n el.parentElement.classList.remove(\"form-field--is-filled\");\r\n }\r\n }\r\n\r\n private setInActive(evt, node: IJSLVNode) {\r\n const formField = node.dom.parentElement.parentElement;\r\n if (formField == null) {\r\n return;\r\n }\r\n setTimeout(() => {\r\n formField.classList.remove(\"form-field--is-active\");\r\n if ((node.dom as HTMLInputElement).value === \"\") {\r\n formField.classList.remove(\"form-field--is-filled\");\r\n } else {\r\n formField.classList.add(\"form-field--is-filled\");\r\n }\r\n }, 250);\r\n if (this.options.onBlur) {\r\n this.options.onBlur(evt, node);\r\n return;\r\n }\r\n return false;\r\n }\r\n\r\n private setActive(evt, node: IJSLVNode) {\r\n const formField = node.dom.parentElement.parentElement;\r\n if (formField == null) {\r\n return;\r\n }\r\n formField.classList.add(\"form-field--is-active\");\r\n if (this.options.onFocus) {\r\n this.options.onFocus(evt, node);\r\n return;\r\n }\r\n return false;\r\n }\r\n\r\n private onInput(evt, node) {\r\n if (this.options.onInput) {\r\n this.options.onInput(evt, node);\r\n return;\r\n }\r\n }\r\n\r\n}\r\n","import { ISlickColumn, Slick } from \"../../grid/slick.core\";\r\nimport { createJSLGrid, ISlickCreatorOptions, IJSLGrid } from \"../../grid/slick.creator\";\r\nimport { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\nimport { ISlickGrid } from \"../../grid/slick.grid\";\r\n\r\nexport class GridComponent<T> implements IJSLComponent {\r\n\r\n private gridRef: IJSLGrid<T>;\r\n private ref: Promise<IJSLGrid<T>>;\r\n private refResolver;\r\n\r\n private currentlyVisible = true;\r\n private checkVisibleTimeout: any = 0;\r\n\r\n private rootTag: IJSLVNode;\r\n\r\n private initEventsFnc = [];\r\n\r\n constructor(private data: Promise<T[]> | T[], private columns: ISlickColumn[], private options: ISlickCreatorOptions, height?: string) {\r\n let style = \"\";\r\n if (!options.autoHeight) {\r\n style = \"height:\" + (height ?? \"400px\");\r\n }\r\n this.rootTag = {\r\n tag: \"div\",\r\n attr: {\r\n style\r\n }\r\n };\r\n this.ref = new Promise((resolve, reject) => {\r\n this.refResolver = resolve;\r\n });\r\n }\r\n\r\n public getRootTag(): IJSLVNode {\r\n return this.rootTag;\r\n }\r\n\r\n public getRef(): Promise<IJSLGrid<T>> {\r\n return this.ref;\r\n }\r\n\r\n public initEvents(fnc: (grid: IJSLGrid<T>) => void) {\r\n this.initEventsFnc.push(fnc);\r\n }\r\n\r\n public onCreate(vnode: IJSLVNode) {\r\n\r\n // let grid;\r\n setTimeout(() => {\r\n if (Array.isArray(this.data)) {\r\n this.gridRef = createJSLGrid(vnode.dom as HTMLDivElement, this.data, this.columns, this.options);\r\n } else {\r\n const rawData = [];\r\n this.gridRef = createJSLGrid(vnode.dom as HTMLDivElement, rawData, this.columns, this.options);\r\n this.data.then((result) => {\r\n for (let i = 0; i < result.length; i++) {\r\n rawData.push(result[i]);\r\n }\r\n this.gridRef.refreshData();\r\n });\r\n }\r\n this.refResolver(this.gridRef);\r\n for (let idx = 0; idx < this.initEventsFnc.length; idx++) {\r\n this.initEventsFnc[idx](this.gridRef);\r\n }\r\n window.addEventListener(\"resize\", this.resizeEventListener);\r\n this.checkVisibility(this.gridRef);\r\n }, 1);\r\n }\r\n\r\n public onRemove(vnode: IJSLVNode) {\r\n if (this.gridRef != null) {\r\n this.gridRef.destroy();\r\n this.gridRef = null;\r\n }\r\n this.ref = new Promise((resolve, reject) => {\r\n this.refResolver = resolve;\r\n });\r\n if (this.checkVisibleTimeout !== 0) {\r\n clearTimeout(this.checkVisibleTimeout);\r\n }\r\n window.removeEventListener(\"resize\", this.resizeEventListener);\r\n }\r\n\r\n public render(): IJSLVNode {\r\n return this.rootTag;\r\n }\r\n\r\n private checkVisibility(g: ISlickGrid<T>) {\r\n if (!this.isVisible(g)) {\r\n this.currentlyVisible = false;\r\n this.checkVisibleTimeout = setTimeout(() => {this.checkVisibility(g); }, 1000);\r\n } else {\r\n if (!this.currentlyVisible) {\r\n this.currentlyVisible = true;\r\n g.invalidateAllRows();\r\n g.resizeCanvas();\r\n }\r\n this.checkVisibleTimeout = 0;\r\n }\r\n }\r\n\r\n private resizeEventListener = () => {\r\n this.ref.then((g) => {\r\n if (this.isVisible(g) && !this.anyInputIsFocused()) {\r\n g.resizeCanvas();\r\n }\r\n });\r\n }\r\n\r\n private anyInputIsFocused() {\r\n // this check is necessary because of mobile virtual keyboard\r\n // -> virtual keyboard triggers window resize event -> which would reset any editors\r\n return Slick.GlobalEditorLock.isActive() && document.querySelector(\"input:focus\") != null;\r\n }\r\n\r\n private isVisible(g: ISlickGrid<T>): boolean {\r\n let el = g.getViewportNode().parentElement;\r\n while (el != null && el !== document.body) {\r\n if (getComputedStyle(el, null).display === \"none\") {\r\n return false;\r\n }\r\n el = el.parentElement;\r\n }\r\n return el != null;\r\n }\r\n\r\n}\r\n","import \"./TreeViewStyle.scss\";\r\nimport { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\n\r\nexport interface ITreeViewComponentOptions {\r\n data: ITreeViewChild;\r\n renderItem?: (data: any) => IJSLVNode;\r\n style?: string;\r\n class?: string;\r\n}\r\n\r\nexport interface ITreeViewChild {\r\n id: string;\r\n content: IJSLVNode | string;\r\n children?: ITreeViewChild[];\r\n collapsed?: boolean;\r\n}\r\n\r\nexport class TreeViewComponent implements IJSLComponent {\r\n\r\n public constructor(private options: ITreeViewComponentOptions) {\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 render(): IJSLVNode {\r\n return {\r\n tag: \"div\", attr: { style: this.options.style, class: \"treeview-comp hover \" + (this.options.class ?? \"\") }, children: [\r\n { tag: \"ul\", children: [this.renderNode(this.options.data)] }\r\n ]\r\n };\r\n }\r\n\r\n private renderNode(el: ITreeViewChild): IJSLVNode {\r\n\r\n function getInput(): IJSLVNode {\r\n const res: IJSLVNode = { tag: \"input\", attr: { type: \"checkbox\", id: el.id } };\r\n if (el.collapsed) {\r\n (res.attr as any).checked = \"checked\";\r\n }\r\n return res;\r\n }\r\n\r\n return (el.children && el.children.length > 0) ?\r\n { tag: \"li\", children: [\r\n getInput(),\r\n this.addChild({ tag: \"label\", attr: { for: el.id } }, this.options.renderItem != null ? this.options.renderItem(el) : el.content),\r\n { tag: \"ul\", children: el.children.map((c) => this.renderNode(c)) }\r\n ]} :\r\n this.addChild({ tag: \"li\" }, this.options.renderItem != null ? this.options.renderItem(el) : el.content);\r\n }\r\n\r\n private addChild(parent: IJSLVNode, content: string | IJSLVNode): IJSLVNode {\r\n if (typeof content === \"string\") {\r\n parent.content = content;\r\n } else {\r\n parent.children = [content];\r\n }\r\n return parent;\r\n }\r\n\r\n}\r\n","import \"./TabsStyle.scss\";\r\nimport { IJSLComponent, IJSLVNode, JSLRender } from \"jsl-render\";\r\nimport { helper } from \"../../core/helper\";\r\n\r\nexport interface ITabItemOption {\r\n id?: string;\r\n header: IJSLVNode | string | IJSLComponent;\r\n enabled?: boolean;\r\n content?: IJSLVNode | string | IJSLComponent;\r\n onCreate?: () => IJSLVNode | string | IJSLComponent;\r\n canClose?: boolean;\r\n onClosing?: () => boolean;\r\n}\r\n\r\nexport interface ITabOptions {\r\n tabs?: ITabItemOption[];\r\n contentClass?: string;\r\n style?: string;\r\n selectedIndex?: number;\r\n onSelect?: (index?: number) => boolean | void;\r\n maxHeight?: string;\r\n preserveContent?: boolean;\r\n}\r\n\r\nexport class TabsComponent implements IJSLComponent {\r\n\r\n public State = {selectedIndex: null};\r\n\r\n private renderer: JSLRender;\r\n\r\n public constructor(private options?: ITabOptions) {\r\n this.options = this.options ?? {};\r\n this.options.tabs = this.options.tabs ?? [];\r\n this.options.selectedIndex = this.options.selectedIndex ?? 0;\r\n }\r\n\r\n public render(): IJSLVNode {\r\n let index: number = -1;\r\n\r\n const activeIndex = this.State.selectedIndex ?? this.options.selectedIndex;\r\n if (activeIndex > -1 &&\r\n this.options.tabs[activeIndex].content == null &&\r\n this.options.tabs[activeIndex].onCreate) {\r\n this.options.tabs[activeIndex].content = this.options.tabs[activeIndex].onCreate();\r\n }\r\n\r\n const tabs = [];\r\n\r\n for (let idx = 0; idx < this.options.tabs.length; idx++) {\r\n if (!this.options.tabs[idx].id) {\r\n this.options.tabs[idx].id = helper.newDomGuid();\r\n }\r\n if (idx === activeIndex) {\r\n tabs.push({\r\n tag: \"div\", attr: {\r\n class: \"tab-content \" + (this.options.contentClass ?? \"\"),\r\n style: { \"max-height\": (this.options.maxHeight ?? \"100%\") },\r\n id: this.options.tabs[idx].id\r\n },\r\n children: [this.toNode(this.options.tabs[idx].content)]\r\n });\r\n } else if (this.options.preserveContent) {\r\n tabs.push({\r\n tag: \"div\", attr: {\r\n class: \"tab-content tab-hidden \" + (this.options.contentClass ?? \"\"),\r\n style: { \"max-height\": (this.options.maxHeight ?? \"100%\") },\r\n id: this.options.tabs[idx].id\r\n },\r\n children: [this.toNode(this.options.tabs[idx].content)]\r\n });\r\n }\r\n }\r\n\r\n return {\r\n tag: \"div\", attr: { class: \"stabcomponent\", style: this.options.style }, children: [\r\n {\r\n tag: \"div\", attr: { class: \"tab-header-row\" }, children:\r\n this.options.tabs.map((x): IJSLVNode => {\r\n index++;\r\n const currIndex = index;\r\n return {\r\n tag: \"div\", attr: {\r\n class: \"tab-item \" + (index === activeIndex ? \"active \" : \"\") + (this.options.tabs[currIndex].enabled === false ? \"disabled \" : \"\"),\r\n click: (evt) => {\r\n if (this.options.tabs[currIndex].enabled ?? true) {\r\n this.SetSelectedTab(currIndex);\r\n if (this.options.onSelect) {\r\n this.options.onSelect(currIndex);\r\n }\r\n }\r\n }\r\n }, children: [\r\n { tag: \"span\", attr: { style: \"vertical-align: middle; vertical-align: -webkit-baseline-middle; vertical-align: -moz-middle-with-baseline;\" }, children: [this.toNode(x.header, \"span\")] },\r\n this.options.tabs[index].canClose\r\n ?\r\n {\r\n tag: \"div\", attr: {\r\n class: \"close-button\", click: (evt) => {\r\n if (this.options.tabs[currIndex].enabled ?? true) {\r\n evt.stopPropagation();\r\n this.closeTabIndex(currIndex);\r\n }\r\n }\r\n }, content: \"X\"\r\n }\r\n :\r\n undefined]\r\n };\r\n })\r\n }, ...tabs]\r\n };\r\n\r\n\r\n }\r\n\r\n public AddTab(tabItem: ITabItemOption): number {\r\n tabItem.enabled = tabItem.enabled ?? true;\r\n this.options.tabs.push(tabItem);\r\n return this.options.tabs.length - 1;\r\n }\r\n\r\n public EnableAll() {\r\n for (let i = 0; i < this.options.tabs.length; i++) {\r\n this.options.tabs[i].enabled = true;\r\n }\r\n this.renderer.refresh();\r\n }\r\n\r\n public DisableAll() {\r\n for (let i = 0; i < this.options.tabs.length; i++) {\r\n this.options.tabs[i].enabled = false;\r\n }\r\n this.renderer.refresh();\r\n }\r\n\r\n public GetByID(id: string): ITabItemOption {\r\n return this.options.tabs.filter((f) => f.id === id)[0];\r\n }\r\n\r\n public closeTabIndex(index: number) {\r\n // console.log(\"closing tab index \" + index);\r\n if (this.options.tabs[index].onClosing) {\r\n if (this.options.tabs[index].onClosing() === false) {\r\n return;\r\n }\r\n }\r\n let currIdx: number = 0;\r\n this.options.tabs = this.options.tabs.filter((x) => currIdx++ !== index);\r\n if (this.options.tabs.length <= (this.State.selectedIndex ?? this.options.selectedIndex)) {\r\n this.SetSelectedTab((this.State.selectedIndex ?? this.options.selectedIndex) - 1);\r\n }\r\n }\r\n\r\n // public onCreate(node: IJSLVNode) {\r\n // this.ref = node.dom as HTMLDivElement;\r\n // }\r\n\r\n // public onUpdate(node: IJSLVNode) {\r\n // this.ref = node.dom as HTMLDivElement;\r\n // }\r\n\r\n public onInit(renderer: JSLRender) {\r\n this.renderer = renderer;\r\n }\r\n\r\n public SetSelectedTab(index: number) {\r\n // console.log(\"setActiveTab: \" + index);\r\n if (this.options.tabs[index].content == null) {\r\n this.options.tabs[index].content = this.options.tabs[index].onCreate();\r\n }\r\n this.options.selectedIndex = index;\r\n this.State.selectedIndex = index;\r\n this.renderer.refresh();\r\n }\r\n\r\n private toNode(content: IJSLVNode | string | IJSLComponent, tag?: string): IJSLVNode | IJSLComponent {\r\n if (content == null) {\r\n return undefined;\r\n }\r\n if (typeof content === \"string\") {\r\n return { tag: tag ?? \"div\", content };\r\n }\r\n return content;\r\n }\r\n\r\n}\r\n","import { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\nimport { NumberInput, INumberInputOptions } from \"../../ui/number.input\";\r\nimport { numeric } from \"../../core/numeric\";\r\nimport { helper } from \"../../core/helper\";\r\nimport { EventHandler } from \"../../interaction/eventhandler\";\r\nimport { IDataConverter } from \"../../interaction/dataconverter\";\r\n\r\nexport interface INumberComponentOptions<T = any> extends INumberInputOptions {\r\n id?: string;\r\n class?: string;\r\n style?: string;\r\n placeholder?: string;\r\n bindTo?: T;\r\n bindMode?: \"toModel\" | \"fromModel\" | \"both\";\r\n property?: keyof T;\r\n converter?: IDataConverter<any, number>;\r\n}\r\n\r\nexport class NumberComponent<T = any> implements IJSLComponent {\r\n\r\n private currentDom: HTMLInputElement;\r\n private id: string;\r\n private options: INumberComponentOptions<T>;\r\n\r\n public constructor(options: INumberComponentOptions<T>) {\r\n this.options = { ...{ onChange: new EventHandler<number>(), bindMode: \"toModel\" }, ...options };\r\n if (this.options.bindTo != null && this.options.property != null && this.options.value == null) {\r\n this.options.value = (this.options.converter?.toUI ?\r\n this.options.converter.toUI(this.options.bindTo[this.options.property]) :\r\n this.options.bindTo[this.options.property]) as number;\r\n }\r\n this.options.onChange = EventHandler.Create(this.options.onChange);\r\n this.id = options.id || helper.newDomGuid();\r\n }\r\n\r\n get onChange(): EventHandler<number> {\r\n return this.options.onChange as EventHandler<number>;\r\n }\r\n\r\n public render(): IJSLVNode {\r\n let val = this.options.value;\r\n if (this.options.bindMode !== \"toModel\" && this.options.bindTo != null && this.options.property != null) {\r\n const current = this.getValue();\r\n const newVal = (this.options.converter?.toUI ?\r\n this.options.converter.toUI(this.options.bindTo[this.options.property]) :\r\n this.options.bindTo[this.options.property]) as number;\r\n const newValStr = numeric.format(newVal, this.options.format);\r\n if (newValStr !== current) {\r\n val = newVal;\r\n if (this.currentDom != null) {\r\n this.currentDom.value = newValStr;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n tag: \"input\",\r\n attr: {\r\n id: this.id,\r\n class: this.options.class,\r\n style: this.options.style,\r\n value: numeric.format(val, this.options.format),\r\n placeholder: this.options.placeholder\r\n }\r\n };\r\n }\r\n\r\n public getValue(): string {\r\n if (this.currentDom == null) {\r\n return null;\r\n }\r\n return this.currentDom.value;\r\n }\r\n\r\n public getValueAsNumber(): number {\r\n return numeric.parse(this.getValue());\r\n }\r\n\r\n public onCreate(node: IJSLVNode) {\r\n this.currentDom = node.dom as HTMLInputElement;\r\n const handler = new EventHandler<number>((value) => {\r\n if (this.options.bindTo != null && this.options.bindMode !== \"fromModel\" && this.options.property != null) {\r\n if (this.options.bindTo && this.options.property) {\r\n this.options.bindTo[this.options.property] = this.options.converter?.toData ? this.options.converter.toData(value) : value;\r\n }\r\n }\r\n (this.options.onChange as EventHandler<number>).notify(value);\r\n });\r\n NumberInput(this.currentDom, {...this.options, onChange: handler});\r\n }\r\n\r\n // public onUpdate(node: IJSLVNode) {\r\n // this.currentDom = node.dom as HTMLInputElement;\r\n // }\r\n\r\n}\r\n","import { IJSLComponent, IJSLVNode, JSLRender } from \"jsl-render\";\r\nimport { Dialog, IDialogOptions, JSLDialog } from \"../../ui/dialog\";\r\nimport { Moveable, IMoveEventArg, IMoveableOptions } from '../../interaction/moveable';\r\nimport { EventHandler } from \"../../interaction/eventhandler\";\r\nimport { Resizable, IResizeOptions } from \"../../interaction/resizable\";\r\nimport { UILang } from \"../../core/lang\";\r\n\r\nexport interface IDialogComponentOptions extends IDialogOptions {\r\n // id: string;\r\n width?: string;\r\n minWidth?: string;\r\n minHeight?: string;\r\n height?: string;\r\n maxWidth?: string;\r\n maxHeight?: string;\r\n header: IJSLVNode | string | IJSLComponent;\r\n content: IJSLVNode | string | IJSLComponent;\r\n footer: IJSLVNode | string | IJSLComponent;\r\n showCloseButton?: boolean;\r\n allowMove?: boolean;\r\n allowResize?: boolean;\r\n resizeOptions?: IResizeOptions;\r\n moveOptions?: IMoveableOptions;\r\n class?: string;\r\n}\r\n\r\nexport interface IDialogButtonOptions {\r\n content?: string;\r\n class?: string;\r\n onClick?: () => void | boolean;\r\n raw?: boolean;\r\n}\r\n\r\nexport class DialogComponent implements IJSLComponent {\r\n\r\n public static Button(options: IDialogButtonOptions) {\r\n const res = {\r\n tag: \"button\", attr: {\r\n class: \"jsl-button \" + (options.class ?? \"\"),\r\n click: () => {\r\n if (options.onClick != null && options.onClick() === false) {\r\n return;\r\n }\r\n if (DialogComponent.lastRenderedDlg != null) {\r\n DialogComponent.lastRenderedDlg.getRef().close();\r\n }\r\n }\r\n }, content: options.content ?? \"OK\", raw: options.raw ?? false\r\n };\r\n return res;\r\n }\r\n\r\n public static Ok(onClick?: () => void | boolean) {\r\n return DialogComponent.Button({ content: UILang.core.Ok, onClick, class: \"dlg-ok-btn\" });\r\n }\r\n\r\n public static Cancel() {\r\n return DialogComponent.Button({ content: UILang.core.Cancel, class: \"dlg-cancel-btn jsl-button-outline\" });\r\n }\r\n\r\n public static show(options: IDialogComponentOptions): DialogComponent {\r\n const container = document.createElement(\"div\");\r\n document.body.appendChild(container);\r\n const oldRenderer = (JSLRender as any).lastCreatedRenderer;\r\n const oldLastDlg = DialogComponent.lastRenderedDlg;\r\n const renderer = new JSLRender(container, oldRenderer != null);\r\n if (oldRenderer != null) {\r\n (JSLRender as any).lastCreatedRenderer = renderer;\r\n }\r\n const o = { ...options };\r\n if (o.autoOpen == null) {\r\n o.autoOpen = true;\r\n }\r\n o.onClose = () => {\r\n if (options.onClose) {\r\n if (options.onClose() === false) {\r\n return;\r\n }\r\n }\r\n document.body.removeChild(container);\r\n (JSLRender as any).lastCreatedRenderer = oldRenderer;\r\n if (oldRenderer != null) {\r\n oldRenderer.refresh();\r\n }\r\n DialogComponent.lastRenderedDlg = oldLastDlg;\r\n };\r\n const dlg = new DialogComponent(o);\r\n DialogComponent.lastRenderedDlg = dlg;\r\n renderer.render(dlg);\r\n return dlg;\r\n }\r\n\r\n private static lastRenderedDlg: DialogComponent;\r\n\r\n private closeIcon = {\r\n tag: \"div\", content: \"🗙\", attr: {\r\n class: \"dlg-close-btn\", click: () => {\r\n this.ref.close();\r\n }\r\n }\r\n };\r\n private resizeHandle = {\r\n tag: \"div\", attr: { class: \"dlg-res-handle rs-b rs-r\" }\r\n };\r\n\r\n private ref: JSLDialog;\r\n\r\n private options: IDialogComponentOptions;\r\n\r\n public constructor(options: IDialogComponentOptions) {\r\n this.options = { maxHeight: \"calc(100vh - 7.5rem)\", width: \"50vw\", ...options };\r\n }\r\n\r\n public render(): IJSLVNode {\r\n\r\n const header = this.toNode(this.options.header);\r\n const body = this.toNode(this.options.content);\r\n const footer = this.toNode(this.options.footer);\r\n\r\n let styleW = \"\";\r\n let styleH = \"\";\r\n if (this.options.width != null) {\r\n styleW += \"width:\" + this.options.width + \";\";\r\n }\r\n if (this.options.minWidth != null) {\r\n styleW += \"min-width:\" + this.options.minWidth + \";\";\r\n }\r\n if (this.options.maxWidth != null) {\r\n styleW += \"max-width:\" + this.options.maxWidth + \";\";\r\n }\r\n if (this.options.height != null) {\r\n styleH += \"height:\" + this.options.height + \";\";\r\n }\r\n if (this.options.minHeight != null) {\r\n styleH += \"min-height:\" + this.options.minHeight + \";\";\r\n }\r\n if (this.options.maxHeight != null) {\r\n styleH += \"max-height:\" + this.options.maxHeight + \";\";\r\n }\r\n const headerStyle = this.options.allowMove ? \"cursor:move\" : undefined;\r\n return {\r\n tag: \"div\", attr: {\r\n class: \"jsl-dialog-overlay\", wheel: (e: MouseEvent) => {\r\n e.preventDefault();\r\n }\r\n }, children: [\r\n {\r\n tag: \"div\", attr: {\r\n class: \"jsl-dialog \" + (this.options.class || \"\"), style: styleW, wheel: (e: MouseEvent) => {\r\n e.stopImmediatePropagation();\r\n e.stopPropagation();\r\n }\r\n }, children: [\r\n {\r\n tag: \"div\", attr: { class: \"dlg-header\", style: headerStyle },\r\n children: this.options.showCloseButton ? [header, this.closeIcon] : [header]\r\n },\r\n { tag: \"div\", attr: { class: \"dlg-body\", style: styleH }, children: [body] },\r\n {\r\n tag: \"div\", attr: { class: \"dlg-footer\" },\r\n children: [footer]\r\n }\r\n , this.options.allowResize ? this.resizeHandle : undefined]\r\n }]\r\n };\r\n }\r\n\r\n public onCreate(node: IJSLVNode) {\r\n this.ref = Dialog(node.dom as HTMLDivElement, this.options);\r\n if (this.options.allowMove) {\r\n Moveable(this.ref.getOverlay(), {\r\n onStart: new EventHandler((e) => {\r\n let headerWasClicked = false;\r\n let parent = e.evt.target as HTMLElement;\r\n while (parent != null && !parent.classList.contains(\"jsl-dialog-overlay\")) {\r\n if (parent.classList.contains(\"dlg-header\")) {\r\n headerWasClicked = true;\r\n break;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n if (headerWasClicked) {\r\n const rect = e.target.getBoundingClientRect();\r\n e.target.style.transform = \"translate(0, 0)\";\r\n e.target.style.left = rect.left + \"px\";\r\n e.target.style.top = rect.top + \"px\";\r\n } else {\r\n e.cancelEvent();\r\n }\r\n })\r\n , ...this.options.moveOptions\r\n });\r\n }\r\n if (this.options.allowResize) {\r\n const dlgEl = this.ref.getOverlay().querySelector(\".jsl-dialog\") as HTMLElement;\r\n Resizable(dlgEl, this.options.resizeOptions);\r\n const rect = dlgEl.getBoundingClientRect();\r\n dlgEl.style.transform = \"translate(0, 0)\";\r\n dlgEl.style.left = rect.left + \"px\";\r\n dlgEl.style.top = rect.top + \"px\";\r\n const bodyEl = dlgEl.querySelector(\".dlg-body\") as HTMLElement;\r\n const bodyRect = bodyEl.getBoundingClientRect();\r\n bodyEl.style.height = \"calc(100% - \" + (rect.height - bodyRect.height) + \"px)\";\r\n }\r\n }\r\n\r\n public getRef(): JSLDialog {\r\n return this.ref;\r\n }\r\n\r\n private toNode(content: IJSLVNode | string | IJSLComponent): IJSLVNode | IJSLComponent {\r\n if (typeof content === \"string\") {\r\n return { tag: \"div\", content };\r\n }\r\n return content;\r\n }\r\n\r\n}\r\n","import { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\nimport { EventHandler } from \"../../interaction/eventhandler\";\r\n\r\nexport interface IButtonOptions {\r\n content: string | IJSLVNode | IJSLComponent;\r\n enabled?: boolean;\r\n class?: string;\r\n outlined?: boolean;\r\n style?: string;\r\n click?: EventHandler<MouseEvent> | ((evt?: MouseEvent) => void);\r\n}\r\n\r\nexport class ButtonComponent implements IJSLComponent {\r\n\r\n private options: IButtonOptions;\r\n\r\n get click(): EventHandler<MouseEvent> {\r\n return this.options.click as EventHandler<MouseEvent>;\r\n }\r\n\r\n constructor(options: IButtonOptions) {\r\n this.options = { ...{ enabled: true, class: \"\" }, ...options };\r\n this.options.click = EventHandler.Create(this.options.click);\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 render(): IJSLVNode {\r\n return {\r\n tag: \"button\",\r\n attr: {\r\n class: \"jsl-button \" + (this.options.outlined ? \"jsl-button-outline \" : \"\") +\r\n this.options.class + (!this.options.enabled ? \" disabled\" : \"\"), style: this.options.style, click: this.raiseEvent\r\n },\r\n content: typeof this.options.content === \"string\" ? this.options.content as string : \"\",\r\n children: typeof this.options.content !== \"string\" ? [this.options.content] : []\r\n };\r\n }\r\n\r\n private raiseEvent(evt) {\r\n if (this.options.enabled) {\r\n (this.options.click as EventHandler<MouseEvent>).notify(evt);\r\n }\r\n }\r\n}\r\n","\r\nimport { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\nimport { EventHandler } from \"../../interaction/eventhandler\";\r\nimport { IDataConverter } from \"../../interaction/dataconverter\";\r\n\r\n\r\nexport interface IInputOptions<T = any> {\r\n value?: string;\r\n enabled?: boolean;\r\n class?: string;\r\n style?: string;\r\n onChange?: EventHandler<string> | ((v?: string) => void);\r\n onInput?: EventHandler<string> | ((v?: string) => void);\r\n id?: string;\r\n bindTo?: T;\r\n property?: keyof T;\r\n placeholder?: string;\r\n converter?: IDataConverter<any, string>;\r\n bindMode?: \"toModel\" | \"fromModel\" | \"both\";\r\n bindOnInput?: boolean;\r\n maxLength?: number;\r\n type?: \"input\" | \"text\" | \"password\" | \"textarea\" | \"color\";\r\n}\r\n\r\n// tslint:disable-next-line: max-classes-per-file\r\nexport class InputComponent<T = any> implements IJSLComponent {\r\n\r\n private options: IInputOptions<T>;\r\n private currentDom: HTMLInputElement;\r\n\r\n get onChange(): EventHandler<string> {\r\n return this.options.onChange as EventHandler<string>;\r\n }\r\n\r\n get onInput(): EventHandler<string> {\r\n return this.options.onInput as EventHandler<string>;\r\n }\r\n\r\n constructor(options: IInputOptions<T>) {\r\n this.options = { ...{ type: \"text\", enabled: true, bindMode: \"toModel\" }, ...options };\r\n if (this.options.bindTo != null && this.options.property != null && this.options.value == null) {\r\n this.options.value = (this.options.converter?.toUI ?\r\n this.options.converter.toUI(this.options.bindTo[this.options.property]) :\r\n this.options.bindTo[this.options.property]) as string;\r\n }\r\n this.options.onChange = EventHandler.Create(this.options.onChange);\r\n this.options.onInput = EventHandler.Create(this.options.onInput);\r\n if (this.options.type === \"input\") {\r\n this.options.type = \"text\";\r\n }\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 render(): IJSLVNode {\r\n let val = this.options.value;\r\n if (this.options.bindMode !== \"toModel\" && this.options.bindTo != null && this.options.property != null) {\r\n if (this.onInput.count() > 0) {\r\n this.options.bindOnInput = true;\r\n }\r\n const current = this.getValue();\r\n const newVal = (this.options.converter?.toUI ?\r\n this.options.converter.toUI(this.options.bindTo[this.options.property]) :\r\n this.options.bindTo[this.options.property]) as string;\r\n if (newVal !== current) {\r\n val = newVal;\r\n if (this.currentDom != null) {\r\n this.currentDom.value = val ?? \"\";\r\n }\r\n }\r\n }\r\n return {\r\n tag: this.options.type !== \"textarea\" ? \"input\" : \"textarea\",\r\n attr: {\r\n type: this.options.type !== \"textarea\" ? this.options.type : undefined,\r\n disabled: !this.options.enabled ? \"disabled\" : undefined,\r\n class: this.options.class,\r\n style: this.options.style,\r\n change: this.raiseChangeEvent,\r\n input: this.raiseInputEvent,\r\n value: this.options.type !== \"textarea\" ? val : undefined,\r\n placeholder: this.options.placeholder,\r\n id: typeof this.options.id === \"string\" ? this.options.id as string : undefined,\r\n maxLength: this.options.maxLength\r\n },\r\n content: this.options.type === \"textarea\" ? val : undefined\r\n };\r\n }\r\n\r\n public getValue(): string {\r\n if (this.currentDom == null) {\r\n return \"\";\r\n }\r\n return this.currentDom.value;\r\n }\r\n\r\n public setValue(value: string): void {\r\n if (this.currentDom != null) {\r\n this.currentDom.value = value;\r\n }\r\n if (this.options.bindMode !== \"fromModel\" && this.options.bindTo && this.options.property) {\r\n this.options.bindTo[this.options.property] =\r\n this.options.converter?.toData ? this.options.converter.toData(value) : value;\r\n }\r\n }\r\n\r\n public onCreate(node: IJSLVNode) {\r\n this.currentDom = node.dom as HTMLInputElement;\r\n }\r\n\r\n // public onUpdate(node: IJSLVNode) {\r\n // this.currentDom = node.dom as HTMLInputElement;\r\n // if (this.options.bindMode !== \"toModel\" && this.options.bindTo != null && this.options.property != null) {\r\n // if (this.onInput.count() > 0) {\r\n // this.options.bindOnInput = true;\r\n // }\r\n // const current = this.getValue();\r\n // const newVal = (this.options.converter?.toUI ?\r\n // this.options.converter.toUI(this.options.bindTo[this.options.property]) :\r\n // this.options.bindTo[this.options.property]) as string;\r\n // if (newVal !== current) {\r\n // if (this.currentDom != null) {\r\n // this.currentDom.value = newVal ?? \"\";\r\n // }\r\n // }\r\n // }\r\n // }\r\n\r\n private raiseChangeEvent(e: any, node: IJSLVNode) {\r\n if (this.options.enabled) {\r\n const value = (node.dom as HTMLInputElement).value;\r\n if (this.options.bindMode !== \"fromModel\" && this.options.bindTo && this.options.property) {\r\n this.options.bindTo[this.options.property] =\r\n this.options.converter?.toData ? this.options.converter.toData(value) : value;\r\n }\r\n (this.options.onChange as EventHandler<string>).notify(value);\r\n }\r\n }\r\n\r\n private raiseInputEvent(e: any, node: IJSLVNode) {\r\n if (this.onInput.count() === 0) {\r\n return false;\r\n }\r\n if (this.options.enabled) {\r\n const value = (node.dom as HTMLInputElement).value;\r\n if (this.options.bindOnInput && this.options.bindMode !== \"fromModel\" && this.options.bindTo && this.options.property) {\r\n this.options.bindTo[this.options.property] =\r\n this.options.converter?.toData ? this.options.converter.toData(value) : value;\r\n }\r\n (this.options.onInput as EventHandler<string>).notify(value);\r\n }\r\n }\r\n}\r\n","import \"./CheckBoxStyle.scss\";\r\nimport { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\nimport { EventHandler } from \"../../interaction/eventhandler\";\r\nimport { IDataConverter } from \"../../interaction/dataconverter\";\r\nimport { helper } from \"../../core/helper\";\r\n\r\nexport interface ICheckBoxOptions<T = any> {\r\n value?: boolean;\r\n label: string;\r\n enabled?: boolean;\r\n class?: string;\r\n style?: string;\r\n onChange?: EventHandler<boolean> | ((v?: boolean) => void);\r\n id?: string;\r\n bindTo?: T;\r\n property?: keyof T;\r\n bindMode?: \"toModel\" | \"fromModel\" | \"both\";\r\n converter?: IDataConverter<any, boolean>;\r\n}\r\n\r\nexport class CheckBoxComponent<T = any> implements IJSLComponent {\r\n\r\n private options: ICheckBoxOptions<T>;\r\n private currentDom: HTMLInputElement;\r\n\r\n get onChange(): EventHandler<boolean> {\r\n return this.options.onChange as EventHandler<boolean>;\r\n }\r\n\r\n constructor(options: ICheckBoxOptions<T>) {\r\n this.options = { ...{ enabled: true, class: \"\", bindMode: \"toModel\" }, ...options };\r\n if (!this.options.id) {\r\n this.options.id = helper.newDomGuid();\r\n }\r\n if (this.options.bindTo != null && this.options.property != null && this.options.value == null) {\r\n this.options.value = (this.options.converter?.toUI ?\r\n this.options.converter.toUI(this.options.bindTo[this.options.property]) :\r\n this.options.bindTo[this.options.property]) as boolean;\r\n }\r\n this.options.onChange = EventHandler.Create(this.options.onChange);\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 render(): IJSLVNode {\r\n let val = this.options.value;\r\n if (this.options.bindMode !== \"toModel\" && this.options.bindTo != null && this.options.property != null) {\r\n const current = this.getValue();\r\n const newVal = (this.options.converter?.toUI ?\r\n this.options.converter.toUI(this.options.bindTo[this.options.property]) :\r\n this.options.bindTo[this.options.property]) as boolean;\r\n if (newVal !== current) {\r\n val = newVal;\r\n if (this.currentDom != null) {\r\n this.currentDom.checked = val;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n tag: \"span\",\r\n attr: { style: this.options.style },\r\n children: [{\r\n tag: \"input\",\r\n attr: {\r\n type: \"checkbox\",\r\n disabled: !this.options.enabled ? \"disabled\" : undefined,\r\n class: \"checkbox-comp \" + (this.options.class || \"\"),\r\n change: this.raiseEvent,\r\n checked: val ? \"checked\" : undefined,\r\n id: typeof this.options.id === \"string\" ? this.options.id as string : undefined\r\n }\r\n }, { tag: \"label\", content: this.options.label, attr: { for: this.options.id } }]\r\n };\r\n }\r\n\r\n public getValue(): boolean {\r\n return this.currentDom?.checked || false;\r\n }\r\n\r\n public setValue(val: boolean): void {\r\n if (this.currentDom != null) {\r\n this.currentDom.checked = val;\r\n }\r\n }\r\n\r\n public onCreate(node: IJSLVNode) {\r\n this.currentDom = node.dom.querySelector(\"input\");\r\n }\r\n\r\n private raiseEvent(e: any, node: IJSLVNode) {\r\n if (this.options.enabled) {\r\n const value = (node.dom as HTMLInputElement).checked;\r\n if (this.options.bindTo && this.options.bindMode !== \"fromModel\" && this.options.property) {\r\n this.options.bindTo[this.options.property] = this.options.converter?.toData ? this.options.converter.toData(value) : value;\r\n }\r\n (this.options.onChange as EventHandler<boolean>).notify(value);\r\n }\r\n }\r\n}\r\n","import { IJSLComponent, JSLRender, IJSLVNode } from \"jsl-render\";\r\n\r\nexport interface IIntervalOptions {\r\n interval: number;\r\n stopOnError?: boolean;\r\n noRefresh?: boolean;\r\n}\r\n\r\nexport class IntervalComponent implements IJSLComponent {\r\n\r\n private renderer: JSLRender;\r\n\r\n public constructor(private fnc: any, private options: IIntervalOptions) {\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 render(): IJSLVNode {\r\n return { tag: \"input\", attr: { type: \"hidden\" } };\r\n }\r\n\r\n public onInit(render: JSLRender) {\r\n this.renderer = render;\r\n }\r\n\r\n public onCreate(node: IJSLVNode) {\r\n const timeoutRef = (node.dom as HTMLInputElement).value;\r\n if (timeoutRef && timeoutRef !== \"0\") {\r\n clearTimeout(parseInt(timeoutRef, 10));\r\n (node.dom as HTMLInputElement).value = \"\";\r\n }\r\n const f = () => {\r\n const result = this.fnc();\r\n const isPromise = result && typeof result.then === \"function\" && typeof result.catch === \"function\";\r\n if (isPromise) {\r\n result.then(() => {\r\n if (!this.options.noRefresh) {\r\n this.renderer.refresh();\r\n }\r\n (node.dom as HTMLInputElement).value = setTimeout(f, this.options.interval).toString();\r\n }).catch((e) => {\r\n console.error(e);\r\n if (!this.options.stopOnError) {\r\n if (!this.options.noRefresh) {\r\n this.renderer.refresh();\r\n }\r\n (node.dom as HTMLInputElement).value = setTimeout(f, this.options.interval).toString();\r\n }\r\n });\r\n } else {\r\n try {\r\n this.fnc();\r\n } catch (e) {\r\n console.error(e);\r\n if (this.options.stopOnError) {\r\n return;\r\n }\r\n }\r\n if (!this.options.noRefresh) {\r\n this.renderer.refresh();\r\n }\r\n (node.dom as HTMLInputElement).value = setTimeout(f, this.options.interval).toString();\r\n }\r\n };\r\n f();\r\n }\r\n\r\n public onRemove(node: IJSLVNode) {\r\n const timeoutRef = (node.dom as HTMLInputElement).value;\r\n if (timeoutRef && timeoutRef !== \"0\") {\r\n clearTimeout(parseInt(timeoutRef, 10));\r\n (node.dom as HTMLInputElement).value = \"\";\r\n }\r\n }\r\n\r\n}\r\n","import \"./StackPanelStyle.scss\";\r\nimport { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\n\r\n\r\nexport interface IStackPanelOptions {\r\n orientation?: \"horizontal\" | \"vertical\";\r\n valign?: \"center\" | \"stretch\" | \"top\" | \"bottom\" | \"baseline\";\r\n class?: string;\r\n style?: string;\r\n responsive?: boolean;\r\n sizes?: string[];\r\n wrap?: boolean;\r\n}\r\n\r\nexport class StackPanelComponent implements IJSLComponent {\r\n\r\n private options: IStackPanelOptions;\r\n\r\n public constructor(private children: Array<IJSLVNode | IJSLComponent>, options?: IStackPanelOptions) {\r\n this.options = { ...{ orientation: \"horizontal\", valign: \"stretch\" }, ...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 render(): IJSLVNode {\r\n let c = this.options.orientation === \"horizontal\" ? \"stackpanel-comp hstackpanel\" : \"stackpanel-comp vstackpanel\";\r\n if (this.options.responsive) {\r\n c += \" responsive\";\r\n }\r\n if (this.options.wrap) {\r\n c += \" wrap\";\r\n }\r\n if (this.options.class) {\r\n c += \" \" + this.options.class;\r\n }\r\n const va = this.options.valign;\r\n let s = \"align-items:\" + (va === \"top\" ? \"flex-start\" : (va === \"bottom\" ? \"flex-end\" : va));\r\n if (this.options.style) {\r\n s += \";\" + this.options.style;\r\n }\r\n return {\r\n tag: \"div\", attr: { class: c, style: s },\r\n children: this.children.map((x, idx) => x != null && (x as any)._is_splitter === true ? x : ({\r\n tag: \"div\",\r\n attr: { style: this.getSize(idx) },\r\n children: [x]\r\n })\r\n )\r\n };\r\n }\r\n\r\n private getSize(idx: number): string {\r\n if (this.options.sizes != null && this.options.sizes[idx] != null) {\r\n const s = this.options.sizes[idx];\r\n if (s === \"*\") {\r\n return undefined;\r\n }\r\n if (this.options.orientation === \"vertical\") {\r\n return \"height: \" + s;\r\n } else {\r\n return \"width:\" + s;\r\n }\r\n }\r\n return \"flex-grow:1;\";\r\n }\r\n\r\n}\r\n","import \"./SplitterStyle.scss\";\r\nimport { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\nimport { EventHandler } from \"../../interaction/eventhandler\";\r\n\r\nexport interface ISplitterComponentOptions {\r\n minSizesInPX?: number[];\r\n maxSizesInPX?: number[];\r\n onResize?: EventHandler<void>;\r\n onResizeDone?: EventHandler<void>;\r\n}\r\n\r\nexport class SplitterComponent implements IJSLComponent {\r\n\r\n private static listenerRegistered = false;\r\n\r\n // tslint:disable-next-line: variable-name\r\n public _is_splitter = true;\r\n\r\n private options: ISplitterComponentOptions;\r\n\r\n constructor(options?: ISplitterComponentOptions) {\r\n this.options = options ?? {};\r\n if (this.options.minSizesInPX == null) {\r\n this.options.minSizesInPX = [];\r\n }\r\n if (this.options.minSizesInPX[0] == null) {\r\n this.options.minSizesInPX[0] = 0;\r\n }\r\n if (this.options.minSizesInPX[1] == null) {\r\n this.options.minSizesInPX[1] = 0;\r\n }\r\n if (this.options.maxSizesInPX == null) {\r\n this.options.maxSizesInPX = [];\r\n }\r\n\r\n if (!SplitterComponent.listenerRegistered) {\r\n SplitterComponent.listenerRegistered = true;\r\n this.registerListener();\r\n }\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 render(): IJSLVNode {\r\n return { tag: \"div\", attr: { class: \"split-comp\" } };\r\n }\r\n\r\n private registerListener() {\r\n\r\n let dragStartX = 0;\r\n let draggedEl: HTMLElement;\r\n let elLeft: HTMLElement;\r\n let elRight: HTMLElement;\r\n let elLeftWidth: number;\r\n let elRightWidth: number;\r\n let isDown: boolean;\r\n\r\n function mousemove(e: MouseEvent) {\r\n if (!isDown) {\r\n return;\r\n }\r\n e.preventDefault();\r\n // e.stopPropagation();\r\n // e.stopImmediatePropagation();\r\n let x;\r\n const orientation = (draggedEl.parentElement as HTMLElement).classList.contains(\"vstackpanel\") ? \"vertical\" : \"horizontal\";\r\n const component = (draggedEl as any)._component as SplitterComponent;\r\n if (orientation === \"horizontal\") {\r\n x = e.pageX != null ? e.pageX : ((e as unknown) as TouchEvent).touches[0].pageX;\r\n } else {\r\n x = e.pageY != null ? e.pageY : ((e as unknown) as TouchEvent).touches[0].pageY;\r\n }\r\n const delta = dragStartX - x;\r\n\r\n if ((elLeftWidth - delta) < component.options.minSizesInPX[0] ||\r\n (elRightWidth + delta) < component.options.minSizesInPX[1]) {\r\n return;\r\n }\r\n if ((elLeftWidth - delta) > component.options.maxSizesInPX[0] ||\r\n (elRightWidth + delta) > component.options.maxSizesInPX[1]) {\r\n return;\r\n }\r\n\r\n if (orientation === \"horizontal\") {\r\n elLeft.style.width = (elLeftWidth - delta) + \"px\";\r\n elRight.style.width = (elRightWidth + delta) + \"px\";\r\n } else {\r\n elLeft.style.height = (elLeftWidth - delta) + \"px\";\r\n elRight.style.height = (elRightWidth + delta) + \"px\";\r\n }\r\n component.options.onResize?.notify();\r\n }\r\n\r\n function mouseup(e) {\r\n isDown = false;\r\n // document.removeEventListener(\"mousemove\", mousemove);\r\n // document.removeEventListener(\"touchmove\", mousemove);\r\n document.removeEventListener(\"mouseup\", mousedown);\r\n document.removeEventListener(\"touchend\", mousedown);\r\n const component = (draggedEl as any)._component as SplitterComponent;\r\n component.options.onResizeDone?.notify();\r\n }\r\n\r\n function mousedown(e) {\r\n\r\n if ((e.target as HTMLElement).classList.contains(\"split-comp\")) {\r\n isDown = true;\r\n const orientation = (e.target.parentElement as HTMLElement).classList.contains(\"vstackpanel\") ? \"vertical\" : \"horizontal\";\r\n\r\n if (orientation === \"horizontal\") {\r\n dragStartX = e.pageX != null ? e.pageX : ((e as unknown) as TouchEvent).touches[0].pageX;\r\n } else {\r\n dragStartX = e.pageY != null ? e.pageY : ((e as unknown) as TouchEvent).touches[0].pageY;\r\n }\r\n draggedEl = e.target as HTMLElement;\r\n\r\n elLeft = draggedEl.previousElementSibling as HTMLElement;\r\n elRight = draggedEl.nextElementSibling as HTMLElement;\r\n\r\n if (elLeft != null && elRight != null) {\r\n\r\n if (orientation === \"horizontal\") {\r\n elLeftWidth = elLeft.getBoundingClientRect().width;\r\n elRightWidth = elRight.getBoundingClientRect().width;\r\n } else {\r\n elLeftWidth = elLeft.getBoundingClientRect().height;\r\n elRightWidth = elRight.getBoundingClientRect().height;\r\n }\r\n\r\n document.body.addEventListener(\"mousemove\", mousemove, { passive: false });\r\n document.body.addEventListener(\"touchmove\", mousemove, { passive: false });\r\n document.body.addEventListener(\"mouseup\", mouseup, false);\r\n document.body.addEventListener(\"touchend\", mouseup, false);\r\n }\r\n }\r\n }\r\n\r\n document.addEventListener(\"mousedown\", mousedown);\r\n document.addEventListener(\"touchstart\", mousedown);\r\n document.removeEventListener(\"mousemove\", mousemove);\r\n document.removeEventListener(\"touchmove\", mousemove);\r\n }\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, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\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 \"./NavigationStyle.scss\";\r\nimport { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\n\r\nexport interface INavItemChild {\r\n content: string | IJSLVNode;\r\n link?: string;\r\n target?: string;\r\n click?: (e: MouseEvent) => void;\r\n}\r\n\r\nexport interface INavItem {\r\n content: string | IJSLVNode;\r\n link?: string;\r\n target?: string;\r\n children?: INavItemChild[];\r\n click?: (e: MouseEvent) => void;\r\n}\r\n\r\nexport interface INavigationOptions {\r\n title: string | IJSLVNode;\r\n titleLink?: string;\r\n data: INavItem[];\r\n style?: string;\r\n class?: string;\r\n position?: \"default\" | \"static\" | \"fixed\" | \"fixed-bottom\";\r\n alignment?: \"right\" | \"left\";\r\n id?: string;\r\n}\r\n\r\nexport class NavigationComponent implements IJSLComponent {\r\n\r\n private options: INavigationOptions;\r\n\r\n constructor(options: INavigationOptions) {\r\n this.options = {position: \"fixed\", id: \"luxbar-checkbox\", alignment: \"left\", ...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 render(): IJSLVNode {\r\n\r\n return {\r\n tag: \"header\",\r\n attr: {style: this.options.style, class: \"nav-comp \" + (this.options.class ?? \"\")},\r\n children: [\r\n {tag: \"div\", attr: {class: \"luxbar luxbar-\" + this.options.position},\r\n children: [\r\n {tag: \"input\", attr: {type: \"checkbox\", class: \"luxbar-checkbox\", id: this.options.id}},\r\n {tag: \"div\", attr: {class: \"luxbar-menu luxbar-menu-\" + this.options.alignment + \" luxbar-menu-light\"},\r\n children: [{tag: \"ul\", attr: {class: \"luxbar-navigation\"}, children: [\r\n {tag: \"li\", attr: {class: \"luxbar-header\"}, children: [\r\n {tag: \"a\", attr: {href: this.options.titleLink ?? \"#\", class: \"luxbar-brand\"}, children: [this.toNode(this.options.title)]},\r\n {tag: \"label\", attr: {class: \"luxbar-hamburger luxbar-hamburger-spin\", for: this.options.id},\r\n children: [{tag: \"span\"}]},\r\n ]},\r\n ...this.options.data.map((x) => this.itemToNode(x))\r\n ]}]}\r\n ]}\r\n ]\r\n };\r\n\r\n }\r\n\r\n private itemToNode(x: INavItem): IJSLVNode {\r\n return {tag: \"li\", attr: {class: \"luxbar-item\" + (x.children?.length > 0 ? \" dropdown\" : \"\") + (this.isActive(x.link) ? \" active\" : \"\")}, children: [\r\n {tag: \"a\", attr: {href: x.link ?? \"#\", target: x.target, click: x.click}, children: [this.toNode(x.content)]},\r\n (x.children?.length > 0 ? {tag: \"ul\", children: x.children.map((c) => this.itemToNode(c))} : undefined)\r\n ]};\r\n }\r\n\r\n private isActive(link: string): boolean {\r\n return location.hash.startsWith(link);\r\n }\r\n\r\n private toNode(content: IJSLVNode | string | IJSLComponent): IJSLVNode | IJSLComponent {\r\n if (typeof content === \"string\") {\r\n return { tag: \"span\", content };\r\n }\r\n return content;\r\n }\r\n\r\n}\r\n","import \"./RibbonMenuStyle.scss\";\r\nimport { IJSLComponent, IJSLVNode } from \"jsl-render\";\r\n\r\n\r\nexport interface IRibbonGroup {\r\n title?: string;\r\n children: Array<IJSLVNode | IJSLComponent>;\r\n}\r\n\r\nexport class RibbonMenuComponent implements IJSLComponent {\r\n\r\n // private options: IStackPanelOptions;\r\n\r\n public constructor(private groups: IRibbonGroup[]) {\r\n // this.options = {...{orientation: \"horizontal\", verticalAlign: \"stretch\"}, ...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 render(): IJSLVNode {\r\n return {\r\n tag: \"div\", attr: { class: \"ribbon-menu-comp\" },\r\n children: this.groups.map((g) => {\r\n return {\r\n tag: \"div\", attr: { class: \"ribbon-group\" },\r\n children: [{ tag: \"div\", attr: { class: \"ribbon-legend\" }, content: g.title ?? \"\" }, ...g.children]\r\n };\r\n })\r\n };\r\n }\r\n\r\n}\r\n"],"names":["_culture","exports","_date","_helper","_jq","_numeric","_resizable","_moveable","_eventhandler","_datePicker","_dialog","_dropDown","_numberInput","_notification","_slickCore","_slickCreator","_slickDataview","_slickEditorsCore","_slickEditorsDate","_slickEditorsLookup","_slickFormatters","_slickGrid","_slickGroupitemmetadataprovider","_slickCellrangedecorator","_slickCellrangeselector","_slickCellselectionmodel","_slickHeadermenu","_slickRowselectionmodel","_progressComponent","_dateComponent","_timeComponent","_dateTimeComponent","_expanderComponent","_loadingComponent","_formComponent","_formFieldComponent","_gridComponent","_treeViewComponent","_tabsComponent","_numberComponent","_dialogComponent","_autoSuggestComponent","_buttonComponent","_inputComponent","_checkBoxComponent","_intervalComponent","_selectComponent","_stackPanelComponent","_splitterComponent","_excelFilter","_slickTree","_navigationComponent","_ribbonMenuComponent","_w","window","_current_culture","culture","info","thousandSep","decimalSep","dateFormat","numberFormat","set","c","cult_vals","cultures","toLowerCase","undefined","get","current_culture","de","en-us","en-gb","interopDefault","a","__esModule","default","defineInteropFlag","Object","defineProperty","value","exportAll","source","dest","keys","forEach","key","enumerable","export","destName","date2","Math","floor","date","[object Object]","format","settings","_cultureDefault","shortYearCutoff","_defaults","Date","getFullYear","parseInt","dayNamesShort","monthNamesShort","monthNames","match","matches","iFormat","lookAhead","RegExp","num","iValue","length","getName","shortNames","longNames","names","i","substr","Error","literal","charAt","doy","getNumber","month","day","date1","getDate","year","_ticksTo1970","getMonth","checkLiteral","dim","_getDaysInMonth","result","_daylightSavingAdjust","isNaN","dayNames","len","output","formatNumber","formatName","getDay","getTime","inputMode","pad","getHours","getMinutes","getSeconds","helper","random","replace","r","toString","obj","prototype","call","id","test","pl","search","decode","s","decodeURIComponent","query","location","substring","urlParams","exec","o","seenObjects","detect","indexOf","push","hasOwnProperty","data","correctDates","dateISO","x","fromString","getTimezoneOffset","emptyGuid","d","regexIso8601","_myparse","v","m","UTC","parse","apply","this","arguments","getParentWithClass","el","stopAt","classList","contains","parentElement","jQWrapper","elements","_elements","empty","innerHTML","appendTo","selector","HTMLElement","appendChild","j","append","add","css","style","getComputedStyle","keyEl","attr","closestClass","name","jQueryReplacement","remove","parentNode","removeChild","html","text","innerText","height","cssHeight","offsetHeight","width","offsetWidth","removeClass","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","Array","isArray","each","array","shallowExtend","rest","numeric","nrAsString","str","comma_sep","parseFloat","nr","f","cacheEntry","formatCache","parseNrFormat","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","end","slice","nr_str","t","CustomEvent","CustomEvent1","event","params","bubbles","cancelable","detail","evt","createEvent","initCustomEvent","Event","Element","ResizeContainer","Resizable","defaultOptions","resizeHandlePrefix","onStart","EventHandler","onStop","onResize","resizeDelta","container","options","startSize","y","mouseDownContainer","target","className","preventDefault","stopPropagation","stopImmediatePropagation","resizeX","resizeY","element","notify","extractArg","mouseMove","mouseUp","raiseEvt","val","minWidth","maxWidth","abs","gridX","round","minHeight","maxHeight","gridY","removeEventListener","init","touches","changedTouches","options1","querySelector","click","res","subscribe","fnc1","handlers","val2","h","splice","console","warn","MoveableContainer","Moveable","onMove","direction","moveDelta","initialX","initialY","directChild","canceled","args","offsetLeft","offsetTop","cancelEvent","maxX","clientWidth","maxY","clientHeight","parcelHelpers","_datePickerOptions","require","_index","_emitter","input","opts","_datePickerOptionsDefault","mode","_indexDefault","me","emitter","setState","open","destroy","_fns","today","lang","english","now","dt","_dateManip","dateClass","dateOrParse","inRange","makeInRangeFn","min","shiftYear","max","datesEq","shiftMonth","setMonth","_permanentModeDefault","_permanentMode","emit","tagName","_modalModeDefault","_baseMode","dp","_baseModeDefault","readonly","_dom","views","_dayPickerDefault","_monthPickerDefault","current","focus","detatchInputEvents","selectedDate","closing","shouldFocusOnBlur","shouldFocusOnRender","hilightedDate","updateInput","close","adjustPosition","noop","selectedDate1","e","simulated","dispatchEvent","view","containerHTML","calEl","hasFocus","currentView","onKeyDown","activeElement","onClick","attachContainerEvents","constrainDate","computeSelectedDate","attachToDom","focused","isVisible","becauseOfBlur","parent","focusInput","hadFocus","render","firstChild","focusCurrent","bufferFn","bufferShow","attachInputEvents","keyCode","shiftBy","getAttribute","dp-cal-year","days","dayOffset","months","hilightedMonth","map","currentDate","fn","mapDays","isNotInMonth","isDisabled","isToday","clear","Key","esc","dp-month","currentMonth","mapYears","currentYear","selectedYear","up","right","down","shiftedYear","setYear","inputPos","win","cal","pageYOffset","inputTop","calHeight","belowTop","aboveTop","isAbove","innerHeight","toggle","adjustCalY","pageXOffset","inputLeft","maxRight","innerWidth","shiftedLeft","visibility","root","onOne","handler","fns","onMany","arg","off","filter","JSLDialog","Dialog","autoOpen","autoFocus","closeOnOverlayClick","modal","closeOnEscape","overlay","background","pointerEvents","setTimeout","firstInput","onKeydownEvent","onOpen","onClose","el1","DropDown","_lang","func","_events","mixin","props","Events","_reHasRegExpChar","_reRegExpChar","src","prop","extend","b","util","trim","join","closest","isFinite","clearTimeout","g","w","bottom","startsWith","truncate","toDom","item","elementData","class","role","aria-selected","textContent","opt","disabled","active","selected","optgroup","vitem","custom","items","createDocumentFragment","config","pagination","pages","pageIndex","appendItem","customOption","childElementCount","childNodes","removeActive","tree","navIndex","idx","multiple","dom","opened","createItem","option","renderOption","defaultSelected","build","isset","isInt","customClass","mobileDevice","nativeDropdown","label","tags","selectedValues","getSelectedProperties","selectedIndexes","selectedIndex","selectClear","taggable","li","placeholder","tagPlaceholder","autocomplete","autocorrect","autocapitalize","type","tagSeperators","concat","_aTempEscapedSeperators","tagSeperatorsRegex","searchable","tagIndex","spellcheck","messages","searchPlaceholder","inputClear","inputContainer","notice","group","Option","dropdown","disable","includes","which","noResults","itm","prevEl","lastIndex","navigating","lastElementChild","optsRect","requiresPagination","load","that","docFrag","tag","btn","sortSelected","arr","that1","$1","$2","Infinity","ac","bc","ax","shift","by","nn","localeCompare","tg","insertBefore","removeTag","scrollHeight","total","page","clearSearch","searchResults","searching","paginate","nodeName","defaultConfig","disabledMobile","UILang","dropDown","SelectOption","SelectOptionMultiple","NoResults","noOptions","NoOptions","maxSelections","MaxSelection","tagDuplicate","AlreadyInUse","Search","originalType","tabIndex","navigator","userAgent","renderSelection","getSelected","detectEventPassiveOption","bindEvents","events","dismiss","bind","navigate","reset","__selfTriggered","indexes","changes","last","added","removed","getChangedOptions","select","deselect","nativeKeyboard","altKey","ctrlKey","metaKey","String","fromCodePoint","codePointAt","exactSearch","typing","setValue","allowDeselect","_sVal","_oOption","_sGrabbedTagValue","escapeRegExp","update","debounce","closeOnScroll","invert","paginateItems","form","Selectr","setSelected","rendered","replaceChild","selectr","change","setMessage","customSelected","selectedValue","removeAttribute","fireEvent","force","selIndex","clearable","initEvent","toObject","toJson","values","JSON","stringify","checkDuplicate","dupe","setPlaceholder","getOptionByIndex","getOptionByValue","i1","string","anchor","removeMessage","compare","live","counter","firstEl","core","All","Ok","Cancel","grid","Sort","Asc","Desc","Filter","ClearFilter","NumberInput","formatOnBlur","commitOnEnter","enabled","onChange","Create","setAttribute","Notification1","createContainer","notification","newDomGuid","animation","from","to","duration","content","containerVNode","renderer","refresh","timeOut","closeOnClick","_jslRender","JSLRender","Slick","Range1","countHandlers","unsubscribe","scope","returnValue","isPropagationStopped","isImmediatePropagationStopped","EventData","unsubscribeAll","NonDataItem","Group","GroupTotals","EditorLock","SPACE","BACKSPACE","DELETE","END","ENTER","HOME","INSERT","LEFT","PAGE_DOWN","PAGE_UP","TAB","fromRow","fromCell","toRow","toCell","isSingleRow","isSingleCell","row","cell","__nonDataRow","__group","level","count","title","collapsed","selectChecked","totals","rows","groups","groupingKey","__groupTotals","initialized","equals","createJSLGrid","$","columns","formulaObjects","headerMenu","headerButtons","formulas","customCommandHandler","dataView","filters","CreateColumnGroups","getOptions","columns1","getColumns","frozenColumn","$preHeaderPanel","getPreHeaderPanel","renderHeaderGroups","getPreHeaderPanelRight","preHeaderPanel","start","getHeadersWidth","headerColumnWidthDiff","getHeaderColumnWidthDiff","header","lastColumnGroup","widthTotal","columnGroup","storeColumnSettings","cols","colSettings","localStorage","setItem","saveColumnsKey","triggerFormula","column","l","sort","sortAsc","comparer","sortByVisibleValue","formatter","getDataItemValueForColumn","xStr","yStr","toLocaleLowerCase","refreshData","setItems","invalidate","getFormattedValue","TextFormatter","formatterResult","getItem","calcLengthInternal","convertElement","charWidth","isHTML","measureElement","position","whiteSpace","columnId","dontrefresh","refreshFilters","noColumnHeaderRefresh","setFilter","filterArray","field","orResult","onFiltersChanged","sanitizeColumns","explicitInitialization","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","onRowCountChanged","updateRowCount","onAddNewRow","provideDefaultValues","addItem","showHeaderMenu","HeaderMenu","onBeforeMenuShow","menu","sortable","command","filterable","onCommand","sortCols","multiColumnSort","showFilterDialog","show","clearFilter","_slickHeaderbuttons","HeaderButtons","onColumnsResized","onColumnsReordered","setColumns","loadColumnSettings","setHeight","resizeCanvas","getHeight","setData","newData","getData","addFormula","usedColumns","getContentWidth","fitToContent","getDataLength","triggerAllFormulas","refreshDataItem","updateRow","getRowByItem","addFilter","setFilters","getFilters","getSelectedRows","selRows","rowIdx","toPush","scrollbarDimensions","maxSupportedCssHeight","th","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","forceSyncScrolling","addNewRowCssClass","preserveCopiedSelectionOnPaste","showCellSelection","viewportClass","minRowBuffer","emulatePagingWhenScrolling","editorCellNavOnLRKeys","doPaging","dragDelta","columnDefaults","resizable","rerenderOnResize","headerCssClass","defaultSortAsc","focusable","selectable","vScrollDir","uid","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","oldProps","finishInitialization","dragStartX","dragStartY","isDown","getViewportWidth","getViewportHeight","h1","n1","measureCellPaddingAndBorder","$target","jquery","cacheRowPositions","setFrozenOptions","setPaneVisibility","setScroller","setOverflow","updateColumnCaches","createColumnHeaders","createColumnFooter","ctrlPressed","$col","getEditorLock","commitCurrentEdit","sortColumn","hadSortCol","shiftKey","setSortColumns","trigger","col","getColumnIndex","processColumnResize","startColumnResize","finishColumnResize","mouseDownFnc","lastChild","pageX","dragColStartX","draggedEl","dragGhost","ghostContent","processColumnDrag","finishColumnDrag","startColumnDragging","setupColumnMoveAndResize","createCssRules","elem","scrollWidth","$elem","handleActiveCellPositionChange","bindAncestorScrollEvents","handleScroll","preventScroll","handleHeaderContextMenu","handleHeaderClick","handleKeyDown","handleClick","handleDblClick","handleContextMenu","dragStartedDD","delta","dd","getCellFromEvent","cellExists","onDragInit","handleDragInit","pageY","handleMouseUp","_dd","dragging","propagates","startX","startY","onDragStart","handleDragStart","handleDrag","onDragEnd","handleDragEnd","old","hasFrozenColumns","unregisterPlugin","plugin","setActiveCanvasNode","setActiveViewportNode","measureScrollbar","$outerdiv","$innerdiv","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","nextEl","nextElementSibling","prevWidth","nextWidth","draggedDistance","$colsL","$colsR","reorderedIds","reorderedColumns","applyColumnResort","minPageX","maxPageX","colIdx","columnElements","shrinkLeewayOnRight","stretchLeewayOnRight","previousWidth","shrinkLeewayOnLeft","stretchLeewayOnLeft","currentX","actualMinWidth","newCanvasWidthL","k","j1","j2","applyColumnHeaderWidths","syncColumnCellResize","newWidth","invalidateAllRows","getVBoxDelta","$el","getRowTop","dataLength","rules","styleSheet","cssText","createTextNode","getColumnCssRules","sheets","styleSheets","ownerNode","columnIdx","cssRules","selectorText","removeCssRules","tmp_fnc","_isImmediatePropagationStopped","_isPropagationStopped","autosizeColumns","prevTotal","widths","shrinkLeeway","availWidth","shrinkProportion","absMinWidth","shrinkSize","growProportion","growSize","currentWidth","reRender","onAutosizeColumns","headers","rule","numberCols","headerColumnEls","columnIndex","handleSelectedRangesChanged","ranges","previousSelectedRows","arr1","arr2","hash","canCellBeSelected","setCellCssStyles","onSelectedRowsChanged","updateColumnProps","widthRequest","columnDefinitions","validateAndEnforceOptions","getLength","getDataLengthIncludingAddNew","getDataItem","variableRowHeight","getRowFromPosition","rowsInPosCache","ar","compare_fn","cmp","binarySearch","pos","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","rl","invalidateRow","applyFormatResultToCellNode","cellNode","suppressRemove","removeClasses","ensureCellNodesInRowsCache","cellNodesByColumnIdx","loadValue","onAppendCell","invalidatePostProcessingResults","fullHeight","preHeaderH","ceil","paneBottomTop","dataLengthIncludingAddNew","numberOfRows","oldH","tempViewportH","oldViewportHasVScroll","r1","resetActiveCell","rowH","oldScrollTopInRange","viewportTop","viewportLeft","getRenderedRangeFromVisibleRange","buffer","minBuffer","lastNode","pop","cleanUpCells","cellToRemove","cellsToRemove","cleanUpAndRenderCells","cellsAdded","stringArray","processedRows","btm","processedRow","renderRows","needToReselectCell","xRight","ii1","xChild","xChildRight","nodes","idx1","cIdx","getCellNode","startPostProcessing","asyncPostProcessRows","asyncPostProcessCleanupRows","visible","renderedFrozenRows","onRendered","startRow","endRow","isMouseWheel","vScrollDist","maxScrollDistanceY","maxScrollDistanceX","hScrollDist","dx","dy","enqueue","onScroll","_handleScroll","processedStatus","asyncPostRender","groupId","entry","actionType","asyncPostRenderCleanup","updateCellCssStylesOnRenderedRows","addedHash","removedHash","addedRowHash","removedRowHash","prevHash","keyCaptureList","handled","navigateTop","navigateRowStart","navigateBottom","navigateRowEnd","navigatePrev","ESCAPE","isActive","navigatePageDown","navigateLeft","RIGHT","navigateRight","UP","navigateUp","DOWN","navigateDown","navigateNext","makeActiveCellEditable","error","setFocus","scrollRowIntoView","setActiveCellInternal","preClickModeOn","suppressActiveCellChangedEvent","$cell","onContextMenu","onDblClick","gotoCell","$header","onHeaderContextMenu","onHeaderClick","getCellFromPoint","cls","getRowBottom","rowOffset","getCellFromNode","scrollCellIntoView","getColspan","scrollRight","newCell","opt_editMode","$activeCellNode","$activeCellOffset","isBottom","isCellPotentiallyEditable","onActiveCellChanged","getActiveCell","onBeforeCellEditorDestroy","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","gotoPrev","gotoNext","forceEdit","isValueChanged","validate","valid","onCellChange","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","getMaxSupportedCssHeight","msMaxTouchPoints","headerL","headerR","headerRowScrollerL","headerRowScrollerR","headerRowSpacerL","headerRowSpacerR","headerRowL","headerRowR","topPanelScrollerL","topPanelScrollerR","cloneNode","Grid","_grid","_inHandler","_options","_ranges","_self","_handler","selectActiveRow","wrapHandler","rangesToRows","handleActiveCellChange","getRowsRange","setActiveCell","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","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","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","vl","valueList","txt","ExcelFilter","rem","documentElement","fontSize","currentFilters","getDistinctValues","filterOptions","getFilterValues","oldCheckedValues","_checkedValues","dlg","dlgBody","cbAllContainer","cbAll","cbAllLabel","cursor","marginLeft","sortedValues","visibleValues","checkedValues","cbContainer","convertRemToPixels","vr","_virtualRenderComponent","VirtualRenderComponent","renderRow","checked","rowData","_","selId","selId1","allChecked","getOwnPropertyNames","for","raw","term","dlgObj","selLength","anyChecked","filterObject","dlgClearButton","textToValues","State","scrollPos","bufferSizeInPx","rowTag","viewportSizeInPX","__proto__","vrBody","getChildren","scroll","newScrollPos","updateNode","viewport","TextEditor","MultiLineTextEditor","NumericEditor","BooleanEditor","navOnLR","maxLength","_slickEditorsNav","handleKeydownLRNav","handleKeydownLRNoNav","defaultValue","validator","val_as_str","msg","$select","keyCodes","selectionStart","textLength","DateEditor","datePicker","DatePicker","onlyDate","equal","validationResults","MultiLookupEditor","SelectComponent","dropdownWidth","getValue","LookupEditor","openOnEnter","editorOptions","reposition","isExpanded","AutoSuggestEditor","AutoSuggestComponent","suggest","getRef","expanded","doNotFocus","keyColumn","textColumn","dropdownHeight","dropDirection","enableSearch","enableAnimation","enableKeyboard","allowEmpty","focusFirstItem","autoShrink","bindMode","onAppend","onRender","isCurrent","matchSearch","bindTo","property","converter","toUI","mousedown","keydown","ENTER_KEY","openOnFocus","searchTxt","dimension","dropdownArea","dropdownClass","ddDimension","ddAreaComp","_selectDDAreaComponent","SelectDDAreaComponent","renderHeight","ddHeight","requestAnimationFrame","selectionEnd","ex","toData","clearbtn","hasSelection","isSelected","isFocused","placehoder","isInternetExplorer","component","isScrolling","focusFirst","scrollContainer","filteredData","offsetX","offsetY","blur","ESCAPE_KEY","DOWN_KEY","UP_KEY","getFocus","currentSelection","TAB_KEY","args1","renderArg","selItem","oldLen","ref","AutoSuggest","autoComplete","addEvent","removeEvent","elClass","cb","context","srcElement","minChars","delay","menuClass","renderItem","re","onSelect","elems","sc","autocompleteAttr","last_val","updateSC","resize","next","currentStyle","suggestionHeight","scrTop","selTop","blurHandler","keydownHandler","nextSibling","previousSibling","keyupHandler","timer","part","focusHandler","i3","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","ProgressComponent","progress1","progress","color","showPercent","percentFormat","DateComponent","newVal","newValStr","currentDom","raiseEvent","TimeComponent","formatTime","raiseChangeEvent","datePart","parts","setHours","setMinutes","setSeconds","log","getValueAsDate","DateTimeComponent","optionsCopy","dateComp","timeComp","ExpanderComponent","optionsOrHeader","expanded1","waitingForAnimation","iconSize","animate","isToggleOnHeader","toggleExpand","expandedIcon","getIcon","collapsedIcon","toNode","onToggle","LoadingComponent","sizeInRem","FormComponent","FormFieldComponent","validationMessage","required","setInActive","setActive","onInput","InputDom","numberOptions","datepickerRef","dateOptions","_autoSuggest","autoSuggestOptions","onValidate","validationResult","getElementById","formField","onBlur","onFocus","GridComponent","currentlyVisible","checkVisibleTimeout","initEventsFnc","resizeEventListener","then","anyInputIsFocused","rootTag","Promise","resolve","reject","refResolver","vnode","gridRef","rawData","checkVisibility","getViewportNode","TreeViewComponent","renderNode","getInput","addChild","TabsComponent","tabs","activeIndex","onCreate","contentClass","preserveContent","currIndex","SetSelectedTab","canClose","closeTabIndex","tabItem","onClosing","currIdx","NumberComponent","DialogComponent","lastRenderedDlg","Button","oldRenderer","lastCreatedRenderer","oldLastDlg","closeIcon","resizeHandle","footer","styleW","styleH","headerStyle","allowMove","wheel","showCloseButton","allowResize","getOverlay","headerWasClicked","transform","moveOptions","dlgEl","resizeOptions","bodyEl","bodyRect","ButtonComponent","outlined","InputComponent","bindOnInput","raiseInputEvent","CheckBoxComponent","IntervalComponent","timeoutRef","catch","noRefresh","interval","stopOnError","StackPanelComponent","orientation","valign","responsive","wrap","va","_is_splitter","getSize","sizes","SplitterComponent","minSizesInPX","maxSizesInPX","listenerRegistered","registerListener","elLeft","elRight","elLeftWidth","elRightWidth","mousemove","_component","mouseup","onResizeDone","passive","IndentFormatter","GridTree","hierachy","_hierachy","getLevel","indentInRem","enableCollapsing","hasChildren","collapsedStateField","expandIconHTML","collapseIconHTML","hiddenStateField","initEvents","getParent","parentColumn","rowHasChildren","getIdxByItem","parentid","getAllChildren","expand","realRows","filterChildren","parentID","rows2","oldparent","newparent","getIdxById","dict","hiddenFilter","NavigationComponent","alignment","href","titleLink","itemToNode","link","RibbonMenuComponent"],"version":3,"file":"index.js.map"}
1
+ {"mappings":"o3CACAA,EAAkCC,+CAClCC,EAAqCD,gDACrCE,EAAsCF,oDACtCG,EAA0CH,kDAC1CI,EAAwCJ,4CACxCK,EAAkCL,iEAClCM,EAAuDN,4CACvDO,EAAkCP,kEAElCQ,EAAwDR,iEACxDS,EAAuDT,kEACvDU,EAAwDV,0DACxDW,EAAgDX,iEAChDY,EAAuDZ,0rBC0D5Ca,MAKKC,OAAAd,EAAW,SAAA,IAAAe,UAEzBC,EAAa,oBACb,CAEAC,uDA0LoBC,KAAAC,SAElBC,cAAe,WACf,OAAMC,EAAGC,QA2BXC,KAAAC,YAAA,SAAAL,aAMcE,EAAOC,OAAS,EAAKG,GAAA,EAAAA,IAAAJ,EAAAI,KAAAN,GAAAE,EAAAK,OAAAD,EAAA,SA6C9BE,OAAA,SAAmBC,EAAAC,EAAAC,OAWnBC,aAPPD,EAAAA,GAAAP,KASE,IAAA,IAAAE,EAAA,EAAAA,EAAAJ,EAAAC,UAAAO,EAAAG,sBAAAH,EAAAG,wBAKKH,EAAAI,+BAASJ,EAAAI,iCAAAR,IAAAM,EAAAV,EAAAI,GAAAS,KAAAJ,EAAAD,EAAAD,GAEd,OAAAG,IAxRAI,UAAAA,0BAoTA,IAAAd,EAAA,GAOAE,KAAAa,UAAA,SAAAC,EAAAC,GAgCF,OAzBEjB,EAAAH,KAAA,CAOAmB,MAAAA,EAOAC,QAAAA,IASID,EAAAD,UAAgBE,GAEtBf,yCAaA,IAAAE,EAAAJ,EAAAC,OAUOG,QAAaJ,EAAOI,GAAAY,QAAAA,GAAAhB,EAAAI,GAAAa,UAAAA,SAEzBjB,EAAAK,OAAAD,EAAA,QAOAY,EAAAb,YAAAc,GAWF,OAAAf,MAWEA,KAAAgB,eAAA,qBAQUlB,EAAAC,wDAGVD,EAAA,GAOME,aAhaCR,aACIyB,QACTC,cACQC,aACDC,mBAMM,IAAAA,UAEN,CACPC,MAAM,EACNC,UAAM,EACNC,OAAK,WAEPC,IAAA,GACCC,MAAA,aAIHC,KAAA,GAOMC,OAAA,GACAC,KAAA,GAEJC,UAAA,GAKEC,QAAA,YAGFC,IAAA,gCAcE,6CAqBF,SAAAnB,QAQEH,GAAgB,OAOlBT,KAAAgC,gBAAA,cAMwB,6BAyBF,kBAIbvB,QAOJwB,yBAA6B,WAChCvB,GAAa,wDASVA,cA2REwB,EAAAC,EAAeC,EAAAC,QAGpBC,IAAAF,QAAuBE,IAAAD,QAGzBA,EAAAF,gBAsBUI,KAAAC,IAAAN,EAAuBE,+BAkBnCpC,KAAAoC,MAAAG,KAAAE,IAAAP,EAAAE,GAKApC,KAAAqC,OAAAE,KAAAE,IAA0BN,EAAAE,GAO1BrC,KAAA0C,YAAc,WACd,OAAA1C,KAAAkC,SAAAlC,KAAAoC,OAOApC,KAAM2C,aAAA,WAEN,OAAA3C,KAAAkC,SAAAlC,KAAAoC,OAAuCpC,KAAAmC,UAAAnC,KAAAqC,QAavCrC,KAAM4C,SAAA,SAAAC,EAAAC,GAEN,OAAAD,GAAA7C,KAAAkC,SAAmCW,GAAA7C,KAAAoC,OAAAU,GAAA9C,KAAAmC,UAAAW,GAAA9C,KAAAqC,QAOnCrC,KAAA+C,SAAW,WACX,OAAA/C,KAAA2C,eAAqC,IAAA3C,KAAAkC,QAAA,IAAAlC,KAAAmC,SAAA,IACrC,IAAAnC,KAAAkC,QAAgC,IAAAlC,KAAAmC,SAAA,MAAAnC,KAAAoC,MAAA,IAAApC,KAAAqC,OAAA,KAQhC,SAAMpB,IAENjB,KAAAgD,cAAA,EAOA,SAAQ9B,IACRlB,KAAAiD,SAAa,EAMbjD,KAAAkD,MAAA,EAOAlD,KAAAmD,MAAA,EAKAnD,KAAUoD,MAAA,KAMVpD,KAAAqD,MAAA,KAMArD,KAAMsD,WAAA,EAQNtD,KAAAuD,eAAA,EAQAvD,KAAAwD,OAAiB,KAOjBxD,KAAMyD,KAAA,GAQNzD,KAAA0D,OAAA,KAQA1D,KAAO2D,YAAA,KAyBP,SAAUxC,IACVnB,KAAO4D,eAAA,EAOP5D,KAAA6D,MAAA,KAQA7D,KAAA8D,aAAA,wxBAtCA5C,EAAA6C,UAAA,IAAA9C,EAQAC,EAAA6C,UAAAC,OAAA,SAAoCH,GACpC,OAAO7D,KAAAoD,QAAAS,EAAAT,OAAApD,KAAAmD,QAAAU,EAAAV,OAAAnD,KAAAsD,YAAAO,EAAAP,WAAAtD,KAAAqD,QAAAQ,EAAAR,OA+BPlC,EAAU4C,UAAA,IAAA9C,8KC1qBDgD,EAAmBC,EAAiBC,EAAWC,UAChDF,EAAGG,UAAUzB,SAASuB,GACfD,OACI5B,IAAX8B,GAAwBF,EAAGG,UAAUzB,SAASwB,UAE9CF,EAAGI,cACIL,EAAmBC,EAAGI,cAAeH,mBAK3CI,EAAUC,OACXC,EAAiBD,SAErBC,EAAUC,MAAK,mBACFC,KAAKF,EACVE,EAAEC,UAAS,gBAKnBH,EAAUI,SAAQ,SAAaC,WAClB5E,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,OAC9B4E,aAAoBC,YACpBD,EAASE,YAAYP,EAAUvE,iBAEtB+E,EAAI,EAAGA,EAAIH,EAAS/E,OAAQkF,IACjCH,EAASG,GAAGD,YAAYP,EAAUvE,iBAOlDuE,EAAUS,OAAM,SAAahB,WAChBhE,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAClCuE,EAAUvE,GAAG8E,YAAYd,gBAKjCO,EAAUU,IAAG,SAAaL,WACLxC,IAAbwC,KACIA,aAAoBC,YACpBN,EAAU9E,KAAKmF,gBAEN5E,EAAI,EAAGA,EAAI4E,EAAS/E,OAAQG,IACjCuE,EAAU9E,KAAKmF,EAAS5E,iBAOxCuE,EAAUW,IAAG,SAAaC,EAAmBjC,WAE3Bd,IAAVc,EAAmB,IACJ,iBAAHiC,EAAiB,KACpBZ,EAAU1E,OAAM,aAGP,sIAEDuF,QAAQD,GAAO,EACjBZ,EAAU,GAAGc,MAAMF,GAEvBG,OAAOC,iBAAiBhB,EAAU,IAAIY,aAElCK,KAASL,KACXA,EAAIM,eAAeD,WAGfxF,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAAC,iDACuBoF,QAAQI,IAAU,GAAqB,iBAATL,EAAIK,GACxFjB,EAAUvE,GAAGqF,MAAMG,GAASL,EAAIK,GAAK,KAErCjB,EAAUvE,GAAGqF,MAAMG,GAASL,EAAIK,WAO3CxF,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAAC,iDACuBoF,QAAQD,IAAQ,GAAiB,iBAALjC,EAClFqB,EAAUvE,GAAGqF,MAAMF,GAAOjC,EAAK,KAE/BqB,EAAUvE,GAAGqF,MAAMF,GAAOjC,eAMtCqB,EAAUmB,KAAI,SAAaP,EAAajC,WACtBd,IAAVc,EAAmB,OACZqB,EAAU1E,OAAS0E,EAAU,GAAGY,QAAO/C,UAEzCpC,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAClCuE,EAAUvE,GAAGmF,GAAOjC,eAK5BqB,EAAUoB,aAAY,SAAaC,EAAc1B,OACzC2B,EAASC,YACJ9F,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAAC,KAC/B+F,EAAQhC,EAAmBQ,EAAUvE,GAAI4F,EAAM1B,GACnD2B,EAAOZ,IAAIc,UAERF,GAGXtB,EAAUyB,OAAM,mBACHhG,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAAC,KAC/BgE,EAAKO,EAAUvE,GACnBgE,EAAGiC,WAAWC,YAAYlC,KAIlCO,EAAU4B,KAAI,SAAaP,EAAc1C,MACZ,IAArBqB,EAAU1E,gBAEAuC,IAAVc,EAAmB,OACZqB,EAAU,GAAGqB,WAEf5F,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAClCuE,EAAUvE,GAAG4F,GAAQ1C,gBAK7BqB,EAAU6B,KAAI,SAAalD,WACTd,IAAVc,EAAmB,OACZqB,EAAU1E,OAAS0E,EAAU,GAAGG,eAAYtC,UAE9CpC,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAClCuE,EAAUvE,GAAG0E,UAAYxB,eAKjCqB,EAAU8B,KAAI,SAAanD,WACdlD,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAClCuE,EAAUvE,GAAGsG,UAAYpD,eAKjCqB,EAAUgC,OAAM,SAAarD,WACXd,IAAVc,EAAmB,KACdqB,EAAU1E,OAAM,WAGjB2G,EAAYC,SAASlC,EAAU,GAAGc,MAAMkB,eACxCG,MAAMF,GACCjC,EAAU,GAAGoC,aAEbH,UAGNxG,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAE9BuE,EAAUvE,GAAGqF,MAAMkB,OADP,iBAALrD,EACqBA,EAGAA,EAAK,kBAM7CqB,EAAUqC,MAAK,SAAa1D,WACVd,IAAVc,EAAmB,KACdqB,EAAU1E,OAAM,cAKd0E,EAAU,GAAGsC,oBAKf7G,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAE9BuE,EAAUvE,GAAGqF,MAAMuB,MADP,iBAAL1D,EACoBA,EAGAA,EAAK,kBAM5CqB,EAAUuC,YAAW,SAAalB,WACrB5F,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAAC,GAC/B4F,EAAKR,QAAO,KAAQ,EAAC,KACjB2B,EAAQnB,EAAKoB,MAAK,aACbC,EAAO,EAAGA,EAAOF,EAAMlH,OAAQoH,IACpC1C,EAAUvE,GAAGmE,UAAU6B,OAAOe,EAAME,SAGxC1C,EAAUvE,GAAGmE,UAAU6B,OAAOJ,gBAM1CrB,EAAU2C,OAAM,cACa,IAArB3C,EAAU1E,OAAY,WAGtBsH,EADK5C,EAAU,GACL6C,+BAEVC,IAAKF,EAAKE,IAAMC,SAASC,KAAKC,UAC9BC,KAAMN,EAAKM,KAAOH,SAASC,KAAKG,aAIxCnD,EAAUoD,SAAQ,eACV9B,EAAM,WACD7F,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAAC,IAAA,IAC1B4H,EAAO,EAAGA,EAAOrD,EAAUvE,GAAG2H,SAAS9H,OAAQ+H,IACpD/B,EAAOpG,KAAK8E,EAAUvE,GAAG2H,SAASC,WAGnCvD,EAAUwB,IAGrBtB,EAAUsD,GAAE,SAAaC,EAAmBC,WAC/B/H,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAClCuE,EAAUvE,GAAGgI,iBAAiBF,EAAWC,gBAKjDxD,EAAU0D,YAAW,SAAarC,EAAcsC,WACnClI,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,KACpB,IAAVkI,GAAmB3D,EAAUvE,GAAGmE,UAAUzB,SAASkD,GACnDrB,EAAUvE,GAAGmE,UAAU6B,OAAOJ,IACb,IAAVsC,GAAmB3D,EAAUvE,GAAGmE,UAAUzB,SAASkD,IAC1DrB,EAAUvE,GAAGmE,UAAUc,IAAIW,gBAMvCrB,EAAU4D,KAAI,SAAavD,OACnBiB,EAASC,YACJ9F,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAAC,KAC/BoI,EAAQ7D,EAAUvE,GAAGqI,iBAAiBzD,WACjCG,EAAI,EAAGA,EAAIqD,EAAMvI,OAAQkF,IAC9Bc,EAAOZ,IAAImD,EAAMrD,WAGlBc,GAGXtB,EAAU+D,UAAS,SAAaC,EAAeC,WAElCxI,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAClCuE,EAAUvE,GAAGqF,MAAMoD,QAAO,gBAKlClE,EAAUmE,QAAO,SAAaH,EAAeC,WAEhCxI,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAClCuE,EAAUvE,GAAGqF,MAAMoD,QAAO,oBAKlClE,EAAUoE,SAAQ,SAAa/C,MACvBA,EAAI,IAAA,IAES5F,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,IAClCuE,EAAUvE,GAAGmE,UAAUc,IAAIW,gBAO3CrB,EAAUqE,SAAQ,SAAahD,WAClB5F,EAAI,EAAGA,EAAIuE,EAAU1E,OAAQG,OAC9BuE,EAAUvE,GAAGmE,UAAUzB,SAASkD,GAAI,OAC7B,SAER,GAGXrB,EAAUsE,MAAK,eACPA,EAAQ,MACRC,EAAOvE,EAAU,OAChBuE,EAAI,OACE,OACHA,EAAOA,EAAKC,wBAChBF,WAEGA,GAIJtE,6DAGAuB,QAAAA,EAAiB,SAAiClB,OACrDN,EAAQ,MACO,iBAARM,KACO,MAAVA,EAAS,GAAU,KACfoE,EAAM1B,SAAS2B,cAAa,OAChCD,EAAItE,UAAYE,EAChBN,EAAS7E,KAAkBuJ,EAAIE,4BAE3BC,EAAI7B,SAASe,iBAAiBzD,MAE9BuE,EAAC,IAAA,IACQnJ,EAAI,EAAGA,EAAImJ,EAAEtJ,OAAQG,IAAC,KACvB8I,EAAaK,EAAEnJ,GACf8I,EAAKM,WAAaC,KAAKC,cACvBhF,EAAS7E,KAAKqJ,cAMb1G,IAAbwC,GACAN,EAAS7E,KAAkBmF,UAG5BP,EAAUC,IAGrBwB,EAAkByD,oBArWTA,EAAWC,KAAaC,GAC7BD,EAAMA,GAAG,WAEAxJ,EAAI,EAAGA,EAAI0J,UAAU7J,OAAQG,IAAC,KAC/B2J,EAAMD,UAAU1J,MAEf2J,UAGIxE,KAAOwE,EACRA,EAAIlE,eAAeN,KACF,OAAbwE,EAAIxE,IAA+B,iBAAPwE,EAAIxE,GAChCqE,EAAIrE,GAAOoE,EAAYK,MAAMC,QAAQF,EAAIxE,UAAsB/C,IAAboH,EAAIrE,GAAkB,GAASqE,EAAIrE,GAAMwE,EAAIxE,IAE/FqE,EAAIrE,GAAOwE,EAAIxE,WAKxBqE,GAmVX1D,EAAkBgE,KAAI,SAAaC,EAA+BhC,WACrD/H,EAAI,EAAGA,EAAI+J,EAAMlK,OAAQG,IAC9B+H,EAAI/H,EAAG+J,EAAM/J,KAGrB8F,EAAkBkE,cAAa,SAAaR,KAAQS,GAChDT,EAAMA,GAAG,WAEAxJ,EAAI,EAAGA,EAAI0J,UAAU7J,OAAQG,OAC7B0J,UAAU1J,WAGNmF,KAAOuE,UAAU1J,GAClB0J,UAAU1J,GAAGyF,eAAeN,KAC5BqE,EAAIrE,GAAOuE,UAAU1J,GAAGmF,WAI7BqE,yFC3ZXjL,EAAQ2L,eAAc,SAAYT,UACzBA,GAAKA,EAAEU,WAAaV,EAAC,CAAIW,QAASX,IAG3ClL,EAAQ8L,kBAAiB,SAAYZ,GACnCa,OAAOC,eAAed,EAAC,aAAc,CAAGvG,OAAO,KAGjD3E,EAAQiM,UAAS,SAAYC,EAAQC,UACnCJ,OAAOK,KAAKF,GAAQG,SAAO,SAAUzF,GAC5B,YAAHA,GAAwB,eAAHA,IAKrBA,KAAOuF,GAAQA,EAAKvF,KAASsF,EAAOtF,IAIxCmF,OAAOC,eAAeG,EAAMvF,EAAG,CAC7B0F,YAAY,EACZC,IAAG,kBACML,EAAOtF,UAKbuF,GAGTnM,EAAQc,OAAM,SAAYqL,EAAMK,EAAUD,GACxCR,OAAOC,eAAeG,EAAMK,EAAQ,CAClCF,YAAY,EACZC,IAAKA,oJC0COE,0UAFVC,EAACC,EAAApF,2BAESkF,EAAiBpG,EAAmCuB,EAChEgF,EAAyBC,SAEnBC,EAAc,OAMhBC,EACAC,QAEEC,EAAQ,OAEVC,EAIAC,EAEAC,EACAC,MALAC,EAAO,YAkFFC,UACCC,EAAUJ,EAAKK,aACfC,EAAUN,EAAKO,gBACjBH,EAAQI,cAAgB,EAAC,KAErBC,EAAkBnB,EAAEU,EAAKU,qBAC7BC,EAAmBF,EAAiB,EAAGL,EAAQI,aAAe,GAE9DC,EAAkBnB,EAAEU,EAAKY,0BACzBD,EAAmBF,EAAiBL,EAAQI,aAAe,EAAGF,EAAQpM,aAGtEyM,EADwBrB,EAAEU,EAAKU,qBACK,EAAGJ,EAAQpM,iBAG1CyM,EAAmBE,EAAgBC,EAAOC,GAC/CF,EAAehI,QACVmE,SAAQ,wBACRzD,IAAG,OAAO,WACV0B,MAAM+E,EAAKgB,mBAChBH,EAAe,GAAGpI,cAAcD,UAAUc,IAAG,sBAEvC2H,EAAwBjB,EAAKkB,+BAC/BC,EACAC,EAAe,GACfC,EAAa,UAERhN,EAAIyM,EAAOzM,EAAI0M,EAAK1M,IAAC,OACpBiN,EAAIhB,EAAQjM,GACd+M,IAAoBE,EAAEC,aAAelN,EAAIyM,GACzCO,GAAcC,EAAErG,MAChBkG,EAAOlG,MAAMoG,EAAaJ,KAE1BI,EAAaC,EAAErG,MACfkG,EAAW7B,EAAC,wDACP7E,KAAI,oCAAuC6G,EAAEC,aAAW,IAAA,WACxDtG,MAAMqG,EAAErG,MAAQgG,GAChBjI,SAAS6H,IAElBO,EAAkBE,EAAEC,uBAMvBC,UACCC,EAAOzB,EAAKO,aACZH,EAAUJ,EAAKK,aACfqB,EAAcD,EAAKE,KAAKrJ,IAAC,CAAOsJ,GAAItJ,EAAEsJ,GAAI3G,MAAO3C,EAAE2C,UACrDtB,OAAOkI,cACPA,aAAaC,QAAO,sBAAyB1B,EAAQ2B,eAAgBC,KAAKC,UAAUP,aAuJnFQ,EAAeC,EAAQC,SACtBC,EAAIxC,EAASsC,MACfE,EAAC,IAAA,IACQhO,EAAI,EAAGiO,EAAID,EAAEnO,OAAQG,EAAIiO,EAAGjO,IACjC+N,EAAKC,EAAEhO,GAAG8N,QAAUE,EAAEhO,GAAG+H,IAAIgG,EAAMD,YAwCtCI,EAAKJ,EAAsBK,SA8B1BC,EAAWN,EAAOM,WAAaN,EAAOO,4BAZlB5E,EAAG6E,SACnB7J,EAAIqJ,EAAOS,UAAU,EAAG,EAAG5C,EAAK6C,0BAA0B/E,EAAGqE,GAASA,EAAQrE,GAC9EgF,EAAIX,EAAOS,UAAU,EAAG,EAAG5C,EAAK6C,0BAA0BF,EAAGR,GAASA,EAAQQ,OAChFI,EAAwC,oBAAhCpE,OAAOzG,UAAUhB,SAASpC,KAAKgE,GAA4BA,EAAgBA,EAA4B4B,KAC/GsI,EAAwC,oBAAhCrE,OAAOzG,UAAUhB,SAASpC,KAAKgO,GAA4BA,EAAgBA,EAA4BpI,WACvG,iBAAD5B,GAA0B,iBAADgK,IAChCC,EAAOjK,EAAEmK,oBACTD,EAAOF,EAAEG,qBAELF,IAASC,EAAO,EAAKD,EAAOC,EAAO,GAAI,YAzBhClF,EAAG6E,OACd7J,EAAIkH,EAAK6C,0BAA0B/E,EAAGqE,GACtCW,EAAI9C,EAAK6C,0BAA0BF,EAAGR,SAC9B,iBAADrJ,GAA0B,iBAADgK,IAChChK,EAAIA,EAAEmK,oBACNH,EAAIA,EAAEG,qBAED,MAALnK,GAAkB,MAALgK,GACN,EACK,MAALhK,GAAkB,MAALgK,EACb,EAEChK,IAAMgK,EAAI,EAAKhK,EAAIgK,EAAI,GAAI,IAiB3C7C,EAASsC,KAAKE,IAAUD,YAanBU,IAELjD,EAASkD,SAAS3I,GAElB4I,aAGKA,IACLpD,EAAKqD,sBAmBCC,EAAkBnB,EAAW5K,EAAK6K,YACzBD,EAAUS,WAAc5P,EAAeuQ,kCAKA,oBAAjD5E,OAAAzG,UAAgBhB,SAAiCpC,KAAA0O,GAAAA,EAAAA,EAAA9I,gBAEzCyH,EAAAnL,SACToL,EAAKnC,EAAWwD,QAAMzM,sDAGlByC,QAAA,MAAc,EACdiK,EAAiBjJ,GAAS,GAAA,IAGR,UAAAkJ,EAAehI,SAAiB2B,cAAA,gCAUtC5C,SACT,UACHrG,EAAI,EAAAA,EAAAqG,EAAWxG,OAAAG,IAAA,OACdiE,EAAIoC,EACLrG,GAEJ,IAAAuP,EAAMC,EAAKvL,gCAEFsL,SAGR1J,8BAbA,YAeDwJ,EAAiBpL,EAAAwL,UACF,MAAfC,IACAA,EAAepI,SAAM2B,cAAW,QAChCyG,EAAerK,MAAMgC,IAAA,YACrBqI,EAAcrK,MAAAsK,SAAY,WAC1BD,EAAKrK,MAAgBuK,WAAS,eACtBrI,KAAAzC,YAAe4K,iGAWpBA,EAAehL,UAAAT,kBAGjByL,EAAatI,wBAAoBR,iBA4BnBiJ,yCAIZhE,EAAK7L,GAAA6P,WAAAA,EAAA,OAAA,SAGP,0BAoDazN,MAAMyJ,EAAQhM,OAAS,WAG7B,IAACG,EAAA,EAAAA,EAAA6L,EAAAhM,OAAAG,IAAA6L,EAAA7L,GAAA6P,WAAAA,uBASRC,GAAAC,eAGIC,GAoCI,WAnCHrE,EAAWK,aAmCTiE,0BAEZrE,EAAAsE,oBApCInC,EAAA5N,SACIgQ,EAAYhQ,8BAOK,MAAPN,OAAO,OAAAsQ,EAAA,GAAApK,MAAAtF,KAAA,KAAAsN,EAAAoC,EAAA,GAAAC,eAEN,IACH,SACGD,EAAItQ,QAAY,QACf,SAGAsQ,EAAatQ,aAGZsQ,EAAAnQ,GAAA+F,MAAAtF,KAAA,KAAAsN,EAAAoC,EAAAnQ,GAAAoQ,UAAAC,GAAA,yBAGJrQ,gBAIJ,0DAiBRsQ,iBAAgBpQ,qCAvbAkN,WACZpN,EAAI,EAAGA,EAAIoN,EAAKvN,OAAQG,IAAC,OACxBiE,EAAImJ,EAAKpN,QACCoC,IAAZ6B,EAAEmM,OAAuBnM,EAAEsJ,KAC3BtJ,EAAEmM,MAAQnM,EAAEsJ,KA9JpBgD,CAAgBpF,SACVY,EAAUd,EAAEjB,cAAa,CAAGwG,wBAAwB,EAAMP,KAAI,UAAc7E,MAElFK,EAA4B,iBAAR7G,EAChB0C,SAASmJ,cAAc7L,GACvBA,GAEC6G,EAAS,MAAA,IACAiF,MAAK,+CAGf3E,EAAQ4E,mBACR5E,EAAQ6E,sBAAuB,EAC/B7E,EAAQ8E,oBAAqB,GAGjCnF,EAAuBN,EAAO0F,mBAC9B/E,EAAQ+E,mBAAkB,CAAIrH,EAAG6E,EAAGrK,eAwQb8J,EAAMD,EAAQiD,SAC/BhF,EAAUJ,EAAKK,aACfgF,EAASrF,EAAK6C,0BAA0BT,EAAMD,GAChDpC,EACAA,EAAqBqC,EAAMD,EAAQiD,GAEnCA,EAAYE,UAEhBpD,EAAeC,EAAOsC,MAAOrC,GAC7BnC,EAASsF,WAAWnD,EAAKhC,EAAQoF,YAAapD,IAUtB,IARCpC,EAAayF,YAAYlR,OAAM,CACpDyL,KAAAA,EACA0F,SAAUL,EACVM,SAAU3F,EAAK6C,0BAA0BT,EAAMD,GAC/CA,OAAAA,EACAC,KAAAA,MAIAA,EAAKD,EAAOsC,OAASY,EACrBnD,EAAeC,EAAOsC,MAAOrC,GAC7BnC,EAASsF,WAAWnD,EAAKhC,EAAQoF,YAAapD,IA9RNwD,CAAkB9H,EAAG6E,EAAGrK,UAE9DuN,EAA4BzF,EAAQyF,2BAAyB3S,EAAA4S,0BAA8B1F,EAAQ2F,kBACjF,MAApB3F,EAAQH,SACRA,EAAWG,EAAQH,UAEnBA,EAAQ,IAAAnN,EAAAkT,SAAA,CAAkBC,eAAe,EAAMJ,0BAAAA,IAC/C5F,EAASkD,SAAS3I,EAAM4F,EAAQoF,aAEpCxF,EAAI,IAAA/M,EAAAiT,UAAiBpG,EAAWG,EAAUT,EAASY,GACnDJ,EAAKmG,eAAeN,GACpB7F,EAAKoG,kBAAiB,IAAA5S,EAAA6S,mBAEtBrG,EAAKsG,qBAAqBtR,WAAS,CAAEP,EAAGD,KAChC+R,EAAgB/R,EAAK2N,OAAOP,KAE5BpN,EAAK2I,KAAK3E,UAAUc,IAAG,4BAmI9B0G,EAAayF,YAAW,IAAA9S,EAAAc,MAAaI,MACrCmM,EAAa2E,iBAAgB,IAAAhS,EAAAc,MAAaI,MAuC3B,WADAmM,EAAKK,aACTiE,MACRtE,EAAKwG,OAAOxR,WAAS,CAAEP,EAAGD,KACtB+N,EAAK/N,EAAKiS,QAASjS,EAAKgO,YArChCvC,EAASyG,cAAc1R,WAAS,CAAEP,EAAGD,KACjCwL,EAAK2G,eAAenS,EAAKoD,MACzBoI,EAAK4G,YAOT3G,EAAS4G,kBAAkB7R,WAAS,CAAEP,EAAGD,KACrCwL,EAAK8G,iBACL9G,EAAK4G,YAGT5G,EAAK+G,YAAY/R,WAAS,CAAEP,EAAGD,WACrB4L,EAAUJ,EAAKK,aACe,MAAhCD,EAAQ4G,uBAEO,IADA5G,EAAQ4G,qBAAqBxS,EAAK4N,QAKrDnC,EAASgH,QAAQzS,EAAK4N,MACrBpC,EAAayF,YAAYlR,OAAM,CAC5ByL,KAAAA,EACA0F,cAAUjP,EACVkP,SAAU3F,EAAK6C,0BAA0BrO,EAAK4N,KAAM5N,EAAK2N,QACzDA,OAAQ3N,EAAK2N,OACbC,KAAM5N,EAAK4N,WA7JfhC,EAAQ8G,iBAkLZvH,EAAU,IAAApM,EAAA4T,WAAA,IACVnH,EAAKmG,eAAexG,GACpBA,EAAWyH,iBAAiBpS,WAAS,CAAEP,EAAGD,WAChC2N,EAAuB3N,EAAK2N,OAC5BkF,EAAO7S,EAAK6S,KACdlF,EAAOmF,WACPD,EAAKE,MAAMzT,KAAI,CACX0D,MAAKgQ,EAAAC,OAASzH,KAAK0H,KAAI,IAAMF,EAAAC,OAAUzH,KAAK2H,IAC5CC,QAAO,aAEXP,EAAKE,MAAMzT,KAAI,CACX0D,MAAKgQ,EAAAC,OAASzH,KAAK0H,KAAI,IAAMF,EAAAC,OAAUzH,KAAK6H,KAC5CD,QAAO,eAGXzF,EAAO2F,aACPT,EAAKE,MAAMzT,KAAI,CACX0D,MAAKgQ,EAAAC,OAASzH,KAAK+H,OACnBH,QAAO,WAEP1H,EAAQ8H,QAAQ3F,GAAMA,EAAE6B,WAAa/B,EAAOP,KAAI1N,OAAS,GACzDmT,EAAKE,MAAMzT,KAAI,CACX0D,MAAKgQ,EAAAC,OAASzH,KAAKiI,YACnBL,QAAO,qBAMvBjI,EAAWuI,UAAUlT,WAAS,CAAEP,EAAGD,QACf,aAAZA,EAAKoT,SAAsC,cAAZpT,EAAKoT,QACpC5H,EAAKwG,OAAOjS,OAAM,CACdiO,QAAqB,aAAZhO,EAAKoT,QACdnB,QAASjS,EAAK2N,OACd+B,SAAU1P,EAAK2N,OAAOP,GACtBuG,SAAQ,EAAKjE,SAAU1P,EAAK2N,OAAOP,GAAI6E,QAASjS,EAAK2N,OAAQK,QAAqB,aAAZhO,EAAKoT,UAC3EQ,iBAAiB,GAClB3T,WAEgB,WAAZD,EAAKoT,QAAoB,OAC1BxH,EAAUJ,EAAKK,aACW,MAA5BD,EAAQiI,iBACRjI,EAAQiI,iBAAiB7T,EAAK2N,OAAQnC,qBAEtBA,GAAMsI,KAAK9T,EAAK2N,YAEjB,iBAAZ3N,EAAKoT,SACZW,EAAY/T,EAAK2N,OAAOP,QApDhChC,EAAa,IAAA4I,EAAAC,cAAA,IACbzI,EAAKmG,eAAevG,GAzKfH,EAAOoF,wBACR7E,EAAK0I,OAGLtI,EAAQ4E,kBACR2D,YAAU,KAEN3I,EAAK4I,iBAAiB5T,WAAS,KAC3BmL,OAEJA,MACD,GAGHC,EAAQ2B,iBACR/B,EAAK4I,iBAAiB5T,WAAS,KAC3BwM,OAEJxB,EAAK6I,mBAAmB7T,WAAS,KAC7BwM,sBA8DH7H,OAAOkI,aAAY,aAIlBrI,EADUwG,EAAKK,aACD0B,kBAChBvI,EAAG,OACGiI,EAAOzB,EAAKO,aACZmB,EAAcM,KAAK8G,MAAMjH,aAAa4B,QAAO,sBAAyBjK,QACvEkI,EAAW,eAGPrN,EAAI,EAAGA,EAAIqN,EAAYxN,OAAQG,YAC3B+E,EAAI,EAAGA,EAAIqI,EAAKvN,OAAQkF,IAAC,GAC1BqI,EAAKrI,GAAGwI,KAAOF,EAAYrN,GAAGuN,GAAE,OAC1BtJ,EAAImJ,EAAKrI,GACfd,EAAE2C,MAAQyG,EAAYrN,GAAG4G,MACrB5G,IAAM+E,IACNqI,EAAKnN,OAAO8E,EAAG,GACfqI,EAAKnN,OAAOD,EAAG,EAAGiE,UAMlC0H,EAAK+I,WAAWtH,IApFhBuH,OAwiBJ1J,EAAAjB,cAAS2B,EAAA,CACTC,SAAAA,EACAgJ,mBAzTerO,GACf0E,EAAEQ,GAAWlF,OAAOA,GACpBoF,EAAKkJ,gBAwTLC,4BApTO7J,EAAEQ,GAAWlF,UAqTpB2H,KAAAA,EACAW,YAAAA,EACAkG,iBAlRaC,GACb7O,EAAO6O,EACPpJ,EAASkD,SAAS3I,GAClB4I,KAgRAkG,0BA5QO9O,GA6QP4I,QAAAA,EACAmG,oBAhQgB9E,EAAerI,EAC/BoN,GACA9J,EAAe5L,KAAI,CAAGsI,IAAAA,EAAK+F,OAAQsC,YAC1BpQ,EAAI,EAAGA,EAAImV,EAAYtV,OAAQG,IAC/BwL,EAAS2J,EAAYnV,MACtBwL,EAAS2J,EAAYnV,IAAC,IAE1BwL,EAAS2J,EAAYnV,IAAIP,KAAI,CAAGsI,IAAAA,EAAK+F,OAAQsC,KA0PjDnB,kBAAAA,EACAmG,gBAAAA,EACAC,sBAtLkBvH,GAEd,IAAAlH,EAAY,GAEhB,IAAA,IAAO0O,EAAK,EAAGC,EAAK5J,EAAA6J,gBAAAF,EAAAC,EAAAD,IACpB1O,EAAKvE,KAAAE,IAAWqE,EAAKwO,EAAUtH,EAAAwH,IAC/BxH,EAAAlH,MAAAA,EACA+E,EAAA+I,WAAA/I,EAAAO,eAgLAuJ,iCAtKkC,MAAd5V,YACZ,IAAIkF,EAAI,EAAAA,EAAAsG,EAAkBxL,OAAUkF,IAAG,IAAA,IAAA/E,EAAA,EAAAA,EAAAmG,EAAAtG,OAAAG,IAAA,sCAG/CmG,EAAAnG,GAAWqL,EAAAtG,GAAA+I,QAAA4H,QAmKXxD,gBAAAA,EACAyD,yBAtJoB5H,GACpB,MAAAhC,EAAAJ,EAAkBK,0BACF+B,EAAQhC,EAChBoF,YAASpD,kDAOZ6H,UAAUhK,EAIhBiK,aAAqB9H,KAyIpB+H,mBAvIUnC,EAAQ7D,SAGOK,EAANvG,MAAMC,QAAA8J,GAAAA,cAMpB2B,EAAA,EAAWA,EACZnF,EAActQ,OAAAyV,iBAIbxF,GAIPC,KAsHEgG,oBAnHgB/H,EACZ8B,OAICA,GAAUC,KA+GfiG,6BA3GKnK,GA4GLqI,YAAAA,EACAnE,eAAAA,sCA1CiBpE,EAAGsK,oBACV,aACA,EAAAjW,EAASkW,EAAQrW,OAAQG,IAAC,OAC5BmW,EAAWD,EAAAlW,uBAIRoC,IAAJgU,GAAIA,EAAArT,SAAAqT,EAAA1S,eAAAH,EAAA9D,KAAA2W,UAGN7S,4BAIT,OAAA+H,siBChaYuG,0JATZ5G,EAAC3M,EAAAc,MAA6B6L,MAK9BoL,EACAC,WAGYzE,EAAUpG,EAAoCtF,EAAMgF,EAAyBY,OA+EvFwK,EACAC,EACAC,EACAC,EACAC,EASAC,EAGAC,EAA4BC,EAE5BC,EACAC,EACAC,EAA4BC,EAAoCC,EAAmCC,EACnGC,EAA4BC,EAAoCC,EAAmCC,EACnGpL,EAAiCqL,EAAyCC,EAC1EC,EAAkCC,EAClCC,EACAC,EACAC,EACAC,EACAC,EACAC,EAEAC,EAAYC,EAAiBC,EAC7BC,EAAmBC,EACnBC,EAAqBC,EAAsBC,EAC3CC,EAAsBC,EAAuBC,EAC7CC,EAA6BC,EAG7BC,EAaAC,EACAC,GACAC,GACAC,GAAWC,GAGXC,GACAC,GAcAC,GA2BAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAEAC,GACAC,GAEAC,GACAC,GAKAC,GACAC,GAEAC,GACAC,GAEAC,GACAC,GAEAC,GACAC,GAEAC,GACAC,GAEAC,GACAC,GAEAC,GACAC,GACAC,GACAC,GAEAC,GACAC,GACAC,GACAC,GAEAC,GACAC,GACAC,GACAC,GACAC,GAEAC,GAIAC,GAtOAC,GAAQ,CAEVC,0BAA0B,EAC1BC,4BAA4B,EAC5BC,6BAA6B,EAC7BzL,wBAAwB,EACxB0L,UAAW,GACXC,mBAAoB,GACpBC,cAAc,EACdC,sBAAsB,EACtBC,UAAU,EACVC,UAAU,EACVC,gCAAgC,EAChCC,sBAAsB,EACtBC,qBAAqB,EACrBC,oBAAoB,EACpBC,qBAAsB,IACtBC,iBAAiB,EACjBC,uBAAuB,EACvBC,qBAAsB,GACtBC,8BAA8B,EAC9BC,4BAA6B,GAC7BC,YAAY,EACZC,WAAU7e,EAAAc,MAAQge,iBAClBC,eAAe,EACfC,gBAAiB,GACjBC,iBAAiB,EACjBC,eAAe,EACfC,gBAAiB,GACjB7M,sBAAsB,EACtBC,oBAAoB,EACpB6M,qBAAsB,GACtBC,cAAc,EACdC,eAAgB,GAChBC,iBAAkB,KAClBC,cAAe,KACfC,qBAAoB,WACpBC,qBAAoB,WACpBC,aAAa,EACbC,4BAA4B,EAC5BC,6BAA8B,KAC9BC,cAAc,EACdjS,cAAc,EACdkS,WAAW,EACXC,eAAe,EACfvK,iBAAiB,EACjBwK,yBAAyB,EACzBC,yBAAyB,EACzBC,6BAA6B,EAC7BC,0BAghGwB/b,EAAaC,EAAcM,EAAYyb,EAAyBC,UAC3E,MAAT1b,EAAa,IAGPA,EAAK,IAAO2b,QAAO,KAAA,SAAgBA,QAAO,KAAA,QAAeA,QAAO,KAAA,SAnhG1EC,oBAAoB,EACpBC,kBAAiB,UACjBC,gCAAgC,EAChCC,mBAAmB,EACnBC,cAAe,KACfC,aAAc,EACdC,4BAA4B,EAC5BC,uBAAuB,EACvBC,UAAU,EACVC,YAAa,EACbC,UAAW,GAGTC,GAAc,CAChB7Z,KAAI,GACJ8Z,WAAW,EACXzM,UAAU,EACV0M,SAAU,GACV/Y,WAAOxE,EACPwd,kBAAkB,EAClBC,eAAgB,KAChBC,gBAAgB,EAChBC,WAAW,EACXC,YAAY,GAUVC,GAAO,EACP/Y,GAAS,EACTgZ,GAAa,EAIbtc,IAAc,EAEduc,GAAG,aAAkB9d,KAAK+d,MAAM,IAAU/d,KAAKge,UAC/CC,GAAIxgB,KAqBJ8M,IAnBgC3B,IAmBR,GAC1BsV,GAAgB,EAAGC,GAAiB,EAAGC,IAA0B,EAE/DC,IAAgB,EAChBC,GAAmB,EACnBC,IAAkB,EAClBC,GAAW,EACXC,GAAc,EACdC,GAAe,EAEfC,GAAY,EACZC,GAAa,EACbC,GAAa,EAEbC,GAAmB,EAKnBC,GAA8B,KAC9BC,GAAgB,KAIhBC,GAAS,GACTC,GAAgB,GAGhBC,GAAiB,EACjBC,GAAgB,EAChBja,GAAY,EACZka,GAAwB,EACxBC,GAAyB,EACzBC,GAAiB,EACjBla,GAAa,EAGbma,GAAY,GAEZC,GAAO,GACPC,GAAc,GAEdC,GAAW,GACXC,GAAW,GACXC,GAAa,GACbC,GAAc,GAEdC,IAAe,EACfC,IAAmB,EAEnBC,YA8pIEC,EAAAC,UAEA,gBASFC,IACAC,GAAA,kBAIO,aACGC,EAAAH,2BASVI,KACOC,GAAS,4BApBhBA,OAAcD,KAyBZH,QAAAA,GA9rIeK,CAAevQ,GAAQ,IAGxCwQ,GAAiB,KAEjBC,GAAe,KACfC,GAAsB,KACtBC,GAAiB,GACjBC,GAAmB,KACnBC,GAAqB,KACrBC,GAAyB,GAwDzBC,GAAO,CAAK3T,SAAQ,WAAc4T,WAAU,SAAY9a,QAAO,SAE/D+a,GAAQ,YAyPHC,SACF7f,GAAW,KAgGV8f,EACAC,EACAC,EAjGJhgB,IAAc,EAEdigB,KACAC,oBAm5DE9f,EACA+f,EAAC,oEACDC,EAAC,oEAMLvD,IAA0B,EAE1Bzc,EAAKiH,EAAC,uFAAwFtG,SAASqS,GACvGpK,GAAiD,EAC1B,cAAnB5I,EAAGkB,IAAG,eAA0D,cAAxBlB,EAAGkB,IAAG,oBAAkE,cAA3BlB,EAAGkB,IAAG,wBAC7F+F,EAAEnB,KAAKia,GAAC,SAAYE,EAAGvO,GACrB9I,IAAyBsX,WAAWlgB,EAAGkB,IAAIwQ,KAAS,KAEtDzK,EAAEnB,KAAKka,GAAC,SAAYC,EAAGvO,GACKwO,WAAWlgB,EAAGkB,IAAIwQ,KAAS,MAGzD1R,EAAGgC,aAECme,EAAIlZ,EAAC,6BAA8BtG,SAASqT,GAChDhU,EAAKiH,EAAC,mEAAoEtG,SAASwf,GACnF5D,GAAgBC,GAAiB,EACV,cAAnBxc,EAAGkB,IAAG,eAA0D,cAAxBlB,EAAGkB,IAAG,oBAAkE,cAA3BlB,EAAGkB,IAAG,wBAC7F+F,EAAEnB,KAAKia,GAAC,SAAYE,EAAGvO,GACrB6K,IAAiB2D,WAAWlgB,EAAGkB,IAAIwQ,KAAS,KAE9CzK,EAAEnB,KAAKka,GAAC,SAAYC,EAAGvO,GACrB8K,IAAkB0D,WAAWlgB,EAAGkB,IAAIwQ,KAAS,MAGjDyO,EAAEne,SAEFgT,EAAyB3W,KAAKE,IAAIqK,GAAuB2T,IAl7DvD6D,IA8dsBC,EAvdLrN,IAwdJqN,EAAQC,QACrBD,EACG3e,KAAI,eAAe,MACnBR,IAAG,gBAAgB,QACnB2C,GAAE,kBAAiB,kBACX,KA3dNkE,EAAQmS,4BAGXnG,EAAUlQ,GAAE,eAAc,SAAYjH,GACZ,UAApBA,EAAM2jB,OAAOC,SAA2C,aAApB5jB,EAAM2jB,OAAOC,SACnD5jB,EAAM6jB,oBAKZC,KAEAC,KACAC,KACAC,KACAC,KAEAC,KACAC,KAEAC,KA63BFjO,EAASnP,GAAE,SAAQ,SAAYzH,OAEzB8kB,EAAuB9kB,EAAE+kB,SAAW/kB,EAAEglB,YACtCna,EAAE7K,EAAEmkB,QAAQ3b,SAAQ,aAIpByc,EAAOpa,EAAE7K,EAAEmkB,QAAQ5e,aAAY,0BAC9B0f,EAAKxlB,YAINiO,EAASuX,EAAKlf,KAAI,aAClB2H,EAAOmF,SAAQ,KACZqS,KAAgBC,oBAAiB,eAIlCC,EAAa,KACbxlB,EAAI,EACDA,EAAIiiB,GAAYpiB,OAAQG,IAAC,GAC1BiiB,GAAYjiB,GAAG6P,UAAY/B,EAAOP,GAAE,EACtCiY,EAAavD,GAAYjiB,IACdmO,SAAWqX,EAAWrX,kBAIjCsX,IAAeD,EAEfzZ,EAAQyS,yBACLgH,IACHA,EAAU,CAAK3V,SAAU/B,EAAOP,GAAIY,QAASL,EAAOgS,iBAElD2F,GAAcD,EAAWrX,UAE3B8T,GAAYhiB,OAAOD,EAAG,GACtBwlB,EAAa,MAEVzZ,EAAQgI,kBAAmBkO,GAAW,KACvCuD,GAAgBC,GAAe1Z,EAAQgI,iBACzCkO,GAAYxiB,KAAK+lB,IAIfN,GAAenZ,EAAQgI,gBACrByR,GACFvD,GAAYhiB,OAAOD,EAAG,KAGlBI,EAAEslB,UAAaR,IAAiBnZ,EAAQgI,kBAC5CkO,GAAW,IAGRuD,EAG4B,GAAtBvD,GAAYpiB,QACrBoiB,GAAYxiB,KAAK+lB,IAHjBA,EAAU,CAAK3V,SAAU/B,EAAOP,GAAIY,QAASL,EAAOgS,gBACpDmC,GAAYxiB,KAAK+lB,KAOvBG,GAAe1D,IAEVlW,EAAQgI,gBAQX6R,GAAQtF,GAAKnO,OAAM,CACjB4B,iBAAiB,EACjBD,SAAUmO,GAAY3U,KAAG,SAAWuY,UACzBhW,SAAU1E,EAAQ2a,GAAeD,EAAIhW,WAAWtC,GAAI6E,QAASjH,EAAQ2a,GAAeD,EAAIhW,WAAY1B,QAAS0X,EAAI1X,aAE3H/N,GAZHwlB,GAAQtF,GAAKnO,OAAM,CACjB4B,iBAAiB,EACjBlE,SAAWoS,GAAYpiB,OAAS,EAAIiO,EAAOP,GAAK,KAChD6E,QAAU6P,GAAYpiB,OAAS,EAAIiO,EAAS,KAC5CK,UAAU8T,GAAYpiB,OAAS,IAAIoiB,GAAY,GAAG9T,SACjD/N,8BAkLE6D,KAAM2S,EAAWzO,KAAI,yBAAwB4d,EAAAC,UAC5C/hB,EAAC,CACTsb,YAAaxT,EAAQwT,YACrB0G,SAAQ,IAAAC,EAAAC,cAAoBC,IAC1BC,GAAoBD,EAAI7B,OAAQ6B,EAAI3hB,MAEtC6hB,QAAO,IAAAJ,EAAAC,cAAoBC,IACzBG,GAAkBH,EAAI7B,OAAQ6B,EAAI3hB,MAEpC+hB,OAAM,IAAAN,EAAAC,cAAoBC,IACxBK,gBAcAC,EAAY,SAAatmB,OACzBumB,EAAkBvmB,EAClBikB,EAA0BpZ,EAAE7K,EAAEmkB,QAAQ5e,aAAY,0BAC/B,IAAnB0e,EAAQxkB,OAAY,KAElBO,EAAEmkB,OAAOpgB,UAAUzB,SAAQ,+BAC7B2hB,EAAUpZ,EAAG7K,EAAEmkB,OAA0BqC,iBAMvCniB,EAAyB,MAAbkiB,EAAIE,MAAgBF,EAAIE,MAAUF,EAA+BG,QAAQ,GAAGD,MAC/DxC,EAAQle,KAAI,UAEvC4F,EAAQ2Q,8BAgBa2H,EAAyB5f,GACpDsiB,GAAgBtiB,EAChBuiB,GAAY3C,EAAQ,IACpB4C,GAAY3f,SAAS2B,cAAa,QACxBie,UAAS,kBACnBD,GAAU5hB,MAAMoC,KAAOuf,GAAUG,WAAU,KAC3CF,GAAU5hB,MAAMkB,OAASygB,GAAUI,aAAY,KAC/CH,GAAU5hB,MAAMuB,MAAQogB,GAAUK,YAAW,SACzCC,EAAehgB,SAAS2B,cAAa,OACzCqe,EAAaJ,UAAS,sBACtBI,EAAajiB,MAAMkB,OAASygB,GAAUI,aAAY,KAClDH,GAAUniB,YAAYwiB,GACtBN,GAAU7iB,UAAUc,IAAG,8BACvB+hB,GAAU5iB,cAAcU,YAAYmiB,IACpC3hB,OAAO0C,iBAAgB,YAAcuf,IACrCjiB,OAAO0C,iBAAgB,YAAcuf,IACrCjiB,OAAO0C,iBAAgB,UAAYwf,IACnCliB,OAAO0C,iBAAgB,WAAawf,IAhChCC,CAAoBpD,EAAS5f,IAMjCuS,EAASnP,GAAE,YAAc6e,GACzB1P,EAASnP,GAAE,aAAe6e,GAlqCxBgB,GACAC,KACA9S,oBA2eE+S,EAAQlH,KAAkB3U,EAAQqS,aAAgB/C,GAAe,GAAKF,GAAY,SAC9EyM,EAAOA,EAAK3hB,aAAeqB,SAASC,MAAgB,MAARqgB,MAE9CA,GAAQ7M,GAAc,IAAM6M,EAAKC,aAAeD,EAAKP,aAAeO,EAAKE,cAAgBF,EAAKR,aAAY,KACxGW,EAAQ9c,EAAE2c,GAIZ1P,EAHGA,EAGeA,EAAgBjT,IAAI8iB,GAFpBA,EAIpBnM,GAAsBgM,EAAwB5f,iBAAgB,SAAWggB,KApf3EC,GAEArR,EAAW/O,GAAE,SAAWgN,IACxBkD,EAAUlQ,GAAE,SAAWqgB,IAOvBnR,EACGlP,GAAE,SAAWsgB,IACbtgB,GAAE,cAAgBugB,IAClBvgB,GAAE,QAAUwgB,IAEfnR,EACGrP,GAAE,SAAWsgB,IAEZpc,EAAQwR,iBACVjG,EACGzP,GAAE,SAAWsgB,IAGdpc,EAAQ6E,sBACV6G,EACG5P,GAAE,SAAWsgB,IAiBlBtR,EAAW5R,IAAI6R,GACZjP,GAAE,UAAYygB,IACjBtQ,EACGnQ,GAAE,UAAYygB,IACdzgB,GAAE,QAAU0gB,IACZ1gB,GAAE,WAAa2gB,IACf3gB,GAAE,cAAgB4gB,QASjBC,EAAgB,WACdC,EAAQ,EAKd3Q,EAAQnQ,GAAE,aAAY,SAAYzH,EAAGwoB,aA66HjCxoB,EAAAwoB,GAIN,IAAAhmB,EAAAimB,GAAAzoB,GACA,IAAAwC,IAAAkmB,GAAmBlmB,EAAAD,IAAAC,EAAAA,MAAA,OAAA,QACPgjB,GAAAtF,GAAAyI,WAAAH,EAAAxoB,qCAl7HI4oB,CAAe5oB,EAAGwoB,GAC9BlF,EAAatjB,EAAEymB,MACflD,EAAavjB,EAAE6oB,MACfrF,GAAS,EACTtc,SAASU,iBAAgB,UAAYkhB,MAEvClR,EAAQnQ,GAAE,aAAY,SAAYzH,EAAG+oB,MAC/BvF,EAAM,IACJvhB,KAAK+mB,IAAI1F,EAAatjB,EAAEymB,OAAS8B,GAChCtmB,KAAK+mB,IAAIzF,EAAavjB,EAAE6oB,OAASN,EAAK,UAGtB,MAAjBD,EAAqB,CACvBA,EAAa,GACbA,EAAcW,SAAW,KACzBX,EAAcY,WAAa,EAC3BZ,EAAcnE,OAASnkB,EAAEmkB,OACzBmE,EAAc7B,MAAQzmB,EAAEymB,MACxB6B,EAAcO,MAAQ7oB,EAAE6oB,MACxBP,EAAca,OAASb,EAAc7B,MACrC6B,EAAcc,OAASd,EAAcO,gBAw6HvC7oB,EAAAwoB,SAICC,GAAKzoB,2CAGLwlB,GAAgBtF,GAAAmJ,YAAAb,EAAAxoB,sCA96HHspB,CAAgBtpB,EAAGsoB,GAEjCA,EAAc7B,MAAQzmB,EAAEymB,MACxB6B,EAAcO,MAAQ7oB,EAAE6oB,MACxBP,EAAca,OAASb,EAAc7B,MACrC6B,EAAcc,OAASd,EAAcO,eA86H9B7oB,EAAAwoB,qBA76HPe,CAAWvpB,EAAGsoB,aAIZQ,EAAiB9oB,IACjBwjB,GAA2B,MAAjB8E,YA46HLtoB,EAASwoB,MAAOtI,GAAEsJ,UAAShB,EAAAxoB,GA36HlCypB,CAAczpB,EAAGsoB,GAEnB9E,GAAS,EACT8E,EAAgB,KAChBphB,SAASwiB,oBAAmB,UAAYZ,IAsC5Cje,EAAEnB,KAAK+R,IAAc,SAAY7b,OAC3B+pB,EAAMvG,GAASxjB,WACV4F,KAAQ0d,GAAOxjB,KACjBuF,MAAMO,GAAQmkB,EAAInkB,UA8SHye,WAzSjB2F,YACAje,EAAQI,cAAe,WAQvB8d,GAAiBC,WACflqB,EAAI8hB,GAAQjiB,OAAQG,GAAK,EAAGA,IAAC,GAChC8hB,GAAQ9hB,KAAOkqB,EAAM,CACnBpI,GAAQ9hB,GAAGmqB,SACbrI,GAAQ9hB,GAAGmqB,UAEbrI,GAAQ7hB,OAAOD,EAAG,mBAwDfoqB,GAAoBC,GACvBA,IACFpR,EAAoBhO,EAAEof,EAAQ9F,QAAQ5e,aAAY,yBAc7C2kB,GAAsBD,GACzBA,IACFnR,GAAsBjO,EAAEof,EAAQ9F,QAAQ5e,aAAY,4BAI/C4kB,WAEDC,EAAYvf,EAAC,iHAAoHtG,SAASsG,EAAC,SAC3Iwf,EAAYxf,EAAC,iEAAoEtG,SAAS6lB,GAC1FE,EAAG,CACP9jB,MAAO4jB,EAAU,GAAG3jB,YAAc2jB,EAAU,GAAGnD,YAC/C9gB,OAAQikB,EAAU,GAAG7jB,aAAe6jB,EAAU,GAAGpD,qBAEnDqD,EAAUzkB,SACVwkB,EAAUxkB,SACH0kB,WAGA/d,KACQiM,EAAgBC,EAAgB,UAC3C8R,GAAoB5e,EAAQmR,WAEvBld,EAAI,EAAG4qB,EAAKzf,EAAQtL,OAAQG,EAAI4qB,EAAI5qB,IAAC,KACxC4G,EAAQuE,EAAQnL,GAAG4G,MAElBmF,EAAQI,cAAgB,GAAOnM,EAAI+L,EAAQI,aAC9C0M,GAAiBjS,EAEjBgS,GAAiBhS,SAIjB+jB,IACG5e,EAAQI,cAAgB,GAAOnM,EAAI+L,EAAQI,aAC9C0M,GAAiBxC,EAAoBzP,MAErCgS,GAAiBvC,EAAoBzP,OAIrCojB,MACFpR,GAAgC,IAEhCC,EAAgBxW,KAAKE,IAAIsW,EAAeN,GAAaK,EACrDC,GAAiBxC,EAAoBzP,QAErCgS,GAAiBvC,EAAoBzP,MACrCgS,EAAgBvW,KAAKE,IAAIqW,EAAeL,GAAa,KAGvDI,EAAeC,EAAgBC,EACxBxW,KAAKE,IAAIoW,EAAcJ,GAAa,aAuCpCsS,SACHC,EAAiB/R,EAAqBR,EAAYlC,EAAoBzP,MAAQ2R,EAC9EvY,EAAImL,EAAQtL,WAEhB4Y,EAAeC,EAAe,EAEvB1Y,KACDgqB,MAAuBhqB,EAAI+L,EAAQI,aACrCuM,GAAgBvN,EAAQnL,GAAG4G,MAE3B6R,GAAgBtN,EAAQnL,GAAG4G,UAG3BmkB,EAAgBtS,EAAeC,SAC5B3M,EAAQuS,cAAgBjc,KAAKE,IAAIwoB,EAAeD,GAAkBC,WAGlEC,GAAkBC,OAIrBC,EAHAC,EAAiB3S,EACjB4S,EAAkB3S,EAClB4S,EAAkB3S,IAItBwS,GAFA1S,EAAcqS,QAEiBM,GAAkB1S,IAAiB2S,GAAmB1S,IAAiB2S,IAElFrB,MAAsBtJ,MACxCvF,GAAYvU,MAAM6R,GAElB9L,KAEAsN,GAASrT,MAAMgS,GACfsB,GAAStT,MAAMiS,GAEXmR,MACF5O,GAAYxU,MAAM8R,GAElBe,GAAa7S,MAAM6R,GACnBiB,GAAaxU,IAAG,OAASuT,GAEzBiB,GAAaxU,IAAG,QAAQ,eAAmBuT,EAAY,OAEvDkB,GAAU/S,MAAM6R,GAChBmB,GAAU1U,IAAG,OAASuT,GAEtBmB,GAAU1U,IAAG,QAAQ,eAAmBuT,EAAY,OAEpD0B,GAAoBvT,MAAM6R,GAE1B2B,GAAoBlV,IAAG,QAAQ,QAE/BqV,GAAY3T,MAAM6R,GAClB+B,GAAY5T,MAAM8R,GAEd3M,EAAQwR,kBACVlD,GAAoBzT,MAAM6R,GAE1B6B,GAAoBpV,IAAG,QAAQ,QAE/BuV,GAAY7T,MAAM6R,GAClBiC,GAAY9T,MAAM8R,IAEhB3M,EAAQ6E,sBACVxE,EAAgBxF,MAAM4R,GAExBuC,GAAcnU,MAAM6R,GAEpBuC,GAAc9V,IAAG,QAAQ,QAErBwb,KACF7G,GAAajT,MAAM6R,GACnBqB,GAAa5U,IAAG,OAASuT,GAEzBwC,GAAiBrU,MAAM6R,GAEvByC,GAAiBtU,MAAK,QAEtByU,GAAezU,MAAM6R,GACrB6C,GAAe1U,MAAM8R,MAGvBe,GAAa7S,MAAK,QAClB+S,GAAU/S,MAAK,QACfuT,GAAoBvT,MAAK,QACzB2T,GAAY3T,MAAM4R,GAEdzM,EAAQwR,kBACVlD,GAAoBzT,MAAK,QACzB6T,GAAY7T,MAAM4R,IAGhBzM,EAAQ6E,uBACVxE,EAAgBxF,MAAK,QACrBwF,EAAgBxF,MAAM4R,IAExBuC,GAAcnU,MAAK,QAEf8Z,KACFzF,GAAiBrU,MAAK,QACtByU,GAAezU,MAAM6R,KAIzBK,EAAqB/M,EAAQiQ,4BAA+BxD,EAAcD,EAAYlC,EAAoBzP,OAG5GuQ,EAAkBvQ,MAAM4R,GAAeO,EAAqB1C,EAAoBzP,MAAQ,IACxFwQ,EAAkBxQ,MAAM4R,GAAeO,EAAqB1C,EAAoBzP,MAAQ,IAEpFmF,EAAQwR,kBACVhG,EAAkB3Q,MAAM4R,GAAeO,EAAqB1C,EAAoBzP,MAAQ,IACxF4Q,EAAkB5Q,MAAM4R,GAAeO,EAAqB1C,EAAoBzP,MAAQ,MAGtFskB,GAAgBD,IAClBK,cAyLKrG,QACHlZ,EAAQwR,gBAAe,CACzBtS,EAAEnB,KAAKuN,EAAWlP,KAAI,4BAA0B,eAExCwW,EAAY1T,EAACnL,MAAOqG,KAAI,UACxBwY,GACFiH,GAAQtF,GAAKiL,6BAA4B,MACjCzrB,YACI6e,OACF2B,QAKhB7F,GAAYjW,QACZkW,GAAYlW,gBAEHxE,EAAI,EAAGA,EAAImL,EAAQtL,OAAQG,IAAC,KAC/BiN,EAAI9B,EAAQnL,GAEZwrB,EAAgBvgB,EAAC,wDAA2DjL,EAAC,KAAUA,EAAC,YACzFmG,KAAI,SAAW8G,GACftE,SAASqhB,MAAsBhqB,GAAK+L,EAAQI,aAAY,SAAW,IACnExH,SAASqlB,MAAuBhqB,EAAI+L,EAAQI,aAAgBuO,GAAcD,IAE7EmL,GAAQtF,GAAKmL,wBAAuB,MAC1BD,EAAc,UACZve,OACFqT,gBA8DP0E,cACE0G,IACPzgB,EAACnL,MAAO6I,SAAQ,2BAGTgjB,IACP1gB,EAACnL,MAAOgH,YAAW,kBAGrBmE,EAAEnB,KAAKkN,EAAS7O,KAAI,yBAAuB,eAEnCwW,EAAY1T,EAACnL,MAAOqG,KAAI,UACxBwY,GACFiH,GAAQtF,GAAKsL,0BAAyB,MAC9B9rB,YACI6e,OACF2B,QAKhBrG,GAASzV,QACT0V,GAAS1V,QAETmI,KAEAsN,GAASrT,MAAMgS,GACfsB,GAAStT,MAAMiS,GAEf5N,EAAEnB,KAAKmN,EAAW9O,KAAI,4BAA0B,eAExCwW,EAAY1T,EAACnL,MAAOqG,KAAI,UACxBwY,GACFiH,GAAQtF,GAAKuL,6BAA4B,MACjC/rB,YACI6e,OACF2B,QAKhB/F,GAAY/V,QACZgW,GAAYhW,QAERuH,EAAQwR,kBACVtS,EAAEnB,KAAK2Q,GAAYtS,KAAI,4BAA0B,eAEzCwW,EAAY1T,EAACnL,MAAOqG,KAAI,UACxBwY,GACFiH,GAAQtF,GAAKiL,6BAA4B,MACjCzrB,YACI6e,OACF2B,QAIhB7F,GAAYjW,QAERwlB,OACF/e,EAAEnB,KAAK4Q,GAAYvS,KAAI,4BAA0B,eAEzCwW,EAAY1T,EAACnL,MAAOqG,KAAI,UACxBwY,GACFiH,GAAQtF,GAAKiL,6BAA4B,MACjCzrB,YACI6e,OACF2B,QAIhB5F,GAAYlW,kBAIPxE,EAAI,EAAGA,EAAImL,EAAQtL,OAAQG,IAAC,KAC/BiN,EAAI9B,EAAQnL,GAEZ8rB,EAAgB9B,KAAuBhqB,GAAK+L,EAAQI,aAAgB8N,GAAWC,GAAYD,GAC3F8R,EAAmB/B,KAAuBhqB,GAAK+L,EAAQI,aAAgBoO,GAAcC,GAAeD,GAGpGyR,EAAM1kB,SAAS2B,cAAa,OAChC+iB,EAAI9E,UAAS,uCACb8E,EAAI3mB,MAAMuB,MAASqG,EAAErG,MAAQgG,GAAqB,KAClDof,EAAIze,GAAE,GAAQ4S,GAAMlT,EAAEM,GACtBye,EAAI7oB,MAAQ8J,EAAEgf,SAAO,OACjB7lB,EAAI,mCAAwC6G,EAAErH,KAAI,UAClDqH,EAAEyS,YACJtZ,GAAI,sBAA4B2F,EAAQmgB,kBAAiB,gBAAqBngB,EAAQmgB,kBAAiB,IAAM,IAAA,WAC7GF,EAAI9E,WAAS,cAEf8E,EAAItnB,UAAY0B,EACZ6G,EAAE4S,iBACJmM,EAAI9E,WAAS,IAAUja,EAAE4S,gBAEvBmK,MAAsBhqB,GAAK+L,EAAQI,cACrC6f,EAAI7nB,UAAUc,IAAG,cAEf6H,EAAS7B,EAAE+gB,MACflf,EAAOnI,SAASmnB,GAChBhf,EAAO3G,KAAI,SAAW8G,IAWlBlB,EAAQ2Q,qBAAuBzP,EAAEgG,WACnCnG,EACGjF,GAAE,aAAe6jB,GACjB7jB,GAAE,aAAe8jB,GAGlB1e,EAAEgG,SAAQ,CACZnG,EAAOnE,SAAQ,6BACXwjB,EAAgB7kB,SAAS2B,cAAa,WAC1CkjB,EAAcjF,UAAS,wBAClBnb,EAAQwS,0BAA4BxS,EAAQ0S,4BAA2B,iCAAmC,IAC/G3R,EAAO9H,OAAOmnB,GACVpgB,EAAQwS,yBAA2BxS,EAAQ0S,4BAA2B,KACpE2N,EAAe9kB,SAAS2B,cAAa,QACzCmjB,EAAalF,UAAS,gCACtBpa,EAAO9H,OAAOonB,OAIlBxG,GAAQtF,GAAKrO,qBAAoB,MACvBnF,EAAO,UACLG,OACFqT,KAGNvU,EAAQsR,cAAa,KACnBgP,EAAgBphB,EAAC,wDAA2DjL,EAAC,KAAUA,EAAC,YACzFmG,KAAI,SAAW8G,GACftE,SAASqhB,MAAsBhqB,GAAK+L,EAAQI,aAAY,SAAW,IACnExH,SAASonB,GAEZnG,GAAQtF,GAAKgM,wBAAuB,MAC1BD,EAAc,UACZpf,OACFqT,QAGRvU,EAAQwR,iBAAmBxR,EAAQyR,cAAa,KAC9CgO,EAAgBvgB,EAAC,wDAA2DjL,EAAC,KAAUA,EAAC,YACzFmG,KAAI,SAAW8G,GACftI,SAAS0S,GAEZuO,GAAQtF,GAAKmL,wBAAuB,MAC1BD,EAAc,UACZve,OACFqT,MAKdqF,GAAe1D,aAkPRsK,GAAmBC,OACtBC,EAAe,MAENrqB,MAAToqB,EAAkB,IAAA,IAEXxsB,EAAIwsB,EAAM/f,MAAOzM,GAAKwsB,EAAM9f,IAAK1M,IACxCysB,EAAgBhtB,KAAK0L,EAAQnL,SAI/BysB,EAAkBthB,SAGbshB,MAyDLzF,GACAC,GAFAF,GAAgB,WAwBXQ,GAAkBnB,SACnB3hB,EAAyB,MAAb2hB,EAAIS,MAAgBT,EAAIS,MAAUT,EAA+BU,QAAQ,GAAGD,UAC1F6F,EAAsB1F,GAAUje,uBAChC4jB,EAAsB3F,GAAU4F,mBAEhCC,EAAsB,MAAVH,EAAiBA,EAAO7lB,aAAc,EAClDimB,EAAsB,MAAVH,EAAiBA,EAAO9lB,aAAc,EAClDkmB,EAAkBtoB,EAAIsiB,MAC1BE,GAAU5hB,MAAMoC,KAAQuf,GAAUG,WAAa4F,EAAe,KAC1DF,GAAa,GAAKE,GAAmBF,EACzB,MAAVH,GACF1F,GAAU/gB,WAAW+mB,aAAahG,GAAW0F,aAEtCI,GAAa,GAAKC,EAAkBD,UAC/B,MAAVH,GACF3F,GAAU/gB,WAAW+mB,aAAaL,EAAQ3F,IAK9CD,GAAgBtiB,WAuBT+iB,GAAiBb,SAClBliB,EAAyB,MAAbkiB,EAAIE,MAAgBF,EAAIE,OAASF,EAAIG,QAAQjnB,OAAS,EAAI8mB,EAAIG,QAAUH,EAAIsG,gBAAgB,GAAGpG,MACjHvhB,OAAOwkB,oBAAmB,YAAcvC,IACxCjiB,OAAOwkB,oBAAmB,UAAYtC,IACtCliB,OAAOwkB,oBAAmB,YAAcvC,IACxCjiB,OAAOwkB,oBAAmB,WAAatC,IACvCxQ,EAAS7O,KAAI,+BAAgCrB,YAAW,8BACvC,MAAbmgB,IACFA,GAAU7iB,cAAc8B,YAAY+gB,IAEtCA,GAAY,KACR5kB,KAAK+mB,IAAIrC,GAAgBtiB,GAAKsH,EAAQyT,oBA/BjBmH,OAEpBrB,KAAgBC,oBAAiB,WAIlC2H,EAASjT,GAAS9R,KAAI,wBACtBglB,EAASjT,GAAS/R,KAAI,wBACtBilB,EAAiBF,EAAqC5f,KAAKlN,GAAMA,EAAEmN,KACvE6f,EAAeA,EAAaC,OAASF,EAAqC7f,KAAKlN,GAAMA,EAAEmN,UAEnF+f,EAAgB,WACXttB,EAAI,EAAGA,EAAIotB,EAAavtB,OAAQG,IACvCstB,EAAiB7tB,KAAK0L,EAAQ2a,GAAesH,EAAaptB,GAAG6e,QAAQsB,GAAG,OAE1EzL,GAAW4Y,GAEX1H,GAAQtF,GAAK9L,mBAAkB,CAAIiY,gBAAiBF,GAAmB,KAerEgB,OAOA1G,GAAO2G,GAAUC,YAEZlH,GAAkBhC,EAAqB9f,SACxC4f,EAAUpZ,EAAEsZ,OAEbe,KAAgBC,oBAAiB,OAC7B,EAETsB,GAAQpiB,MACJipB,EAASrJ,EAAQxb,QACjB8kB,EAAiB3W,EAASrP,WAC1BimB,EAAsB,KAAMC,EAAuB,QACvDxJ,EAAQ1b,SAAQ,8BAEhBsC,EAAEnB,KAAK6jB,GAAc,SAAY3tB,EAAGI,GAC9BJ,GAAKmL,EAAQtL,SACjBsL,EAAQnL,GAAG8tB,cAAgB7iB,EAAE7K,GAAGwG,YAE9BmF,EAAQ8Q,gBAAe,CACzB+Q,EAAsB,EACtBC,EAAuB,UAEd9oB,EAAI2oB,EAAS,EAAG3oB,EAAIoG,EAAQtL,OAAQkF,IAAC,KACxCd,EAAIkH,EAAQpG,GACZd,EAAEyb,YACyB,OAAzBmO,IACE5pB,EAAE8pB,SACJF,GAAwB5pB,EAAE8pB,SAAW9pB,EAAE6pB,cAEvCD,EAAuB,MAG3BD,GAAuB3pB,EAAE6pB,cAAgBzrB,KAAKE,IAAI0B,EAAE0b,UAAY,EAAG3G,SAIrEgV,EAAqB,EAAGC,EAAsB,UACzClpB,EAAI,EAAGA,GAAK2oB,EAAQ3oB,IAAC,KAExBd,EAAIkH,EAAQpG,GACZd,EAAEyb,YACwB,OAAxBuO,IACEhqB,EAAE8pB,SACJE,GAAuBhqB,EAAE8pB,SAAW9pB,EAAE6pB,cAEtCG,EAAsB,MAG1BD,GAAsB/pB,EAAE6pB,cAAgBzrB,KAAKE,IAAI0B,EAAE0b,UAAY,EAAG3G,IAG1C,OAAxB4U,IACFA,EAAsB,KAEG,OAAvBI,IACFA,EAAqB,KAEM,OAAzBH,IACFA,EAAuB,KAEG,OAAxBI,IACFA,EAAsB,KAExBR,GAAW5G,GAAQxkB,KAAKC,IAAIsrB,EAAqBK,GACjDT,GAAW3G,GAAQxkB,KAAKC,IAAI0rB,EAAoBH,YAMzCxH,GAAoB9B,EAAqB2J,OAG5C7J,EAAUpZ,EAAEsZ,GAGZmJ,EAASrJ,EAAQxb,QACjBmhB,MAAsB3F,EAAQ1e,aAAY,wBAAyBiD,SAAQ,gCAC7E8kB,GAAU3hB,EAAQI,aAAe,OAE/BgiB,EAA8E1pB,EAA9D2pB,EAAI/rB,KAAKC,IAAImrB,GAAUprB,KAAKE,IAAIirB,GAAUU,IAAarH,MACvEuH,EAAI,EAAC,CACP3pB,EAAI2pB,MAEAC,EAAkB,UAEbtpB,EAAI2oB,EAAQ3oB,GAAK,EAAGA,IAAC,KACxBd,EAAIkH,EAAQpG,GACZd,EAAEyb,YACJyO,EAAiB9rB,KAAKE,IAAI0B,EAAE0b,UAAY,EAAG3G,GACvCvU,GAAKR,EAAE6pB,cAAgBrpB,EAAI0pB,GAC7B1pB,GAAKR,EAAE6pB,cAAgBK,EACvBlqB,EAAE2C,MAAQunB,IAEVlqB,EAAE2C,MAAQ3C,EAAE6pB,cAAgBrpB,EAC5BA,EAAI,YAMD6pB,EAAI,EAAGA,GAAKZ,EAAQY,IAAC,KACxBrqB,EAAIkH,EAAQmjB,GAEZtE,MAAuBsE,EAAIviB,EAAQI,aAClBlI,EAAE2C,MAErBynB,GAAmBpqB,EAAE2C,SAIrBmF,EAAQ8Q,gBAAe,CACzBpY,GAAK2pB,UACIG,EAAIb,EAAS,EAAGa,EAAIpjB,EAAQtL,OAAQ0uB,IAAC,KACxCtqB,EAAIkH,EAAQojB,GACZtqB,EAAEyb,YACAjb,GAAKR,EAAE8pB,UAAa9pB,EAAE8pB,SAAW9pB,EAAE6pB,cAAgBrpB,GACrDA,GAAKR,EAAE8pB,SAAW9pB,EAAE6pB,cACpB7pB,EAAE2C,MAAQ3C,EAAE8pB,WAEZ9pB,EAAE2C,MAAQ3C,EAAE6pB,cAAgBrpB,EAC5BA,EAAI,GAGFulB,MAAuBuE,EAAIxiB,EAAQI,aAClBlI,EAAE2C,MAErBynB,GAAmBpqB,EAAE2C,qBAKlB2nB,EAAIb,EAAS,EAAGa,EAAIpjB,EAAQtL,OAAQ0uB,IAAC,KACxCtqB,EAAIkH,EAAQojB,GAEZvE,MAAuBuE,EAAIxiB,EAAQI,aAClBlI,EAAE2C,MAErBynB,GAAmBpqB,EAAE2C,SAKvBmF,EAAQ8Q,gBAAe,CACzBpY,GAAK2pB,UACII,EAAId,EAAS,EAAGc,EAAIrjB,EAAQtL,OAAQ2uB,IAAC,KACxCvqB,EAAIkH,EAAQqjB,GACZvqB,EAAEyb,YACAjb,GAAKR,EAAE8pB,UAAa9pB,EAAE8pB,SAAW9pB,EAAE6pB,cAAgBrpB,GACrDA,GAAKR,EAAE8pB,SAAW9pB,EAAE6pB,cACpB7pB,EAAE2C,MAAQ3C,EAAE8pB,WAEZ9pB,EAAE2C,MAAQ3C,EAAE6pB,cAAgBrpB,EAC5BA,EAAI,WAMZA,EAAI2pB,EAEAC,EAAkB,UAEbtpB,EAAI2oB,EAAQ3oB,GAAK,EAAGA,IAAC,KACxBd,EAAIkH,EAAQpG,GACZd,EAAEyb,YACAjb,GAAKR,EAAE8pB,UAAa9pB,EAAE8pB,SAAW9pB,EAAE6pB,cAAgBrpB,GACrDA,GAAKR,EAAE8pB,SAAW9pB,EAAE6pB,cACpB7pB,EAAE2C,MAAQ3C,EAAE8pB,WAEZ9pB,EAAE2C,MAAQ3C,EAAE6pB,cAAgBrpB,EAC5BA,EAAI,YAKD6pB,EAAI,EAAGA,GAAKZ,EAAQY,IAAC,KACxBrqB,EAAIkH,EAAQmjB,GAEZtE,MAAuBsE,EAAIviB,EAAQI,aAClBlI,EAAE2C,MAErBynB,GAAmBpqB,EAAE2C,SAIrBmF,EAAQ8Q,gBAAe,CACzBpY,GAAK2pB,UACIG,EAAIb,EAAS,EAAGa,EAAIpjB,EAAQtL,OAAQ0uB,IAAC,KACxCtqB,EAAIkH,EAAQojB,GACZtqB,EAAEyb,YACJyO,EAAiB9rB,KAAKE,IAAI0B,EAAE0b,UAAY,EAAG3G,GACvCvU,GAAKR,EAAE6pB,cAAgBrpB,EAAI0pB,GAC7B1pB,GAAKR,EAAE6pB,cAAgBK,EACvBlqB,EAAE2C,MAAQunB,IAEVlqB,EAAE2C,MAAQ3C,EAAE6pB,cAAgBrpB,EAC5BA,EAAI,GAGFulB,MAAuBuE,EAAIxiB,EAAQI,aAClBlI,EAAE2C,MAErBynB,GAAmBpqB,EAAE2C,qBAKlB2nB,EAAIb,EAAS,EAAGa,EAAIpjB,EAAQtL,OAAQ0uB,IAAC,KACxCtqB,EAAIkH,EAAQojB,GAEZvE,MAAuBuE,EAAIxiB,EAAQI,aAClBlI,EAAE2C,MAErBynB,GAAmBpqB,EAAE2C,OAMzBojB,MAAsBqE,GAAmB5V,IAC3CwB,GAASrT,MAAMynB,EAAkB,KACjC3U,GAAaxU,IAAG,OAASmpB,IAG3BI,KAEI1iB,EAAQ2iB,sBACVpD,cAKK7E,SACHkI,EACAhB,EAAiB3W,EAASrP,WAC9BqP,EAAS7O,KAAI,+BAAgCrB,YAAW,sCAC/C/B,EAAI,EAAGA,EAAIoG,EAAQtL,OAAQkF,IAAC,KAC/Bd,EAAIkH,EAAQpG,MAChB4pB,EAAW1jB,EAAE0iB,EAAe5oB,IAAI6B,QAE5B3C,EAAE6pB,gBAAkBa,GAAY1qB,EAAE2b,iBAAgB,CACpDgP,YAIJ5D,IAAkB,GAClBnW,KACAqT,KAEAtC,GAAQtF,GAAK/L,iBAAgB,aAqQtBsa,GAAaC,OAEhBnG,EAAQ,SACZ1d,EAAEnB,KAFG,qEAEG,SAAYma,EAAGvO,GACrBiT,GAASzE,WAAW4K,EAAI5pB,IAAIwQ,KAAS,KAEhCiT,WAGAhE,QACP5Y,EAAQI,aAAgBJ,EAAQI,cAAgB,GAAKJ,EAAQI,aAAehB,EAAQtL,OAChFkM,EAAQI,cACR,EAEAJ,EAAQsS,WAAY,EAAE,CACxBqC,IAAgB,EAChBC,GAAmBoO,GAAUhjB,EAAQsS,eAEjC2Q,EAAaxZ,KAEjBoL,GAAmB7U,EAAQqS,aACtB4Q,EAAajjB,EAAQsS,UACtBtS,EAAQsS,eAEZqC,IAAgB,WAIXkE,KACHoF,MACF/e,EAAEnB,KAAK4P,IAAY,SAAYpE,EAAKtR,GAAMA,EAAGqB,MAAMoD,QAAO,MAC1DwC,EAAEnB,KAAK8P,IAAS,SAAYtE,EAAKtR,GAAMA,EAAGqB,MAAMoD,QAAO,MAEnDiY,IACFzV,EAAEnB,KAAK+P,IAAY,SAAYvE,EAAKtR,GAAMA,EAAGqB,MAAMoD,QAAO,MAC1DwC,EAAEnB,KAAKgQ,IAAY,SAAYxE,EAAKtR,GAAMA,EAAGqB,MAAMoD,QAAO,QAE1DwC,EAAEnB,KAAKgQ,IAAY,SAAYxE,EAAKtR,GAAMA,EAAGqB,MAAMoD,QAAO,UAC1DwC,EAAEnB,KAAK+P,IAAY,SAAYvE,EAAKtR,GAAMA,EAAGqB,MAAMoD,QAAO,aAG5DwC,EAAEnB,KAAK4P,IAAY,SAAYpE,EAAKtR,GAAMA,EAAGqB,MAAMoD,QAAO,UAC1DwC,EAAEnB,KAAK8P,IAAS,SAAYtE,EAAKtR,GAAMA,EAAGqB,MAAMoD,QAAO,UACvDwC,EAAEnB,KAAKgQ,IAAY,SAAYxE,EAAKtR,GAAMA,EAAGqB,MAAMoD,QAAO,UAEtDiY,GACFzV,EAAEnB,KAAK+P,IAAY,SAAYvE,EAAKtR,GAAMA,EAAGqB,MAAMoD,QAAO,OAE1DwC,EAAEnB,KAAKgQ,IAAY,SAAYxE,EAAKtR,GAAMA,EAAGqB,MAAMoD,QAAO,UAC1DwC,EAAEnB,KAAK+P,IAAY,SAAYvE,EAAKtR,GAAMA,EAAGqB,MAAMoD,QAAO,qBAKvDqc,KACP/J,GACG7V,IAAG,aAAe6G,EAAQiQ,2BAA0B,SAAegO,KAAuBtJ,KAAkB3U,EAAQkQ,4BAA2B,SAAW,SAAgByE,KAAkB3U,EAAQkQ,4BAA2B,SAAW,QAC1O/W,IAAG,aAAe6G,EAAQgQ,yBAAwB,SAAgBiO,KAAoC,SAA2BtJ,GAAa,SAAW,QAG5J1F,GACG9V,IAAG,aAAe6G,EAAQiQ,2BAA0B,SAAegO,KAAuBtJ,KAAkB3U,EAAQkQ,4BAA2B,SAAW,SAAgByE,KAAkB3U,EAAQkQ,4BAA2B,SAAW,QAC1O/W,IAAG,aAAe6G,EAAQgQ,yBAAwB,UAAgBiO,KAAuBtJ,GAAa,SAAW,SAGpHzF,GACG/V,IAAG,aAAe6G,EAAQiQ,2BAA0B,SAAegO,KAAuBtJ,KAAkB3U,EAAQkQ,4BAA2B,SAAW,QAAcyE,IAAkB3U,EAAQkQ,4BAA2B,SAC7N/W,IAAG,aAAe6G,EAAQgQ,yBAAwB,SAAgBiO,KAAoC,SAA2BtJ,GAAa,SAAW,QAG5JxF,GACGhW,IAAG,aAAe6G,EAAQiQ,2BAA0B,SAAegO,KAAuBtJ,KAAkB3U,EAAQkQ,4BAA2B,SAAW,QAAcyE,IAAkB3U,EAAQkQ,4BAA2B,SAC7N/W,IAAG,aAAe6G,EAAQgQ,yBAAwB,UAAgBiO,KAAoC,SAErGje,EAAQmT,gBACVnE,GAAc9S,YAAY8D,EAAQmT,eAAe,GACjDlE,GAAc/S,YAAY8D,EAAQmT,eAAe,GACjDjE,GAAiBhT,YAAY8D,EAAQmT,eAAe,GACpDhE,GAAiBjT,YAAY8D,EAAQmT,eAAe,aAI/C2F,KACHmF,MACFvO,GAAyBzB,GACzB0B,GAA4BtB,GAC5BuB,GAA4BrB,GAExBoG,GACE3U,EAAQqS,cACV7C,GAA4BL,GAC5BM,GAA4BR,IAE5BO,GAA4BC,GAA4BN,GAG1DK,GAA4BC,GAA4BR,KAG1DS,GAAyB1B,GACzB2B,GAA4BvB,GAC5BwB,GAA4BtB,GAExBqG,GACE3U,EAAQqS,cACV7C,GAA4BN,GAC5BO,GAA4BT,IAE5BQ,GAA4BC,GAA4BP,GAG1DM,GAA4BC,GAA4BT,aA4CrD4M,SACHtiB,EAAQiC,SAAS2B,cAAa,SAClC5D,EAAM4pB,KAAI,WACVhkB,EAAC,QAASjG,OAAOK,GACjB4S,EAAShN,EAAE5F,WAEP6W,EAAanQ,EAAQmQ,UAAYsE,GACjC0O,EAAK,KACD/O,GAAG,oDACHA,GAAG,8CACHA,GAAG,8BAAmCpU,EAAQ6R,eAAc,YAC5DuC,GAAG,oCAAyCpU,EAAQ2R,qBAAoB,YACxEyC,GAAG,sCAA2CpU,EAAQuR,gBAAe,YACrE6C,GAAG,sCAA2CpU,EAAQ0R,gBAAe,YACrE0C,GAAG,yBAA8BjE,EAAS,YAC1CiE,GAAG,wBAA6BpU,EAAQmQ,UAAS,SAGhDlc,EAAI,EAAGA,EAAImL,EAAQtL,OAAQG,IAClCkvB,EAAMzvB,KAAI,IAAO0gB,GAAG,MAAWngB,EAAC,QAChCkvB,EAAMzvB,KAAI,IAAO0gB,GAAG,MAAWngB,EAAC,QAG9BiY,EAAO,GAAGkX,WACZlX,EAAO,GAAGkX,WAAWC,QAAUF,EAAMG,KAAI,KAEzCpX,EAAO,GAAGnT,YAAYwC,SAASgoB,eAAeJ,EAAMG,KAAI,gBAInDE,GAAkBja,OACrBtV,MACCmY,EAAU,KACTqX,EAASloB,SAASmoB,gBACjBzvB,EAAI,EAAGA,EAAIwvB,EAAO3vB,OAAQG,IAAC,GAC1BwvB,EAAOxvB,GAAG0vB,WAAazX,EAAO,GAAC,CACjCE,EAAaqX,EAAOxvB,aAKnBmY,EAAU,MAAA,IACHzH,MAAK,2BAIjB0H,EAAe,GACfC,EAAe,OAEXsX,EAASC,EADTC,EAAY1X,EAAW0X,UAAY1X,EAAW+W,UAE7ClvB,EAAI,EAAGA,EAAI6vB,EAAShwB,OAAQG,IAAC,KAC5B4E,EAAWirB,EAAS7vB,GAAG8vB,cACvBH,EAAO,SAAYI,KAAKnrB,KAC1BgrB,EAAYnpB,SAASkpB,EAAQ,GAAGK,OAAO,EAAGL,EAAQ,GAAG9vB,OAAS,GAAI,IAClEuY,EAAgBwX,GAAaC,EAAS7vB,KAC7B2vB,EAAO,SAAYI,KAAKnrB,MACjCgrB,EAAYnpB,SAASkpB,EAAQ,GAAGK,OAAO,EAAGL,EAAQ,GAAG9vB,OAAS,GAAI,IAClEwY,EAAgBuX,GAAaC,EAAS7vB,iBAMlCoY,EAAgB9C,SACf+C,EAAgB/C,aAIpB2a,KACPhY,EAAOjS,SACPmS,EAAa,cAyBNyN,GAAQQ,EAAKjmB,EAAMC,OAI1BA,EAAIA,GAAC,IAAA9B,EAAAc,MAAcsB,WACbqB,yBAAwB,KACxBmuB,EAAU9vB,EAAE2B,yBAChB3B,EAAE2B,yBAAwB,WACxBmuB,EAAQC,MAAM/vB,GACdA,EAAEgwB,gCAAiC,GAEhChwB,EAAEI,gCACLJ,EAAEI,8BAA6B,kBACtBJ,EAAEgwB,oCAIXhwB,EAAE0B,gBAAe,KACfouB,EAAU9vB,EAAE0B,gBAChB1B,EAAE0B,gBAAe,WACfouB,EAAQC,MAAM/vB,GACdA,EAAEiwB,uBAAwB,GAEvBjwB,EAAEG,uBACLH,EAAEG,qBAAoB,kBACbH,EAAEiwB,+BAIflwB,EAAOA,GAAI,IACNwL,KAAO2U,GACL8F,EAAIlmB,OAAOC,EAAMC,EAAGkgB,aAGpBgF,YACAvZ,EAAQoR,oBAOR2I,GAAevY,UACfyU,GAAYzU,YAOZ+iB,SACHtwB,EAAGiE,EAILssB,EAHAC,EAAM,GACNC,EAAe,EACfC,EAAQ,EAERC,EAAa5X,EAAqBR,EAAYlC,EAAoBzP,MAAQ2R,MAEvEvY,EAAI,EAAGA,EAAImL,EAAQtL,OAAQG,IAC9BiE,EAAIkH,EAAQnL,GACZwwB,EAAO/wB,KAAKwE,EAAE2C,OACd8pB,GAASzsB,EAAE2C,MACP3C,EAAEyb,YACJ+Q,GAAgBxsB,EAAE2C,MAAQvE,KAAKE,IAAI0B,EAAE0b,SAAU3G,QAKnDuX,EAAYG,EACLA,EAAQC,GAAcF,GAAY,KACnCG,GAAoBF,EAAQC,GAAcF,MACzCzwB,EAAI,EAAGA,EAAImL,EAAQtL,QAAU6wB,EAAQC,EAAY3wB,IAAC,CACrDiE,EAAIkH,EAAQnL,OACR4G,EAAQ4pB,EAAOxwB,SACdiE,EAAEyb,WAAa9Y,GAAS3C,EAAE0b,UAAY/Y,GAASoS,QAGhD6X,EAAcxuB,KAAKE,IAAI0B,EAAE0b,SAAU3G,GACnC8X,EAAazuB,KAAK0uB,MAAMH,GAAoBhqB,EAAQiqB,KAAiB,EAEzEH,GADAI,EAAazuB,KAAKC,IAAIwuB,EAAYlqB,EAAQiqB,GAE1CJ,GAAgBK,EAChBN,EAAOxwB,IAAM8wB,MAEXP,GAAaG,EAAK,MAGtBH,EAAYG,MAIdH,EAAYG,EACLA,EAAQC,GAAU,KACnBK,EAAiBL,EAAaD,MAC7B1wB,EAAI,EAAGA,EAAImL,EAAQtL,QAAU6wB,EAAQC,EAAY3wB,IAAC,CACrDiE,EAAIkH,EAAQnL,OAERixB,EADAC,EAAeV,EAAOxwB,GAQ1B0wB,GAJEO,GADGhtB,EAAEyb,WAAazb,EAAE8pB,UAAYmD,EACrB,EAEA7uB,KAAKC,IAAID,KAAK0uB,MAAMC,EAAiBE,GAAgBA,EAAejtB,EAAE8pB,SAAWmD,GAAiB,MAAY,EAG3HV,EAAOxwB,IAAO0wB,GAASC,EAAaM,EAAW,KAE7CV,GAAaG,EAAK,MAGtBH,EAAYG,MAGVS,GAAW,MACVnxB,EAAI,EAAGA,EAAImL,EAAQtL,OAAQG,IAC1BmL,EAAQnL,GAAG4f,kBAAoBzU,EAAQnL,GAAG4G,OAAS4pB,EAAOxwB,KAC5DmxB,GAAW,GAEbhmB,EAAQnL,GAAG4G,MAAQ4pB,EAAOxwB,GAG5ByuB,KAEAzD,IAAkB,GAElBpF,GAAQtF,GAAK8Q,kBAAiB,SAAejmB,IAEzCgmB,IACFvC,KACArc,eAwCKkc,QACF7qB,YACDmgB,EAEK/jB,EAAI,EAAGqxB,EAAUra,EAASrP,WAAYijB,EAAKzf,EAAQtL,OAAQG,EAAI4qB,EAAI5qB,IAC1E+jB,EAAI9Y,EAAEomB,EAAQrxB,IACVygB,GACEsD,EAAEnd,UAAYuE,EAAQnL,GAAG4G,OAC3Bmd,EAAEnd,MAAMuE,EAAQnL,GAAG4G,OAIrBmd,EAAEnd,MAAMuE,EAAQnL,GAAG4G,MAAQgG,IAK/BmY,eAGOuG,aACI/b,EAAG+hB,EAAV7sB,EAAI,EACCzE,EAAI,EAAGA,EAAImL,EAAQtL,OAAQG,IAClCuP,EAAIpE,EAAQnL,GAAG4G,OAEf0qB,EAAO/B,GAAkBvvB,IACpByH,KAAKpC,MAAMoC,KAAOhD,EAAC,KACxB6sB,EAAKC,MAAMlsB,MAAMksB,QAAmC,GAAxBxlB,EAAQI,cAAsBnM,EAAI+L,EAAQI,aAAgBuM,EAAeD,GAAgBhU,EAAI8K,EAAC,KAItHxD,EAAQI,cAAgBnM,EAC1ByE,EAAI,EAEJA,GAAK0G,EAAQnL,GAAG4G,eASb+e,GAAevY,GACtB6U,GAAc7U,MACVokB,EAAazlB,EAAQwS,yBAA2B0D,GAAYpiB,OAAS,EACrE4xB,EAAkBza,EAASrP,WAC/B8pB,EACG3qB,YAAW,8BACXqB,KAAI,yBACJrB,YAAW,sDACd2qB,EACGtpB,KAAI,kCACJ9B,KAAI,IAEP4E,EAAEnB,KAAKmY,IAAW,SAAYjiB,EAAG6lB,GACZ,MAAfA,EAAI1X,UACN0X,EAAI1X,SAAU,OAEZujB,EAAc5L,GAAeD,EAAIhW,UAClB,MAAf6hB,IACFzmB,EAAEwmB,EAAgBC,IACf/oB,SAAQ,8BACRR,KAAI,yBACJQ,SAASkd,EAAI1X,QAAO,2BAA6B,6BAChDqjB,GACFvmB,EAAEwmB,EAAgBC,IACfvpB,KAAI,kCACJ9B,MAAMrG,EAAI,GAAG6C,yBAUf8uB,GAA4BvxB,EAAGwxB,OAClCC,EAAuBhQ,GAAaiQ,MAAM,GAC9CjQ,GAAY,WAwBakQ,EAAMC,EAvB3BC,EAAI,GACCjyB,EAAI,EAAGA,EAAI4xB,EAAO/xB,OAAQG,IAAC,IAAA,IACzB+E,EAAI6sB,EAAO5xB,GAAGgC,QAAS+C,GAAK6sB,EAAO5xB,GAAGkC,MAAO6C,IAAC,CAChDktB,EAAKltB,KACR8c,GAAapiB,KAAKsF,GAClBktB,EAAKltB,GAAC,YAECupB,EAAIsD,EAAO5xB,GAAGiC,SAAUqsB,GAAKsD,EAAO5xB,GAAGmC,OAAQmsB,IAClD4D,GAAkBntB,EAAGupB,KACvB2D,EAAKltB,GAAGoG,EAAQmjB,GAAG/gB,IAAMxB,EAAQiS,sBAMzCmU,GAAiBpmB,EAAQiS,qBAAsBiU,GAQtBF,EANHF,EAMSG,EANanQ,GAOrCjY,MAAMC,QAAQkoB,IAASnoB,MAAMC,QAAQmoB,IAASA,EAAK9jB,OAAOrL,aAAekvB,EAAK7jB,OAAOrL,YAN1F+iB,GAAQtF,GAAK8R,sBAAqB,CAAI7uB,KAAM0S,MAAqB7V,YAa5D2kB,KAEP7C,GAAa,GACbC,GAAc,WACV1d,EAAI,EACCzE,EAAI,EAAG4qB,EAAKzf,EAAQtL,OAAQG,EAAI4qB,EAAI5qB,IAC3CkiB,GAAcliB,GAAKyE,EACnB0d,GAAeniB,GAAKyE,EAAI0G,EAAQnL,GAAG4G,MAE/BmF,EAAQI,cAAgBnM,EAC1ByE,EAAI,EAEJA,GAAK0G,EAAQnL,GAAG4G,eAKbyrB,KACPrQ,GAAW,WACFhiB,EAAI,EAAGA,EAAImL,EAAQtL,OAAQG,IAAC,CAC/BmL,EAAQnL,GAAG4G,QAAeuE,EAAQnL,GAAIsyB,aAAennB,EAAQnL,GAAG4G,WAEhEqG,EAAI9B,EAAQnL,GAAKiL,EAAEjB,cAAa,GAAKyV,GAAgBtU,EAAQnL,IACjEgiB,GAAY/U,EAAEM,IAAMvN,EAChBiN,EAAE0S,UAAY1S,EAAErG,MAAQqG,EAAE0S,WAC5B1S,EAAErG,MAAQqG,EAAE0S,UAEV1S,EAAE8gB,UAAY9gB,EAAErG,MAAQqG,EAAE8gB,WAC5B9gB,EAAErG,MAAQqG,EAAE8gB,oBAKTrZ,GAAW6d,GAMlBpnB,EAAUonB,EAGVF,KACAtN,KACInhB,KACFghB,KACAE,KACA8J,KACA5J,KAEAC,KACAgL,KACAtI,KACA9S,KACAmW,KACAM,KACApD,eAgCKsK,KACHzmB,EAAQmR,aACVnR,EAAQsQ,sBAAuB,YAiB1B7G,YACHrP,EAAKssB,UACAtsB,EAAKssB,YAELtsB,GAAQA,EAAKtG,QAAU,WAIzB6yB,YACAld,MAAoBzJ,EAAQqQ,gBAC7BgG,IAAgBC,IAAmB,EADS,YAK3CsQ,GAAY3yB,UACfmG,EAAKiJ,QACAjJ,EAAKiJ,QAAQpP,GAEbmG,EAAKnG,YA2DP+uB,GAAUpsB,OACbkD,SAEFA,EADEkG,EAAQ6mB,kBACDrR,GAAiB5e,GAAK0E,IAAMH,GAE5B6E,EAAQmQ,UAAYvZ,EAAMuE,GAEjCwZ,IAAiB/d,EAAMie,KACzB/a,GAAUqB,IAELrB,WAUAgtB,GAAmBpkB,OACrB1C,EAAQ6mB,kBAAiB,OACrBvwB,KAAK0uB,OAAOtiB,EAAIvH,IAAU6E,EAAQmQ,eAGvC4W,EAAiBtd,SAEhBsd,EAAc,OACV,MAKLnwB,EAAMN,KAAKE,IAAI,WA+BCwwB,EAAI/uB,EAAIgvB,OACxB/lB,EAAI,EACJgX,EAAI8O,EAAGlzB,OAAS,OACboN,GAAKgX,GAAC,KACPqK,EAAKrK,EAAIhX,GAAM,EACfgmB,EAAMD,EAAWhvB,EAAI+uB,EAAGzE,OACxB2E,EAAM,EACRhmB,EAAIqhB,EAAI,YACC2E,EAAM,UAGR3E,EAFPrK,EAAIqK,EAAI,UAKJrhB,EAAI,EA5CVimB,CAAa3R,GAAkB9S,EAAIvH,IAAM,SAAYisB,EAAKC,UACpDA,EAAW/rB,KAAO8rB,EAChBC,EAAWC,OAASF,EACf,EAEA,GAGF,aAeT1kB,EAAIvH,GAASqa,GAAiBuR,EAAiB,GAAGO,SACpD1wB,EAAMmwB,EAAiB,GAGlBnwB,WAoBA2wB,GAAS7kB,GAChBA,EAAIpM,KAAKE,IAAIkM,EAAG,GAChBA,EAAIpM,KAAKC,IAAImM,EAAG8H,EAAaiF,GAA0BjV,UAAauS,GAAsBkR,KAAsB3T,EAAoB9P,OAAS,QAEzIgtB,EAAYrsB,GAEhB+Y,GAAO5d,KAAKC,IAAIoU,EAAI,EAAGrU,KAAK0uB,MAAMtiB,EAAIgI,QAElC+c,EAAe/kB,GADnBvH,GAAS7E,KAAK+d,MAAMH,GAAOtJ,IAGvBzP,IAAUqsB,IAEZE,GADYC,GAAgBF,uBA6iCrB7wB,KAAO2e,GACdA,GAAU3e,GAAKgxB,QAAQ/oB,SAAQnG,GAAKA,EAAEY,MAAMgC,IAAM0nB,GAAUpsB,GAAG,OA5iC/DixB,IAGEnS,IAAiB+R,IACnBtT,GAAcuB,GAAgB8R,EAAYC,EAAetsB,GAAU,GAAI,EACvEwa,GAAyBla,GAAYia,GAAgB+R,EAEjDxJ,OACFjP,GAAc,GAAGvT,UAAYgsB,GAG3B9S,KACFzF,GAAiB,GAAGzT,UAAY0T,GAAiB,GAAG1T,UAAYgsB,GAGlEhY,GAA0B,GAAGhU,UAAYgsB,EAEzC5N,GAAQtF,GAAKuT,kBAAiB,cAYzBC,GAAanxB,EAAKmL,OACrBimB,EAAc5tB,EAAK6tB,iBAAmB7tB,EAAK6tB,gBAAgBrxB,GAG3DsxB,EAAkBF,GACpBA,EAAY5oB,UACX4oB,EAAY5oB,QAAQ2C,EAAOP,KAAOwmB,EAAY5oB,QAAQ2a,GAAehY,EAAOP,aAEvE0mB,GAAmBA,EAAgB1lB,WACxCwlB,GAAeA,EAAYxlB,WAC5BT,EAAOS,WACNxC,EAAQ8R,kBAAoB9R,EAAQ8R,iBAAiBiW,aAAahmB,EAAQnL,IAC3EoJ,EAAQ2S,0BAqBHwV,GAAUvxB,EAAKC,OAClBkL,EAAS3C,EAAQvI,GACjBmxB,EAAc5tB,EAAK6tB,iBAAmB7tB,EAAK6tB,gBAAgBrxB,GAC3DwxB,EAAiBJ,GAAeA,EAAY5oB,eAE5CgpB,GAAkBA,EAAermB,EAAOP,UAA4CnL,IAArC+xB,EAAermB,EAAOP,IAAI6mB,OACpED,EAAermB,EAAOP,IAAI6mB,OAE/BD,GAAkBA,EAAevxB,SAAyCR,IAAhC+xB,EAAevxB,GAAMwxB,OAC1DD,EAAevxB,GAAMwxB,OAGvBtmB,EAAOsmB,QAAWroB,EAAQ+R,eAAiB/R,EAAQ+R,cAAcoW,UAAUpmB,EAAQnL,YAGnF6L,GAA0BT,EAAM4Q,MACnC5S,EAAQoS,6BAA4B,OAC/BpS,EAAQoS,6BAA6BpQ,EAAM4Q,MAExC,MAAR5Q,MAGA4Q,EAAUvO,MAAMhL,QAAO,KAAQ,EAAC,OAC5BivB,EAAS1V,EAAUvO,MAAMpJ,MAAK,SAChCnB,EAASkI,UACJ/N,EAAI,EAAGA,EAAIq0B,EAAOx0B,OAAQG,IACjC6F,EAASA,EAAOwuB,EAAOr0B,WAElB6F,SAEFkI,EAAK4Q,EAAUvO,iBAGfkkB,GAAcluB,EAAgCzD,EAAK4xB,EAAOvF,OAC7DZ,EAAIuE,GAAYhwB,GAChB6xB,EAAc7xB,EAAMqsB,IAAeZ,EACnCqG,EAAM,aACP/T,IAAiB/d,GAAOoJ,EAAQsS,UAAS,UAAY,KACrDmW,EAAW,WAAa,KACxB7xB,IAAQyW,IAAarN,EAAQkT,kBAAiB,UAAY,KAC1Dtc,EAAM,GAAM,EAAC,OAAS,UAEpByrB,GAAKzrB,GAAOqsB,IACfyF,GAAM,IAAU1oB,EAAQgT,uBAGtB2V,EAAWvuB,EAAK6tB,iBAAmB7tB,EAAK6tB,gBAAgBrxB,GAExD+xB,GAAYA,EAASC,aACvBF,GAAM,IAAUC,EAASC,YAG3BF,GAAM,KAAW7O,GAAQtF,GAAKsU,YAAW,CAAIjyB,IAAKA,EAAKoL,KAAMqgB,aAmBzDyG,EAAS5nB,EAjBT6nB,EAAkBC,GAAmBpyB,GAIrCqyB,EAAO,iCAAsCP,EAAM,iBAF7C1F,GAAUpsB,GAAOmyB,GAGpB,KACHG,GAAatyB,KAASoJ,EAAQmQ,YAChC8Y,GAAO,WAAiBC,GAAatyB,GAAG,MAE1CqyB,GAAO,KAEP5uB,EAAK8uB,GAAKF,EAENhL,OACF5jB,EAAK+uB,GAAKH,WAIHh1B,EAAI,EAAG4qB,EAAKzf,EAAQtL,OAAQG,EAAI4qB,EAAI5qB,IAAC,IAC5CiN,EAAI9B,EAAQnL,GACZ60B,EAAU,EACNH,GAAYA,EAASvpB,QAAO,KAC1BiqB,EAAaV,EAASvpB,QAAQ8B,EAAEM,KAAOmnB,EAASvpB,QAAQnL,GAEjD,OADX60B,EAAWO,GAAcA,EAAWP,SAAY,KAE9CA,EAAUjK,EAAK5qB,MAKfmiB,GAAe9f,KAAKC,IAAIsoB,EAAK,EAAG5qB,EAAI60B,EAAU,IAAMN,EAAMc,OAAM,KAC7DpoB,EAAEqoB,oBAAsBpT,GAAcliB,GAAKu0B,EAAMgB,QAAO,MAKzDvL,MAAuBhqB,EAAI+L,EAAQI,aACrC/F,EAAK+uB,GAAKK,GAAe7yB,EAAK3C,EAAG60B,EAASzG,GAE1ChoB,EAAK8uB,GAAKM,GAAe7yB,EAAK3C,EAAG60B,EAASzG,QAEnCnhB,EAAEqoB,oBAAuBtL,MAAsBhqB,GAAK+L,EAAQI,gBACrE/F,EAAK8uB,GAAKM,GAAe7yB,EAAK3C,EAAG60B,EAASzG,IAGxCyG,EAAU,IACZ70B,GAAM60B,EAAU,GAIpBzuB,EAAK8uB,GAAC,SAEFlL,OACF5jB,EAAK+uB,GAAC,mBAIDK,GAAe7yB,EAAaC,EAAciyB,EAAiB9mB,OAK9D0nB,EAAY,GAEZxoB,EAAkB9B,EAAQvI,GAC1B8yB,EAAO,eAAoB9yB,EAAI,KAAUP,KAAKC,IAAI6I,EAAQtL,OAAS,EAAG+C,EAAOiyB,EAAU,IACxF5nB,EAAE0oB,SAAQ,IAAS1oB,EAAE0oB,SAAQ,YAUvBxwB,KARL6kB,MAAsBpnB,GAAQmJ,EAAQI,eACxCupB,GAAO,WAGL/yB,IAAQyW,IAAaxW,IAASyW,IAActN,EAAQkT,oBACtDyW,GAAO,WAGO3T,GACVA,GAAe5c,GAAKxC,IAAQof,GAAe5c,GAAKxC,GAAKsK,EAAEM,MACzDmoB,GAAO,IAAW3T,GAAe5c,GAAKxC,GAAKsK,EAAEM,SAI7CrK,EAAQ,KAAMiM,EAAe,GAC7BpB,IACF7K,EAAQsL,GAA0BT,EAAMd,GAEpCkC,OADJA,EAAkB2kB,GAAanxB,EAAKsK,EAAlB6mB,CAAqBnxB,EAAKC,EAAMM,EAAO+J,EAAGc,EAAMuS,OACDnR,EAAe,SAI9EymB,EAAkBzmB,GAA2CA,EAAiB0mB,YAAcD,EAAc,IAAM,IAAiCzmB,EAAiB0mB,WAAU,UAGhLJ,GAAY,eACVC,GAAWE,EAAc,IAASA,EAAc,IAAA,MAHpCzmB,GAA2CA,EAAiB8c,QAAO,UAAuC9c,EAAiB8c,QAAO,IAAM,KAKlJgJ,GAAatyB,KAASoJ,EAAQmQ,UAAS,kBACjB+Y,GAAatyB,GAAO6d,IAAc,OAAU,KAIlEzS,IACF0nB,GAA+D,oBAA9CnrB,OAAOzG,UAAUhB,SAASpC,KAAK0O,GAAkDA,EAA2CA,EAAiB9I,MAGhKovB,GAAY,SAEZnU,GAAU3e,GAAKmzB,gBAAgBr2B,KAAKmD,GACpC0e,GAAU3e,GAAKozB,aAAanzB,GAAQiyB,EAC7BY,WAIAhC,GAAYuC,WACVh2B,KAAKshB,GAAS,KACjBhM,EAAM7O,SAASzG,EAAG,QAClBi2B,GAAkB,EAElBvV,KACG3U,EAAQqS,cAAgB9I,GAAOsL,KAC7B7U,EAAQqS,cAAgB9I,GAAOsL,MAGtCqV,GAAkB,GAGf3gB,IAAQ8D,KACP9D,EAAM0gB,EAAY3uB,KAAOiO,EAAM0gB,EAAY3C,SAC3C4C,GAEJC,GAAmBl2B,GAGnB+L,EAAQiR,8BAAgCmZ,cAgBrCvH,aAIEjsB,KAHL0e,IACF+U,KAEc9U,GACd4U,GAAmBvzB,GAEjBoJ,EAAQiR,8BAAgCmZ,cAmCrCzR,QACF3Y,EAAQ6mB,mBARbrR,GAAgB,EACdla,IAAK,EACHd,OAAQwF,EAAQmQ,UAChBmX,OAAQtnB,EAAQmQ,oBAWXlc,EAAI,EAAGiO,EAAIuH,KAAiBxV,GAAKiO,EAAGjO,IAAC,KACxC00B,EAAWvuB,EAAK6tB,iBAAmB7tB,EAAK6tB,gBAAgBh0B,GAE5DuhB,GAAiBvhB,GAAC,CAChBqH,IAAMka,GAAiBvhB,EAAI,GACtBuhB,GAAiBvhB,EAAI,GAAGqzB,OACzB,EACF9sB,OAASmuB,QAAgCtyB,IAApBsyB,EAASnuB,OAC5BmuB,EAASnuB,OACTwF,EAAQmQ,WAGdqF,GAAiBvhB,GAAGqzB,OAAS9R,GAAiBvhB,GAAGqH,IAAMka,GAAiBvhB,GAAGuG,kBAItE2vB,GAAmBvzB,OACtBywB,EAAa9R,GAAU3e,GACtBywB,IAILxN,GAAQtF,GAAK+V,kBAAiB,CAAI1zB,IAAKA,EAAK2zB,IAAKlD,EAAWO,UAE5DP,EAAWO,QAAQ/oB,SAAQnG,IACzBA,EAAEL,cAAc8B,YAAYzB,aAGvB6c,GAAU3e,UACVugB,GAAkBvgB,aAGlB2P,GAAe/O,OAClBvD,EAAGu2B,KACFhzB,GAASA,EAAK1D,YAGnBqgB,GAAa,EACbqW,EAAKhzB,EAAK1D,OACLG,EAAI,EAAGA,EAAIu2B,EAAIv2B,IACdqhB,IAAiBjI,KAAc7V,EAAKvD,IACtCo2B,KAEE9U,GAAU/d,EAAKvD,KACjBk2B,GAAmB3yB,EAAKvD,IAGxB+L,EAAQiR,8BAAgCmZ,eAGrCK,GAAc7zB,IAChBA,GAAe,IAARA,IACZ2P,GAAc,CAAE3P,aAGT8zB,GAA4BtnB,EAAiBunB,EAAUC,GAC1DxnB,MAAAA,IAA6DA,EAAe,IAC9B,oBAA9C7E,OAAOzG,UAAUhB,SAASpC,KAAK0O,GACjCunB,EAAShyB,UAAYyK,GAErBunB,EAAShyB,UAAYyK,EAAgB9I,KACjC8I,EAAgBynB,gBAAkBD,GACpC1rB,EAAEyrB,GAAU5vB,YAAYqI,EAAgBynB,eAEtCznB,EAAgB0mB,YAClB5qB,EAAEyrB,GAAU/tB,SAASwG,EAAgB0mB,YAEnC1mB,EAAgB8c,SAClBhhB,EAAEyrB,GAAUhxB,KAAI,QAAUyJ,EAAgB8c,mBA+BvCrW,GAAUjT,OACbywB,EAAa9R,GAAU3e,MACtBywB,GAILyD,GAA2Bl0B,OAENyrB,EAAIuE,GAAYhwB,WAQ5BmL,KAAUslB,EAAW0D,qBAAoB,KAC3C1D,EAAW0D,qBAAqBrxB,eAAeqI,GAAM,aAItD8hB,EAAmC,EAAvBnpB,SAASqH,EAAQ,QAC7Bb,EAAI9B,EAAQykB,GACd9mB,EAAOsqB,EAAW0D,qBAAqBlH,MAErCjtB,IAAQyW,IAAawW,IAAcvW,IAAcgI,GACnDA,GAAc0V,UAAU3I,WACfA,MAETqI,GADkB3C,GAAanxB,EAAKsK,EAAlB6mB,CAAqBnxB,EAAKitB,EAAWphB,GAA0B4f,EAAGnhB,GAAIA,EAAGmhB,EAAG9N,IACjDxX,GACzCwX,GAAK0W,aAAar3B,gBAAkB,EAAC,KACnCoO,EAAO4kB,GAAYhwB,GACnBO,EAAQsL,GAA0BT,EAAM5C,EAAQykB,IACpDhK,GAAQtF,GAAK0W,aAAY,CAErBr0B,IAAKA,EAAKC,KAAMgtB,EAChB1sB,MAAOA,EAAO6K,KAAMA,EACpBD,OAAQ3C,EAAQykB,GAAY0G,IAAKxtB,UAIvCA,EAAKpE,UAAS,GAIlBuyB,GAAgCt0B,aAGzBmhB,QACH/X,EAAQmR,WAAU,KAChBga,EAA6Bzd,GAAalT,SAC9C2wB,GAAenrB,EAAQsR,cAAiBtR,EAAQuR,gBAAkBuR,GAAa3X,GAAsB,EACrGggB,GAAenrB,EAAQyR,cAAiBzR,EAAQ0R,gBAAkBoR,GAAavX,GAAsB,EACrG4f,GAAerM,KAAmBtS,EAAalC,EAAoB9P,OAAS,EAG1E+R,EADEvM,EAAQ6mB,kBACErR,GAAiBmR,MAAgCW,OAEjDtnB,EAAQmQ,UAChBwW,OAC0B,GAAxB3mB,EAAQI,aAA8B+qB,EAAa,QAI3DlW,GAAajV,EAAQ4R,aAAgB5R,EAAQ6R,eAAiBiR,GAAahX,GAAqB,EAChGoJ,GAAclV,EAAQsR,cAAiBtR,EAAQuR,gBAAkBuR,GAAa3X,GAAsB,EACpGgK,GAAcnV,EAAQyR,cAAiBzR,EAAQ0R,gBAAkBoR,GAAavX,GAAsB,MAChG6f,EAAcprB,EAAQ6E,sBAAwB7E,EAAQ8E,mBAAsB9E,EAAQ2R,qBAAuBmR,GAAapX,GAA2B,EAEvJa,EAAY1B,EAAW,GAAGwQ,aACtBrQ,EAAgB,GAAGqQ,aACnByH,GAAa9X,GACbiK,GACAC,GACAC,GACAiW,SAGN3V,GAAiBnf,KAAK+0B,KAAK9e,EAAYvM,EAAQmQ,WACxC5D,WAGAuL,KACPtL,EAAY3B,EAAWhQ,QAAoB,WAGpCiO,QACFjR,IACLid,GAAW,EACXC,GAAc,EACdC,GAAe,EACG,EAElB8C,KACAC,KAGIpD,GACE3U,EAAQqS,cACVyC,GAAWvI,EAAYqI,GAAmBtK,EAAoB9P,OAC9Dua,GAAcH,GAAmBtK,EAAoB9P,SAErDsa,GAAWF,GACXG,GAAcxI,EAAYqI,IAG5BE,GAAWvI,EAIbuI,IAAYG,GAAYC,GAAaC,GAEjC8I,MAAsBje,EAAQmR,aAChC2D,IAAYxK,EAAoB9P,QAIlCwa,GAAeF,GAAWG,GAAYC,GAAaC,GAE/CnV,EAAQmR,aACN8M,MACFpT,EAAWrQ,OACTsa,GAAW9G,GAAiB,GAAGpT,cAInCgT,GAAUzU,IAAG,WAAW,aAG1ByU,GAAUzU,IAAG,MAAQuU,GAAalT,UAAUrB,IAAG,SAAW2b,QACtDwW,EAAgB1d,GAAU,GAAG2d,UAAYzW,GAExC9U,EAAQmR,YACXnC,GAAcxU,OAAOwa,IAGnBiJ,MACFpQ,GAAU1U,IAAG,MAAQuU,GAAalT,UAAUrB,IAAG,SAAW2b,IAE1D7F,GAAczU,OAAOwa,IAEjBL,KACF7G,GAAa3U,IAAG,MAAQmyB,GAAenyB,IAAG,SAAW4b,IAErDhH,GAAa5U,IAAG,MAAQmyB,GAAenyB,IAAG,SAAW4b,IAErD5F,GAAiB3U,OAAOua,MAGtBJ,KACF7G,GAAa3U,IAAG,QAAQ,QAAUA,IAAG,SAAW4b,IAEhDjH,GAAa3U,IAAG,MAAQmyB,IAIxB3W,IACFzF,GAAiB1U,OAAOua,IAEpB/U,EAAQqS,cACV/C,GAAe9U,OAAOoa,IAElBqJ,MACF1O,GAAe/U,OAAOoa,MAGxBxF,GAAY5U,OAAOoa,IAEfqJ,MACF5O,GAAY7U,OAAOoa,MAIvB3F,GAAczU,OAAOwa,IAGlB1K,GAAwBA,EAAoBzP,QAC/CyP,EAAsBkU,MAGpBxe,EAAQ8Q,iBACVyT,KAGF7d,KACAyV,KAIAvG,IAAyB,EACzBpP,eAQOE,QACF7O,IACL8gB,SAEIsK,EAAaxZ,KACb+hB,EAA4B7E,KAC5B8E,EAAe,EACfC,EAAQ/W,KAAkB3U,EAAQqS,aAAgB3X,SAAS4U,GAAe,GAAGhW,MAAMkB,QAAUE,SAAS0U,GAAY,GAAG9V,MAAMkB,QAE7HixB,EADE9W,GACalL,KAAkBzJ,EAAQsS,UAE1BkZ,GAA6BxrB,EAAQsQ,qBAAuBmF,GAAiB,EAAI,OAG9FkW,EAAwBlc,GAA0BjV,SAClDoxB,EAAwB5e,EAE5BA,EAAqBhN,EAAQgQ,2BAA6BhQ,EAAQmR,aAC/DnR,EAAQ6mB,kBACNrR,GAAiBiW,EAAe,IAAOjW,GAAiBiW,EAAe,GAAGnE,OAAS/a,EACnFkf,EAAezrB,EAAQmQ,UAAYwb,GACxCtB,SAIIwB,EAAK5I,EAAa,UACbhvB,KAAKshB,GACR7a,SAASzG,EAAG,IAAM43B,GACpB1B,GAAmBl2B,GAGnB+L,EAAQiR,8BAAgCmZ,KAExC/U,IAAkBhI,GAAYwe,GAChCC,KAGFJ,EAAOjhB,MAEHshB,EAAO/rB,EAAQ6mB,kBAAqB7mB,EAAQqQ,aAC5CmF,GAAiB/L,MAAiB6d,OAClC9R,GAAiB/L,MAAiBnO,IAAO0E,EAAQmQ,UAAYsb,EAE7DzrB,EAAQmR,WACV1G,EAAIshB,GAEJvhB,EAAKlU,KAAKE,IAAIu1B,EAAMJ,EAAgBrhB,EAAoB9P,SAC/C+P,GAEPE,EAAIC,EAAKF,EACTG,EAAI,EACJC,EAAK,IAILF,GADAD,EAAIF,GACK,IACTI,EAAIrU,KAAK0uB,MAAMxa,EAAKE,GACpBE,GAAMJ,EAAKC,IAAME,EAAI,IAIrBF,IAAMihB,IACJ/W,KAAkB3U,EAAQqS,cAC5B/C,GAAenW,IAAG,SAAWsR,GAEzBwT,MACF1O,GAAepW,IAAG,SAAWsR,KAG/B2E,GAAYjW,IAAG,SAAWsR,GAC1B4E,GAAYlW,IAAG,SAAWsR,IAG5BhP,GAAYgU,GAA0B,GAAGhU,eAGvCuwB,EAAuBvwB,GAAYN,IAAUqP,EAAKmhB,EAE5C,GAANnhB,GAAwB,GAAb/O,GACbyY,GAAO/Y,GAAS,EAGhBosB,GAFSyE,EAEAvwB,GAAYN,GAGZqP,EAAKmhB,GAGZlhB,GAAKihB,GAAQ1rB,EAAQmR,YACvBrI,KAGE9I,EAAQ8Q,iBAAmB8a,GAAyB5e,GACtDuX,KAEFtF,IAAkB,aAGX0I,GAAgBsE,EAAsBC,UAC1B,MAAfD,IACFA,EAAcxwB,IAEI,MAAhBywB,IACFA,EAAevwB,KAIfL,IAAKwrB,GAAmBmF,GACxB3E,OAAQR,GAAmBmF,EAAc1f,GAAa,EACtD+c,OAAQ4C,EACR1C,QAAS0C,EAAe1f,YAInB2f,GAAiC3D,OACpC4D,EAAS91B,KAAK+d,MAAM9H,EAAYvM,EAAQmQ,WACxCkc,EAAYrsB,EAAQoT,oBAEL,IAAfe,IACFqU,EAAMltB,KAAO8wB,EACb5D,EAAMlB,QAAU+E,GACQ,IAAflY,IACTqU,EAAMltB,KAAO+wB,EACb7D,EAAMlB,QAAU8E,IAEhB5D,EAAMltB,KAAO+wB,EACb7D,EAAMlB,QAAU+E,GAGlB7D,EAAMltB,IAAMhF,KAAKE,IAAI,EAAGgyB,EAAMltB,KAC9BktB,EAAMlB,OAAShxB,KAAKC,IAAIowB,KAAiC,EAAG6B,EAAMlB,QAElEkB,EAAMc,QAAU9c,EAChBgc,EAAMgB,SAAWhd,EAEjBgc,EAAMc,OAAShzB,KAAKE,IAAI,EAAGgyB,EAAMc,QACjCd,EAAMgB,QAAUlzB,KAAKC,IAAIkW,EAAa+b,EAAMgB,SAErChB,WAQAsC,GAA2Bl0B,OAC9BywB,EAAa9R,GAAU3e,MACvBywB,GACEA,EAAW0C,gBAAgBj2B,eACzBw4B,EAAwBjF,EAAWO,QAAQP,EAAWO,QAAQ9zB,OAAS,GAAGy4B,iBACvED,GAAYjF,EAAW0C,gBAAgBj2B,QAAM,KAC9C+vB,EAAYwD,EAAW0C,gBAAgByC,MAC3CnF,EAAW0D,qBAAqBlH,GAAayI,GAC7CA,EAAwBA,EAAStvB,0BAG/BsvB,EAAwBjF,EAAWO,QAAQ,GAAG2E,4BAO/CE,GAAajE,EAAO5xB,OAEvB+d,MACG3U,EAAQqS,cAAgBzb,EAAMie,IAC7Bje,GAAOie,SAuCX6X,EAhCArF,EAAa9R,GAAU3e,GAGvB+1B,EAAa,WACRpjB,KAAO8d,EAAW0D,qBAAoB,KAExC1D,EAAW0D,qBAAqBrxB,eAAe6P,GAAG,aAKnDtV,EAAwB,EAApByG,SAAS6O,EAAK,SAGlBtV,GAAK+L,EAAQI,iBAKbvC,MAAMC,QAAQsB,IAAYA,EAAQnL,IAAMmL,EAAQnL,GAAGs1B,yBAInDT,EAAUzB,EAAW2C,aAAa/1B,IAClCkiB,GAAcliB,GAAKu0B,EAAMgB,SAC3BpT,GAAe9f,KAAKC,IAAI6I,EAAQtL,OAAS,EAAGG,EAAI60B,EAAU,IAAMN,EAAMc,UAChE1yB,GAAOyW,IAAapZ,GAAKqZ,IAC7Bqf,EAAcj5B,KAAKO,UAMsB,OAAvCy4B,EAAeC,EAAcH,QACnCnF,EAAW0D,qBAAqB2B,GAAcr0B,cAAc8B,YAAYktB,EAAW0D,qBAAqB2B,WAEjGrF,EAAW2C,aAAa0C,UACxBrF,EAAW0D,qBAAqB2B,GACnCvV,GAAkBvgB,WACbugB,GAAkBvgB,GAAK81B,aAM3BE,GAAsBpE,WAEzBnB,EAGAwF,EAEA/D,EAJAgE,EAAW,GACXC,EAAa,GAKRn2B,EAAM4xB,EAAMltB,IAAK0xB,EAAMxE,EAAMlB,OAAQ1wB,GAAOo2B,EAAKp2B,OACxDywB,EAAa9R,GAAU3e,IAMvBk0B,GAA2Bl0B,GAE3B61B,GAAajE,EAAO5xB,GAGpBi2B,EAAa,MAETlE,EAAWvuB,EAAK6tB,iBAAmB7tB,EAAK6tB,gBAAgBrxB,GAC5D+xB,EAAWA,GAAYA,EAASvpB,gBAE5BijB,EAAIuE,GAAYhwB,GAEX3C,EAAI,EAAG4qB,EAAKzf,EAAQtL,OAAQG,EAAI4qB,KAEnC1I,GAAcliB,GAAKu0B,EAAMgB,SAFcv1B,OAOG,OAAzC60B,EAAUzB,EAAW2C,aAAa/1B,QAKvC60B,EAAU,EACNH,EAAQ,KACNU,EAAaV,EAASvpB,EAAQnL,GAAGuN,KAAOmnB,EAAS10B,GAE1C,OADX60B,EAAWO,GAAcA,EAAWP,SAAY,KAE9CA,EAAUjK,EAAK5qB,GAIfmiB,GAAe9f,KAAKC,IAAIsoB,EAAK,EAAG5qB,EAAI60B,EAAU,IAAMN,EAAMc,SAC5DwD,GAAerD,GAAe7yB,EAAK3C,EAAG60B,EAASzG,GAC/CwK,KAGF54B,GAAM60B,EAAU,EAAIA,EAAU,EAAI,OAlBhC70B,GAAM60B,EAAU,EAAIA,EAAU,EAAI,EAqBlC+D,IACiBA,EACnBE,EAAcr5B,KAAKkD,OAIlBk2B,EAAYh5B,YAQbm5B,EAJAv0B,EAAI6C,SAAS2B,cAAa,WAC9BxE,EAAEC,UAAYm0B,EAIiC,OAAvCG,EAAeF,EAAcP,QAAc,KAE7C3I,MADJwD,EAAa9R,GAAU0X,GAEkC,OAAjDpJ,EAAYwD,EAAW0C,gBAAgByC,QAAc,KACvDzvB,EAAoBrE,EAAE6zB,oBAEtBtO,MAAuB4F,EAAY7jB,EAAQI,aAC7CinB,EAAWO,QAAQ,GAAG7uB,YAAYgE,GAElCsqB,EAAWO,QAAQ,GAAG7uB,YAAYgE,GAGhCwX,GAAK0W,aAAar3B,gBAAkB,EAAC,KACnCoO,EAAO4kB,GAAYqG,GACnB91B,EAAQsL,GAA0BT,EAAM5C,EAAQykB,IACpDhK,GAAQtF,GAAK0W,aAAY,CAErBr0B,IAAKq2B,EAAcp2B,KAAMgtB,EACzB1sB,MAAOA,EAAO6K,KAAMA,EACpBD,OAAQ3C,EAAQykB,GAAY0G,IAAKxtB,IAIvCsqB,EAAW0D,qBAAqBlH,GAAa9mB,cAK1CmwB,GAAW1E,OACdnuB,EAAI,CAAK8uB,EAAC,GAAMC,EAAC,IACnB5xB,EAAI,GACJ21B,GAAqB,EACrBlK,EAAaxZ,aAENxV,EAAIu0B,EAAMltB,IAAKujB,EAAK2J,EAAMlB,OAAQrzB,GAAK4qB,EAAI5qB,IAC9CshB,GAAUthB,IAAO0gB,IAAiB3U,EAAQqS,cAAgBpe,GAAKwV,OAInEjS,EAAK9D,KAAKO,GAIVshB,GAAUthB,GAAC,CACT2zB,QAAS,KAIToC,aAAY,GAGZe,qBAAoB,GAKpBhB,gBAAe,IAGjBxB,GAAcluB,EAAMpG,EAAGu0B,EAAOvF,GAC1B5N,IAAkBhI,KAAcpZ,IAClCk5B,GAAqB,QAIpB31B,EAAK1D,OAAM,WAGZ4E,EAKA00B,EAJA/yB,EAAK8uB,EAAEr1B,OAAS,IAClB4E,EAAI6C,SAAS2B,cAAa,OAC1BxE,EAAEC,UAAY0B,EAAK8uB,GAGjB9uB,EAAK+uB,EAAEt1B,OAAS,IAClBs5B,EAAS7xB,SAAS2B,cAAa,OAC/BkwB,EAAOz0B,UAAY0B,EAAK+uB,WAIjBiE,EAAI,EAAGC,EAAK91B,EAAK1D,OAAQu5B,EAAIC,EAAID,IAAC,KACrCE,EACAC,KACJjY,GAAU/d,EAAK61B,IAAIzF,QAAO,GACtBlvB,GAAKA,EAAEkD,SAAS9H,OAAS,IAC3By5B,EAAS70B,EAAEkD,SAAS,GACpB2Z,GAAU/d,EAAK61B,IAAIzF,QAAQl0B,KAAK65B,IAE9BH,GAAUA,EAAOxxB,SAAS9H,OAAS,IACrC05B,EAAcJ,EAAOxxB,SAAS,GAC9B2Z,GAAU/d,EAAK61B,IAAIzF,QAAQl0B,KAAK85B,IAG7B7Y,IAAmBnd,EAAK61B,IAAMxY,IACjCvF,GAAe,GAAGvW,YAAYw0B,GAC1BtP,MACF1O,GAAe,GAAGxW,YAAYy0B,IAEvBvP,MACT7O,GAAY,GAAGrW,YAAYw0B,GAC3Ble,GAAY,GAAGtW,YAAYy0B,IAE3Bpe,GAAY,GAAGrW,YAAYw0B,GAGzBhZ,GAAK0W,aAAar3B,gBAAkB,EAAC,OACjC65B,EAAK,WACFlkB,EAAM,EAAGA,EAAMgkB,EAAOG,WAAW55B,OAAQyV,IAChDkkB,EAAM/5B,KAAK65B,EAAOG,WAAWnkB,OAE3BikB,EAAW,IAAA,IACJG,EAAM,EAAGA,EAAMH,EAAYE,WAAW55B,OAAQ65B,IACrDF,EAAM/5B,KAAK85B,EAAYE,WAAWC,YAG7BC,EAAO,EAAGA,EAAOH,EAAM35B,OAAQ85B,IAAI,KACtC5rB,EAAO4kB,GAAYpvB,EAAK61B,IACxBl2B,EAAQsL,GAA0BT,EAAM5C,EAAQwuB,IACpD/T,GAAQtF,GAAK0W,aAAY,CAErBr0B,IAAKY,EAAK61B,GAAIx2B,KAAM+2B,EACpBz2B,MAAOA,EAAO6K,KAAMA,EACpBD,OAAQ3C,EAAQwuB,GAAOrD,IAAKkD,EAAMG,OAOxCT,IACF9X,GAAiBwY,GAAYxgB,GAAWC,cAKnCwgB,KACF9tB,EAAQ+Q,wBAGbgd,aAAa9W,IACbA,GAAe1O,WAAWylB,GAAsBhuB,EAAQgR,gCAGjDoZ,KACFpqB,EAAQiR,+BAGb8c,aAAa7W,IACbA,GAAsB3O,WAAW0lB,GAA6BjuB,EAAQkR,uCAG/Dga,GAAgCt0B,WAE9BitB,KAAa1M,GAAkBvgB,GAClCugB,GAAkBvgB,GAAK8C,eAAemqB,KACxC1M,GAAkBvgB,GAAKitB,GAAS,KAGpCxM,GAAqB/gB,KAAKC,IAAI8gB,GAAoBzgB,GAClDwgB,GAAmB9gB,KAAKE,IAAI4gB,GAAkBxgB,GAC9Ck3B,cASOtnB,QACF3O,IAEL0e,GAAeG,cAEXwX,EAAUvG,KACVwG,EAAWhC,GAAiC+B,MAGhDxG,GAAYyG,GAGRvY,IAA0Bja,GAAU,IAElCgZ,GAAa,KAEXyZ,EAAqBlvB,EAAE1B,WAAU,GAAK2wB,GAEtCnuB,EAAQqS,cAEV+b,EAAmB9yB,IAAMuZ,GACzBuZ,EAAmB9G,OAAS7d,OAG5B2kB,EAAmB9yB,IAAM,EACzB8yB,EAAmB9G,OAAStnB,EAAQsS,WAGtCsa,GAAsBwB,GAGxBxB,GAAsBuB,GAIxBjB,GAAWiB,GAGPxZ,KACE3U,EAAQqS,aACV6a,GAAU,CACR5xB,IAAKuZ,GAAiByS,OAAQ7d,KAAkB,EAAG6f,OAAQ6E,EAAS7E,OAAQE,QAAS2E,EAAS3E,UAGhG0D,GAAU,CACR5xB,IAAK,EAAGgsB,OAAQtnB,EAAQsS,UAAY,EAAGgX,OAAQ6E,EAAS7E,OAAQE,QAAS2E,EAAS3E,WAKxFnS,GAAqB6W,EAAQ5yB,IAC7B8b,GAAmB9gB,KAAKC,IAAIowB,KAAiC,EAAGuH,EAAQ5G,QACxEwG,KAEAnY,GAAwBla,GACxBma,GAAyBja,GACd,KACXke,GAAQtF,GAAK8Z,WAAU,CAAIC,SAAUJ,EAAQ5yB,IAAKizB,OAAQL,EAAQ5G,OAAQ1nB,KAAM2U,eAGzE6H,GAAc/nB,GACrBA,EAAEqkB,0BAyCKyD,YACP1gB,GAAYgU,GAA0B,GAAGhU,UACzCE,GAAa6T,GAA0B,GAAG7T,oBAIrB6yB,OASjBC,EAAc,MACbzuB,EAAQmR,WAAU,KACjBud,EAAqBjf,GAA0B,GAAGsM,aAAetM,GAA0B,GAAG4L,aAC9F5f,GAAYizB,IACdjzB,GAAYizB,GAEdD,EAAcn4B,KAAK+mB,IAAI5hB,GAAYia,QAGjCiZ,EAAqBlf,GAA0B,GAAGqM,YAAcrM,GAA0B,GAAG6L,YAC7F3f,GAAagzB,IACfhzB,GAAagzB,OAEXC,EAAct4B,KAAK+mB,IAAI1hB,GAAaka,IAGpC+Y,IACF/Y,GAAiBla,GAEjB6T,GAA0B,GAAG7T,WAAaA,GAC1C+T,GAAuB,GAAG/T,WAAaA,GACvCmQ,EAAkB,GAAGnQ,WAAaA,GAClCgU,GAA0B,GAAGhU,WAAaA,GACtCqE,EAAQwR,kBACV5B,GAA0B,GAAGjU,WAAaA,IAExCqE,EAAQ6E,uBACNoZ,KACFpS,EAAyB,GAAGlQ,WAAaA,GAEzC+P,EAAwB,GAAG/P,WAAaA,IAGxCsiB,KACEtJ,KACF1F,GAAc,GAAGtT,WAAaA,IAG5BgZ,KACF3F,GAAc,GAAGrT,WAAaA,QAKhC8yB,KACFta,GAAauB,GAAgBja,GAAY,GAAI,EAC7Cia,GAAgBja,GAEZ+yB,IACF/e,GAA0B,GAAGhU,UAAYA,IAGvCwiB,OACEtJ,KAAkB3U,EAAQqS,aAC5BnD,GAAiB,GAAGzT,UAAYA,GAEhCuT,GAAc,GAAGvT,UAAYA,IAK7BgzB,EAAcliB,EAChBgb,GAAS9rB,GAAYN,aAEjBqsB,EAAYrsB,GAEd+Y,GADEzJ,GAAK8B,EACA,EAEAjW,KAAKC,IAAIoU,EAAI,EAAGrU,KAAK0uB,MAAMvpB,KAAc+O,EAAK+B,IAAc9B,EAAI8B,KAAe,EAAI7B,KAGxF8c,IADJrsB,GAAS7E,KAAK+d,MAAMH,GAAOtJ,KAEzBiY,QAMF+L,GAAeH,EAAW,KACxBI,EAAKv4B,KAAK+mB,IAAIzH,GAAyBja,IACvCmzB,EAAKx4B,KAAK+mB,IAAI1H,GAAwBla,KACtCozB,EAAK,IAAMC,EAAK,MAEd9uB,EAAQ+S,oBAAuB+b,EAAKviB,GAAasiB,EAAKriB,EACxDhG,KAGA+P,GAAewY,UAGjBlV,GAAQtF,GAAKuT,kBAAiB,YAIlCjO,GAAQtF,GAAKya,SAAQ,CAAIrzB,WAAYA,GAAYF,UAAWA,QAExDmzB,IAAeH,GA5GZQ,EAAc,2BAgKdxlB,SAIkB2N,IACrB,uBAGFiQ,EAAA9R,GAA2B3e,WACRA,GAAAqsB,YAQblhB,QAPYnL,KAAAugB,GAAqBvgB,GAAA,OAMrBA,GACZywB,EAAkB0D,qBAAuB,KACxC1D,EAAC0D,qBAAmBrxB,eAAuBqI,GAAA,eACxB,EAAXrH,SAAUqH,EAAC,UAClB3C,EACAykB,GAEJqL,EAAkB/X,GAAcvgB,GAAOitB,kEAI/B9mB,GAAGmE,EAAAiuB,gBAAWpyB,EAAAnG,EAAoBgwB,GAAUhwB,GAAAsK,EAAoB,MAApBguB,iBAMtD,eADG3mB,WAAAylB,GAA2BhuB,EAAAgR,6CAMlBld,OAAA,EAAA,WACFwjB,GACD,GAAC8X,WAGat7B,OAAM,GAASwjB,GAAA,GAAA8X,SAAAA,GAAA,OAChC9X,GAA6B+X,WAExB,KAAPC,EAAMC,YAACrwB,EAAAowB,EAAuBvyB,MAAM9C,iDAK1C8H,EAAAytB,wBAAAF,EAAAvyB,MACAgF,EAAAytB,uBAAiCF,EAAAvyB,KAAAuyB,EAAAllB,OAA6BrI,IAK5DmV,GAAgB3O,WAAc0lB,GAAcjuB,EAAAkR,uCAG9Cue,GAA4BC,EAAaC,SAErC7rB,EAAA8rB,EAAcC,eACXta,GAAY,MAENoa,GAAiBA,EAAA/4B,KACpB84B,GACMA,EAAY94B,gCAMxBmG,EAAA8wB,GAAYj3B,EAAAmjB,GAAAjW,MACD5E,EAAInC,GAAAhC,YACV80B,EAAc/rB,kFAuCzBsiB,GAAahtB,EAAA8sB,SAAoClQ,GAAA5c,MAAUA,GAAI8sB,KAAcA,EAAA4J,4CAGtE5J,OACA3R,cA4DwDgI,GAAAloB,MAC3DkgB,GAAOwb,UAAK,CACZn5B,IAAAyW,QAECC,aAEGjZ,EAAAI,oCACSpB,MAAA28B,6BAIA37B,EAAA47B,OAAA,sCAIT,GACkB,mBADP3a,GACb4a,oBAEoB,IADT5a,GAAS4a,eACb77B,EAAI87B,OAAa,4DAIlB97B,EAAA87B,OAAAH,EAAAv6B,KAAA26B,EAAA/7B,EAAAglB,QAAAgX,KAAAC,KACHj8B,EAAQ87B,OAAOH,EAAMz6B,MAAO66B,EAAO/7B,EAAAglB,QAAAkX,KAAAC,2BAIhCn8B,EAAA47B,QAAc57B,EAAAglB,QAoDtBhlB,EAAA87B,OAAeH,EAAAl6B,MAAAzB,EAAAslB,UAAAtlB,EAAAglB,SAAAhlB,EAAA47B,SAAAG,EAAAK,UApDqB,sCAOhC,GAAyB,mBAAdnb,GAAc4a,oBAEjB,IADL5a,GAAgB4a,eAAQ77B,EAAA87B,OACnB,YAEV,GAAA7a,GAAqB4a,eAAA72B,QAAAhF,EAAA87B,QAAA,EAAA,UAErB97B,EAAA87B,OAAAH,EAAgBU,OAAA,CAChB,IAAAnX,KAAcoX,WAAA,iBAEdt8B,EAAA87B,OAAcH,EAAAp6B,WACdg7B,QACW,GAEAv8B,EAAA87B,OAASH,EAAQn6B,iBAIjB,GAEAxB,EAAA87B,OAASH,EAAQr6B,KAC5By6B,EAAUS,KACDx8B,EAAE87B,OAASH,EAAQc,MAAKV,EAAAW,KAC7B18B,EAAA87B,OAAQH,EAAQgB,GAAAZ,EAAAa,cACdjB,EAAakB,KAAAd,EAAAe,cACfnB,EAAAl6B,IAAiBs6B,EAAAgB,cACbpB,EAASx6B,wBAWP6X,KAAI5D,KAAA0nB,UAEI5X,KAAiBC,qBAAe6X,QAC7Ch7B,OAAGA,EAAYhC,IAIf+7B,GAAA,8EAWJ,MAAAkB,0BAeCj9B,EAAAmkB,QAAYjd,SAAAg2B,eAAAryB,EAAA7K,EAAAmkB,QAAA3b,SAAA,gBAAA20B,SAAmB36B,EAAMimB,GAASzoB,MAAKwC,IAAA,OAAAye,IAAAjI,IAAAxW,EAAAD,KAAA0W,IAAAzW,EAAAA,WACrD0d,GAAAkd,QAAA,CAIN76B,IAAAC,EAAAD,IACAC,KAAAA,EAAAA,gDAMcA,EAAGD,IAAQC,EAAKA,cACtB85B,YAAApX,KAA0CC,sBAAsB,CACpEkY,GAAA76B,EAAsBD,KAAA,8IAKnB+6B,GAAmB9D,GAAAh3B,EAAAD,IAAAC,EAAAA,MAAA,KAAA+6B,EAAAC,EAAAx9B,aAOtBqoB,GAAmBroB,GAIvB,IAAAy9B,EAAY5yB,EAAC7K,EAAAmkB,QAAA5e,aAAa,aAAA,eAAO,IAAAk4B,EAAAh+B,cAGVg+B,EAAA,IAAA,OAAAxc,OACff,GAAGwd,cAAiB,gBAIDtV,GAAapoB,OAAEwC,EAAMimB,GAASzoB,IAAKwC,GAAA,OAAAye,IAAAjI,IAAAxW,EAAAD,KAAA0W,IAAAzW,EAAAA,UACxD0d,GAAAyd,WAAA,CAIFp7B,IAAAC,EAAQD,iBAKdvC,GACAA,EAAAI,iCACAuL,EAAAuQ,UAAA0hB,GAAAp7B,EAAwCD,IAAAC,EAAAA,MAAA,EAAAxC,aAeFgoB,GAAchoB,OAAK69B,EAAAhzB,EAAA7K,EAAAmkB,QAAA5e,aAAA,sBAAA,iDAGhD2a,GAAA4d,oBAAmB,CAC1BpwB,OAAAA,eAGIua,GACMjoB,OAAyC69B,EAAAhzB,EAAA7K,EAAAmkB,QAAA5e,aAAA,sBAAA,iDAI5CigB,GAAAtF,GAAkB6d,cAAA,CACzBrwB,OAAYA,GAAmB1N,YAY3B0oB,GAAMnmB,EAAAC,GAEV,QAAAD,EAAA,GAAAA,GAAA6S,MAAwC5S,EAAA,GAAAA,GAAAuI,EAAAtL,iBAKpCu+B,GAAQ35B,EAAAgK,OAER9L,EAAKkwB,GAAApkB,GAEPiS,IAAgBjS,GAAKsmB,GAAAnU,MAAAje,EAAAkwB,GAAApkB,EAAAvH,aACrBtE,EAAI,MAGE5C,EAAI,EACVA,EAAImL,EAAItL,QAAA0P,EAAA9K,EAAAzE,kBAGD4C,2BAGFD,EACPC,KAAAA,EAAA,eAKqB8zB,SAGd,OAAA3G,KAAe2G,EAAOxP,iBACpB,MAAO,IAAAxW,MAAS,sCACagmB,EAAAxP,2BAC9BmX,EAAU,GAAKrO,OAAO,EAAEqO,EAAA,GAAMx+B,OAAO,GAAA,aAyBtCk1B,GAAkBpyB,UACZ+d,GAAA3U,EAAAqS,aAAAzb,GAAAie,GAAApK,EAAAuK,YAzzDOpe,UAChBoJ,EAAQ6mB,kBACHrR,GAAiB5e,GAAK0wB,OAASnsB,GAEjC6E,EAAQmQ,WAAavZ,EAAM,GAAKuE,GAqzD1Bo3B,CAAA1d,IAAApK,EAAA,EAAA7T,GAAAie,GAAAD,GAAA,EAAA,WAMVkI,GAAkBzoB,OAEjBuC,EAAAC,IAEMqI,EAAA7K,EAAAmkB,QAAM5e,aAAa,aAAe,qBAEtC9F,OAAS,OAAI,mBAjCR8zB,iDAGJrS,GAAA3e,GAAkBgxB,QAAI3zB,KAAA2zB,EAAA,OAAA,EAAAltB,SAAA9D,EAAA,WActB,MAiBUk7B,EAAM,GAAA53B,eAGnB,CAGF,IAAGhC,EAAG45B,EAAAl4B,aAAmB,eAAgBuB,aAGpC22B,EAAgBl4B,aAAO,sBAAA9F,SAEf0+B,EAAYxyB,EAAIqS,aAClBjD,GAAA5U,SAAAoa,0DAIT6d,GAAYX,EAAA,+BAKTl7B,OACFC,YAsCEqyB,GAAAtyB,GACP,OAAAoJ,EAAA6mB,+BAAiC7mB,EAAAmQ,mBAI7B2b,QAGa,MAAK,YAIf0F,MACgB,GAAvBpc,GAAuBtK,EAAQ,GAAA4nB,QAE3B3nB,EAAQ,GAAQ2nB,iBAKpBC,GAAA/7B,EAA6BC,EAAA0c,mBAGtBvT,EAAAI,mBACH0oB,EAAA8J,GAAch8B,EAAUC,MAEPsf,GAAAtf,GAAAuf,GAAAvf,GAAAiyB,EAAA,EAAAA,EAAA,EAAA,kBACwDptB,EAAA8pB,uBAC3E9pB,EAAAC,IACAuD,EAAAnB,KAAMyR,IAAA,SAAAjG,EAAAtR,KACG0D,WAAQD,gBAEjB8pB,EAAYqN,IACZ3zB,EAAAnB,KAAMyR,IAAA,SAAAjG,EAAAtR,wDAKRuO,kBAOyBssB,EACrBC,EAAmBnB,EAAiBC,EAAiCx9B,GAAI,iBAIzE6K,EAAAmW,IAAiBta,YAAI,UACzBwa,GAAiBlI,KAAOkI,GAAAlI,IAAAua,QAAA/oB,SAAAnG,GAAAA,EAAAN,UAAA6B,OAAA,gBAOP,UADF64B,GACE,KAEXE,EAAiB9zB,EAAAmW,IAMjB4d,EAAOD,EAAiB73B,SAE5Bq3B,EAAgBl8B,KAAI0uB,MAAAgO,EAAAp5B,aAAA,eAAAuB,SAAAG,KACpB43B,EAAaF,EAAap5B,aAAa,sBAAa9F,OAEpD6gB,IAAgBue,IAASV,GAAQxyB,EAAAqS,aAAAjD,GAAA5U,SAAAoa,QAC7B/d,EAAAw7B,GACFY,EAAmBv3B,KAAEpF,KAAQ+0B,KAAO4H,EAAkB33B,KAAIk3B,MAAW37B,EAAAD,OAGnEwW,GACFE,GAAYF,GAAaqlB,GAAiBpd,MAGhCzY,SAAA,UACV2Y,GAAElI,KAAgBkI,GAASlI,IAAQua,QAAA/oB,SAAAnG,GAAAA,EAAAN,UAAAc,IAAA,YACmC,UAAA65B,EAAA1lB,IAAA5D,MAAsDzJ,EAAAwQ,gCAG1HtR,EAAAmW,IAAgBzY,SAAI,UACtB2Y,GAAAlI,IAAaua,QAAc/oB,SAAAnG,GAAAA,EAAAN,UAAAc,IAAA,eAKtBqX,UAAQwiB,GAAoBI,GAAA9lB,GAAAC,mBAE/B0J,mDAIJqa,QAAyBh7B,EAAIu7B,EAAAv9B,KAG/B2L,EAAA6Q,sBACAwgB,QAA2Bh7B,EAAAu7B,EAAAv9B,SAEvBgZ,GAAAC,GAAA,KAIMukB,GAAuChY,GAAUtF,GAAK6e,oBAAAC,KAAAh/B,YAoBhE8+B,GAAAv8B,EAAAC,OACIosB,EAAYxZ,eAKXwZ,IAAmB2D,GAAahwB,4CAQhCuxB,GAAAvxB,EAAaC,IAAAuI,EAAAvI,GAAAy8B,yBAIlB,GAAAhe,GAAA,IACAuE,GAAAtF,GAAagf,0BAAO,CAEhBlL,OAAA/S,QAEA8I,aACG,QACO,OACNwI,GAAYvZ,aACZtS,YAAkB,oBACtBsnB,EAAA,KACItgB,EAAK3C,EAAYkO,UACRya,GAAY1a,GAAStL,EACpBS,CAAA6K,GAA0BC,GAAa7K,GAAW4f,EAAAtgB,GAAAA,EAAAsgB,EAAA9N,IACrCc,OAErB4V,aAAcr3B,gBAAA,EAAA,KAAEoO,EAAM4kB,GAAUvZ,IAChClW,EAAOsL,GAAKT,EAAA5C,EAAAkO,QAAMiH,GAAE0W,aAAI,CACxBr0B,IAAAyW,GAAgBxW,KAAKyW,kBAG3BvL,OAAAA,WAKJmpB,GAAA7d,eASKmmB,UAAcC,cAAAz5B,MAAA,iFAnEV05B,UAAUj7B,cACbpE,qCAMCs/B,EAAAp6B,OAAAq6B,eACHD,GAAUA,EAAGE,iBAAaF,EAAAE,mBA2DXC,QAGNC,WAAQvmB,cAKrB6jB,GAA2BhJ,EAAAuJ,EAAAv9B,MAEtBghB,QAIDrV,EAASuQ,SAAU,MAAC,IAAA5L,MAAU,0GAGtBqS,IAAyBmc,GAAc9lB,GAAAC,SAAEsF,EAAMxT,EAAUkO,IAAEtL,EAAM4kB,GAAIvZ,QAKjF,IALmFwM,GAAQtF,GAAAyf,iBAAS,KAAQ3mB,GAC1GxW,KAAAyW,2BAUc2mB,SAASzmB,UAIV5Q,SAAK,YACpB,IAAAs3B,EAAW7L,GAAYF,GAAS9a,GAAOC,IAGvC+a,GAAa6L,EAAOC,sBAAS9e,GAAA1c,UAAA,QAC3BgwB,EAAUvuB,EAAA6tB,iBAAA7tB,EAAA6tB,gBAAA5a,IAEV+mB,KADAzL,GAAcA,EAAOvpB,WACJupB,EAAc/V,EAAApR,KAAAmnB,EAAArb,QACpB,IAAA4mB,EAAc,CACzBt0B,KAAM2U,GACN8f,aAAcC,GAAEzpB,EAAc,IAC9BjH,SAAU0wB,GAAAjf,iBACVtT,OAAQ6Q,EACRwhB,eAAeA,EACfpyB,KAAAA,GAAA,WAIEuyB,cAAIC,GACNC,kBAAcC,iBACVC,KAKN3yB,IAEIsT,GAAc0V,UAChBhpB,kCAKFuL,GAAA+H,GAAAsf,iBACAtf,GAAA1R,UAAAqY,UA3CEuV,gBA6CAgD,qCAQFx0B,EAAAwQ,UAAA2gB,4DAcIwD,KACFpb,KAAUsb,qBAASrD,cAEnB8C,GAAQzY,OACRiZ,EAAK,CACLx5B,IAAKugB,EAAI0P,UACT7vB,KAAMmgB,EAAIT,WACVkM,OAAO,UAELzsB,MAAMqE,EAAG2c,GAAIhhB,QACbL,OAAQ0E,EAAA2c,GAAQrhB,SAEpB0zB,SAAA,YAEY4G,EAAGx5B,IAAKw5B,EAAAt6B,eACVs6B,EAAIp5B,KAAIo5B,EAAAj6B,gBAMDghB,EAAIkZ,cAIhBlZ,EAAKA,EAAI3hB,aAAeqB,SAAAC,MAChB,MAAPqgB,GAEAiZ,EAAI5G,SAAKrS,EAAAE,cAAYF,EAAAjhB,cAAA,WAAAsE,EAAA2c,GAAA1iB,IAAA,eAAA27B,EAAA5G,QAAA4G,EAAAxN,OAAAzL,EAAApgB,WAAAq5B,EAAAx5B,IAAAugB,EAAApgB,UAAAogB,EAAAR,cACvByZ,EAAI5G,SAAQrS,EAAKC,aAAUD,EAAA/gB,aAAA,WAAAoE,EAAA2c,GAAA1iB,IAAA,eAAA27B,EAAA5G,QAAA4G,EAAAtP,MAAA3J,EAAAlgB,YAAAm5B,EAAAp5B,KAAAmgB,EAAAlgB,WAAAkgB,EAAAP,eAC3B5f,MAAOmgB,EAAIlgB,aACXL,KAAAugB,EAAYpgB,kBAGVq5B,EAAAp5B,MAAYmgB,EAAIT,WAChB0Z,EAAAx5B,KAAWugB,EAAK0P,sDAMf/F,MAAAsP,EAAAp5B,KAAqBo5B,EAAAj6B,oDAexBohB,gBAEE1H,GAAAygB,4BAAsB,QAItB,YAIA1f,GAAcpN,MAAQoN,GACxB2f,sCAMG3f,GAAa1R,UAAA0R,GAAA1R,SAAAsxB,aAOO7B,oBAIpBhmB,QACAC,kBAWLokB,GAAA96B,EAAA2c,YACiBvT,EAAAqS,cAA0Bzb,EAAAie,GAAqB,GAAQ7U,EAASqS,cAAMzb,EAAAie,GAAA,EAAA,KAEnFsgB,EAAY1lB,GAA4BjV,SAK5C46B,EAAAzgB,KAAqB3U,EAAAqS,aAAAzb,EAAAoJ,EAAAsS,UAAA1b,EACjBy+B,EAAYr1B,EAAA6mB,kBAA2BrR,GAAS5e,GAAA0wB,QAAA8N,EAAA,GAAAp1B,EAAAmQ,UAClDmlB,EAASt1B,EAAQ6mB,kBAAcrR,GAAW5e,GAAA0E,IAAA85B,EAAAp1B,EAAAmQ,UAC1ColB,EAAMF,EAAAF,GAAApoB,EAAAzC,EAAA9P,OAAA,GAEN66B,EAAS55B,GAAW05B,EAAsBh6B,IAC1CosB,GAAMhU,EAAA+hB,EAAAC,6BAKH/uB,gBASHgvB,GAAAC,GACJ,IAAAC,EAAUD,EAAAhgB,UAKJqR,GAD2BrrB,GAAAuE,EAAAmQ,UAAA,GACCulB,GAA4B11B,EAAAmQ,kBAIrDO,sBACE,MAAArD,GAAA,KAGLzW,EAAIyW,GAAcqoB,EAClBlK,EAA2B7E,QACpB6E,IAAc50B,EAAA40B,EAAA,KACnB,IAAA50B,EAAA,WAGJC,EAAI,EAAI8+B,EAAW,UAGjB9+B,GAAQuW,IACVwoB,GAAAh/B,EAAsBC,KAAA8+B,EAAiB9+B,GACvCA,GAAA+7B,GAAah8B,EAAAC,yBAOVuW,GAAgByoB,GACZ/J,eAIX8E,oBAIAkF,qBAIAzF,oBAIIE,QACS9mB,KAAe,eAEc7S,GAE1C,IAAAm/B,EAAAtsB,SACIssB,EAAQ,OAAA,OACN,EAAIn/B,EAAM,EACVA,GAAAm/B,IAAiBn/B,EAAAm/B,EAAU,MAChBn/B,EAAA,GAAA,KACT8Z,sBACM,MADerD,GACR,SAEjBxW,EAAI,EAAI8+B,EAAW,UAGjB9+B,GAAQuW,IACVwoB,GAAAh/B,EAAsBC,KAAA8+B,EAAiB9+B,GACvCA,GAAA+7B,GAAah8B,EAAAC,aAKV86B,GAAI9D,GAAAj3B,EAAA++B,UAGJ7J,YAEF,WAKD8G,GAAWh8B,EAAAC,OACX8xB,EAAOvuB,EAAQ6tB,iBACC7tB,EAAA6tB,gBAAarxB,OAE/B+xB,IAAUA,EAAYvpB,QAAA,OAAA,QAGVupB,EAAAvpB,QAAAA,EAAAvI,GAAA2K,KAAAmnB,EAAAvpB,QAAAvI,yBAGPiyB,EAAA,QAA0B1pB,EAAAtL,OAAA+C,EACrBiyB,GAAA,WAKVkN,GAAwBp/B,iBAEfwI,EAAAtL,QAAA,wBAGJ8+B,GAAAh8B,EAAsBC,UAEzB,iBAEqBD,WAGvBC,EAAI,WAECuI,EAAAtL,0BAGA8+B,GAAeh8B,EAAMC,UAMtBo/B,WAIFC,GAAOt/B,EAAQC,EAAMs/B,SAEd/2B,EAAGtL,OAAA,OAAA,WACJ8+B,GAAMh8B,EAAAC,SACZA,EAAQuI,EAAItL,SAAA8hC,GAAAh/B,EAAAC,2BAGLD,cAGJC,GAKH,cAKAu/B,GAAIx/B,EAAAC,EAAAs/B,SACC,EAAG,OAAA,WACFH,GAAkBp/B,MAClB,UAAkBy/B,GAAAx/B,EAAA,OAAA,kBAExBD,IAAGA,OACIy/B,EACTF,KAAME,KAOC,gDAIFjP,EAAAvwB,MAAcA,EAAM,OAAIy/B,EAC3BA,EAAAlP,eAGOxwB,EAAIC,EAAAs/B,WAIbR,IACmBhP,OACjB,MACA/vB,GAAQ40B,EAAoB,OAAA,eAG1B30B,GAAAs/B,KAEUt/B,KACF+7B,GAAQh8B,EAAAC,kCAOfs/B,KAAUA,aAOfI,GAAQ3/B,EAAGC,EAAQs/B,eAEjB,MACAv/B,EAAQ,EAAA,OAAW,eAGjBC,GAAAs/B,KAEUt/B,KACF+7B,GAAQh8B,EAAAC,kCAOfs/B,KAASA,gBAKLv/B,EAAKC,EAAAs/B,MACV,SAAY,MAAJt/B,QACRA,EAAY,kBAKXA,KAAGA,EACHs/B,KACEt/B,GAMT,IAAAuwB,EAAA8O,GAAAt/B,EAAAC,MACIuwB,EAAG,OAAKA,QAEG,KACboE,EAAqB7E,aAGZ6E,EAAK,GAAA50B,MACVA,EAAQ40B,gBACAwK,GAAkBp/B,iBAIzBC,KAAIw/B,iBAKN,iBAECz/B,EAAAC,EAAgBs/B,MAEhB,SAAU,MAAAt/B,QACV8vB,KAAY,IACJvnB,EAAItL,OAAA,gBAKX+C,KAAAA,EACHs/B,KAAAt/B,gBAUFuwB,KACAA,EAAAgP,GAAAx/B,EAAkBC,KADX,MAIHD,EAAU,EAAA,OAAA,OACV,YACQ4/B,GAAkB5/B,eAIzBC,KAAG4/B,kBAKNrP,WAGFsP,GAAU9/B,EAAAC,EAAAs/B,SACFH,GAAOp/B,UACP,SAAO,iBAIVk8B,EACHqD,KAAOrD,YAIT6D,GAAU//B,EAAAC,EAAAs/B,SACFK,GAAO5/B,UACP,SAAO,iBAIVk8B,OACAA,2OAoCFtC,YAIAoG,GAAA,gBAWHA,GAASnB,OACTz1B,EAAQ0Q,qBAAE,OAAA,MACV2E,IAAU,QAAAogB,GAAA,QAAAA,EAAA,OAAA,MACVlc,KAAUC,oBAAA,OAAA,UAEA,KACH,SAET9d,MAAA,EAEI8pB,MAAA,QACI,OACE,QACA,MACD,GAESiQ,YACR,IACHc,WAEH76B,KAAM06B,GACN5Q,MAAM0Q,GACNI,KAAGO,QACDC,QAIAJ,OAEEC,IAMelB,IACVpoB,GAAAC,GAAAF,UAEX,GAAAuH,IAAqB3U,EAACqS,cAAuB+U,EAAAxwB,KAAU6S,KAAA,aAC3C2d,EAAAxwB,KAAA6S,KAKV,wIADe2d,EAAG+O,MAClB,EAGF,OADAxE,GAAQ9D,GAAAxgB,GAAAC,MACR,WAGIugB,GAAAj3B,EAAAC,oBAEKD,GAKD2e,GAAA3e,GAAam0B,qBAAqBl0B,IAS5C,iBAsBqBD,EAAEC,6EAGhBuD,EAAkB6tB,iBAAS7tB,EAAA6tB,gBAAArxB,MAC9BoxB,QAA6C,IAAzBA,EAAahU,UAA0B,QAAWgU,EACjEhU,cAGLoU,EAAcJ,GAAKA,EAAwB5oB,eAC3CgpB,GAAWA,EAAsBhpB,EAACvI,GAAU2K,UACf,IAD+B4mB,EACrDhpB,EAAYvI,GAAA2K,IAAUwS,YAAAoU,EAAAhpB,EAAAvI,GAAA2K,IAAAwS,UAG7BoU,GAAiBA,EAAevxB,SAAoD,IAAxCuxB,EAAYvxB,GAAYmd,YAA6BoU,EAAwBvxB,GAAAmd,YACzH5U,EAAAvI,GAAcmd,iCAOXvK,MAAoB7S,EAAY,GAACC,GAAAuI,EAAAtL,QAAA+C,EAAA,EAAA,OAAA,QACxBuD,EAAA6tB,iBAAA7tB,EAAA6tB,gBAAArxB,cACc,IAAJoxB,EAAI/T,WAAA,QAAA+T,EAAA/T,iBAIT+T,GAAAA,EAAiB5oB,UAAA4oB,EAAA5oB,QAAAA,EAAAvI,GAAA2K,KAAAwmB,EAAA5oB,QAAAvI,IAItC,OAAAuxB,QAAmC,IAAPA,EAAOnU,aAAAmU,EAAAnU,aAE/B7U,EAAUvI,GAAAod,oBAGVge,GAASr7B,EAAAC,EAAYkgC,EAAA1iC,MACrBwD,IACJ+9B,GAAqBh/B,EAACC,IAEtB0iB,KAAAC,oBAAA,IACkB5iB,EAChBC,GAAQ,iBAMZkL,EAAA3C,EAAAvI,QAE0BmJ,EAAAuQ,UAAAxO,GAAAA,EAAAsmB,QAAAroB,EAAAyQ,mCACFqiB,EAACiE,GAASngC,IAAA6S,MAAAzJ,EAAAwQ,SAAA,KAAAqhB,EAAAx9B,GAG5BihB,IAAakc,6BAMLnkB,QACFC,iBAEA0pB,iBAAQ,OACR1hB,GAAiB2hB,gBACjBC,MAAA,OACOztB,KAAA,OACA,KACL4D,QACAC,UACEgI,mBACIA,GAAWsf,qCACLrnB,WACV,uEAGAsM,GAAAtF,GAAA4iB,aAAA,KACGpjC,KAAO6C,IACZC,KAAS9C,KAAM8C,KACfmL,KAAQA,EACN7K,MAAGpD,KAAOqjC,uHAQJxgC,IAAA7C,KAAA6C,IACVC,KAAA9C,KAAA8C,KACQmL,KAAAA,2DAONqoB,mCAEJrlB,EAAAE,UACAmlB,oBAGF/U,GAAA+hB,WAAAC,EAAAhiB,GAAAsf,0CAGA5yB,KAAAs1B,EACEv1B,OAAcA,WAKdwX,KAAQoX,WAkBT,aAfe51B,YAAA,iBACRF,cACQ+B,SAAA,oCAGhByrB,OAAA/S,YACYD,8BAIhBxe,KAAAyW,0BAKK,cAMH,wCAoBFpD,KACE,IAAAuD,GAAA,MAAA,IAAA9I,MAAA,wDAgBJ5Q,KAAA,kBACe,iBAEf,IAAAxB,EAA2Bc,MAAAI,aAC3B,IAAAlB,EAAyBc,MAAAI,0BAGzB,IAAAlB,EAA8Bc,MAAAI,oBAChB,IAAAlB,EAAAc,MAAYI,2BACZ,IAAAlB,EAAYc,MAAKI,gCACtB,IAAYlB,EAAKc,MAAAI,8BACd,IAAAlB,EAAiBc,MAAAI,8BACd,IAAAlB,EAAYc,MAAKI,mCACrB,IAAYlB,EAAKc,MAAAI,mCACf,IAAYlB,EAAKc,MAAAI,mBAChB,IAAAlB,EAAAc,MAAYI,mBAC1B,IAAmBlB,EAAAc,MAAAI,cACnB,IAAAlB,EAAmBc,MAAAI,iBACnB,IAAAlB,EAAoBc,MAAAI,oBACF,IAAAlB,EAAAc,MAAAI,gBACJ,IAAAlB,EAAAc,MAAAI,kBACd,IAAkBlB,EAAAc,MAAAI,mBAClB,IAAAlB,EAA2Bc,MAAAI,wBACV,IAAAlB,EAAAc,MAAYI,wBACR,IAAAlB,EAAAc,MAAAI,yBACrB,IAAAlB,EAA6Bc,MAAAI,uBACjB,IAAAlB,EAAYc,MAAKI,mBAChB,IAAAlB,EAAAc,MAAYI,uBACjB,IAAAlB,EAAYc,MAAKI,gCACd,IAAAlB,EAAiBc,MAAAI,sBAC5B,IAAuBlB,EAAAc,MAAAI,0BACC,IAAAlB,EAAAc,MAAAI,kCACL,IAAAlB,EAAYc,MAAKI,iBACxB,IAAAlB,EAAAc,MAAYI,kBACX,IAAAlB,EAAAc,MAAYI,aACzB,IAAAlB,EAAmBc,MAAAI,MAEnBoqB,UAAU,IAAAtrB,EAAAc,MAAAI,4BACQ,IAAAlB,EAAcc,MAAAI,6BACZ,IAAAlB,EAAgBc,MAAAI,wBACjB,IAAAlB,EAAec,MAAAI,iBACpB,IAAAlB,EAAUc,MAAAI,kBACV,IAAAlB,EAAUc,MAAAI,wBACN,IAAAlB,EAAcc,MAAAI,8BA1tKV0qB,GACtBpI,GAAQwhB,QAAQpZ,GAChBA,EAAO7V,KAAKiM,sBA2tKK2J,4BA5sKMrkB,WACd5F,EAAI8hB,GAAQjiB,OAAS,EAAGG,GAAK,EAAGA,OACnC8hB,GAAQ9hB,GAAGujC,aAAe39B,EAAI,OACzBkc,GAAQ9hB,iCA6lEZmL,cA+mGPuJ,kBACcoR,0BAx1GOvY,UACdpC,EAAQ2a,GAAevY,iCA5hDJsC,EAAU1M,EAAO8oB,MACtCroB,QACD0R,EAAMwQ,GAAejW,MACd,MAAPyF,OAIAqJ,EAAYxT,EAAQmK,GACpB2oB,EAAUhzB,EAAE+L,EAASrP,WAAW2N,IAChC2oB,SACY77B,IAAVe,IACFgI,EAAQmK,GAAK1P,KAAOzC,QAENf,IAAZ6pB,IACF9gB,EAAQmK,GAAK2W,QAAUA,GAGzBrG,GAAQtF,GAAKsL,0BAAyB,MAC5BqS,EAAQ,UACNtf,OACF2B,KAGO2d,EACdv4B,KAAI,QAAUumB,GAAO,IACrBtkB,WAAW,GAAGjD,UAAYvB,EAE7ByiB,GAAQtF,GAAKrO,qBAAoB,MACvBgsB,EAAQ,UACNtf,OACF2B,gCA+pDSzQ,EAAU2zB,GAC/B7d,GAAc,EAAI9V,SAAUA,EAAU1B,QAASq1B,qBAyrGhC7d,oCAtpGR1D,oBAwpGYqO,gCAtjGZvkB,uBAGW5L,EAAMsjC,GACnBne,KAAgBC,sBAIrB6Q,KAEIrqB,EAAQqQ,eAAiBjc,EAAKic,cAChCoa,GAAchhB,MAGhBzJ,EAAUd,EAAEjB,cAAc+B,EAAS5L,GACnCqyB,KAEAza,EAAU7S,IAAG,aAAe6G,EAAQmR,WAAU,SAAW,QACpDumB,GAAkBlxB,KAEvBoS,KACAE,KAGAnQ,GAAWvJ,+BAmBJhF,iBA+gGWqP,eAClBmd,oBA1hGe3d,EAAS0uB,GACxBv9B,EAAO6O,EACP4Z,KACAnc,KACIixB,GACFpQ,GAAS,wCA7qEJ9Z,+BAhBkBmqB,GACrBnqB,KACFA,GAAeoqB,wBAAwB7jC,YAAY4xB,IAC/CnY,GAAe2Q,SACjB3Q,GAAe2Q,YAInB3Q,GAAiBmqB,KAEfnqB,GAAenF,KAAKiM,IACpB9G,GAAeoqB,wBAAwBjjC,UAAUgxB,sBA4sKlC1b,mBA5EnB,SAAa1S,GAEX,IAAAiW,GAAa,MAAA,IAAA9I,MAAA,8BAGb8I,GAASqqB,2BAvBJtgC,aAGE,gBAGAvD,EAAA,EAAAA,EAAAuD,EAAgB1D,OAAIG,IAAA4xB,EAAAnyB,KAAA,IAAAnB,EAAAc,MAAA0kC,MAAAvgC,EAAAvD,GAAA,EAAAuD,EAAAvD,GAAA+jC,WACtBnS,EAgBIoS,CAAAzgC,wCAp4FFqT,EAAW,wCAksBgBqtB,GAClC7hB,GAAwC,IAAxB6hB,EAAWC,SAC3B7hB,GAAoB4hB,EAAWE,SAAWF,EAAWG,WAAa,+BA2wE5C3N,UACtBlkB,6BA/mFI8xB,EAAoB,KACpBhjB,KACAgjB,EAAoBjF,MAExB3sB,KACAmc,KACArc,KACI8xB,GACAjH,GAAuB,KAAM,KAAI,mBAymFrB5G,kBACElkB,qBACGsc,uBA7+EHjsB,EAAKC,OACnB8zB,EAAWkD,GAAYj3B,EAAKC,MAC3B8zB,OAIDzpB,EAAI9B,EAAQvI,GAAOwrB,EAAIuE,GAAYhwB,MACnC0e,IAAiBjI,KAAczW,GAAO0W,KAAezW,EACvDye,GAAc0V,UAAU3I,WAGxBqI,GADsBrI,EAAI0F,GAAanxB,EAAKsK,EAAlB6mB,CAAqBnxB,EAAKC,EAAM4L,GAA0B4f,EAAGnhB,GAAIA,EAAGmhB,EAAG9N,IAAI,GACxDoW,GACzCpW,GAAK0W,aAAar3B,gBAAkB,EAAC,KACnCoO,EAAO4kB,GAAYvZ,IACnBlW,EAAQsL,GAA0BT,EAAM5C,EAAQkO,KACpDuM,GAAQtF,GAAK0W,aAAY,CAErBr0B,IAAKA,EAAKC,KAAMA,EAChBM,MAAOA,EAAO6K,KAAMA,EACpBD,OAAQb,EAAGqpB,IAAKI,IAGtBO,GAAgCt0B,gBAy9ElCiT,eACA8d,6BAnoEwBsE,EAAsBC,UAEvCC,GADKxE,GAAgBsE,EAAaC,kBAooEzBpjB,kBAChBpC,qBACAgrB,2BAhsBqB96B,MACjBoJ,EAAY6mB,kBAAoBrR,GAAA5e,GAAA0E,IAAA1E,EAAAoJ,EAAAmQ,WACpC3J,yBAgsBkBmsB,iCA9hCK97B,MACDsf,GAAAtf,GAAAuf,GAAAvf,4BAzrID0hC,EAAeC,GAC/BD,IAAiBA,EAAgB,GACjCC,IAAYA,EAAW,OAExBjvB,EAA2B,iBAAbgvB,EAA6BA,EAAgBxe,GAAewe,UAEtE5jB,IAAiB6jB,GAAY3jB,IAAmB7U,EAAQqS,aAAe,EAAI,GAC7E4L,MAAsB1U,EAAMvJ,EAAQI,aAAgBmP,GAAe,GAAKD,GAAe,GACvF2O,MAAsB1U,EAAMvJ,EAAQI,aAAgBiP,GAAY,GAAKD,GAAY,6BAiRhFgF,+CAIAvT,6CAIAyJ,mBA27JP1J,kBACiBke,iCA1sKV7S,gCAPoBqS,UAC3BD,GAAoBC,GAEbpR,EAAkB,wBAktKLmR,qCApsKbrS,EAAU,mCAGYsS,UAC7BC,GAAsBD,GAEfnR,GAAoB,0BAisKNoR,SACrBiT,YACAjK,oBACkB8K,oBACDvV,iBACFuW,0BAvSRz8B,EAAmBC,EAAMk8B,EAAAnB,EAAAC,GAC3Bh6B,KAKDjB,EAAA6S,MAAmB7S,EAAA,GAAeC,GAASuI,EAAAtL,QAAmB+C,EAAA,GAC9DmJ,EAAA0Q,0BAIc9Z,EAAGC,GAAA,MACCg3B,GAAAj3B,EAAeC,GAAQk8B,EAAQnB,EAAYC,oEA8R9C4G,mBACH3M,kBACAuF,mDAEFxD,2BA/nCAj3B,EAAAC,OACVkmB,GAAMnmB,EAAAC,GAAA,OAAA,eACUmyB,GAAOpyB,GACzB8hC,EAAE1V,GAAapsB,GAAOmyB,IAElB2P,EAAAxP,GAAQtyB,GAAiB,MAIzB3C,EAAK,EAAGA,EAAA4C,EAAQ5C,kBAGjB+L,EAAII,cAAAnM,IAAA0kC,EAAA,SAGP,cAIJrR,OAAAsR,EACApT,MANImT,EAAUv5B,EAAAvI,GAAAgE,0BAmnCKsrB,mBACCyP,gBAClBnF,gBACeW,cACfH,gBACAE,gBACgBN,iBACJE,kBACG+E,oBACflF,eACAP,kBACAE,oBACAD,kBACaE,YACbyB,iCAvjGOlmB,EAAU,mCAGYmiB,GACzBluB,EAAQ4R,cAAgBsc,IAC1BluB,EAAQ4R,aAAesc,EACnBA,EACFpiB,EAAkBvP,UAAS,OAASuM,IAEpCgD,EAAkBnP,QAAO,OAASmM,0CAr1D/BzI,EAAgB,6CAIhBuL,EAAiB,yCA42DWsiB,GAC/BluB,EAAQ8E,oBAAsBopB,IAChCluB,EAAQ8E,mBAAqBopB,EACzBA,EACFxiB,EAAwBnP,UAAS,OAASuM,IAE1C4C,EAAwB/O,QAAO,OAASmM,yBA/4D3B8J,OACZA,EAAS,OACLqL,KAAqBhT,EAAWiD,OAErC3E,EAAMwQ,GAAenH,EAAUpR,WAC5Byc,KAAuB1U,GAAOvJ,EAAQI,aAAgB8N,GAAWC,GAAYD,6BAG7DqqB,OACnBhvB,EAA2B,iBAAbgvB,EAA6BA,EAAgBxe,GAAewe,GAC1EM,EAAe5a,KAAuB1U,GAAOvJ,EAAQI,aAAgB8N,GAAWC,GAAYD,GAC5F4qB,EAAc7a,KAAuB1U,GAAOvJ,EAAQI,aAAgBmJ,EAAMA,EAAMvJ,EAAQI,aAAe,EAAKmJ,EAC5GwvB,EAAOF,EAAaj9B,WAAWk9B,UAC5BC,GAAQA,EAAK,oCAs2DU7K,GAC1BluB,EAAQsR,eAAiB4c,IAC3BluB,EAAQsR,cAAgB4c,EACpBA,EACF/iB,EAAmB5O,UAAS,OAASuM,IAErCqC,EAAmBxO,QAAO,OAASmM,qCAx2DhCmV,KAAqB/S,EAAaA,EAAW,gCAe1BqtB,OAGtBvY,EAFAzW,EAA2B,iBAAbgvB,EAA6BA,EAAgBxe,GAAewe,GAI1Eta,KACE1U,GAAOvJ,EAAQI,aACjB4f,EAAmBxR,IAEnBwR,EAAmBvR,GACnBlF,GAAOvJ,EAAQI,aAAe,GAGhC4f,EAAmBxR,OAGjB0jB,EAAUlS,EAAiBpkB,WAAWo9B,GAAGzvB,UACtC2oB,GAAWA,EAAQ,oCA60DIhE,GAC1BluB,EAAQyR,eAAiByc,IAC3BluB,EAAQyR,cAAgByc,EACpBA,EACF3iB,EAAmBhP,UAAS,OAASuM,IAErCyC,EAAmB5O,QAAO,OAASmM,qCA/2DhCmV,KAAqB3S,EAAaA,EAAW,gCA+B1BitB,OAGtBU,EAFA1vB,EAA2B,iBAAbgvB,EAA6BA,EAAgBxe,GAAewe,GAI1Eta,KACE1U,GAAOvJ,EAAQI,aACjB64B,EAAmBvqB,IAEnBuqB,EAAmBtqB,GAEnBpF,GAAOvJ,EAAQI,aAAe,GAGhC64B,EAAmBvqB,OAGjBwqB,EAAUD,EAAiBr9B,WAAWo9B,GAAGzvB,UACtC2vB,GAAWA,EAAQ,+BAwiI1B,OAAO5E,GAAMzpB,EAAA,wBA9rBPjU,EAAAC,EAAe2F,EAAI28B,WAChB,OACCviC,GAAA,KACNk7B,EAAA5yB,EAAU2uB,GAAAj3B,EAAAC,MACOuiC,IACdA,0CAEL7wB,YAAe,mBAOb8wB,EAAyB,GAAlBF,GAAkB,gCA9ChB//B,EAAA8sB,SAAoC9sB,GAAA,MAAA,IAAAuL,MAAA,6CAAAvL,EAAA,wBAAUA,GAAI8sB,KAAcA,EAAA,+CAGtEA,OACF3R,MA2hDL6R,iBAAAA,gCAphDahtB,GAA0B4c,GAAU5c,QAAc,KAAA4c,GAAA5c,WAAE4c,GAAY5c,4CAGtE,KACHwG,KAAQ2U,iCAaQnb,UAChB4c,GAAa5c,0BAugDfqJ,0BAAAA,8BA//GF8W,KAAgBsb,oBAEhBhb,GAAQtF,GAAK+kB,gBAAe,YAExBrlC,EAAI8hB,GAAQjiB,OACTG,KACLiqB,GAAiBnI,GAAQ9hB,IAx+CtBkY,IAID0D,IACF1D,EAAgB,GAAG4R,oBAAmB,UAExC5R,EAAkB,MAs+ClB+X,KAGArZ,EAAWpS,QAAQsC,YAAYqZ,0DA8CxB5G,qBArzEP3C,EAAa3L,EAAEQ,IACA5L,OAAS,EAAC,MAAA,IACb6Q,MAAK,yCAA4CjF,EAAS,kCAGlEM,EAAQyR,gBAAkBzR,EAAQwR,gBAAe,MAAA,IACzC7M,MAAK,kFA2Yb40B,EAAcr6B,IAAIhG,IAAI2R,GAAY3R,IAAI2R,EAAW,GAAGxS,eACpDmhC,EAAa,GACjB1pB,GAAiB5Q,YACRjL,EAAI,EAAGA,EAAIslC,EAAYzlC,OAAQG,IACQ,UAAzCslC,EAAYtlC,GAAGyI,SAAO,IAAQ+2B,gBACjC+F,EAAc9lC,KAAK6lC,EAAYtlC,IAC/B6b,GAAe5W,IAAIqgC,EAAYtlC,KAGnCulC,EAAc36B,SAAO,SAAW46B,OAC1Bzb,EAAG,WACEnkB,KAAQ0d,GACfyG,EAAInkB,GAAQ4/B,EAAEngC,MAAMO,GACpB4/B,EAAEngC,MAAMO,GAAQ0d,GAAQ1d,GAE1B4d,GAAS/jB,KAAKsqB,MAvZhB0b,GAGAnvB,EAAwBA,kBAwtBpBovB,EAAkB,IAElBC,EAAWC,UAAUrG,UAAUC,cAAcz5B,MAAK,WAAc,IAAU,IAC1EimB,EAAsB/gB,EAAC,WAC3B+gB,EAAIrnB,SAAS2C,SAASC,aAEX,KACLs+B,EAAyB,EAAlBH,KACX1Z,EAAIzlB,OAAOs/B,GACPA,EAAOF,GAAY3Z,EAAIzlB,WAAas/B,EAAI,MAG1CH,EAAkBG,SAItB7Z,EAAIhmB,SACG0/B,EAzuB0CI,GAEjD/5B,EAAUd,EAAEjB,cAAa,GAAK8R,GAAU/P,GACxCymB,KACA/S,GAAe7Y,MAAQmF,EAAQoQ,mBAK/BkW,KAOA9Y,GAAc,mBACSgM,qBACAqb,IAGvBhqB,EACGpS,QACAU,IAAG,WAAW,UACdA,IAAG,UAAY,GACfyD,SAASwX,IACTxX,SAAQ,aACRA,SAAQ,cAEE,iBAAuBrD,QAAasgC,UAAkBG,iBAAmB,IAEpFnvB,EAAWjO,SAAQ,sCAKUk9B,KAAKjvB,EAAW1R,IAAG,cAChD0R,EAAW1R,IAAG,WAAW,YAG3B2R,EAAa5L,EAAC,sGAAuGtG,SAASiS,GAG9H6C,GAAexO,EAAC,6EAA8EtG,SAASiS,GACvG8C,GAAezO,EAAC,8EAA+EtG,SAASiS,GACxG+C,GAAY1O,EAAC,0EAA2EtG,SAASiS,GACjGgD,GAAY3O,EAAC,2EAA4EtG,SAASiS,GAClGiD,GAAe5O,EAAC,6EAA8EtG,SAASiS,GACvGkD,GAAe7O,EAAC,8EAA+EtG,SAASiS,GAEpG7K,EAAQ6E,uBACV6G,EAA0BxM,EAAC,qGAAsGtG,SAAS8U,IAC1IrN,EAAkBnB,EAAC,WAAYtG,SAAS8S,GACxCC,EAAwBzM,EAAC,gFACtBtG,SAAS8S,GAEZG,EAA2B3M,EAAC,qGAAsGtG,SAAS+U,IAC3I/B,EAAmB1M,EAAC,WAAYtG,SAASiT,GAChB3M,EAAC,gFACvBtG,SAASiT,GAEP7L,EAAQ8E,qBACX4G,EAAwB,GAAGpS,MAAMoD,QAAO,OACxCmP,EAAyB,GAAGvS,MAAMoD,QAAO,SAK7CsR,GAAmB9O,EAAC,mEAAoEtG,SAAS8U,IACjGO,GAAmB/O,EAAC,oEAAqEtG,SAAS+U,IAGlG3C,EAAkB9L,IAAIhG,IAAI8U,IAAkB9U,IAAI+U,IAChC/O,QAWZ+6B,EAAU1+B,SAAS2B,cAAa,OACpC+8B,EAAQ9e,UAAS,iDACjB8e,EAAQ3gC,MAAMoC,KAAI,cACdw+B,EAAU3+B,SAAS2B,cAAa,OACpCg9B,EAAQ/e,UAAS,kDACjB+e,EAAQ5gC,MAAMoC,KAAI,UAClBwS,GAAWhP,EAAE+6B,GAASrhC,SAASoV,IAC/BG,GAAWjP,EAAEg7B,GAASthC,SAASqV,KAG/BhD,EAAW/L,IAAIhG,IAAIgV,IAAUhV,IAAIiV,KAExBrS,GAAE,eAAc,SAAYjH,GACnCA,EAAM6jB,wBAGJyhB,EAAqB5+B,SAAS2B,cAAa,OAC/Ci9B,EAAmBhf,UAAS,uCACxBif,EAAqB7+B,SAAS2B,cAAa,OAC/Ck9B,EAAmBjf,UAAS,mCAC5B/M,GAAsBlP,EAAEi7B,GAAoBvhC,SAASgV,IACrDS,GAAsBnP,EAAEk7B,GAAoBxhC,SAASiV,IAErD1C,EAAqBjM,IAAIhG,IAAIkV,IAAqBlV,IAAImV,QAElDgsB,EAAmB9+B,SAAS2B,cAAa,OAC7Cm9B,EAAiB/gC,MAAMoD,QAAO,QAC9B29B,EAAiB/gC,MAAMkB,OAAM,MAC7B6/B,EAAiB/gC,MAAMoC,KAAI,IAC3B2+B,EAAiB/gC,MAAMgC,IAAG,IAC1B++B,EAAiB/gC,MAAMsK,SAAQ,eAE3B02B,EAAmB/+B,SAAS2B,cAAa,OAC7Co9B,EAAiBhhC,MAAMoD,QAAO,QAC9B49B,EAAiBhhC,MAAMkB,OAAM,MAC7B8/B,EAAiBhhC,MAAMoC,KAAI,IAC3B4+B,EAAiBhhC,MAAMgC,IAAG,IAC1Bg/B,EAAiBhhC,MAAMsK,SAAQ,WAE/BwH,EAAoBlM,EAAEm7B,GACnBzhC,SAASwV,IACZ/C,EAAoBnM,EAAEo7B,GACnB1hC,SAASyV,QAERksB,EAAah/B,SAAS2B,cAAa,OACvCq9B,EAAWpf,UAAS,2DAEhBqf,EAAaj/B,SAAS2B,cAAa,OACvCs9B,EAAWrf,UAAS,wDAEpB3M,GAActP,EAAEq7B,GAAY3hC,SAASwV,IACrCK,GAAcvP,EAAEs7B,GAAY5hC,SAASyV,IAErCnD,EAAahM,IAAIhG,IAAIsV,IAAatV,IAAIuV,QAGlCgsB,EAAoBl/B,SAAS2B,cAAa,OAC9Cu9B,EAAkBtf,UAAS,gDACvBuf,EAAoBn/B,SAAS2B,cAAa,OAC9Cw9B,EAAkBvf,UAAS,4CAC3BvM,GAAqB1P,EAAEu7B,GAAmB7hC,SAASgV,IACnDiB,GAAqB3P,EAAEw7B,GAAmB9hC,SAASiV,IAEnD/B,EAAoB5M,IAAIhG,IAAI0V,IAAoB1V,IAAI2V,IAGpDC,GAAa5P,EAAC,yDAA0DtG,SAASgW,IACjFG,GAAa7P,EAAC,yDAA0DtG,SAASiW,IAEjF9C,EAAY7M,IAAIhG,IAAI4V,IAAY5V,IAAI6V,IAE/B/O,EAAQ4R,cACX1S,EAAEnB,KAAK+N,GAAiB,SAAYvC,EAAKtR,GAAMA,EAAGqB,MAAMoD,QAAO,UAG5DsD,EAAQsR,eACXpS,EAAEnB,KAAKoN,GAAkB,SAAY5B,EAAKtR,GAAMA,EAAGqB,MAAMoD,QAAO,UAIlEsS,GAAgB9P,EAAC,gGAAiGtG,SAASgV,IAC3HqB,GAAgB/P,EAAC,iGAAkGtG,SAASiV,IAC5HqB,GAAmBhQ,EAAC,mGAAoGtG,SAASkV,IACjIqB,GAAmBjQ,EAAC,oGAAqGtG,SAASmV,IAGlI/B,EAAY9M,IAAIhG,IAAI8V,IAAe9V,IAAI+V,IAAe/V,IAAIgW,IAAkBhW,IAAIiW,IAIhFhC,GAAsB6B,GAGtBI,GAAclQ,EAAC,uFAAwFtG,SAASoW,IAChHK,GAAcnQ,EAAC,wFAAyFtG,SAASqW,IACjHK,GAAiBpQ,EAAC,0FAA2FtG,SAASsW,IACtHK,GAAiBrQ,EAAC,2FAA4FtG,SAASuW,IACnHnP,EAAQmT,eAAiBnH,EAAU9P,YAAY8D,EAAQmT,eAAe,GAG1ElH,EAAU/M,IAAIhG,IAAIkW,IAAalW,IAAImW,IAAanW,IAAIoW,IAAgBpW,IAAIqW,IAExEjF,EAAsBA,GAAuBkU,KAG7CtR,EAAoBkC,GAGhBzD,GAAyBA,EAAsBxS,IAAG,QAAU2lB,KAAmBxU,EAAoBzP,MAAK,MAC5GoQ,EAASpQ,MAAM+F,MACfwK,EAAkBjS,IAAG,QAAU2lB,KAAmBxU,EAAoBzP,MAAK,MAC3EwQ,EAAkBlS,IAAG,QAAU2lB,KAAmBxU,EAAoBzP,MAAK,MAGvEmF,EAAQwR,kBACVjD,GAAsBrP,EAAC,oDAAqDtG,SAASiV,IACrFS,GAAsBpP,EAAC,oDAAqDtG,SAASgV,IAErFrC,EAAqBrM,IAAIhG,IAAIoV,IAAqBpV,IAAIqV,IAEtD/C,EAAoBtM,EAAC,gFAClB/F,IAAG,QAAU2lB,KAAmBxU,EAAoBzP,MAAK,MACzDjC,SAAS0V,IACZ7C,EAAoBvM,EAAC,gFAClB/F,IAAG,QAAU2lB,KAAmBxU,EAAoBzP,MAAK,MACzDjC,SAAS2V,IAGZG,GAAcxP,EAAC,wEAAyEtG,SAAS0V,IACjGK,GAAczP,EAAC,yEAA0EtG,SAAS2V,IAElGjD,EAAapM,IAAIhG,IAAIwV,IAAaxV,IAAIyV,IAEjC3O,EAAQyR,eACXvS,EAAEnB,KAAKwN,GAAkB,SAAYhC,EAAKtR,GAAMA,EAAGqB,MAAMoD,QAAO,WAIpEqO,EAAc7L,EAAE4L,EAAW,GAAG6vB,WAAU,IAAO/hC,SAASiS,GAEnD7K,EAAQyE,wBACXiT,QAreNxY,EAAE1B,WAAUjL,EAAAc,MAAA,CAAUunC,KAAM90B,0ZChQf+0B,gCA4GG5gB,gFApHV6gB,EAAc,CAChBC,mBAAkB,MAClBxgB,QAAO,IAAAJ,EAAAC,aACPK,OAAM,IAAAN,EAAAC,aACNF,SAAQ,IAAAC,EAAAC,aACR5G,YAAa,SAGJqnB,cASWn7B,EACAM,QADAN,UAAAA,OACAM,QAAAA,OAHZg7B,UAAS,CAA+BtiC,EAAG,KAAMgK,EAAG,WAapDu4B,mBAAsB5gB,UACpB7B,EAAsB6B,EAAI7B,YACrBA,EAAO2C,WAAW9hB,QAAO,IAAItF,KAAQiM,QAAQ+6B,oBAAsB,IAG9E1gB,EAAI3B,iBACJ2B,EAAItkB,kBACJskB,EAAIrkB,gCACCklC,QAAU1iB,EAAOpgB,UAAUzB,SAAQ5C,KAAMiM,QAAQ+6B,mBAAkB,MACpEviB,EAAOpgB,UAAUzB,SAAQ5C,KAAMiM,QAAQ+6B,mBAAkB,UACxDI,QAAU3iB,EAAOpgB,UAAUzB,SAAQ5C,KAAMiM,QAAQ+6B,mBAAkB,MACpEviB,EAAOpgB,UAAUzB,SAAQ5C,KAAMiM,QAAQ+6B,mBAAkB,UAExDzc,QAAU9F,EAAOngB,mBACjB2H,QAAQua,QAAQpmB,OAAM,CAAEkmB,IAAAA,EAAK7B,OAAMzkB,KAAOuqB,QAAS5lB,EAAC3E,KAAOqnC,WAAmB/gB,EAAG,SAAY3X,EAAC3O,KAAOqnC,WAAmB/gB,EAAG,WAGhI9gB,OAAO0C,iBAAgB,YAAYlI,KAAOsnC,WAAW,GACrD9hC,OAAO0C,iBAAgB,UAAUlI,KAAOunC,SAAS,GACjD/hC,OAAO0C,iBAAgB,YAAYlI,KAAOsnC,WAAW,GACrD9hC,OAAO0C,iBAAgB,WAAWlI,KAAOunC,SAAS,UAG9CD,UAAahhB,QACbkhB,GAAW,UAENL,QAAO,KACRvxB,EAAG5V,KAAgBqnC,WAAmB/gB,EAAG,WAAWtmB,KAASuqB,QAAQjjB,wBAAwBK,UACxFsE,QAAQ4T,UAAYjK,EAAG5V,KAAQiM,QAAQ4T,SAC5CjK,EAAG5V,KAAQiM,QAAQ4T,cACP5T,QAAQgiB,UAAYrY,EAAG5V,KAAQiM,QAAQgiB,WACnDrY,EAAG5V,KAAQiM,QAAQgiB,UAED,WAAbgZ,WAAyC,MAAxBjnC,KAASinC,UAAUtiC,IAAS3E,KAC7CinC,UAAUtiC,EAAIiR,IAED,WAAbqxB,WAAqB1kC,KAAK+mB,IAAGtpB,KAAMinC,UAAUtiC,EAAIiR,IAAG5V,KAAUiM,QAAQwT,oBAE9DxT,QAAQw7B,QACb7xB,EAAMrT,KAAK+d,MAAM1K,EAAG5V,KAAQiM,QAAQw7B,OAAKznC,KAASiM,QAAQw7B,YAEzDld,QAAQhlB,MAAMuB,MAAQvE,KAAK+d,MAAM1K,GAAG,KACzC4xB,GAAW,OACNP,UAAY,cAIpBG,QAAO,KACRxxB,EAAG5V,KAAgBqnC,WAAmB/gB,EAAG,WAAWtmB,KAASuqB,QAAQjjB,wBAAwBC,SACxF0E,QAAQy7B,WAAa9xB,EAAG5V,KAAQiM,QAAQy7B,UAC7C9xB,EAAG5V,KAAQiM,QAAQy7B,eACPz7B,QAAQ07B,WAAa/xB,EAAG5V,KAAQiM,QAAQ07B,YACpD/xB,EAAG5V,KAAQiM,QAAQ07B,WAED,WAAbV,WAAyC,MAAxBjnC,KAASinC,UAAUt4B,IAAS3O,KAC7CinC,UAAUt4B,EAAIiH,IAED,WAAbqxB,WAAqB1kC,KAAK+mB,IAAGtpB,KAAMinC,UAAUt4B,EAAIiH,IAAG5V,KAAUiM,QAAQwT,oBAE9DxT,QAAQ27B,QACbhyB,EAAMrT,KAAK+d,MAAM1K,EAAG5V,KAAQiM,QAAQ27B,OAAK5nC,KAASiM,QAAQ27B,YAEzDrd,QAAQhlB,MAAMkB,OAASlE,KAAK+d,MAAM1K,GAAG,KAC1C4xB,GAAW,OACNP,UAAY,MAIzBO,GAAQxnC,KACHiM,QAAQka,SAAS/lB,OAAM,CAAEkmB,IAAAA,EAAK7B,OAAMzkB,KAAOuqB,QAAS5lB,EAAC3E,KAAOqnC,WAAmB/gB,EAAG,SAAY3X,EAAC3O,KAAOqnC,WAAmB/gB,EAAG,iBAIjIihB,QAAWjhB,IACf9gB,OAAOwkB,oBAAmB,YAAYhqB,KAAOsnC,WAAW,GACxD9hC,OAAOwkB,oBAAmB,UAAUhqB,KAAOunC,SAAS,GACpD/hC,OAAOwkB,oBAAmB,YAAYhqB,KAAOsnC,WAAW,GACxD9hC,OAAOwkB,oBAAmB,WAAWhqB,KAAOunC,SAAS,QAChDt7B,QAAQya,OAAOtmB,OAAM,CAAEkmB,IAAAA,EAAK7B,OAAMzkB,KAAOuqB,QAAS5lB,EAAC3E,KAAOqnC,WAAmB/gB,EAAG,SAAY3X,EAAC3O,KAAOqnC,WAAmB/gB,EAAG,gBAC1H2gB,UAAS,CAAKtiC,EAAG,KAAMgK,EAAG,YAxF1B4F,OAGDszB,YACCl8B,UAAUtH,UAAUc,IAAG,kBACvBwG,UAAUzD,iBAAgB,YAAYlI,KAAOknC,oBAAoB,QACjEv7B,UAAUzD,iBAAgB,aAAalI,KAAOknC,oBAAoB,GAqFnEW,WAAcvhB,EAAUjhB,UACT,MAAZihB,EAAIjhB,GAAeihB,EAAIjhB,IAAQihB,EAAIU,QAAQjnB,OAAS,EAAIumB,EAAIU,QAAUV,EAAI6G,gBAAgB,GAAG9nB,aAK5F6gB,EAAUphB,EAAgCgjC,cAC3ChB,EAA+B,iBAARhiC,EAC9B0C,SAASmJ,cAAc7L,GACvBA,EAAQ,IACHiiC,KAAmBe,iNC/IC,mBAAlBtiC,OAAOuiC,YAA0B,OAAW,WAE9CC,EAAYlnC,EAAOmnC,GACxBA,EAASA,GAAM,CAAMC,SAAS,EAAOC,YAAY,EAAOC,YAAQ9lC,OAC5DgkB,EAAM9e,SAAS6gC,YAAW,sBAC9B/hB,EAAIgiB,gBAAgBxnC,EAAOmnC,EAAOC,QAASD,EAAOE,WAAYF,EAAOG,QAC9D9hB,EAGX0hB,EAAYjkC,UAAYyB,OAAO9F,MAAMqE,UAEpCyB,OAAeuiC,YAAcC,aAEZO,QAAQxkC,YACrBwkC,QAAQxkC,UAAkBmC,OAAM,gBACpBC,YAAUnG,KACVmG,WAAWC,YAAWpG,uJCb9BqmB,UAAAA,gBAEYmiB,MACJ,MAATA,EAAa,OAAA,IACFniB,KAEC,mBAALmiB,EAAoB,OACrBC,EAAG,IAAOpiB,SAChBoiB,EAAI5nC,UAAU2nC,GACPC,SAEJD,cAKCE,QAFJ5oC,SAAQ,GAGD,MAAP4oC,GAAW1oC,KACNF,SAASH,KAAK+oC,GAIpBb,UAAU5/B,QACRnI,SAASH,KAAKsI,GAGhB4/B,OAAOjyB,EAAS+yB,aACRjyB,KAAC1W,KAASF,SACjB4W,EAAEd,EAAK+yB,GAIRd,oBACS/nC,SAASC,OAGlB8nC,YAAY5/B,QACNnI,SAASwF,QAAQ2C,IAAQ,EAACjI,KAC1BF,SAASK,OAAMH,KAAMF,SAASwF,QAAQ2C,GAAM,GAGjD2gC,QAAQC,KAAI,4PCjCN32B,sDATd/G,EAACC,EAAApF,2BASakM,EAAkBjG,OAC5B68B,EAIAC,EACAC,EAJAC,EAAO,GACPC,EAAKlpC,KACLmpC,EAAQ,IAAA3qC,EAAAc,MAAa+mB,aAGrB+iB,EAAS,CACXC,iBAAiB,YAkBVC,EAAYvoC,qBAEZgoC,IACHA,GAAa,EACbhoC,EAAQsvB,MAAKrwB,KAAO4J,WACpBm/B,GAAa,aAKVQ,EAAazX,WAChBruB,EAAI,GACCvD,EAAI,EAAGA,EAAI4xB,EAAO/xB,OAAQG,IAAC,IAAA,IACzB+E,EAAI6sB,EAAO5xB,GAAGgC,QAAS+C,GAAK6sB,EAAO5xB,GAAGkC,MAAO6C,IACpDxB,EAAK9D,KAAKsF,UAGPxB,WAGAygC,EAAazgC,WAChBquB,EAAM,GACNmS,EAAW6E,EAAM18B,aAAarM,OAAS,EAClCG,EAAI,EAAGA,EAAIuD,EAAK1D,OAAQG,IAC/B4xB,EAAOnyB,KAAI,IAAAnB,EAAAc,MAAW0kC,MAAMvgC,EAAKvD,GAAI,EAAGuD,EAAKvD,GAAI+jC,WAE5CnS,WAcA3b,WACAozB,EAAaN,YAOblF,EAAkBjS,IAEnBmX,GAA8B,IAAnBA,EAAQlpC,QAAmB+xB,GAA4B,IAAlBA,EAAO/xB,UAC7DkpC,EAAUnX,EACVoX,EAAMpF,wBAAwB1jC,OAAO6oC,aAO9BO,EAAuBlpC,EAAG+F,GAC7B2iC,EAASK,iBAA+B,MAAZhjC,EAAKxD,KACnCkhC,EAAiB,aAAYC,MAAM39B,EAAKxD,IAAK,EAAGwD,EAAKxD,IAAKimC,EAAM18B,aAAarM,OAAS,cAIjFyoB,EAAcloB,OACjBgZ,EAAYwvB,EAAMxJ,mBAClBwJ,EAAM58B,aAAaiS,aAAe7E,GACnChZ,EAAEslB,WAAatlB,EAAEglB,UAAYhlB,EAAE47B,SAAW57B,EAAE+kB,UAC3C/kB,EAAE87B,OAAK59B,EAAAc,MAAU28B,QAAQgB,IAAM38B,EAAE87B,OAAK59B,EAAAc,MAAU28B,QAAQkB,MAAI,KAC1Dpb,EAAe5L,IACnB4L,EAAa3T,MAAI,SAAWzJ,EAAGgK,UACtBhK,EAAIgK,KAGRoT,EAAahiB,SAChBgiB,EAAY,CAAIzI,EAAUzW,UAKxB4mC,EAFAliC,EAAMwa,EAAa,GACnBwR,EAASxR,EAAaA,EAAahiB,OAAS,OAI9C0pC,EADEnpC,EAAE87B,OAAK59B,EAAAc,MAAU28B,QAAQkB,KAClB7jB,EAAUzW,IAAM0wB,GAAUhsB,GAAOgsB,IAAWA,IAAWhsB,EAEvD+R,EAAUzW,IAAM0wB,IAAWA,IAAWhsB,IAGnC,GAAKkiC,EAASX,EAAMpzB,gBAChCozB,EAAMnL,kBAAkB8L,GAExB1F,EADiBG,WA9DDwF,EAAMC,OACtBzpC,EAAGuD,EAAI,OACNvD,EAAIwpC,EAAMxpC,GAAKypC,EAAIzpC,IACtBuD,EAAK9D,KAAKO,OAEPA,EAAIypC,EAAIzpC,EAAIwpC,EAAMxpC,IACrBuD,EAAK9D,KAAKO,UAELuD,EAsD2BmmC,CAAariC,EAAKgsB,KAIlDjzB,EAAEqkB,iBACFrkB,EAAE0B,4BAIGymB,EAAYnoB,OACfwC,EAAOgmC,EAAM/f,iBAAiBzoB,OAC7BwC,IAASgmC,EAAMjH,gBAAgB/+B,EAAKD,IAAKC,EAAKA,MAAI,OAC9C,MAGJgmC,EAAM58B,aAAaiS,cACnB7d,EAAEglB,UAAYhlB,EAAEslB,WAAatlB,EAAE+kB,QAAO,OAClC,MAGLsa,EAAY4J,EAAaN,GACzBzzB,EAAMmqB,EAAUr6B,QAAQxC,EAAKD,SAGrB,IAAR2S,IAAelV,EAAEglB,SAAWhlB,EAAE+kB,SAChCsa,EAAUhgC,KAAKmD,EAAKD,KACpBimC,EAAMe,cAAc/mC,EAAKD,IAAKC,EAAKA,eAClB,IAAR0S,IAAelV,EAAEglB,SAAWhlB,EAAE+kB,SACvCsa,EAAYA,EAAU9rB,QAAM,SAAWi2B,EAAG5pC,UAChC4pC,IAAMhnC,EAAKD,OAErBimC,EAAMe,cAAc/mC,EAAKD,IAAKC,EAAKA,cAC1B68B,EAAU5/B,QAAUO,EAAEslB,SAAQ,KACnCmkB,EAAOpK,EAAUlH,MACjBiR,EAAOnnC,KAAKC,IAAIM,EAAKD,IAAKknC,GAC1BJ,EAAKpnC,KAAKE,IAAIK,EAAKD,IAAKknC,GAC5BpK,EAAS,WACAz/B,EAAIwpC,EAAMxpC,GAAKypC,EAAIzpC,IACtBA,IAAM6pC,GACRpK,EAAUhgC,KAAKO,GAGnBy/B,EAAUhgC,KAAKoqC,GACfjB,EAAMe,cAAc/mC,EAAKD,IAAKC,EAAKA,aAIrCihC,EADiBG,EAAavE,IAE9Br/B,EAAE2B,4BAEK,EAGTkJ,EAAEjB,cAAalK,KAAA,iBACMmW,2BArGI1S,GACvBsgC,EAAkBG,EAAazgC,yCAWxBwlC,qBA6FclF,gBApKTl4B,GACZm9B,EAAW79B,EAAE1B,WAAU,GAAK2/B,EAAWn9B,GACvC68B,EAAQj9B,EACRs9B,EAAStoC,UAAUioC,EAAMzJ,oBACrBiK,EAAYE,IAChBL,EAAStoC,UAAUioC,EAAM9M,UACrBsN,EAAY9gB,IAChB2gB,EAAStoC,UAAUioC,EAAMpL,QACrB4L,EAAY7gB,wBAIhB0gB,EAASnoC,6BA4JG,4CAEa,IAAAxC,EAAAc,MAAYI,QA3L3CyL,EAAE1B,WAAWjE,OAAM,OACZ,mBACkB0M,+RC+xCvB3S,OAAAd,EAAA,iBAAuC,IAAAurC,0CArwClCzqC,OAAAd,EAAA,iBAAA,IAAAwrC,UA2EDxqC,EAAQ,gBACVA,EAAA,wBACA2L,EAAApF,gCAIF,IAcIkkC,EAMJC,EApBA3pB,EAAUxgB,KAKNoqC,EAAW,KACXh3B,EAAM,GACN3P,EAAO,GACP4mC,EAAU,GAEdC,EAAA,KACIz2B,EAAA,KACA02B,EAAA,UACAl8B,GAAA,EAEAm8B,EAAa,GAEjBC,EAAA,GAIIC,EAAA,GAGFC,EAAc,MAKdC,OAAA,KACAn8B,UAAW,KACXH,SAAA,CAAA3E,EAAA6E,IACA7E,EAAAvG,QAAoBoL,EAAKpL,MAAA,EAAAuG,EAAAvG,MAAAoL,EAAApL,MAAA,GAAA,EAEzBynC,iBAAgB,GAChBC,YAAA,GACAC,gBAAA,wBAEEC,sBAAa,EACb1nC,WAAM,EACN2nC,kBAAA,EACAC,uBAAoB,GAGpBC,EAAW,GACXznC,EAAS,GAEb0nC,EAAS,GACLC,EAAiB,MACjBC,EAAA,EACAC,EAAA,EACAC,EAAA,EAEuB94B,EAAiB,IAAAlU,EAAAc,MAAAI,QAGxB,IAAAlB,EAAAc,MAAAI,MAClB+rC,EAAc,IAAAjtC,EAAAc,MAAAI,qCAqBDgsC,OAIXj+B,cAFYi+B,GAAe,wCAMtBppC,IAAAmL,EACH,MAAE,IAAAmD,MAAA,OAAAw5B,EAAA,yBAAAlqC,EAAA,oBACOuN,GAAIvN,YA0C8ByrC,QAAWrH,EAAUgH,EAAA/oC,KAAAE,IAAA,EAAAF,KAAA+0B,KAAAkU,EAAAF,IAAA,QAAE,kCAItEhH,WAAAA,EACAx4B,SAAY0U,YAKPpS,EAAKE,EAASo1B,KACfA,EAGJwG,EAAO57B,GACM,IAAbo1B,GAAatwB,EAAAw4B,UACbx4B,EAAAhF,KAAOE,yBAIA,oBAoCPu9B,EAAiBC,GAAiD7/B,EAAAyF,4BAAYzF,EAAAyF,0BAAA,IAAAlT,EAAAc,MAAAysC,KAAAp6B,kCAE1D,QACPm6B,GAAe,cAA2ChiC,MAAegiC,EAAA,CACpFA,OAGA,IAAG5rC,EAAA,EAAAA,EAAAirC,EAAoBprC,OAAAG,IAAA,OACnB8rC,EAAMb,EAAejrC,GAAAiL,EAAM1B,WAAA,KAE1B0hC,EAAwBjrC,IAG7B8rC,EAAAC,YAAsB,mBAAAD,EAAApB,iCAGxB,IAAOp1B,EAAAw2B,EAAAlB,YAAA/qC,+DAGTqrC,EAAAlrC,GAAA,6BAwDmB,OAEV,IAAAA,EAAS,EAAEiO,EAAA1K,EAAA1D,OAAAG,EAAAiO,EAAAjO,IAAAoqC,EAAA7mC,EAAAvD,GAAAkqC,IAAAlqC,wBAgBXkT,EAAIi3B,EAAA58B,eAuCGA,EAAAQ,WAIG3L,MAARmL,GAAU,MAAA,IAAAmD,MAAA,iBAOjBnD,IAAAQ,EAAAm8B,GAAA,YAIF,GAAgB,MAAV8B,EAAe,MAAI,IAAAt7B,MAAA,kDAEzB,QAAAtO,IAAA+nC,EAAA6B,GAAA,MAAA,IAAAt7B,MAAA,0DAEYs7B,GACH7B,EAAA58B,eAGF88B,GAAAA,EAAA98B,WAAA88B,EAAA98B,KAGAy+B,EAEP94B,EAAAi3B,EAAc58B,IAAAQ,YAKds8B,EAAM98B,IAAK,EACXwB,sBAIO9O,OAAA+sB,EAAa,EAAAjf,KACVif,gBAWLif,EAAA1+B,GAGL,IAAA+H,EAAU60B,EAAC58B,sDAGJ48B,EAAA58B,KACHtN,OAAQqV,EAAE,KAGTA,gBAKH42B,EAAAn+B,OACAi8B,EAAa,MAAA,IAAAt5B,MAAA,mEAqBCy7B,SACT,EAAKC,EAAMl5B,EAAArT,sBAGXwsC,EAASC,EAAAF,IAAA,GACC,IAATpC,EAAS92B,EAAAm5B,GAAAF,GAAAG,EAAAD,EAAA,EAEjBD,EAAAC,WA3BEE,CAAkBx+B,GAAAA,YA2ElBy+B,EAAqBxpC,EAASypC,yCAEhCvB,EAAOlrC,GAAA,GAGTirC,EAAAjrC,GAAAoD,UAAAqpC,OAOAvB,EAAAloC,GAAA,oBAQE+L,aA6BI29B,EAAoB1pC,EAAKS,EAAQgpC,KAGnCzpC,GAAoBS,GAAiBwnC,EAAUjoC,GAAAI,UAAoBqpC,eAgCnEE,EAASC,EAAWC,OACpBlpC,QAEO,KACC,KAGNkpC,EAAcA,EAAU7pC,MAAK,EAAA,IAC7BioC,EAAejoC,mDAGjB0S,EAAMo2B,EAAAnB,iBAAgB3qC,UAGf2D,IAELA,EAAQ,IAAOrF,EAACc,MAAA4B,MAChB2C,EAAMT,MAASwS,YAIZ/R,EAAKF,aAAcopC,EAAeA,EAAAppC,YAAA0nC,EAAA,IAAAz1B,EAElCo3B,EAAMA,EAAAjtC,QAAA8D,cAKT,IAAEy1B,EAAG,EAAA2T,EAAAH,EAAc/sC,OAAWu5B,EAAA2T,EAAA3T,IAC9BjV,EAAAyoB,EAAAxT,GACA1jB,EAAKo2B,EAAGC,YAAMD,EAAYpB,OAAMvmB,GAAAA,EAAA2nB,EAAApB,UAE/BsC,EAAkBt3B,GACrB/R,IACIA,EAAI,IAAMrF,EAAac,MAAA4B,QACnBkC,MACDwS,YAMF/R,EAAGF,aAAAopC,EAAAA,EAAAppC,YAAA0nC,EAAA,IAAAz1B,EACLo3B,EAAMA,EAAWjtC,QAAI8D,EACpBqpC,EAAIt3B,GAAA/R,KAINJ,KAAGI,EAAAV,SAAoBkhB,6CAI3BxgB,EAAOmpC,EAAWG,iCAIZ/+B,KAAG+8B,EAAcjoC,GAAWoL,UAC9B0+B,WAECI,EAAgB5pC,OAOrB6pC,IANQ7pC,EAAAK,qBAKSA,EAAQX,OAAcioC,EAAAprC,OAC/ByV,EAAKw2B,EAAKlB,YAAA/qC,WACdutC,GAAKtB,EAAchB,qBAAK,CAExB,IAAA9qC,EAAA2D,EAAaH,OAAG3D,OAChB,KAAMG,KAAO2D,EAAMH,OAAGxD,GAAAsD,OAAAM,aAAAspC,EAAAvpC,EAAAH,OAAAxD,GAAAsD,aAEvBgS,OAEKw2B,EAAAlB,YAAct1B,GAIpB63B,EAAA94B,QACK+4B,GACHtB,EAAShB,qBAAoBgB,EAAAuB,qBAAA/3B,GAAA7U,KAAA0sC,EAAAxpC,EAAAH,QAG3BsoC,EAAGuB,qBAAkB/3B,GACpB7U,KAAA0sC,EAAAxpC,EAAcJ,MAInB4pC,EAAEG,YAAYhqC,6BAKTiqC,EAAA5pC,GACP,IAAAmoC,EAAQb,EAAUtnC,EAAAX,OACdM,EAAK,IAAAhF,EAAmBc,MAAA6B,cACxB0C,MAAWA,WACCL,EACbwoC,EAAGd,uBAAQkC,EAAA5pC,cAGLwpC,EAAS9pC,eACdA,GAAQ,mBAMMkoC,EAAmBloC,+BAO9BwqC,EAAApqC,YAAkB0oC,EAAA2B,qBAErBD,EAAAhqC,QAAakqC,EAAWF,EAAAhqC,OAAMR,EAAO,4FAEvCwqC,EAAApqC,UAAQuqC,EAAoBC,EAAAJ,EAAA/pC,aAC5B+pC,EAAArqC,MAAM2oC,EAAOv9B,UAAEu9B,EAAAv9B,UAAAi/B,GAAAA,EAAAtqC,gBAIV2qC,EAAAf,EAAuB9pC,OASC4pC,EAAAY,EAP3B1B,EAAEb,IADFjoC,GAAA,GAQD8qC,EAA4B,GAAAC,EAAA,UACxB/tC,EAAE,EAAAiO,EAAA6+B,EAAAjtC,OAAAG,EAAAiO,EAAAjO,IAAA,CAIX,UADA8tC,EAAAC,KAAAP,GACAA,EAAApqC,UAAA,CAEAwpC,EAAAY,EAAAhqC,OAAAqqC,EAAAL,EAAmDhqC,OAAAR,EAAA,GAAAwqC,EAAAjqC,KACnD,IAAA,IAAAwB,EAAA,EAAAipC,EAAApB,EAAA/sC,OAAAkF,EAAAipC,EAAAjpC,IAAA+oC,EAAAC,KAA6EnB,EAAA7nC,GAE7EyoC,EAAAlqC,QAAAwoC,EAAAf,oBAAqCyC,EAAApqC,WAAA0oC,EAAA2B,sBAAAK,EAAAC,KAAAP,EAAAlqC,QAErC,OAAAwqC,EAWA,SAAAG,EAAAC,GACA,IAAAC,EAVA,SAAAzuC,GACA,IACAiwB,EAAAjwB,EAAAmD,WAAAkD,MADA,4CAGA,MAAA,CACAgiC,OAAApY,EAAA,GAAA3oB,MAAA,KACAO,KAAAooB,EAAgB,IAIKye,CAAAF,EAAAG,YACrB3uC,EAAA,IAAA4uC,SAAA,SAAA,YAAAH,EAAkEpG,OAAA,GAAA,6CAAAoG,EAAApG,OAAA,GAAA,kBAAAoG,EAAA5mC,KAAA,KAElE,OADA7H,EAAA6uC,YAAA,0BACA7uC,aA4FgB8uC,EAAaruC,SAIzB,GAAAmV,EAAA,EACA,IAAA,IAAAtV,EAAA,EAAA4qB,EAAA4jB,EAAA3uC,OAAAG,EAAA4qB,EAAA5qB,IAAA2T,EAAA66B,EAAiExuC,GAAAG,KAAAsuC,EAAAn5B,KAAAk5B,EAAAxuC,IACjE,OAAAyuC,WAIFC,EAAuBF,EAAAruC,EAAAwuC,OACd5gC,EAAL0gC,EAAK,GAAAn5B,EAAA,MACL,IAAAtV,EAAQ,EAAA4qB,EAAA4jB,EAAA3uC,OAAAG,EAAA4qB,EAAA5qB,MACNwuC,EAAAxuC,KACEA,GAAAyuC,EAAan5B,KAAOvH,EAGtB4F,EAAO5F,EAAG5N,cAGdwuC,EAAQ3uC,IAAA,UAIDyuC,WAgFTG,EAAAC,EAAAC,GACA1E,EAAA,KACIE,EAAYyE,mBAAsBxE,EAAQwE,mBAAAzE,EAAA0E,mBAAAzE,EAAAyE,oBAAAvE,EAAA,QAC5CwE,wBAhFKC,EAAgBC,EACfC,EAAsBV,EACtBpE,EAAWyE,kBAAcvE,EAAA0E,EAAA1E,EAAAP,GAE7BK,EAAgB0E,kBAAaxE,EACxB4E,EACIZ,EAAQvE,EAAQQ,GAGzBH,EAAgB+E,oBAAa7E,EACrB0E,EAAYV,EACpBvE,WAQUmB,EAAAoD,EAAAA,EAAAnhB,yCAoBcge,EAAA,IAAdb,EAAc3qC,OAAA,EACbwC,KAAA0uB,OAAAyZ,EAAA3qC,OAAA,GAAAurC,IAOXkE,EAAA9E,EAAgB1Y,MAAAsZ,EAAAC,EAA+BD,EAAAC,EAAAD,IACnDkE,EAAY9E,EACR,CAEJc,UAAMd,EAAA3qC,OACF0D,KAAA+rC,GA4BaC,CAA0BV,KAClCI,EAAc3D,uBAGvB9nC,EAAO,GACPynC,EAAgBprC,SAChB2D,EAAYmpC,EAAA6C,cAER9B,EAAAlqC,GAGAgsC,EAAW3B,EACbrqC,SAAwEisC,WArC7D7C,EAAO4C,SAChBrrB,EAAAurB,EAAUD,EAAmB,iGAI7BnF,GAAOA,EAAkBqF,mBAAOlG,EAAApnC,KAAAC,IAAAktC,EAAA3vC,OAAAwC,KAAAE,IAAA,EAAA+nC,EAAAqF,oBAEpC,IAAI,IAAG3vC,EAAAwpC,EAAOjT,EAAAqW,EAAA/sC,OAAAG,EAAAypC,EAAAzpC,IAAAA,GAAAu2B,EAAAkZ,EAAAA,EAAA5vC,QAAAG,YAKP4sC,EAAO5sC,IACVirC,EAAOprC,SAAA6vC,EAAA3hC,EAAAjL,cAAAqhB,EAAArhB,eAAAiL,EAAAhL,UAAAohB,EAAAphB,SAAAgL,EAAAhL,UAAAgL,EAAAjK,OAAAqgB,IAAAurB,IAAA3hC,EAAArK,eAAAygB,EAAAzgB,gBAAAqK,EAAAm8B,IAAA/lB,EAAA+lB,IAAAG,GAAAA,EAAAt8B,EAAAm8B,OAAAuF,EAAAA,EAAA5vC,QAAAG,WAKPyvC,EAmBsEG,CAAcrsC,EAAAisC,YAAEA,EAA+CC,WAGhH1gC,OAAY8gC,EAAQ,WAAQC,EAAAvsC,EAAA1D,OAA0DkwC,EAAUzE,EAErHmE,EAAAb,EAAW17B,GAEoCk4B,GAAAE,EAAsBD,EAAMD,IAC3EC,EAAAhpC,KAAeE,IAAE,EAAAF,KAAA+0B,KAAWkU,EAAgBF,GAAA,GAAEqE,EAAAb,EAAa17B,MACpD,SAIbo3B,EAAA,GAqBMyF,IAASzE,GAAA0E,EAAA9vC,OAAAurC,IAAA,KAAAnrB,GACTwvB,IAAcvsC,EAAG1D,QAAK2S,EAAkBtS,OAAA,CACxC+vC,SAAAH,UAEKvsC,EAAA1D,gBACHygB,EAIJ4vB,qBAAiBT,EAAM5vC,OAAA,QAEvBygB,KACEzgB,OAAU,GAAAwS,EAAAnS,OAAA,MACVuvC,WACAnvB,0BACWwvB,IAAavsC,EAAI1D,qBAGjB0D,EAAA1D,QAAA4vC,EAAA5vC,OAAA,IAAA0rC,EAAArrC,OAAA,UACTuvC,mBACUK,kBACRvsC,EAAY1D,uBACXiwC,IACHvsC,EAAA1D,mBAEG4vC,EAAA5vC,OAAgB,WACrBygB,aAn5BGrV,EAAA1B,WAAS,GA3DJ,CACViI,0BAAoB,KACpBI,eAAoB,GA0Df7F,mBAqgCPjM,KAAiB,CAGjBqwC,6BACAC,+BACAC,0BAh9BoBlwC,GAIAiC,MAApBjC,EAAA+jC,WAEAkH,EAAOjrC,EAAA+jC,yDAIU9hC,MAAbjC,EAAAgkC,UAAwBkH,EAAYhpC,KAAKC,IAAKnC,EAAAgkC,QAAY9hC,KAAAE,IAAQ,EAAMF,KAAA+0B,KAAAkU,EAAAF,GAAA,+BAu8B5EK,cAAeA,EAEf6E,oBA/9BA,OAAOp9B,GAg+BPpE,kBA/9Ba3I,EAAAoqC,QACKnuC,IAAlBmuC,IAAkBrG,EAAAqG,GAClBr9B,EAAOs3B,EAAArkC,iEAZA+M,EAAQlT,GAAAkqC,QACH9nC,IAALmL,EAAK,MAAA,IAAAmD,MAAA,OAAAw5B,EAAA,yBAAAlqC,EAAA,0HAy+BZkQ,mBAl6BIsgC,GACJ78B,EAAO68B,OAk6BPC,qBAr6BA,OAAA98B,GAs6BA+8B,mCAz6BOlG,+BAJSt8B,EAAA87B,EAAA77B,gBAk7BJw9B,yBA35BZ,OAAAV,oBAgCa0F,EAAAC,EAAcC,KACf,MAAVF,EAQG,CAILjG,OAAAiG,EACApiC,UAAeqiC,EAEfxiC,SAAYyiC,gCAOQC,EAAAC,SACHlxC,OAAA,MAAA,IAAA6Q,MAAA,iGAGV,GAAY+8B,mBAAKsD,IACjB9F,+BAuPUjoC,KACAA,GAAA,oBAQnB,SAAAA,KAOmBA,GAAU,2BAgBjBguC,OACN7wC,EAAAyJ,MAAW/F,UAAAiuB,MAAArxB,KAAAiJ,kBACV,GAADvJ,EAACN,SAAA,GAAAoxC,EAAA7rC,QAAA+lC,GAAAuB,EAAAuE,EAAAjqC,MAAAmkC,GAAAtrC,OAAA,EAAAoxC,GAAA,GACDvE,EAAmBvsC,EAAGN,OAAY,EAAAM,EAASkvB,KAAI8b,IAAA,yBAQpC6F,SACXpnC,MAAM/F,UAAaiuB,MAAArxB,KAAAiJ,aACnBvJ,EAAM,GACC,KAAPN,SAA6B,GAAfoxC,EAAA7rC,QAAU+lC,GAAKuB,EAAAuE,EAAAjqC,MAAAmkC,GAAAtrC,OAAA,EAAAoxC,GAAA,KACd9wC,EAAIN,OAAK,EAAAM,EAAAkvB,KAAA8b,IAAA,mEAhShB59B,oCAML48B,EAAAp8B,EAAam8B,2BAWPn8B,cAGNq8B,EAAAr8B,EAAem8B,yBAEtB38B,gBAEYA,wCA3BLvN,UACFkT,EAAQlT,4BAkCOkxC,OAChBtE,EAAI,GACRuE,YACSnxC,EAAI,EAAGiO,EAAIijC,EAAQrxC,OAASG,EAAIiO,EAAGjO,IAAA,KACtC2C,EAAMynC,EAAS8G,EAASlxC,GAAAkqC,IACjB,MAAPvnC,IACFiqC,EAAKA,EAAK/sC,QAAU8C,UAGjBiqC,yBAoBPwE,OACIC,EAAE,OACJ,IAAArxC,EAAA,EAAAiO,EAAAmjC,EAAAvxC,OAAAG,EAAkCiO,EAAAjO,IAAAoxC,EAAApxC,GAAAuD,EAAA1D,SAAAwxC,EAAAA,EAAAxxC,QAAA0D,EAAA6tC,EAAApxC,IAAAkqC,oCAnBhBoH,OAChB1E,EAAG,eAMA5sC,EAAG,EAAAiO,EAAAqjC,EAAAzxC,OAAAG,EAAAiO,EAAAjO,IAAA,eAGO,MAAV2C,IAAeiqC,EAAIA,EAAA/sC,QAAA8C,UAEtBiqC,iCAzOG2E,0BAEDpxC,KACOA,WAkiCD4O,aACAmC,aAELsgC,mBAvwBMzjC,GACbmF,EAAAzT,KAAAsO,GACA0jC,EAAOv+B,EAAArT,OAAA,mCAywBMqsC,yCA9uBM9pC,MAAZmL,IAAsBA,IAAAQ,EAAAm8B,GAAA,MAAA,IAAAx5B,MAAA,8BAAAy5B,EAAA58B,QACzBy8B,EAAa,MAAQ,IAACt5B,MAAM,iEAEnBghC,EAAInkC,GACW,MAAbokC,EAAO5jC,MAIdR,SAGD2D,EAAG3D,EAAAQ,+BA2lBGpC,EAAAimC,EAAAC,GAEb,IACAC,EADAC,EAAAjyC,KAEAkyC,EAAmBD,EAAKE,aAAgBtmC,EAAIsK,qBAEhB,IAAI3X,EAAAc,MAAAI,eAC9B0yC,EAAQC,gCACQA,IACKjyC,OAAA,CACnByL,KAAAA,wBAIKrN,EAAMc,MAAAsB,UAAAqxC,IAgCf,+BApBqBpxC,WAAA,SAAAP,EAAAD,yDAIjB,GAAC0xC,GAAgClmC,EAAaK,aAAIiS,YAChD,CAEA,IAAIm0B,EACN,OAEA,IAAApyC,EAAA,EAAAA,EAAAgyC,EAAAnyC,OAAAG,SAAqFoC,IAArF2vC,EAAAM,WAAAL,EAAAhyC,KAAqFoyC,EAAA3yC,KAAAuyC,EAAAhyC,IAKpFkyC,EAAqBE,EAAS/kB,OAAOilB,SAXYJ,EAAAI,MAetDxyC,KAAAyrC,qBAAU5qC,yBA5BNqxC,EAAAnyC,OAAmB,EAAA,IACR,6BACIqyC,EAAQH,EAAAE,aAAApwB,sBACXA,MACH,MAyBb0wB,kCAEkB5mC,EAAAxG,GAClB,IAAAqtC,EACAV,EAIA,SAAAW,EAAkBxgB,GACdugB,EAAM,GAEV,IAAQ,IAAA7vC,KAAMsvB,EAAA,CACd,IAAW1kB,EAAEhK,EAAAZ,GAAWunC,GACxBsI,EAAajlC,GAAA0kB,EAAWtvB,IAGxB,SAAA+vC,IACA,GAAAF,EAAiB,CACjBV,GAAe,EACfX,IACA,IAAWwB,EAAS,GAEpB,IAAY,IAAEplC,KAAAilC,EAAY,CACd,IAAE7vC,EAAAynC,EAAY78B,GACJnL,MAAVO,IAAUgwC,EAAAhwC,GAAA6vC,EAAAjlC,IAEtB5B,EAAYwmB,iBAAchtB,EAAAwtC,GAC1Bb,GAAgB,GApBhBW,EAAW9mC,EAASinC,iBAAAztC,IAuBpBwG,EAAAknC,uBAAiBlyC,WAAe,SAAAP,EAAAD,GAChC2xC,GACO3sC,GAAEhF,EAAOgF,MAChBhF,EAAY8xB,KAAAwgB,EAAUtyC,EAAA8xB,MAEtB3R,EAASirB,qBAAOxrC,YAAA2yC,OAEhB5yC,KAAAyrC,qBAAe5qC,UAAa+xC,kCA/pBpB7yC,yBAEGG,SAIAuD,EAAAvD,SAGJ+N,EAAAhL,SAAiBgL,EAAAzK,SAAAyK,EAAAzK,OAAAM,YAAA,CACpB,IAAIkoC,EAAGb,EAAMl9B,EAAA/K,OACT8oC,EAAAf,mBAIRmC,EAAAn/B,EAAAzK,QACQyK,EAAC5K,MAAO2oC,EAAAv9B,UACCu9B,EAAAv9B,UAAAR,GAAAA,EAA0B7K,YAIlC6K,GAAAA,EAAarK,gBACLqK,EAAAnK,aAAAspC,EAA0Bn/B,UAGvCA,4BAEqB/N,SAAcuD,EAAKvD,sKAKb,MAAxB+N,EAAKimB,gBAA+B,sBAGpCjmB,EAAAimB,iBAA6B,KAIhCztB,OAAAwH,EAAiB+kC,UAGO,MAA1B/kC,EAAAimB,gBAA0BjmB,EAAAimB,gBAAAh0B,EAAA+N,GAAA,MAurB5ByE,kBAAeA,6DAIgBw9B,eAInB5/B,sBAGTiE,KAAA,gBACC0+B,OAAU,OACVC,cAAe,+CAOhBt9B,EAAA3H,EAAWjO,KAAAmzC,aACTF,qCAGLjzC,KAAAkzC,gDAKG1F,YAAc,SAAA4F,GAEVA,EAAAC,MAAAD,EAAAC,IAAA,yFAMQ/iC,sBAKZiE,KAAA,gBACE++B,KAAA,WAGL/E,WAAY,SAAStgC,k4BCtwCnB1O,OAAgBd,EAAK,6BAAA,IAAAkT,UAErBlS,EAAA,gBACAA,EAAe,sBACf2L,EAAApF,2BAMA2L,EAAyB1F,OACzB68B,EACAM,EAAA,CACAmK,gBAAe,uDAGjBC,qBAAsB,KAAKC,cAAW,iCAG7B,mCACM,qCAIE,mBAEC,6DAWT,mCACU,kCACH,iBAWd,SAAA5wC,EAAAC,EAAAM,EAAAyb,EAAA5Q,EAAApC,mDAIgB,GAAAoC,EAAA/K,MAAA,KAChB,OAAQ+I,EAAIsnC,eAAA,gBAAAtnC,EAAAynC,uBAAA,KAAAzlC,EAAA1K,cAAA,UAAA,aAAA,YAAA,IAAA,gBAAA0I,EAAA0nC,eAAA,KAAA1lC,EAAA3K,UAAA2I,EAAA2nC,wBAAA3nC,EAAA4nC,wBAAA,wBAAAC,EAAP,yBAAO7nC,EAAA8nC,mBAAA,YAAA9lC,EAAA/K,MAAA,KAAA+K,EAAA5K,MAAA,oCAEcR,EAAAC,EAAiBM,EAAAyb,EAAA5Q,EAAApC,cAI7BmoC,qBAAAC,EAAAp1B,EAAAm1B,qBAAA/lC,EAAA4Q,EAAAhT,IAAA,OACV,CACF,IAAA48B,EAAMx6B,EAAQolC,KAAAplC,EAAYolC,IAAAx0B,EAAevO,QAAArC,EAAAimC,KAAAjmC,EAAAimC,IAAAr1B,EAAAvO,QAAArC,EAAAxL,KAAAwL,EAAAxL,IAAAoc,EAAAvO,QAAArC,EAAAzL,KAAAyL,EAAAzL,IAAAqc,EAAAvO,OACzC2jC,EAAgBp1B,EAAApQ,UAAYoQ,EAAiBpQ,UAAA5L,EAAAC,EAAA2lC,EAAA5pB,EAAA5Q,GAAA,kCAuB3CsW,EAAQpZ,EAAI7K,EAAAmkB,QACRxW,EAAMjO,KAAA6yB,YAAuBxyB,EAAMwC,QACzCoL,GAAQA,aAAuBzP,EAAEc,MAAa4B,OAAGqjB,EAAczb,SAASmD,EAAA0nC,gBAAA,CACxE,IAAAlf,EAAQqU,EAAgBqL,mBACxBn0C,KAAA8L,SAAAsoC,gBAAuB,CACnBC,kBAAmB5f,EAAAltB,IAChBsoC,iBAAsBpb,EAAAlB,OAAQ,yDAIzCvzB,KAAA8L,SAA0BwoC,cAAArmC,EAAAtK,eACjB1B,2BACH3B,EAAAqkB,uBAEE1W,aAAUzP,EAAAc,MAAA4B,OAAAqjB,EAAAzb,SAAAmD,EAAAynC,wBAAA,kBACIzlC,EAAA1K,gBACZyD,YAAYiH,EAAA1K,cAAA,YAAuB,sBAC5B0K,EAAG1K,cAAM,UAAgB,mBAEhCulC,EAAAh9B,SAAmByoC,eAAStmC,EAAAxK,uBAC5BwI,EAAkBunC,qBAAgBgB,WAAAvoC,EAAAunC,qBAAAiB,cAAAC,eASlCp0C,EAAAD,QACFs0C,sBAAgBr0C,EAAA87B,OAAA59B,EAAAc,MAAA28B,QAAA56B,MAAA,kGAMf,IAAAozB,EAAmBqU,EAAKqL,kDAEjBE,kBAAK5f,EAAAltB,IACNsoC,iBAAQpb,EAAclB,OAAA,IAE1BtlB,EAAA3K,UAAAtD,KAAA8L,SAAA8oC,YAAA3mC,EAAAtK,aACJ3D,KAAA8L,SAAAwoC,cAAArmC,EAAAtK,aACCrD,EAAA2B,2BACA3B,EAAAqkB,+CAlFC1Y,kBAqBCJ,MACAA,WACGhL,UAASg0C,eACbh0C,UAASi0C,6BAKJpX,QAAMz9B,YACT40C,eAEA50C,YAAS60C,wDA0DX,6BAELjgB,WAAY5oB,EAAKwnC,cACjBpoC,QAAS,CACT0pC,EAAA,CACAhgB,QAAW,IACHtmB,UAAIxC,EAAA+oC,eACJ1gB,OAAQ,4FAQKrmB,SACvB,sLAtJAzP,EAAcc,MAAE,MAChB,CACAqS,0BAAsBA,wNC4IfpS,OAAAd,EAAA,cAAqC,IAAAuU,YAGlC,sCAMOvT,EAAA,kCACbuG,6BASQiG,eAMPjM,KAILmpC,EAAW,IAAA3qC,EAAAc,MAAA+mB,aAGX+iB,EAAA,gBACiB,iBACP,cAEJ,eAOA,kBAIK,YA2CX6L,EAAsB30C,GACtB40C,GACwC,IADxC/pC,EAAA7K,EAAAmkB,QACG5e,aAAS,qBAA4B9F,QAAAo1C,aAGtCA,IACAD,iBAIK,KACHE,EAAcpuC,YAAe,wCAI7BquC,EAAsB/0C,EAAOD,GAIjC,IAAA2N,EAAQ3N,EAAA2N,OAEJkF,EAAO/H,EAAA1B,WAAY,KAEXuD,QAAOgB,EAAAhB,OAAAkG,MAAA,OACL,SAERlF,EAAQmnC,SAAI,CACV,IAAEnmB,EAAK7jB,EAAA,eAAAtC,SAAA,2BAAAxC,KAAA,SAAA2H,GAAA3H,KAAA,OAAA6M,GAGflF,EAAA4R,WAAAoP,EAAAnmB,SAAA,iBACEoD,EAAcqpC,gBAAAtmB,EAAAnmB,SAAAoD,EAAAqpC,gBACdrpC,EAAAspC,aAAevmB,EAAA5pB,IAAA,mBAAA,OAAA6G,EAAAspC,YAAA,0CAGjBvmB,EAAAjnB,GAAa,QAAAytC,GAAA3wC,SAAAxE,EAAA2I,gBAGbysC,EAA0Bn1C,EAAAD,OAC1B2N,EAAY3N,EAAE2N,OAEdA,EAAAhB,QAAkBgB,EAAAhB,OAAAkG,MAAY/H,EAAA9K,EAAK2I,MAAAX,KAAA,4BAAAnC,6+CA/E7B2F,KAIAV,EAAA1B,WAAU,KAGLwC,KAILJ,IAIFhL,UAAAioC,EAAA32B,qBAAAkjC,GAECx0C,UAASioC,EAAGhd,0BAAA2pB,GAMjBtqC,EAAA3D,SAAAC,MAAAM,GAAA,YAAAktC,uBAUA9L,EAAAnoC,iBACAwG,SAASC,KAAKuiB,oBAAS,YAAAirB,gDATXS,KACNvqC,EAAA1B,WAAe,KACdisC,kFApEqBlwC,OAAA,OACxB,CAEJmwC,QAAA,CACA3iC,WAAAA,sRChDQzT,OAAOd,EAAO,iBAAA,IAAA6V,IAItB7U,EAAA,mCACAA,EAAA,uBACEA,EAAK,8CAcLwM,WAEEjM,OAEJ,IAAAxB,EAAAc,MAAA+mB,eACM,m6BAINxa,GACFI,EAAEd,EAAA1B,WAAe,QAGjBq/B,EAAAj9B,IACQhL,UAAIioC,EAAA32B,qBAAAkjC,GAAAx0C,UAAAioC,EAAAhd,0BAAA2pB,KAEZ7gC,WAAck0B,EAAA18B,4HAxBV5G,OAAO,OACP,SACM,CAEN8O,cAAeA,0TC3IZshC,yCAIAC,qCAEAC,wCAIAC,yCAIAC,uCAIAC,oCAOAC,oCAIAC,sCAIAC,2CAuBAC,oCAyBAjnC,uCAQAknC,6CASAC,oCAgBAC,wCAIAC,sCAKAC,4DArIFC,EAAgBpwC,UACX,MAARA,EAAY,GAGO,mBAAZA,EAAKwY,QACPxY,EAEFA,EAAKwY,QAAO,KAAA,SAAgBA,QAAO,KAAA,QAAeA,QAAO,KAAA,YAGvD62B,EAAc,SAA8B/yC,EAAKC,EAAMM,EAAOyb,EAAWC,aAIzE+2B,EAAqBD,EAErBE,EAAc,SAA8BjzC,EAAKC,EAAMM,EAAOyb,EAAWC,UAC3E1b,EAAK,MAAQ,MAGX2yC,EAAiB,SAA8BlzC,EAAKC,EAAMM,EAAOyb,EAAWC,4CACzC1b,EAAK,IAAQ,KAAM,UAGtD4yC,EAAkB,SAA8BnzC,EAAKC,EAAMM,EAAOyb,EAAWC,UAC/E1b,EAAK,IAAM,IAGT6yC,EAAgB,SAA8BpzC,EAAKC,EAAMM,EAAOyb,EAAWC,UAElFiX,WAAU,UACVxvB,KAAIqwC,EAAAC,QAAUC,OAAO1zC,EAAOyb,EAAUi4B,UAI/BZ,EAAa,SAA8BrzC,EAAKC,EAAMM,EAAOyb,EAAWC,iBACrEg4B,OAAO1zC,EAAOyb,EAAUi4B,SAG3BX,EAAa,SAA8BtzC,EAAKC,EAAMM,EAAOyb,EAAWC,UAC1E1b,GAAK,IAGHgzC,EAAe,SAA8BvzC,EAAKC,EAAMM,EAAOyb,EAAWC,OAC/Ei4B,EAAKl4B,EAAUm4B,aACfD,EAAE,IACAjtC,MAAMC,QAAQgtC,GAAE,IACdA,EAAGh3C,OAAS,EAAC,IACC,iBAAJg3C,EAAG,GAAgB,OACtBJ,EAAgBI,EAAGzxC,QAAQlC,IAAU,EAAIA,EAAK,WAG9CuzC,EADQI,EACeljC,QAAQlP,GAAMA,EAAEvB,QAAUA,IAAO,IAAImD,sBAMhEowC,EAAgBI,EAAG3zC,WAG5BwlC,QAAQC,KAAI,mCAAsChqB,EAAUpR,IAEvDkpC,EAAgBvzC,IAGdizC,EAAoB,SAA8BxzC,EAAKC,EAAMM,EAAOyb,EAAWC,MAC3E,MAAT1b,GAAkC,IAAjBA,EAAMrD,OAAY,MAAA,SAGjCg3C,EAAKl4B,EAAUm4B,cACjBjxC,EAAM,MACA,MAANgxC,SACFnO,QAAQC,KAAI,mCAAsChqB,EAAUpR,IACrD1H,KAEL+D,MAAMC,QAAQgtC,OACZA,EAAGh3C,OAAS,KACE,iBAAJg3C,EAAG,GACbhxC,EAAS3C,EAAMyQ,QAAQqQ,GAAM6yB,EAAGzxC,QAAQ4e,IAAM,IAAGqL,KAAI,WAGrDxpB,EADegxC,EACCljC,QAAQlP,GAAMvB,EAAMkC,QAAQX,EAAEvB,QAAU,IAAGoK,KAAK7I,GAAMA,EAAE4B,MAAI,KAAQgpB,KAAI,YAI5FxpB,EAAS3C,EAAMoK,KAAK0W,GAAM6yB,EAAG7yB,KAAIrQ,QAAQqQ,GAAW,MAALA,IAAWqL,KAAI,aAEzDxpB,GAAM,IAGJqJ,EAAa,SAA8BvM,EAAKC,EAAMM,EAAOyb,EAAWC,UACpE,MAAT1b,EAAa,GAGRuzC,EAAgBvzC,EAAK,KAIrBkzC,EAAgB,SAA8BzzC,EAAKC,EAAMM,EAAOyb,EAAWC,MACvE,MAAT1b,EAAa,MAAA,UAGT2C,EAAS4wC,EAAgBvzC,EAAK,WAC5BmD,KAAMR,EAAQomB,QAASpmB,KAIxBwwC,EAAsB,SAA8B1zC,EAAKC,EAAMM,EAAOyb,EAAWC,OACtFm4B,EAAG,UACM,MAAT7zC,IACF6zC,EAAMN,EAAgBvzC,EAAK,MAEpBmD,KAAM0wC,EAAKlhB,WAAU,0BAGvBmhB,EAAIC,UACPA,EAAK,GAAE,IACIA,EAAGp0C,WAETo0C,EAAGp0C,eAIHyzC,EAAa,SAA8B3zC,EAAKC,EAAMM,EAAOyb,EAAWC,UAC1E1b,EAAS8zC,EAAI9zC,EAAMg0C,YAAQ,IAAYF,EAAI9zC,EAAMi0C,cAAU,IAGzDZ,EAAiB,SAA8B5zC,EAAKC,EAAMM,EAAOyb,EAAWC,UAC9Eo3B,EAAcrzC,EAAKC,EAAMM,EAAOyb,EAAWC,GAAW,IAC3D03B,EAAc3zC,EAAKC,EAAMM,EAAOyb,EAAWC,IAGpC43B,EAAe,SAA8B7zC,EAAKC,EAAMM,EAAOyb,EAAWC,kSChI/D+3B,qDAAAA,eAEES,MACF,KAAVA,GAAAA,MAAqBA,GAGpBA,gBAGOC,KAAKC,YAAUC,EAAAntC,QAAYitC,KAAKC,WAAWz3C,OAAS,EAAC,KAAA,4DAGrDw3C,KAAKG,aAAWD,EAAAntC,QAAYitC,KAAKG,YAAY33C,OAAS,EAAC,KAAA,wDAG/D43C,EAAG,GACHC,EAASH,EAAAntC,QAAWitC,KAAKC,WACpBt3C,EAAI,EAAGA,EAAIo3C,EAAWv3C,OAAQG,IAAC,KAChCiE,EAAImzC,EAAWO,OAAO33C,GACtBiE,IAAMyzC,EACND,GAAG,KAEG,MAADxzC,GAAc,MAADA,GAAc,MAADA,GAAc,MAADA,GAAc,MAADA,GAAc,MAADA,GAAc,MAADA,GAAc,MAADA,GAAc,MAADA,GAAc,MAADA,GAAe,MAADA,GAAgB,KAAHwzC,KACrJA,GAAOxzC,UAGRigB,WAAWuzB,kBAGDR,EAAYL,MACzBlwC,MAAMuwC,IAANvwC,MAAauwC,EAA+B,MAAA,gBAGpCI,KAAKC,YAAUC,EAAAntC,QAAYitC,KAAKC,WAAWz3C,OAAS,EAAC,KAAA,4DAGrDw3C,KAAKG,aAAWD,EAAAntC,QAAYitC,KAAKG,YAAY33C,OAAS,EAAC,KAAA,sDAI7DmO,EAAI4oC,GAAMW,EAAAntC,QAAYitC,KAAKO,iBAC7BxkB,EAAaujB,EAAQkB,YAAY7pC,UAChColB,IACDujB,EAAQkB,YAAY7pC,GAAKolB,EAAaujB,EAAQmB,cAAc9pC,IAEzD2oC,EAAQoB,aAAad,EAAI7jB,wBAKPwjB,OACrBoB,EAAM,GACNC,EAAM,GACNC,EAAWtB,EAAOxxC,QAAO,MAAS,GAAKwxC,EAAOxxC,QAAO,MAAS,EAC9D+yC,EAAa,UACRn4C,EAAI,EAAGA,EAAI42C,EAAO/2C,QACJ,MAAf+2C,EAAOe,OAAO33C,GADaA,IAIZ,MAAf42C,EAAOe,OAAO33C,IACdm4C,IAEe,IAAfA,GAAmC,MAAfvB,EAAOe,OAAO33C,IAA6B,MAAf42C,EAAOe,OAAO33C,IAA6B,MAAf42C,EAAOe,OAAO33C,IAA6B,MAAf42C,EAAOe,OAAO33C,KACtHg4C,GAAUpB,EAAOe,OAAO33C,QAG5Bo4C,EAAmB,EACnBC,EAAmB,EACnBC,EAAY1B,EAAOxxC,QAAO,QAC1BkzC,GAAa,EAAC,IAAA,IACLvzC,EAAIuzC,EAAY,EAAGvzC,EAAI6xC,EAAO/2C,OAAQkF,IACxB,MAAf6xC,EAAOe,OAAO5yC,GACdszC,IAEoB,MAAfzB,EAAOe,OAAO5yC,GACnBqzC,IAEoB,MAAfxB,EAAOe,OAAO5yC,IAA6B,MAAf6xC,EAAOe,OAAO5yC,KAC/CkzC,GAAUrB,EAAOe,OAAO5yC,WAIpCqzC,GAAoBC,GACXD,iBAAAA,EAAkBC,iBAAAA,EAAkBF,WAAAA,EAAYH,OAAAA,EAAQC,OAAAA,EAAQC,SAAAA,uBAGjDjB,EAAIL,OAExB2B,EAAehB,EAAAntC,QAAWitC,KAAKC,WAC/BkB,EAAkBjB,EAAAntC,QAAWitC,KAAKG,YAClCiB,EAAS7B,EAAOyB,kBAAoB,EACpCK,EAAS9B,EAAOwB,kBAAoB,EACpCO,EAAK/B,EAAOuB,YAAc,EAE1BS,EAAW3B,EAAK,EAChB2B,IACA3B,GAAMA,OAGN4B,EAAa5B,EAAG6B,QAAQJ,GACxBK,EAAKL,EAELhsC,EAAMmsC,EAAWzzC,QAAO,KAAQqzC,KAChC/rC,GAAO,EAAC,KACJjI,EAAIo0C,EAAWh5C,OAAS,OACrB4E,EAAIiI,GACgB,MAAnBmsC,EAAWlB,OAAOlzC,IAClBs0C,IACAF,EAAaA,EAAW/mB,MAAM,GAAG,GAIrCrtB,IAEmB,MAAnBo0C,EAAWlB,OAAOlzC,KAClBo0C,EAAaA,EAAW/mB,MAAM,GAAG,QAGrCknB,EAAwB,MAAfT,EAA0BM,EAAWh6B,QAAO,IAAM05B,GAAmBM,EAC9EI,EAAIF,EAAKA,EAAK,EAAI,OAEfC,EAAOn5C,OAAS84C,EAAKM,GACxBD,EAAM,IAASA,MAGnBC,GAAK,EACED,EAAOn5C,OAASo5C,GAAKrC,EAAOsB,UAC/Bc,EAASA,EAAOhpB,OAAO,EAAGgpB,EAAOn5C,OAASo5C,GAAKT,EAAqBQ,EAAOhpB,OAAOgpB,EAAOn5C,OAASo5C,GAClGA,GAAK,SAGE,IAAPN,GAA2B,MAAfK,EAAOrB,OAAO,KAC1BqB,EAASA,EAAOlnB,MAAM,IAGtB8mB,GAAuC,IAA3B10B,WAAW20B,IACfjC,EAAOoB,QAAM,IAAA,IAAgBgB,GAAUpC,EAAOqB,QAAM,KAGpDrB,EAAOoB,QAAM,IAAUgB,GAAUpC,EAAOqB,QAAM,KA3I5CtB,EAgDHkB,YAAW,0LChE1BqB,EAAU5zC,OAEd4zC,EAAGC,iBAAgB,OAEfC,EAAUF,EAAGG,UAAQ,CAErBhC,KAAI,CAAIG,YAAW,IAAOF,WAAU,IAAOgC,WAAU,WAAc1B,aAAY,YAU3E2B,IAAA,SAAat1C,GACb,IAAAu1C,EAAaJ,EAAWK,SAAGx1C,EAAAu7B,eAC3B,QAAap9B,IAAbo3C,EAA0B,KAAS,oBAAEv1C,EAAA,IACrCm1C,EAAG/B,KAAAC,WAAmBkC,EAAA,2BAG1BJ,EAAA/B,KAAAiC,WAAAE,EAAA,qBAIcv1C,GAIlB6G,IAAA,WACE,OAAFouC,EAAAQ,0BAEA,CAGAC,GAAA,CACA,IACA,IACA,YAiHAC,QAAA,CACA,IACA,IACA,UAwGAC,QAAA,CACA,IACA,IACA,oBA0HW,yOCxWWC,iDAdL,WAAwB,iBAAmB,eAAE,6DAAqE,uBAAwB,oGAAgH,0BAA4B,qCAAsC,uBAA8B,wFAG3U,OAAf,OAAWz3C,KAAI0uB,MAAA,OAAA1uB,KAAA0uB,MAAA,MAAA1uB,KAAA0uB,MAAA,8BACLgpB,mDAGvBA,GAFe,4FA4CGpS,aAAAzkC,EAAA0zC,EAAAoD,MACF,OAAR92C,EAAQ,OAAA,aACAd,IAARc,EAAQ,UACD,IAAPA,EAAU,OAAK,KACnB0zC,EAAAA,GAAAW,EAAAntC,QAAAitC,KAA8CiC,kBAE3BU,EAAcA,EAAOC,gBAAiB,OAAcC,EAAIhR,UAAU+Q,kBAEtE,iBAAAA,EAAAA,GAAA,IAAAE,MAAAC,cAAA,IAAA3zC,SAAAwzC,EAAA,WAEGD,EAAAA,EAAAK,cAAA,OAAAH,EAAAhR,UAAAmR,0DAElBC,GAAAN,EAAAA,EAAyCM,gBAAA,OAAAJ,EAAAhR,UAAAoR,gBACrCC,GAASP,EAAaA,EAAKO,WAAA,OAAAL,EAAAhR,UAAAqR,cACvB,KACI,KAEJ,KACG,KACC,IAID,SAAcx0C,wCAGrB,OADJ4pB,GAAA6qB,IACW7qB,KAIO,SAAW5pB,SACL00C,EAAA10C,KAGV,IAAM20C,OAAA,uDAA2B,+BAE/C,IAAAC,EAAA,KAAA,8BAAAC,SACIA,GAAAD,EAAY,GAAA96C,OACR4G,SAAYk0C,EAAC,GAAM,KAKvBE,EAAU,SAAA90C,EAAA+0C,EAAAC,OACLh0C,EAAO0zC,EAAM10C,GAAUg1C,EAAeD,MAEnC,IAAA96C,EAAO,EAAAA,EAAO+G,EAAOlH,OAAQG,IAAA,GAAKkD,EAAS8sB,OAC3C4qB,EAAO7zC,EAAG/G,GAAKH,QAAA2/B,eAAAz4B,EAAA/G,GAAAw/B,wBAEfz4B,EAAY/G,GAAAH,OAGRG,EAAA,QAEA,IAAM0Q,MAAA,4BAAakqC,MAGR,mGAKP,EAAAJ,EAAA5D,EAAA/2C,OAAA26C,IAAA,GAAAQ,EACiB,KAArBpE,EAAKe,OAAG6C,IAAaC,EAAA,SAAAO,GAAA,cAEjBpE,EAAAe,OAAA6C,QACJ,uBAGA,6BAIAS,EAAIC,EAAQ,KACZ,UACA,2BAIAC,EAAON,EAAK,IAAAP,EAAWC,GACvB,UACA,gCAMW,IAAGJ,KAAIe,EAAA,sCAIlBE,EAAAC,EAAYC,gBAIxB,IAAI,QAEGD,EAIJE,GAJIF,EAAU,IACjBlB,MAAIe,EAAe,KAAAhB,EAAWsB,cAAgB,MAGtCpB,cACRe,EAASE,EAAAI,WAAA,EACNL,EAAMC,EAAAC,wBAGDb,EAAU,KAAAiB,IAGTV,GAAA,EACL,sBAIG,GAAPO,EAAOA,GAAW,IAAApB,MAAUC,cAE9BmB,EAAe,MAAAA,IAAA,IAAApB,MAAAC,eAAA,IAAAD,MAAAC,cAAA,KAAAmB,GAAAtB,EAAA,GAAA,SACV,UAGXmB,EAAAH,IA4BS,CAGC,IAAGvwB,EAAMwvB,EAAAyB,gBAAAJ,EAAiBJ,EAAA,GAC5B,GAAAC,GAAa1wB,EAAI,MACjBywB,IACAC,GAAA1wB,MAGA7kB,EAASq0C,EAAA0B,sBAAkB,IAAAzB,KAAAoB,EAAAJ,EAAA,EAAAC,SACvBhB,eAAqBmB,GAAI11C,EAAO41C,WAAiB,GAAAN,GAAct1C,EAAIy1C,WAAUF,EAAA,MAAA,IAAA1qC,MAAA,yBA0C7Di3B,cAAAoS,EAAAnD,EAAAoD,UACJtzC,MAAMqzC,GAAI,MAAA,yCAENC,EAAAA,EAAAK,cAAA,OAAAH,EAAAhR,UAAAmR,iBACJL,EAAUA,EAAc6B,SAAO,OAAY3B,EAAAhR,UAAiB2S,sEAExD7B,EAAAA,EAAAO,WAAA,OAAAL,EAAAhR,UAAAqR,+BAIAC,EAAA,EAAA5D,EAAA/2C,QAAA+2C,EAAAe,OAAA6C,EAAA,IAAAz0C,YACJy0C,+BAKC,GAAGt3C,OACA6C,GAAS,KACT40C,EAAA96C,OAAa0V,GAAAolC,EAAA,IAAAA,cAMjB,SAAU50C,EAAO7C,EAAO43C,EAAOC,4BAKtC,WAGHhB,EACN,IAAA,IAAAS,EAAc,EAAAA,EAAY5D,EACnB/2C,OAAY26C,IAAO,GAAAQ,EACL,KAAdpE,EAASe,OAAK6C,IAAkBC,EAC3B,oBAAQO,GAAM,2BAKjB,IAAA,IACFc,GAAI/D,EAAA,IAAAgC,EAAAuB,UAAA,SAGL,IAAU,IACRQ,GAAOC,EAAM,IAAAhC,EAAAiC,SAAA3B,EAAAwB,GAClB,MACA,IAAM,4EAGH,MACJ,IAAM,IACLC,GAAa/D,EAAe,IAAAgC,EAAO0B,WAAA,EAAA,GACnC,cAGYK,GAAQC,EAAA,IAAAhC,EAAA0B,WAAAnB,EAAAC,GACf,MACL,IAAA,IACAuB,GAAMrB,EAAA,KAAAV,EAAAK,eAAAL,EAAAK,cAAA,IAAA,GAAA,IAAA,IAAAL,EAAAK,cAAA,UAGH,IAAS,IACP0B,GAAO/B,EAAMkC,UAClB,MACA,IAAM,sCAGH,MACH,IAAK,kBAGWjB,GAAW,EAC3B,cAGYc,GAAOlF,EAAAe,OAAA6C,GAK1B,OAAOsB,+BAIsB,eAAnBI,EAA8Bh5C,EAAA8zC,EAAA9zC,EAAAg0C,YAAA,IAAAF,EAAA9zC,EAAAi0C,cAAA,GACjB,qBAAf+E,GAAwCh5C,EAAM8zC,EAAO9zC,EAAAg0C,YAAA,IAAAF,EAAA9zC,EAAAi0C,cAAA,IAAAH,EAAA9zC,EAAAi5C,8BAM7D,OAAO,IAAAhC,y1BCxVFiC,qKAAAA,4BAEyBC,UACvBA,EAAMn4B,WAAW3e,iBAAiB+B,SAASg1C,iBAAiBC,sBAG5C5wC,QAAAA,KAAAA,aAGTka,OACV22B,QACE3wC,EAAO/L,KAAQ6L,KAAKqK,aACpBymC,EAAiB5wC,EAAQ8H,QAAQ3F,GAAMA,EAAE6B,WAAagW,EAAItY,KAC1D0C,EAAInQ,KAAS6L,KAAKK,aAAsCiE,QACtD,WAAJA,EAEIwsC,EAAe58C,OAAS,GAACC,KACpB6L,KAAKuI,YAAY2R,EAAItY,IAE9BivC,EAAM18C,KAAQ48C,kBAAkB72B,cAE1B82B,EAAa78C,KAAS6L,KAAKK,aAAsC4wC,mBAClD,MAAjBD,EAAqB,MAAA,IACXjsC,MAAK,kEAEnB8rC,QAAeG,EAAc92B,OAG7Bg3B,EAAgB,MAChBJ,EAAe58C,OAAS,EAAC,WACdmO,KAAKyuC,EACPzuC,EAAU8uC,iBACXD,EAAoB7uC,EAAU8uC,gBAE1B,WAAJ7sC,GACApE,EAAQpM,KAAKuO,GAGb,WAAJiC,GAAiBnQ,KACZ6L,KAAKoE,uBAIZgtC,EAAMz1C,SAAS2B,cAAa,OAClC8zC,EAAI54C,UAAUc,IAAG,sBACjB83C,EAAIr4C,UAAS,uFAAyFyO,EAAAC,OAAUzH,KAAK+H,OAAxG,0IAE8BP,EAAAC,OAAU4pC,KAAKC,GAAE,aACvDR,EAAe58C,OAAS,EAAC,2CAA8CsT,EAAAC,OAAUzH,KAAKiI,YAAW,YAAc,IAAA,2CACtET,EAAAC,OAAU4pC,KAAKE,OAJhD,8BAMPC,EAAUJ,EAAItsC,cAAa,aAE3BlD,EAAE2sC,EAAAkD,OAAUC,aAEZC,EAASh2C,SAAS2B,cAAa,OACrCq0C,EAAO54C,UAAS,mCAAqCyO,EAAAC,OAAUzH,KAAK4xC,OAAM,OAC1EJ,EAAQr4C,YAAYw4C,SAEdE,EAAiBl2C,SAAS2B,cAAa,OACvCw0C,EAA0Bn2C,SAAS2B,cAAa,SACtDw0C,EAAMxuB,KAAI,WACVwuB,EAAMlwC,GAAKA,EACXiwC,EAAe14C,YAAY24C,SACrBC,EAA+Bp2C,SAAS2B,cAAa,SAC3Dy0C,EAAWC,aAAY,MAAQpwC,GAC/BmwC,EAAWE,YAAWzqC,EAAAC,OAAU4pC,KAAKa,IACrCH,EAAWr4C,MAAMy4C,OAAM,UACvBJ,EAAWr4C,MAAM04C,WAAU,SAC3BP,EAAe14C,YAAY44C,GAC3BP,EAAQr4C,YAAY04C,SAEdQ,EAAY,MACdp0C,MAAMC,QAAQ2yC,GAAM,IAAA,MACT/3C,KAAK+3C,EACZwB,EAAav+C,KAAI,CAAG8N,GAAE,CAAG9I,GAAIsyC,IAAKtyC,GAAC,oBAG5BmlC,KAAK4S,EACRA,EAAO/2C,eAAemkC,IACtBoU,EAAav+C,KAAI,CAAG8N,GAAIivC,EAAO5S,GAAImN,IAAKnN,GAAC,KAKrDoU,EAAa9vC,MAAI,CAAEzE,EAAG6E,IAAM7E,EAAEstC,IAAInoC,oBAAsBN,EAAEyoC,IAAInoC,qBAAsB,EAAMnF,EAAEstC,IAAInoC,oBAAsBN,EAAEyoC,IAAInoC,oBAAsB,EAAI,QAElJqvC,EAAgBD,QACdE,EAAa,IAAQrB,GAErBsB,EAAc72C,SAAS2B,cAAa,OAC1Ck0C,EAAQr4C,YAAYq5C,SACdjiC,EAAY7Z,KAAK+d,MAAMg8B,EAAYgC,mBAAmB,UACxD73C,EAASy3C,EAAan+C,OAASqc,EACnC3V,EAASlE,KAAKC,IAAIiE,EAAQlE,KAAK+d,MAAM9a,OAAO+4C,YAAcjC,EAAYgC,mBAAmB,YACnFE,EAAE,IAAAC,EAAAC,uBAAA,CACJr4C,KAAM83C,EACNQ,UAAYt+C,IACRA,EAAKsL,UAAU/F,KAAKL,MAAK,gBAAe,OACxClF,EAAKsL,UAAU9D,SAASlI,KAAI,CACxBi/C,IAAG,QACHh5C,KAAI,CACA6H,GAAIA,EAAE,IAASpN,EAAK0I,MACpB81C,QAAST,EAAc/9C,EAAKy+C,QAAQrxC,GAAG,IAAC,eAAiBnL,EACzDy8C,OAAM,CAAGC,EAAGh2C,QACJA,EAAKwtB,IAAIqoB,QAAO,IAAA,MACLI,KAAS5+C,EAAKy+C,QAAQrxC,GAC7B2wC,EAAca,IAAS,iBAGhBC,KAAS7+C,EAAKy+C,QAAQrxC,UACtB2wC,EAAcc,SAIvBC,EAAa30C,OAAO40C,oBAAoBhB,GAAer+C,SAAWm+C,EAAan+C,OACrDs9C,EAAQ1sC,cAAa,IAAOlD,GACtDoxC,QAAUM,GAEpBhwB,KAAI,cAGZ9uB,EAAKsL,UAAU9D,SAASlI,KAAI,CACxBi/C,IAAG,QACHh5C,KAAI,CACAy5C,IAAK5xC,EAAE,IAASpN,EAAK0I,MACrBxD,MAAK,qCAET+5C,KAAK,EACLC,QAASl/C,EAAKy+C,QAAQ7H,OAI9B76B,UAAAA,EACA7W,MAAK,UAAckB,EAAM,OAGvB+4C,EAAQ,IAAAC,EAAAC,UAAiBrB,GAAa,GAC5CmB,EAAS/sC,OAAO+rC,GAEhBhB,EAAOt1C,iBAAgB,SAAWoe,UACxBq5B,GAASr5B,EAAI7B,OAA4BrhB,OAAK,IAAQs8B,cAExDye,EADAwB,EACgBzB,EAAarqC,QAAQ+wB,IAChCA,EAAEqS,KAAG,IAAQvX,cAAcp6B,QAAQq6C,IAAS,IAEjCzB,EAEpBM,EAAGvpC,QAAQkpC,GACXqB,EAASvwC,aAGb0uC,EAAMz1C,iBAAgB,UAAS,aAClBhI,EAAI,EAAGA,EAAIi+C,EAAcp+C,OAAQG,OAMlCy9C,EAAMkB,QAAO,IAAA,MACFI,KAASd,EAAcj+C,GAAGuN,GACjC2wC,EAAca,IAAS,iBAGhBC,KAASf,EAAcj+C,GAAGuN,UAC1B2wC,EAAcc,GAIjCM,EAASvwC,aAGbzH,SAASC,KAAKzC,YAAYi4C,SACpB2C,EAAMC,EAAAC,OAAU7C,EAAG,CACrB8C,UAAU,EAAMC,QAAO,KACnB/C,EAAIr4C,UAAS,GACbq4C,EAAI34C,cAAc8B,YAAY62C,MAIlBA,EAAItsC,cAAa,0BACzBzI,iBAAgB,SAAWoe,UAE7B25B,EAAYz1C,OAAO40C,oBAAoBhB,GAAer+C,OACtDo/C,EAAac,IAAc/B,EAAan+C,OACxCmgD,EAAaD,EAAY,UAC1Bp0C,KAAKuI,YAAY2R,EAAItY,IAAI,IACzB0xC,GAAce,EAAU,OAEnBC,EAAY,CACd7vC,MAAOyV,EAAIzV,MAAOP,SAAUgW,EAAItY,GAAIxH,MAAW,WAAJkK,EAAiB,KAAS,GAAQlC,EAAMqC,MACtE8tC,EAAap+C,KAAM6L,KAAK6C,0BAA0BT,EAAM8X,KAGxEo6B,EAAqBnD,eAAiBoB,OAClCvyC,KAAKmK,UAAUmqC,GAAc,QAEjCt0C,KAAKoE,iBACV2vC,EAAOQ,WAGanD,EAAItsC,cAAa,6BACzBzI,iBAAgB,SAAWoe,IACvCs5B,EAAOQ,iBAGLC,EAAiBpD,EAAItsC,cAAa,6BAClB,MAAlB0vC,GACAA,EAAen4C,iBAAgB,SAAWoe,SACjCza,KAAKuI,YAAY2R,EAAItY,IAC1BmyC,EAAOQ,WA8BXvY,kBAAkB9hB,SAChBu6B,EAAY,WACT9qC,EAAM,EAAGC,EAAGzV,KAAQ6L,KAAK6J,gBAAiBF,EAAMC,EAAKD,IAAG,OACvDvH,EAAIjO,KAAQ6L,KAAKgnB,YAAYrd,GAC7BpS,EAAKpD,KAAQ6L,KAAK6C,0BAA0BT,EAAM8X,GAClDxf,EAAIvG,KAAQ6L,KAAKsD,kBAAkB4W,EAAK3iB,EAAO6K,OACjD+oC,EAAYsJ,EAAa/5C,GACZ,MAAbywC,IACAA,EAAYsJ,EAAa/5C,GAAI,IAE7BywC,EAAU1xC,QAAQlC,GAAS,GAC3B4zC,EAAUr3C,KAAKyD,UAGhBk9C,qVCrQFhtC,UAAAA,GAAAA,EACK4pC,KAAI,CACda,IAAG,MACHZ,GAAE,KACFC,OAAM,UAJD9pC,EAOKzH,KAAI,CACd0H,KAAI,OACJC,IAAG,YACHE,KAAI,aACJE,OAAM,SACNE,YAAW,eACX2pC,OAAM,UAbDnqC,EAgBKitC,SAAQ,CAClBC,aAAY,sBACZC,qBAAoB,mBACpBC,UAAS,aACTC,UAAS,uBACTC,aAAY,2CACZC,aAAY,6BACZpD,OAAM,4MCxBQH,UAAAA,yBAKV/6C,KAAKge,WAAM,IAAU85B,MAAO8B,WAAa,GAAM,gEAITp9B,QAAO,SAAA,SAAoB5a,SAAWkgB,EAAsB,GAAlBi5B,EAAO/8B,SAAgB,SAAQ,KAADpc,EAAWkgB,EAAQ,EAAJA,EAAU,GAActhB,SAAS,+BAIlKurB,GAAC,IAAO+rB,MAAO8B,UAAUp5C,SAAS,SAC/BurB,EAAEvuB,OAAS,IAChBuuB,EAAC,IAASA,SAERA,EAAEvuB,OAAS,KACbuuB,EAAIA,EAAEwyB,UAAU,EAAG,gCAEa/hC,QAAO,SAAA,SAAoB5a,OAASkgB,EAAsB,GAAlBi5B,EAAO/8B,SAAgB,SAAQ,KAADpc,EAAWkgB,EAAQ,EAAJA,EAAU,GAActhB,SAAS,OACpJurB,mEAI0CvP,QAAO,SAAA,SAAoB5a,SAAWkgB,EAAsB,GAAlBi5B,EAAO/8B,SAAgB,SAAQ,KAADpc,EAAWkgB,EAAQ,EAAJA,EAAU,GAActhB,SAAS,uBAGjJ8G,WACdA,GAAwC,oBAAlCW,OAAOzG,UAAUhB,SAASpC,KAAKkJ,iBAGzB4D,WACdA,mFAGkFs4B,KAAKt4B,8BAIxFxH,EACF86C,EAAE,MACFvD,EAAM,qBACNwD,EAAM,SAAaC,UAAYC,mBAAmBD,EAAEliC,QAAQgiC,EAAE,OAC9DI,EAAQ37C,OAAO47C,SAAS5D,OAAOsD,UAAU,GAEvCO,EAAS,GACNp7C,EAAQu3C,EAAOvtB,KAAKkxB,IACzBE,EAAUL,EAAO/6C,EAAM,KAAO+6C,EAAO/6C,EAAM,WACtCo7C,kBAGcvX,SACfwX,EAAW,mBAERC,EAAO13C,MACVA,GAAiB,iBAAHA,EAAgB,KACC,IAA7By3C,EAAYh8C,QAAQuE,GAAW,OAC1B,EAETy3C,EAAY3hD,KAAKkK,aACNxE,KAAOwE,KACZA,EAAIlE,eAAeN,IAAQk8C,EAAO13C,EAAIxE,IAAG,OACpC,SAIN,EAGFk8C,CAAOzX,uBAGWzjC,WAChBhB,KAAOgB,KACVA,EAAKhB,IAAuB,iBAARgB,EAAKhB,GAC3BgB,EAAKhB,GAAOi4C,EAAOkE,aAAan7C,EAAKhB,YAG9BgB,EAAKhB,IAAQo8C,EAAQ1b,KAAK1/B,EAAKhB,GAAKtC,YAAQ,KAC/C4B,EAAK01C,KAAaqH,WAAWr7C,EAAKhB,IACtCgB,EAAKhB,GAAG,IAAQg1C,KAAK11C,EAAEw3C,UAAqC,IAAxBx3C,EAAEg9C,4BAGnCt7C,GApFWi3C,EAENsE,UAAS,2CA2FnBtzB,EACAuzB,EALFJ,EAAO,yCAILnzB,EAAI9oB,OAAO60C,KACXwH,EAAY,wEAGhBvzB,EAAEwzB,SAAQ,SAAa59B,GAEI,MAArBA,EAAE2zB,OAAO3zB,EAAEnkB,OAAS,KACtBmkB,GAAC,SACC/W,EAAI00C,EAAa5xB,KAAK/L,UAEtB/W,EAAC,IACQktC,KAAKA,KAAK0H,KAAK50C,EAAE,IAAKA,EAAE,GAAK,GAAIA,EAAE,IAAKA,EAAE,IAAM,GAAIA,EAAE,IAAM,GAAIA,EAAE,IAAM,EAAGxG,SAAoB,KAATwG,EAAE,MAAuB,IAYrHmhB,EAAE3Z,MAAM0b,MAAKrwB,KAAO4J,YAI7B0kB,EAAEozB,WAAU,SAAax9B,UAChBoK,EAAEwzB,SAAS59B,uMCrGT89B,6BAgFGlC,4BAxFV/Y,EAAc,CAChBgZ,UAAU,EACVkC,UAAS,wBACTC,qBAAqB,EACrBC,OAAO,EACPC,eAAe,SAGNJ,cAOG99C,EAAyB+H,QAAAA,QAAAA,OAC5Bo2C,QAAUn+C,OACVA,GAAKA,EAAGkF,uBACJ6C,QAAQi2C,2BACRG,QAAQn6C,iBAAgB,aAAeoe,IACpCA,EAAI7B,SAAMzkB,KAAUqiD,SAAOriD,KACtBogD,gBAGRiC,QAAQn6C,iBAAgB,cAAgBoe,IACrCA,EAAI7B,SAAMzkB,KAAUqiD,SAAOriD,KACtBogD,YAMdvY,KAAKsa,SAEO7/C,IAAV6/C,GAAwBA,IAAKniD,KAAWiM,QAAQk2C,aAC5CE,QAAQ98C,MAAM+8C,WAAU,mBACxBD,QAAQ98C,MAAMg9C,cAAa,aAG/BF,QAAQ98C,MAAMoD,QAAO,QAEb3I,KAAQkE,GAAGyM,cAAa,eAC1B3Q,KAAQkE,GAAGyM,cAAa,kBAI1B1E,QAAQg2C,WACbztC,YAAU,WACAguC,EAAUxiD,KAAQkE,GAAGyM,cAAa3Q,KAAMiM,QAAQg2C,WACpC,MAAdO,GACAA,EAAW7jB,UAEhB,QAGE1yB,QAAQm2C,qBACRK,eAAkBpiD,IACE,KAAjBA,EAAK47B,SAAcj8B,KACdogD,SAGb54C,SAASU,iBAAgB,UAAUlI,KAAOyiD,sBAGrCx2C,QAAQy2C,QAAM1iD,KACdiM,QAAQy2C,SAId7a,aACM57B,QAAQ+zC,UACkB,SAAtB/zC,QAAQ+zC,iBAIhBqC,QAAQ98C,MAAMoD,QAAO,OAEC,WAAlB85C,gBACLj7C,SAASwiB,oBAAmB,UAAUhqB,KAAOyiD,iBAI9C5a,yBACSwa,kBAKJvC,EAAO6C,EAA6B7a,SAE1CgC,EAAC,IAAQ/C,KAAmBe,OAE9B8a,EAGAA,EADY,iBAALD,EACFn7C,SAASmJ,cAAcgyC,GAEvBA,QAGH58C,EAAM,IAAOi8C,EAAUY,EAAI9Y,UAE5BA,EAAEiW,SAGHh6C,EAAO88C,OAFPD,EAAGr9C,MAAMoD,QAAO,OAIb5C,gQCnGE24C,yCAAAA,cAMGzyC,QAJL62C,MAAK,CAAgDC,UAAW,SAK7Dhc,EAAc,CAChB1gC,KAAM,KACNs4C,UAAW,KACXqE,eAAgB,IAChB5mC,UAAW,GACX6mC,OAAM,MACNC,iBAAkB19C,OAAO+4C,kBAExBtyC,QAAO,IAAQ86B,KAAmB96B,GAGpC47B,QAAQ7+B,eACUm6C,YAAen6C,EAAam6C,UAG9Ctb,QAAQxhC,QACN4F,QAAQ5F,KAAOA,EAGjBwhC,OAAO2X,QACLsD,MAAMtD,SAAWA,EAGnB3X,eACGiC,EAAC9pC,KAAQiM,QACTm3C,EAAM,CACRxE,IAAG,MACHh5C,KAAI,CAAIy9C,MAAK,YAAe99C,MAAK,UAAeukC,EAAEzjC,KAAKtG,OAAS+pC,EAAE1tB,UAAS,wBAC3EvU,SAAQ7H,KAAOsjD,qBAEF,CACb1E,IAAG,MAASh5C,KAAI,CACZy9C,MAAK,aAAiBvZ,EAAEuZ,OAAK,IAC7B99C,MAAK,oBAAwBukC,EAAEvkC,OAAK,IACpCg+C,OAAM,CAAGjjD,EAAG0I,WACFw6C,EAAex6C,EAAKwtB,IAAI9uB,iBAC1BnF,KAAK+mB,IAAGtpB,KAAM8iD,MAAMC,UAAYS,GAAgB1Z,EAAEkZ,sBAGjDF,MAAMC,UAAYS,EACvBJ,EAAOv7C,SAAQ7H,KAAQsjD,cACtBt6C,EAAKnB,SAAS,GAAiBA,SAAQ,EAAK+2C,IAAG,eAC1CkE,MAAMtD,SAAiBiE,WAAWz6C,EAAKnB,SAAS,GAAIu7C,KAL/C,IAQhBv7C,SAAQ,CAAGu7C,IAiBdvb,oBACEiC,EAAC9pC,KAAQiM,QACTpE,EAAQ,GACR67C,EAAQ,CACVn8C,IAAKhF,KAAK0uB,OAAKjxB,KAAO8iD,MAAMC,UAAYjZ,EAAEkZ,gBAAkBlZ,EAAE1tB,WAC9DmX,OAAQhxB,KAAK+0B,MAAIt3B,KAAO8iD,MAAMC,UAAYjZ,EAAEoZ,iBAAmBpZ,EAAEkZ,gBAAkBlZ,EAAE1tB,oBAEhF5G,EAAMkuC,EAASn8C,IAAKiO,EAAMkuC,EAASnwB,OAAQ/d,IAAG,IAC/CA,EAAM,GAAKA,GAAOs0B,EAAEzjC,KAAKtG,OAAM,eAG7BiJ,EAAI,CACN41C,IAAK9U,EAAEmZ,OAAQr9C,KAAI,CACfL,MAAK,CACDgC,IAAMiO,EAAMs0B,EAAE1tB,UAAS,KACvB3V,OAAQqjC,EAAE1tB,UAAS,KACnBvM,SAAQ,WACRlI,KAAI,IACJ8pB,MAAK,MAEV5pB,SAAQ,IAET9B,EAAS+jC,EAAE6U,UAAS,CAAG51C,MAAOyM,EAAK7J,UAAW3C,EAAM81C,QAAShV,EAAEzjC,KAAKmP,KACzD,iBAANzP,EACPiD,EAAKu2C,QAAUx5C,EACE,MAAVA,GACPiD,EAAKnB,SAASlI,KAAKoG,GAGvB8B,EAASlI,KAAKqJ,UAEXnB,sQCjHC87C,0CAuEAC,oCAuEAC,oCA4EAC,UA1NUrkD,EAAK,qBAClBA,EAAA,gCACLkkD,EAAYtjD,OACZsiD,SAIApuC,KAAQ,WACR,IAAAwvC,EAAa1jD,EAAMwL,KAAAK,aAAAqT,uBACnBojC,EAAMn7C,SAAS2B,cAAgB,UAC3BgmB,KAAK,OAGTwzB,EAAMv7B,UAAA,cACF/mB,EAAC2N,OAAUg2C,UAAY,IAAArB,EAAKqB,UAAA3jD,EAAA2N,OAAAg2C,WAChCrB,EAAMz6C,iBAAK,UAAA67C,EAAAE,EAAAC,mBAAAD,EAAAE,sBACX9jD,EAAKsL,UAAO3G,YAAA29C,eAGXyB,oCAIK9/C,cAAA8B,YAAAu8C,4BAILhkB,yCAIAgkB,EAAQv/C,mCAIRA,MAASwS,QAEVqhB,UAAW,SAAGhpB,GACdo2C,EAAMp2C,EAAY5N,EAAG2N,OAAAsC,QAAY,GACjCqyC,EAAMv/C,MAAMihD,qBAGXD,gDAIAzB,EAAUv/C,uCAIV/C,EAAA2N,OAAcsC,OAAAlI,0CAIN,IAAAu6C,EAAAv/C,OAAA,MAAAihD,IAAA1B,EAAAv/C,OAAAihD,iBAED,gBACCr2C,OAAAs2C,UAAkB,8DAOpB,0BAOC/vC,gBAERqvC,EAAYvjD,OACZsiD,SAIApuC,KAAQ,eACJwvC,EAAK1jD,EAAOwL,KAAAK,aACNqT,sBAEVojC,EAAMn7C,SAAS2B,cAAgB,YAC/B9I,EAAM2N,OAAAg2C,UAAiB,IAASrB,EAAEqB,UAAO3jD,EAAA2N,OAAAg2C,WACzCrB,EAAKv7B,UAAU,cACfu7B,EAAMz6C,iBAAK,UAAA67C,EAAAE,EAAAC,mBAAAD,EAAAE,sBACX9jD,EAAKsL,UAAO3G,YAAA29C,eAGXyB,oCAIK9/C,cAAA8B,YAAAu8C,4BAILhkB,yCAIAgkB,EAAQv/C,mCAIRA,MAASwS,QAEVqhB,UAAW,SAAGhpB,GACdo2C,EAAMp2C,EAAY5N,EAAG2N,OAAAsC,QAAY,GACjCqyC,EAAMv/C,MAAMihD,qBAGXD,gDAIAzB,EAAUv/C,uCAIV/C,EAAA2N,OAAcsC,OAAAlI,0CAIN,IAAAu6C,EAAAv/C,OAAA,MAAAihD,IAAA1B,EAAAv/C,OAAAihD,iBAED,gBACCr2C,OAAAs2C,UAAkB,8DAOpB,0BAQC/vC,gBAERsvC,EAAYxjD,OACZsiD,SAIApuC,KAAQ,WACR,IAAAwvC,EAAa1jD,EAAMwL,KAAAK,aAAAqT,uBACnBojC,EAAMn7C,SAAS2B,cAAG,UACZgmB,KAAA,OACNwzB,EAAKv7B,UAAU,oBACfu7B,EAAMz6C,iBAAK,UAAA67C,EAAAE,EAAAC,mBAAAD,EAAAE,sBACX9jD,EAAKsL,UAAO3G,YAAA29C,eAGXyB,oCAIK9/C,cAAA8B,YAAAu8C,0BAIVA,EAAAhkB,wBAWQ,SAAU1wB,GACdo2C,EAAcp2C,EAAA5N,EAAU2N,OAAAsC,OACxB,IAAAi0C,EAAY3N,EAAAC,QAAAC,OAAAuN,EAAAhkD,EAAA2N,OAAA8oC,oBAGXsN,gDAIAxN,EAAUC,QAAaliC,MAAMguC,EAAKv/C,wCAIlC/C,EAAA2N,OAAcsC,OAAAlI,yCAIdwuC,EAAQC,QAAAliC,MAAAguC,EAAAv/C,SAAAihD,iBAGM,cACF,KAAL1B,EAAKv/C,YAA6Bd,IAA7Bs0C,EAAAC,QAA6BliC,MAAAguC,EAAAv/C,OAAA,MAAA,UAItCohD,IAAK,oCAEAx2C,OAAAs2C,UAAkB,+EAOpB,0BAOC/vC,gBAERuvC,EAAYzjD,OACZokD,SAIAlwC,KAAQ,YACRkwC,EAAQj9C,SAAS2B,cAAiB,WAC1B00C,aAAY,WAAA,KACpB4G,EAAKr9B,UAAU,eACfq9B,EAAK7/C,UAAe,8DACpBvE,EAAAsL,UAAa3G,YAAAy/C,0CAGL9lB,mCAIFr6B,cAAA8B,YAAAq+C,4BAIL9lB,cAED1H,UAAa,SAAGhpB,GAChBo2C,EAAap2C,EAAA5N,EAAA2N,OAAAsC,OACbm0C,EAAArhD,MAAmB,MAAAihD,EAAA,IAAAA,EAAA,MAAA,oCAOH,oCAGQ,QAAvBI,EAAUrhD,uCAIV/C,EAAA2N,OAAcsC,OAAAlI,uBAIC,kBACF,QAALhF,OAAiB,MAAAihD,sBAGjBA,iBAEE,iBACJ,4RCnRJK,IAAAC,EAAQplD,OAAAd,EAAA,sBAAA,IAAAylD,MAEN3kD,OAAAd,EAAA,wBAAA,IAAA0lD,UAQG,MACR,SACA,wBAOQ7jD,EAAAmkB,OAAsBmgC,eAC9BC,EAAYvkD,EAAAmkB,OAASrhB,MAAIrD,6WCRtB+kD,+BA4BEC,8BA5BFD,EAAe,SAA8BjiD,EAAKC,EAAMM,EAAOyb,EAAWC,EAAajT,OAC1F9F,EAAM,SACJi/C,EAA2Bn5C,EAAao5C,aAC9B,MAAZD,EAAgB,OACV/4C,EAAU+4C,EAAS94C,aACnBhJ,EAAQ8hD,EAASE,SAASpmC,MAC5B5b,EAAQ,IACR6C,GAAM,6CAAoD7C,EAAQ8hD,EAAS94C,aAAai5C,YAAW,iBAEnGl5C,EAAQm5C,iBAAgB,CACJJ,EAASK,YAAYvmC,GAEjCA,EAAY7S,EAAQq5C,qBACpBv/C,GAAM,4BAAkCkG,EAAQs5C,eAAc,UAE9Dx/C,GAAM,4BAAkCkG,EAAQu5C,iBAAgB,UAGpEz/C,GAAM,kDAIL,MAAT3C,IACA2C,IAAW3C,EAAK,IAAO2b,QAAO,KAAA,SAAgBA,QAAO,KAAA,QAAeA,QAAO,KAAA,SAExEhZ,SAGEg/C,cAMWl5C,EAAmBi+B,QAAnBj+B,KAAAA,OACXI,QAAO,CAEJm5C,kBAAkB,EAClBD,YAAa,EACbM,iBAAgB,eAChBH,oBAAmB,aACnBC,eAAc,IACZC,iBAAc,OACZ1b,QAELz4B,WAAUrR,KAAS6L,KAAKK,aAAsCmF,WAClExF,EAAao5C,UAASjlD,KACvB6L,EAAKoD,eACAy2C,aAGF7d,yBACS57B,QAGT47B,SAAS55B,OACR/K,EAAQ,EACRyiD,EAAM3lD,KAAQ4lD,UAAU33C,QACX,MAAV03C,GACHA,EAAM3lD,KAAQ4lD,UAAUD,GACxBziD,WAEGA,EAGJ2kC,UAAU55B,eACDpC,KAAKC,SAAS8lC,YAAY3jC,EAAIjO,KAAMiM,QAAQ45C,eAGrDhe,YAAY55B,eACH63C,eAAc9lD,KAAM6L,KAAKC,SAASi6C,aAAa93C,IAGxD45B,kBAAkB55B,SACfR,EAAKQ,EAAIjO,KAAMqR,YACftL,EAAM,GACNM,EAAIrG,KAAQ6L,KAAKsJ,kBACdjV,EAAI,EAAGA,EAAImG,EAAKtG,OAAQG,IAAC,CAClBmG,EAAKnG,GAACF,KAAOiM,QAAQ45C,gBACrBp4C,GACR1H,EAAOpG,KAAK0G,EAAKnG,WAGlB6F,EAGJ8hC,eAAe55B,SACZ+3C,EAAW/3C,EAAIjO,KAAMqR,YACrBtL,EAAM,GACNM,EAAIrG,KAAQ6L,KAAKsJ,kBACdjV,EAAI,EAAGA,EAAImG,EAAKtG,OAAQG,IACzBmG,EAAKnG,GAACF,KAAOiM,QAAQ45C,gBAAkBG,IACvCjgD,EAAOpG,KAAK0G,EAAKnG,IACjB6F,EAAOpG,QAAIK,KAASimD,eAAe5/C,EAAKnG,aAGzC6F,EAGJ8hC,eAAehlC,SACZwD,EAAIrG,KAAQ6L,KAAKsJ,iBACnB9O,EAAKtG,OAAS8C,EAAM,GACbwD,EAAKxD,EAAM,GAAC7C,KAAOiM,QAAQ45C,gBAAkBx/C,EAAKxD,GAAG7C,KAAOqR,YAKpEw2B,aAAa55B,GACZA,EAAIjO,KAAMiM,QAAQq5C,qBAAmBtlD,KAChCkmD,OAAOj4C,QAEP0+B,SAAS1+B,GAIf45B,OAAO55B,GACVA,EAAIjO,KAAMiM,QAAQq5C,sBAAuB,QACnCj/C,EAAIrG,KAAQ6L,KAAKsJ,cACnBjV,EAACF,KAAQ6L,KAAKC,SAASi6C,aAAa93C,QACjC/N,EAAImG,EAAKtG,QACZsG,EAAKnG,GAACF,KAAOiM,QAAQw5C,mBAAoB,OAChCK,eAAe5lD,IAChBmG,EAAKnG,GAACF,KAAOiM,QAAQq5C,uBAErBplD,GAACF,KAASimD,eAAe5/C,EAAKnG,IAAIH,QAG1CG,SAEC2L,KAAKkD,cAGP84B,OAAOpkC,SACJ0iD,EAAQnmD,KAAQomD,eAAe3iD,GAC/B4C,EAAIrG,KAAQ6L,KAAKsJ,UAEjBkxC,EAAO,WACJnmD,EAAI,EAAGA,EAAIimD,EAASpmD,OAAQG,IACjCmmD,EAAQ1mD,KAAIK,KAAM6L,KAAKC,SAASi6C,aAAaI,EAASjmD,KAG1DmmD,EAAQj4C,MAAI,CAAEzE,EAAG6E,IAAM7E,EAAI6E,EAAI,EAAK7E,EAAI6E,GAAI,EAAK,YAExC8qB,EAAI,EAAGA,EAAI+sB,EAAQtmD,OAAQu5B,IAAC,OAC3BjjB,EAASgwC,EAAQ/sB,GACjBgtB,EAAWjgD,EAAKgQ,GAAMrW,KAAOiM,QAAQ45C,sBAClC38C,EAAMmN,EAAS,EAAGnN,GAAO,EAAGA,IAAG,GAChC7C,EAAK6C,GAAGlJ,KAAOiM,QAAQ45C,gBAAkBS,EAAQ,CACjDjgD,EAAKgQ,GAAMrW,KAAOiM,QAAQ45C,cAAgBx/C,EAAK6C,GAAGlJ,KAAOqR,wBAKhExF,KAAKkD,cAGP84B,QAAQpkC,SACL8iD,EAAKvmD,KAAQomD,eAAe3iD,GAC5B4C,EAAIrG,KAAQ6L,KAAKsJ,kBACdjV,EAAI,EAAGA,EAAIqmD,EAAMxmD,OAAQG,IAAC,OACzB2C,EAAM0jD,EAAMrmD,GACZsmD,EAAY3jD,EAAG7C,KAAMiM,QAAQ45C,iBAC/BW,EAAS,OACHC,EAAYpgD,EAAIrG,KAAM6L,KAAKC,SAAS46C,WAAWF,IAASxmD,KAAQiM,QAAQ45C,cAC9EhjD,EAAG7C,KAAMiM,QAAQ45C,cAAgBY,MAE7BjxC,EAAGxV,KAAQ6L,KAAKC,SAAS46C,WAAW7jD,EAAG7C,KAAMqR,oBACxCmE,EAAMnP,EAAKtG,QACZsG,EAAKmP,GAAGxV,KAAOiM,QAAQ45C,gBAAkBW,IACzCngD,EAAKmP,GAAGxV,KAAOiM,QAAQ45C,cAAgBhjD,EAAG7C,KAAMqR,mBAM3DxF,KAAKkD,cAGP84B,eAAepkC,SACZsC,EAAM,GAEN4gD,EAAI,WAEDzmD,EAAI,EAAGA,EAAIuD,EAAK1D,OAAQG,IAC7BymD,EAAKljD,EAAKvD,GAACF,KAAOqR,cAAe,UAG5BioB,EAAI,EAAGA,EAAI71B,EAAK1D,OAAQu5B,IAAC,OACxBz2B,EAAMY,EAAK61B,GACX0sB,EAAWnjD,EAAG7C,KAAMiM,QAAQ45C,cAC7BG,GAAaW,EAAKX,IACnBjgD,EAAOpG,KAAKkD,UAGbkD,EAGJ8hC,SAAS55B,GACZA,EAAIjO,KAAMiM,QAAQq5C,sBAAuB,QACnCz9C,EAAQ7H,KAAQimD,eAAeh4C,WAC5B/N,EAAI,EAAGA,EAAI2H,EAAS9H,OAAQG,IACjC2H,EAAS3H,GAACF,KAAOiM,QAAQw5C,mBAAoB,OAE5C55C,KAAKkD,cAGN84B,kBAEK57B,QAAQm5C,kBAAgBplD,KACxB6L,KAAK6xB,QAAQ78B,WAAS,CAAEP,EAAGD,KACxBC,EAAEmkB,OAAOpgB,UAAUzB,SAAQ,gBAC3BtC,EAAE2B,gCACG2kD,aAAY5mD,KAAM6L,KAAKC,SAASwD,QAAQjP,EAAKwC,gBAMxDgkD,EAAY,CACdv2C,MAAKtQ,KAAOiM,QAAQw5C,iBACpBx/C,MAAK,CAAG6gD,EAAKx2C,KACDw2C,EAAG9mD,KAAMiM,QAAQw5C,wBAG5B55C,KAAKmK,UAAU6wC,iOCvNjBtnD,OAAAd,EAAA,sBAAA,IAAAsoD,UAELtnD,EAAA,mBACAA,EAAY,sDAMAoM,EAAAI,WAyBRd,EAAG1B,WAAU,GAvBN,yDAIRu9C,OAAK,OAAeC,OAAW,yBAI7B,CACD1/C,KAAK,QAID,YAOJT,OAAO,IAIDmF,uEACAwoB,OACNyyB,kHAGGj7C,EAAKk7C,cAAA,IAAA,IAAA9hD,KAAA4G,EAAAk7C,aAAAD,EAAA9hD,IAAAC,EAAA4G,EAAAk7C,aAAA9hD,UAGHwG,EAAAu7C,eAAA3yB,EAAAvyB,QAAAuyB,EAAAtyB,UACLwnC,EAAK99B,EAAAu7C,eAAA3yB,EAAAryB,MAAAqyB,EAAApyB,iBACL+C,IAAM,CACNmC,IAAKmiC,EAAGniC,IAAI0E,EAAA7E,OAAAG,oEAIlBT,MAAa6iC,EAAAlY,MAAAiY,EAAA/hC,KAAAsE,EAAA7E,OAAAN,QAELogD,sFA7CAH,6PCjBEM,wFATZl8C,EAACC,EAAApF,2BASWqhD,EAAkBp7C,OAC5B68B,EACAwe,EACAC,EACAC,EACAC,EACAC,EACAC,EAUAC,EACAC,EACAC,EACAC,EAZA7e,EAAKlpC,KACLmpC,EAAQ,IAAA3qC,EAAAc,MAAa+mB,aACrB+iB,EAAS,CACX+d,aAAY,QACF,oBAWRa,EAAa,EACbC,EAAc,WAwBT7/B,EAAa9nB,EAAGD,GACvB2nD,EAAa3nD,EAAKqH,UAClBugD,EAAc5nD,EAAKuH,oBAGZshB,EAAe5oB,EAAGwoB,IAGzB2+B,EAAiBt8C,EAAE29B,EAAMof,oBAAoB5nD,KAEtB8G,SAEvBwgD,EAAa,EACbC,EAAgB,EAChBE,EAAkBN,EAAe3+C,SAAQ,sBAErC0+C,EAAajpC,WAAY,GAAMwpC,IACjCH,EAAcJ,EAAalpC,aAAgBnT,EAAC,uBAAwB1E,SAAW0E,EAAC,oBAAqB1E,UAGvGqhD,EAAiBL,EAAe3+C,SAAQ,qBAEpC0+C,EAAan7C,cAAe,GAAMy7C,IACpCD,EAAgB18C,EAAC,qBAAsBrE,SAIzCxG,EAAE2B,oCAGK2nB,EAAgBtpB,EAAGwoB,OACtBhmB,EAAOgmC,EAAM/f,iBAAiBzoB,OACmB,IAAjD4oC,EAAMif,0BAA0B/nD,OAAO0C,IACrCgmC,EAAM1W,kBAAkBtvB,EAAKD,IAAKC,EAAKA,QACzC4kD,GAAY,EACZpnD,EAAE2B,4BAGDylD,GAIL5e,EAAMnK,YAEFlV,EAASX,EAAGW,OAASte,EAAEo8C,GAASngD,SAASO,KACzC6/C,EAAan7C,cAAgB,GAAKy7C,IACpCr+B,GAAUw+B,OAGRv+B,EAASZ,EAAGY,OAASve,EAAEo8C,GAASngD,SAASG,IACzCigD,EAAajpC,WAAa,GAAKwpC,IACjCr+B,GAAUs+B,OAGRr7C,EAAQm8B,EAAMxK,iBAAiB7U,EAAQC,UAE3CZ,EAAG2L,MAAK,CAAK9nB,MAAOA,EAAOC,IAAG,IAC9B06C,EAA0Bx+B,EAAG2L,MACtBkzB,EAAWxzC,KAAI,IAAA3V,EAAAwlC,MAAWr3B,EAAM9J,IAAK8J,EAAM7J,iBAG3C+mB,EAAWvpB,EAAGwoB,MAChB4+B,GAGLpnD,EAAE2B,+BAEE2K,EAAMk8B,EAAMxK,iBACdh+B,EAAEymB,MAAQ0gC,EAAergD,SAASO,KAAOkgD,EACzCvnD,EAAE6oB,MAAQs+B,EAAergD,SAASG,IAAMqgD,GAGtCJ,EAAan7C,cAAgB,IAAOy7C,GAAmBl7C,EAAI9J,KAAO0kD,EAAan7C,cAAmBy7C,GAAmBl7C,EAAI9J,MAAQ0kD,EAAan7C,cAK9Im7C,EAAajpC,WAAa,IAAOwpC,GAAoBn7C,EAAI/J,KAAO2kD,EAAajpC,WAAgBwpC,GAAoBn7C,EAAI/J,IAAM2kD,EAAajpC,WAKvIuqB,EAAM1W,kBAAkBxlB,EAAI/J,IAAK+J,EAAI9J,QAI1CgmB,EAAG2L,MAAM7nB,IAAMA,EAEf+6C,EAAWxzC,KAAI,IAAA3V,EAAAc,MAAW0kC,MAAMlb,EAAG2L,MAAM9nB,MAAM9J,IAAKimB,EAAG2L,MAAM9nB,MAAM7J,KAAM8J,EAAI/J,IAAK+J,EAAI9J,kBAG/EinB,EAAczpB,EAAGwoB,GACnB4+B,IAILA,GAAY,EACZpnD,EAAE2B,2BAEF0lD,EAAWzmB,OACXgI,EAAMkf,oBAAoBhoD,OAAM,CAC9Bq0B,MAAK,IAAAj2B,EAAAc,MAAY0kC,MACflb,EAAG2L,MAAM9nB,MAAM9J,IACfimB,EAAG2L,MAAM9nB,MAAM7J,KACfgmB,EAAG2L,MAAM7nB,IAAI/J,IACbimB,EAAG2L,MAAM7nB,IAAI9J,SASnBqI,EAAEjB,cAAalK,KAAA,eAxID6L,GACZI,EAAUd,EAAE1B,WAAU,GAAK2/B,EAAWn9B,GACtC07C,EAAa17C,EAAQo8C,eAAa,IAAAppD,EAAA8nD,mBAA2Bl7C,EAAMI,GAEnEs7C,GADAze,EAAQj9B,GACQy8C,gBAChBd,EAAe1e,EAAM58B,aACrBi9B,EACGtoC,UAAUioC,EAAM7N,SAAU7S,GAC1BvnB,UAAUioC,EAAM7f,WAAYC,GAC5BroB,UAAUioC,EAAMnf,YAAaC,GAC7B/oB,UAAUioC,EAAMyf,OAAQ1+B,GACxBhpB,UAAUioC,EAAMhf,UAAWC,uBAI9Bof,EAASnoC,6BA4HG,uDAxHL2mD,qCAkHAL,6BAWoB,IAAA9oD,EAAAc,MAAYI,0BAClB,IAAAlB,EAAAc,MAAYI,QAjLrCyL,EAAE1B,WAAWjE,OAAM,OACV,mBACgB6hD,oSCKTmB,uFATZr9C,EAACC,EAAApF,2BASWwiD,EAAmBv8C,OAC3B68B,EAIA2f,EAYAzf,EAdAC,EAAO,GACPC,EAAKlpC,KAILyoD,OADc,IAAPx8C,QAA2D,IAAzBA,EAAQy8C,kBACxC,IAAAxpD,EAAAmoD,kBAAA,cACS,QACF,qBAIJp7C,EAAQy8C,sBAIpBtf,EAAS,CACTuf,kBAAkB,YAsBbC,EAAoB92B,WACrB/rB,EAAM,GAED7F,EAAI,EAAGA,EAAI4xB,EAAO/xB,OAAQG,IAAC,KAC5BmkB,EAAIyN,EAAO5xB,GACX4oC,EAAM1W,kBAAkB/N,EAAEniB,QAASmiB,EAAEliB,WAAa2mC,EAAM1W,kBAAkB/N,EAAEjiB,MAAOiiB,EAAEhiB,SACrF0D,EAAOpG,KAAK0kB,UAIbte,WAqBFg+B,EAAkBjS,QAEjBmX,GAA8B,IAAnBA,EAAQlpC,QAAmB+xB,GAA4B,IAAlBA,EAAO/xB,QAAY,aAGnE8oD,YAvBcC,EAAQC,OACxBC,EAAgBF,EAAO/oD,SAAWgpD,EAAOhpD,WACxCipD,UACQ9oD,EAAI,EAAGA,EAAI4oD,EAAO/oD,OAAQG,IAAC,GAE5B4oD,EAAO5oD,GAAGiC,WAAa4mD,EAAO7oD,GAAGiC,UAC9B2mD,EAAO5oD,GAAGgC,UAAY6mD,EAAO7oD,GAAGgC,SAChC4mD,EAAO5oD,GAAGmC,SAAW0mD,EAAO7oD,GAAGmC,QAC/BymD,EAAO5oD,GAAGkC,QAAU2mD,EAAO7oD,GAAGkC,MAAK,CAEtC4mD,GAAe,eAKnBA,EAQiBC,CAAehgB,EAASnX,GAEjDmX,EAAU2f,EAAoB92B,GAC1B+2B,GAAmB3f,EAAMpF,wBAAwB1jC,OAAO6oC,YAGvDigB,WACEjgB,WAGFkgB,EAA8B7oD,EAAGD,MAClCyoC,EAAMtjB,gBAAgBoX,kBACtBt8B,EAAE0B,mBACK,WAINonD,EAAwB9oD,EAAGD,GAChCyoC,EAAMe,cAAcxpC,EAAKo0B,MAAMvyB,QAAS7B,EAAKo0B,MAAMtyB,UAAU,GAAO,GAAO,GAC3E4hC,EAAiB,CAAE1jC,EAAKo0B,YAGxB40B,WAEK7f,EAAuBlpC,EAAGD,MAC3B2oC,EAAS2f,kBAAgC,MAAZtoD,EAAKwC,KAA4B,MAAbxC,EAAKyC,KAAY,IAElDxC,EAAEglB,SAAWhlB,EAAE+kB,QACpB,OACDyM,EAASo3B,IAAoBl3B,QACnCF,EAAOnyB,KAAI,IAAAnB,EAAAwlC,MAAW3jC,EAAKwC,IAAKxC,EAAKyC,OACrCihC,EAAkBjS,GAClBu3B,EAAc,CAAIxmD,IAAKxC,EAAKwC,IAAKC,KAAMzC,EAAKyC,cACrCxC,EAAEslB,SAAQ,OACXkM,EAASo3B,IAAoBl3B,WAC/BF,EAAO/xB,OAAS,EAAC,OACXupD,EAAex3B,EAAO2G,MACN,MAAlB4wB,IACAA,EAAc,CAAIxmD,IAAKymD,EAAapnD,QAASY,KAAMwmD,EAAannD,iBAE9DonD,EAAQ,IAAA/qD,EAAAwlC,MAAazhC,KAAKC,IAAI6mD,EAAexmD,IAAKxC,EAAKwC,KAC7DN,KAAKC,IAAI6mD,EAAevmD,KAAMzC,EAAKyC,MACnCP,KAAKE,IAAI4mD,EAAexmD,IAAKxC,EAAKwC,KAClCN,KAAKE,IAAI4mD,EAAevmD,KAAMzC,EAAKyC,OACnCgvB,EAAOnyB,KAAK4pD,QAEZz3B,EAAOnyB,KAAI,IAAAnB,EAAAwlC,MAAW3jC,EAAKwC,IAAKxC,EAAKyC,OACrCumD,EAAc,CAAIxmD,IAAKxC,EAAKwC,IAAKC,KAAMzC,EAAKyC,MAEhDihC,EAAkBjS,QAElBiS,EAAiB,aAAY1jC,EAAKwC,IAAKxC,EAAKyC,QAC5CumD,EAAc,CAAIxmD,IAAKxC,EAAKwC,IAAKC,KAAMzC,EAAKyC,WAExCkmC,EAAS2f,kBAEjB5kB,EAAiB,aAIhBvb,EAAcloB,GAkBf,IAAAwxB,EAAAiY,EACAN,EAAOX,EAAOxJ,gBAEdja,EAAA/kB,EAAAglB,SAAAhlB,EAAA+kB,cACU/kB,EAAAslB,WAAeP,IAAY/kB,EAAC47B,SAC9B,IAAA57B,EAAA87B,OAAa,IAAb97B,EAAA87B,OAAgC,IAAT97B,EAAE87B,OAAW,IAAA97B,EAAA87B,OAAA,IAEpC8sB,IAAqBl3B,SAGhBjyB,QAAU+xB,EAAQnyB,KAAC,IAAOnB,EACnCwlC,MAAOyF,EAAG5mC,IAAO4mC,EAAQ3mC,YAIhB21B,OAID71B,SAAM6mC,EACd5mC,IAAI4mC,EAAU3mC,QAAAinC,EAAA,IAAAvrC,EAAAwlC,MAAAyF,EAAA5mC,IAAA4mC,EAAA3mC,OAGlB,IAAA0mD,EAAAzf,EAAA3nC,MAAA2nC,EAA6B7nC,QAAAunD,EAAA1f,EAAA1nC,OAAA0nC,EAAA5nC,WACzBsnC,EAAQ5mC,KAAAknC,EAAA7nC,QAAa,GAAM,EAAAwnD,EAAYjgB,EAAO3mC,MAAMinC,EAAO5nC,SAAY,GAAG,EAC1E,IAAA7B,EAAA87B,MAAAqtB,GAAmBC,EAAU,IAARppD,EAAA87B,MAAQqtB,GAAAC,EAAS,IAAAppD,EAAA87B,MAAAotB,GAAAG,EAC1B,IAAZrpD,EAAO87B,QAAaotB,GAAAG,SAEhB,IAAWnrD,EAAWc,MAAG0kC,MAASyF,EAAM5mC,IAAG4mC,EAAS3mC,KAAA2mC,EAAQ5mC,IAAA8mD,EAAAH,EAAA/f,EAAA3mC,KAAA4mD,EAAAD,MAChEb,EAAM,CACNgB,WAGA,CAEJ93B,EAAAnyB,KAAAiqD,GAEE,IAAAC,EAAcF,EAAA,EAAAC,EAAAxnD,MAAAwnD,EAAA1nD,QACd4nD,EAAeJ,EAAA,EAAAE,EAAAvnD,OAAAunD,EAAAznD,+DAIV2vB,EAAAnyB,KAAAoqC,GACXhG,EAAqBjS,GACrBxxB,EAAAqkB,iBAEArkB,EAAM0B,mCAINhC,KAAA,uDAvLU6L,GACVm9B,EAAW79B,EAAE1B,WAAU,GAAK2/B,EAAWn9B,IACvC68B,EAAQj9B,GACQy8C,gBAChBxf,EAAMzJ,oBAAoBx+B,UAAU2oC,GACpCV,EAAM9M,UAAUn7B,UAAU2nB,GAC1B3c,EAAKmG,eAAey2C,GACpBA,EAAUL,oBAAoBvnD,UAAUuoD,GACxCX,EAAUN,0BAA0BtnD,UAAUsoD,uBAI9CrgB,EAAMzJ,oBAAoBp/B,YAAYupC,GACtCV,EAAM9M,UAAU/7B,YAAYuoB,GAC5BigC,EAAUL,oBAAoBnoD,YAAYmpD,GAC1CX,EAAUN,0BAA0BloD,YAAYkpD,GAChDrgB,EAAM3e,iBAAiBs+B,gFA5C/Bt9C,EAAE1B,WAAWjE,OAAM,OACR,oBACmBgjD","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, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\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, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\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, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\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"}