@revolist/revogrid 4.8.1 → 4.8.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.
Files changed (156) hide show
  1. package/dist/cjs/base.plugin-75fc9e81.js.map +1 -1
  2. package/dist/cjs/{column.service-b3b5a4ee.js → column.service-43f8c476.js} +2 -2
  3. package/dist/cjs/{column.service-b3b5a4ee.js.map → column.service-43f8c476.js.map} +1 -1
  4. package/dist/cjs/{filter.button-147884a8.js → filter.button-35f508a0.js} +3 -3
  5. package/dist/cjs/filter.button-35f508a0.js.map +1 -0
  6. package/dist/cjs/{header-cell-renderer-96a37624.js → header-cell-renderer-a3b43bca.js} +2 -2
  7. package/dist/cjs/{header-cell-renderer-96a37624.js.map → header-cell-renderer-a3b43bca.js.map} +1 -1
  8. package/dist/cjs/index.cjs.js +1 -1
  9. package/dist/cjs/{key.utils-be4d0b46.js → key.utils-4a384064.js} +17 -12
  10. package/dist/cjs/key.utils-4a384064.js.map +1 -0
  11. package/dist/cjs/revo-grid.cjs.entry.js +14 -9
  12. package/dist/cjs/revo-grid.cjs.entry.js.map +1 -1
  13. package/dist/cjs/revogr-attribution_6.cjs.entry.js +41 -12
  14. package/dist/cjs/revogr-attribution_6.cjs.entry.js.map +1 -1
  15. package/dist/cjs/revogr-clipboard_3.cjs.entry.js +5 -3
  16. package/dist/cjs/revogr-clipboard_3.cjs.entry.js.map +1 -1
  17. package/dist/cjs/revogr-data_4.cjs.entry.js +10 -9
  18. package/dist/cjs/revogr-data_4.cjs.entry.js.map +1 -1
  19. package/dist/cjs/revogr-filter-panel.cjs.entry.js +13 -8
  20. package/dist/cjs/revogr-filter-panel.cjs.entry.js.map +1 -1
  21. package/dist/cjs/{selection.helpers-032d7192.js → selection.helpers-26d856ba.js} +67 -20
  22. package/dist/cjs/selection.helpers-26d856ba.js.map +1 -0
  23. package/dist/collection/components/clipboard/revogr-clipboard.js +1 -0
  24. package/dist/collection/components/clipboard/revogr-clipboard.js.map +1 -1
  25. package/dist/collection/components/data/revogr-data.js +1 -1
  26. package/dist/collection/components/data/revogr-data.js.map +1 -1
  27. package/dist/collection/components/editors/text-editor.js +4 -3
  28. package/dist/collection/components/editors/text-editor.js.map +1 -1
  29. package/dist/collection/components/header/header-renderer.js +2 -2
  30. package/dist/collection/components/header/header-renderer.js.map +1 -1
  31. package/dist/collection/components/overlay/keyboard.service.js +15 -5
  32. package/dist/collection/components/overlay/keyboard.service.js.map +1 -1
  33. package/dist/collection/components/overlay/revogr-overlay-selection.js +44 -5
  34. package/dist/collection/components/overlay/revogr-overlay-selection.js.map +1 -1
  35. package/dist/collection/components/revoGrid/revo-grid.js +3 -3
  36. package/dist/collection/components/revoGrid/revo-grid.js.map +1 -1
  37. package/dist/collection/plugins/base.plugin.js.map +1 -1
  38. package/dist/collection/plugins/column.auto-size.plugin.js.map +1 -1
  39. package/dist/collection/plugins/column.stretch.plugin.js.map +1 -1
  40. package/dist/collection/plugins/filter/filter.button.js +2 -2
  41. package/dist/collection/plugins/filter/filter.button.js.map +1 -1
  42. package/dist/collection/plugins/filter/filter.plugin.js +7 -2
  43. package/dist/collection/plugins/filter/filter.plugin.js.map +1 -1
  44. package/dist/collection/plugins/filter/filter.pop.js +13 -8
  45. package/dist/collection/plugins/filter/filter.pop.js.map +1 -1
  46. package/dist/collection/plugins/groupingRow/grouping.row.plugin.js.map +1 -1
  47. package/dist/collection/plugins/moveColumn/column.drag.plugin.js.map +1 -1
  48. package/dist/collection/plugins/sorting/sorting.plugin.js.map +1 -1
  49. package/dist/collection/plugins/sorting/sorting.sign.js +2 -1
  50. package/dist/collection/plugins/sorting/sorting.sign.js.map +1 -1
  51. package/dist/collection/services/selection.store.connector.js +62 -19
  52. package/dist/collection/services/selection.store.connector.js.map +1 -1
  53. package/dist/collection/store/selection/selection.store.js +4 -0
  54. package/dist/collection/store/selection/selection.store.js.map +1 -1
  55. package/dist/collection/types/interfaces.js.map +1 -1
  56. package/dist/collection/types/plugin.js.map +1 -1
  57. package/dist/collection/types/plugin.types.js.map +1 -1
  58. package/dist/collection/types/selection.js.map +1 -1
  59. package/dist/collection/utils/key.codes.js +6 -2
  60. package/dist/collection/utils/key.codes.js.map +1 -1
  61. package/dist/collection/utils/key.utils.js +25 -13
  62. package/dist/collection/utils/key.utils.js.map +1 -1
  63. package/dist/esm/base.plugin-e6e2bac2.js.map +1 -1
  64. package/dist/esm/{column.service-ffe99cfc.js → column.service-6aab6fac.js} +2 -2
  65. package/dist/esm/{column.service-ffe99cfc.js.map → column.service-6aab6fac.js.map} +1 -1
  66. package/dist/esm/{filter.button-f132c10a.js → filter.button-f9883a78.js} +3 -3
  67. package/dist/esm/filter.button-f9883a78.js.map +1 -0
  68. package/dist/esm/{header-cell-renderer-cac333a3.js → header-cell-renderer-b8663a21.js} +2 -2
  69. package/dist/esm/{header-cell-renderer-cac333a3.js.map → header-cell-renderer-b8663a21.js.map} +1 -1
  70. package/dist/esm/index.js +1 -1
  71. package/dist/esm/{key.utils-9120fde7.js → key.utils-c4a27968.js} +17 -12
  72. package/dist/esm/key.utils-c4a27968.js.map +1 -0
  73. package/dist/esm/revo-grid.entry.js +14 -9
  74. package/dist/esm/revo-grid.entry.js.map +1 -1
  75. package/dist/esm/revogr-attribution_6.entry.js +41 -12
  76. package/dist/esm/revogr-attribution_6.entry.js.map +1 -1
  77. package/dist/esm/revogr-clipboard_3.entry.js +5 -3
  78. package/dist/esm/revogr-clipboard_3.entry.js.map +1 -1
  79. package/dist/esm/revogr-data_4.entry.js +10 -9
  80. package/dist/esm/revogr-data_4.entry.js.map +1 -1
  81. package/dist/esm/revogr-filter-panel.entry.js +13 -8
  82. package/dist/esm/revogr-filter-panel.entry.js.map +1 -1
  83. package/dist/esm/{selection.helpers-0f3ed629.js → selection.helpers-dbf69cc1.js} +67 -20
  84. package/dist/esm/selection.helpers-dbf69cc1.js.map +1 -0
  85. package/dist/revo-grid/base.plugin-e6e2bac2.js.map +1 -1
  86. package/dist/revo-grid/{column.service-ffe99cfc.js → column.service-6aab6fac.js} +2 -2
  87. package/dist/revo-grid/{filter.button-f132c10a.js → filter.button-f9883a78.js} +2 -2
  88. package/dist/revo-grid/filter.button-f9883a78.js.map +1 -0
  89. package/dist/revo-grid/{header-cell-renderer-cac333a3.js → header-cell-renderer-b8663a21.js} +2 -2
  90. package/dist/revo-grid/index.esm.js +1 -1
  91. package/dist/revo-grid/{key.utils-9120fde7.js → key.utils-c4a27968.js} +2 -2
  92. package/dist/revo-grid/key.utils-c4a27968.js.map +1 -0
  93. package/dist/revo-grid/revo-grid.entry.js +1 -1
  94. package/dist/revo-grid/revo-grid.entry.js.map +1 -1
  95. package/dist/revo-grid/revogr-attribution_6.entry.js +1 -1
  96. package/dist/revo-grid/revogr-attribution_6.entry.js.map +1 -1
  97. package/dist/revo-grid/revogr-clipboard_3.entry.js +1 -1
  98. package/dist/revo-grid/revogr-clipboard_3.entry.js.map +1 -1
  99. package/dist/revo-grid/revogr-data_4.entry.js +1 -1
  100. package/dist/revo-grid/revogr-data_4.entry.js.map +1 -1
  101. package/dist/revo-grid/revogr-filter-panel.entry.js +1 -1
  102. package/dist/revo-grid/revogr-filter-panel.entry.js.map +1 -1
  103. package/dist/revo-grid/selection.helpers-dbf69cc1.js +5 -0
  104. package/dist/revo-grid/selection.helpers-dbf69cc1.js.map +1 -0
  105. package/dist/types/components/overlay/keyboard.service.d.ts +1 -1
  106. package/dist/types/components/overlay/revogr-overlay-selection.d.ts +9 -1
  107. package/dist/types/components.d.ts +5 -0
  108. package/dist/types/plugins/base.plugin.d.ts +8 -8
  109. package/dist/types/plugins/column.auto-size.plugin.d.ts +26 -16
  110. package/dist/types/plugins/column.stretch.plugin.d.ts +1 -1
  111. package/dist/types/plugins/filter/filter.button.d.ts +1 -1
  112. package/dist/types/plugins/filter/filter.plugin.d.ts +24 -16
  113. package/dist/types/plugins/groupingRow/grouping.row.plugin.d.ts +2 -2
  114. package/dist/types/plugins/moveColumn/column.drag.plugin.d.ts +3 -3
  115. package/dist/types/plugins/sorting/sorting.plugin.d.ts +8 -8
  116. package/dist/types/services/selection.store.connector.d.ts +20 -0
  117. package/dist/types/store/selection/selection.store.d.ts +1 -0
  118. package/dist/types/types/interfaces.d.ts +2 -2
  119. package/dist/types/types/plugin.d.ts +23 -0
  120. package/dist/types/types/plugin.types.d.ts +20 -0
  121. package/dist/types/types/selection.d.ts +24 -0
  122. package/dist/types/utils/key.codes.d.ts +5 -2
  123. package/dist/types/utils/key.utils.d.ts +2 -1
  124. package/hydrate/index.js +153 -59
  125. package/hydrate/index.mjs +153 -59
  126. package/package.json +1 -1
  127. package/standalone/column.service.js +66 -19
  128. package/standalone/column.service.js.map +1 -1
  129. package/standalone/filter.button.js +2 -2
  130. package/standalone/filter.button.js.map +1 -1
  131. package/standalone/revo-grid.js +10 -5
  132. package/standalone/revo-grid.js.map +1 -1
  133. package/standalone/revogr-clipboard2.js +1 -0
  134. package/standalone/revogr-clipboard2.js.map +1 -1
  135. package/standalone/revogr-data2.js +1 -1
  136. package/standalone/revogr-data2.js.map +1 -1
  137. package/standalone/revogr-edit2.js +19 -13
  138. package/standalone/revogr-edit2.js.map +1 -1
  139. package/standalone/revogr-filter-panel.js +12 -7
  140. package/standalone/revogr-filter-panel.js.map +1 -1
  141. package/standalone/revogr-header2.js +5 -4
  142. package/standalone/revogr-header2.js.map +1 -1
  143. package/standalone/revogr-overlay-selection2.js +39 -10
  144. package/standalone/revogr-overlay-selection2.js.map +1 -1
  145. package/dist/cjs/filter.button-147884a8.js.map +0 -1
  146. package/dist/cjs/key.utils-be4d0b46.js.map +0 -1
  147. package/dist/cjs/selection.helpers-032d7192.js.map +0 -1
  148. package/dist/esm/filter.button-f132c10a.js.map +0 -1
  149. package/dist/esm/key.utils-9120fde7.js.map +0 -1
  150. package/dist/esm/selection.helpers-0f3ed629.js.map +0 -1
  151. package/dist/revo-grid/filter.button-f132c10a.js.map +0 -1
  152. package/dist/revo-grid/key.utils-9120fde7.js.map +0 -1
  153. package/dist/revo-grid/selection.helpers-0f3ed629.js +0 -5
  154. package/dist/revo-grid/selection.helpers-0f3ed629.js.map +0 -1
  155. /package/dist/revo-grid/{column.service-ffe99cfc.js.map → column.service-6aab6fac.js.map} +0 -0
  156. /package/dist/revo-grid/{header-cell-renderer-cac333a3.js.map → header-cell-renderer-b8663a21.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"names":["closest","Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","s","el","this","call","parentElement","parentNode","nodeType","filterStyleCss","RevogrFilterPanelStyle0","defaultType","FILTER_LIST_CLASS","FILTER_LIST_CLASS_ACTION","FilterPanel","filterCaptionsInternal","title","save","reset","cancel","debouncedApplyFilter","debounce","filterChange","emit","filterItems","onMouseDown","e","changes","defaultPrevented","target","isOutside","isFilterBtn","undefined","show","newEntity","type","getChanges","componentWillRender","isFilterIdSet","Object","keys","prop","filterId","length","renderSelectOptions","isDefaultTypeRemoved","options","_a","push","h","selected","currentFilterType","value","filterNames","gIndex","filterTypes","map","k","disabled","renderExtra","index","currentFilter","filterEntities","extra","id","placeholder","onInput","onUserInput","bind","onKeyDown","getFilterItemsList","propFilters","key","d","andOrButton","onClick","toggleFilterAndOr","AndOrButton","isAnd","relation","class","onChange","onFilterTypeChange","onRemoveFilter","TrashButton","render","Host","style","display","left","x","top","y","capts","assign","filterCaptions","onAddNewFilter","disableDynamicFiltering","onSave","onReset","onCancel","setTimeout","input","document","getElementById","focus","addNewFilterToProp","select","currentFilterId","event","toLowerCase","stopPropagation","assertChanges","items","findIndex","splice","Error","classList","contains","uuid"],"sources":["src/utils/closest.polifill.ts","src/plugins/filter/filter.style.scss?tag=revogr-filter-panel","src/plugins/filter/filter.pop.tsx"],"sourcesContent":["(function closest() {\n if (!Element.prototype.matches) {\n Element.prototype.matches =\n ((Element.prototype as unknown) as { msMatchesSelector: (selectors: string) => boolean }).msMatchesSelector || Element.prototype.webkitMatchesSelector;\n }\n\n if (!Element.prototype.closest) {\n Element.prototype.closest = function (s: string) {\n let el: HTMLElement | Element | (Node & ParentNode) = this;\n\n do {\n if (Element.prototype.matches.call(el, s)) {\n return el;\n }\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n };\n }\n})();\n","revogr-filter-panel {\n position: absolute;\n display: block;\n top: 0;\n left: 0;\n z-index: 100;\n\n opacity: 1;\n transform: none;\n background-color: #fff;\n transform-origin: 62px 0px;\n box-shadow: 0 5px 18px -2px rgba(black, 20%);\n padding: 10px;\n border-radius: 4px;\n\n min-width: 220px;\n text-align: left;\n\n .filter-holder > div {\n display: flex;\n flex-direction: column;\n }\n\n label {\n font-size: 13px;\n display: block;\n padding: 8px 0;\n }\n\n select {\n width: 100%;\n }\n\n input[type='text'] {\n border: 0;\n min-height: 34px;\n margin: 5px 0;\n background: #f3f3f3;\n border-radius: 5px;\n padding: 0 10px;\n box-sizing: border-box;\n width: 100%;\n }\n\n button {\n margin-top: 10px;\n margin-right: 5px;\n }\n\n .filter-actions {\n text-align: right;\n margin-right: -5px;\n }\n}\n\n.rgHeaderCell {\n &:hover .rv-filter {\n transition:\n opacity 267ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,\n transform 178ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;\n }\n &:hover .rv-filter,\n .rv-filter.active {\n opacity: 1;\n }\n\n .rv-filter {\n $btn-size: 24px;\n height: $btn-size;\n width: $btn-size;\n background: none;\n border: 0;\n opacity: 0;\n visibility: visible;\n cursor: pointer;\n border-radius: 4px;\n\n &.active {\n color: #10224a;\n }\n\n .filter-img {\n $img-size: 11px;\n color: gray;\n width: $img-size;\n }\n }\n}\n\n.select-css {\n $gradient: 'data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23007CB2%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E';\n $linearGradient: linear-gradient(to bottom, #ffffff 0%, #ffffff 100%);\n $borderColor: #f1f1f1;\n\n display: block;\n font-family: sans-serif;\n font-weight: 600;\n color: #444;\n line-height: 1.3;\n padding: 0.6em 1.4em 0.5em 0.8em;\n width: 100%;\n max-width: 100%; /* useful when width is set to anything other than 100% */\n box-sizing: border-box;\n margin: 0;\n border: 1px solid $borderColor;\n box-shadow: transparent;\n border-radius: 0.5em;\n appearance: none;\n background-color: #fff;\n background-image: url($gradient), $linearGradient;\n background-repeat: no-repeat, repeat;\n /* arrow icon position (1em from the right, 50% vertical) , then gradient position*/\n background-position:\n right 0.7em top 50%,\n 0 0;\n /* icon size, then gradient */\n background-size:\n 0.65em auto,\n 100%;\n\n /* Hide arrow icon in IE browsers */\n &::-ms-expand {\n display: none;\n }\n /* Hover style */\n &:hover {\n border-color: rgb(197, 197, 197);\n }\n /* Focus style */\n &:focus {\n border-color: $borderColor;\n box-shadow: 0 0 1px 3px rgba(59, 153, 252, 0.7);\n box-shadow: 0 0 0 3px -moz-mac-focusring;\n color: #222;\n outline: none;\n }\n\n /* Set options to normal weight */\n option {\n font-weight: normal;\n }\n\n /* Disabled styles */\n &:disabled,\n &[aria-disabled='true'] {\n color: gray;\n background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22graytext%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'),\n linear-gradient(to bottom, #ffffff 0%, #ffffff 100%);\n }\n\n &:disabled:hover,\n &[aria-disabled='true'] {\n border-color: $borderColor;\n }\n}\n\n.multi-filter-list {\n margin-top: 5px;\n margin-bottom: 5px;\n\n div {\n white-space: nowrap;\n }\n\n .multi-filter-list-action {\n display: flex;\n\n justify-content: space-between;\n align-items: center;\n }\n\n .and-or-button {\n margin: 0 0 0 10px;\n min-width: 58px;\n cursor: pointer;\n }\n .trash-button {\n $btn-remove-size: 22px;\n margin: 0 0 -2px 6px;\n cursor: pointer;\n\n width: $btn-remove-size;\n height: 100%;\n font-size: 16px;\n\n .trash-img {\n width: 1em;\n }\n }\n}\n\n.add-filter-divider {\n display: block;\n margin: 0 -10px 10px -10px;\n\n border-bottom: 1px solid #d9d9d9;\n height: 10px;\n}\n\n.select-input {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n","import { Component, h, Host, Listen, Prop, State, Event, EventEmitter, VNode, Method } from '@stencil/core';\nimport { FilterType } from './filter.service';\nimport { AndOrButton, isFilterBtn, TrashButton } from './filter.button';\nimport '../../utils/closest.polifill';\nimport { LogicFunction } from './filter.types';\nimport { FilterCaptions } from './filter.plugin';\nimport debounce from 'lodash/debounce';\nimport { ColumnProp } from '@type';\n\nexport type FilterItem = {\n // column id\n prop?: ColumnProp;\n // filter type definition\n type?: FilterType;\n // value for additional filtering, text value or some id\n value?: any;\n};\n\nexport type FilterData = {\n id: number;\n type: FilterType;\n value?: any;\n relation: 'and' | 'or';\n};\n\nexport type MultiFilterItem = {\n [prop: string]: FilterData[];\n};\n\nexport type ShowData = {\n x: number;\n y: number;\n} & FilterItem;\n\nconst defaultType: FilterType = 'none';\n\nconst FILTER_LIST_CLASS = 'multi-filter-list';\nconst FILTER_LIST_CLASS_ACTION = 'multi-filter-list-action';\n\n/**\n * Filter panel for editing filters\n */\n/**\n * @internal\n */\n@Component({\n tag: 'revogr-filter-panel',\n styleUrl: 'filter.style.scss',\n})\nexport class FilterPanel {\n private filterCaptionsInternal: FilterCaptions = {\n title: 'Filter by',\n save: 'Save',\n // drops the filter\n reset: 'Cancel',\n cancel: 'Close',\n };\n @State() isFilterIdSet = false;\n @State() filterId = 0;\n @State() currentFilterId = -1;\n @State() currentFilterType: FilterType = defaultType;\n @State() changes: ShowData | undefined;\n @Prop({ mutable: true, reflect: true }) uuid: string;\n @Prop() filterItems: MultiFilterItem = {};\n @Prop() filterTypes: Record<string, string[]> = {};\n @Prop() filterNames: Record<string, string> = {};\n @Prop() filterEntities: Record<string, LogicFunction> = {};\n @Prop() filterCaptions: FilterCaptions | undefined;\n @Prop() disableDynamicFiltering = false;\n @Event() filterChange: EventEmitter<MultiFilterItem>;\n @Listen('mousedown', { target: 'document' }) onMouseDown(e: MouseEvent) {\n if (this.changes && !e.defaultPrevented) {\n const el = e.target as HTMLElement;\n if (this.isOutside(el) && !isFilterBtn(el)) {\n this.changes = undefined;\n }\n }\n }\n @Method() async show(newEntity?: ShowData) {\n this.changes = newEntity;\n if (this.changes) {\n this.changes.type = this.changes.type || defaultType;\n }\n }\n\n @Method() async getChanges() {\n return this.changes;\n }\n\n componentWillRender() {\n if (!this.isFilterIdSet) {\n this.isFilterIdSet = true;\n const filterItems = Object.keys(this.filterItems);\n for (const prop of filterItems) {\n // we set the proper filterId so there won't be any conflict when removing filters\n this.filterId += this.filterItems[prop].length;\n }\n }\n }\n\n renderSelectOptions(type: FilterType, isDefaultTypeRemoved = false) {\n const options: VNode[] = [];\n const prop = this.changes?.prop;\n\n if (!isDefaultTypeRemoved) {\n options.push(\n <option selected={this.currentFilterType === defaultType} value={defaultType}>\n {prop && this.filterItems[prop] && this.filterItems[prop].length > 0 ? 'Add more condition...' : this.filterNames[defaultType]}\n </option>,\n );\n }\n\n for (let gIndex in this.filterTypes) {\n options.push(\n ...this.filterTypes[gIndex].map(k => (\n <option value={k} selected={type === k}>\n {this.filterNames[k]}\n </option>\n )),\n );\n options.push(<option disabled></option>);\n }\n return options;\n }\n\n renderExtra(prop: ColumnProp, index: number) {\n const currentFilter = this.filterItems[prop];\n\n if (!currentFilter) return '';\n\n if (this.filterEntities[currentFilter[index].type].extra !== 'input') return '';\n\n return (\n <input\n id={`filter-input-${currentFilter[index].id}`}\n placeholder=\"Enter value...\"\n type=\"text\"\n value={currentFilter[index].value}\n onInput={this.onUserInput.bind(this, index, prop)}\n onKeyDown={e => this.onKeyDown(e)}\n />\n );\n }\n\n getFilterItemsList() {\n const prop = this.changes?.prop;\n if (!(prop || prop === 0)) return '';\n\n const propFilters = this.filterItems[prop] || [];\n return (\n <div key={this.filterId}>\n {propFilters.map((d, index) => {\n let andOrButton;\n\n // hide toggle button if there is only one filter and the last one\n if (index !== this.filterItems[prop].length - 1) {\n andOrButton = (\n <div onClick={() => this.toggleFilterAndOr(d.id)}>\n <AndOrButton isAnd={d.relation === 'and'} />\n </div>\n );\n }\n\n return (\n <div key={d.id} class={FILTER_LIST_CLASS}>\n <div class={{ 'select-input': true }}>\n <select class=\"select-css select-filter\" onChange={e => this.onFilterTypeChange(e, prop, index)}>\n {this.renderSelectOptions(this.filterItems[prop][index].type, true)}\n </select>\n <div class={FILTER_LIST_CLASS_ACTION}>{andOrButton}</div>\n <div onClick={() => this.onRemoveFilter(d.id)}>\n <TrashButton />\n </div>\n </div>\n <div>{this.renderExtra(prop, index)}</div>\n </div>\n );\n })}\n\n {propFilters.length > 0 ? <div class=\"add-filter-divider\"/> : ''}\n </div>\n );\n }\n \n render() {\n if (!this.changes) {\n return <Host style={{ display: 'none' }}></Host>;\n }\n const style = {\n display: 'block',\n left: `${this.changes.x}px`,\n top: `${this.changes.y}px`,\n };\n\n const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);\n\n return (\n <Host style={style}>\n <label>{capts.title}</label>\n <div class=\"filter-holder\">{this.getFilterItemsList()}</div>\n\n <div class=\"add-filter\">\n <select id=\"add-filter\" class=\"select-css\" onChange={e => this.onAddNewFilter(e)}>\n {this.renderSelectOptions(this.currentFilterType)}\n </select>\n </div>\n <div class=\"filter-actions\">\n {this.disableDynamicFiltering &&\n <button class=\"revo-button green save\" onClick={() => this.onSave()}>\n {capts.save}\n </button>\n }\n <button class=\"revo-button light reset\" onClick={() => this.onReset()}>\n {capts.reset}\n </button>\n <button class=\"revo-button light cancel\" onClick={() => this.onCancel()}>\n {capts.cancel}\n </button>\n </div>\n </Host>\n );\n }\n\n private onFilterTypeChange(e: Event, prop: ColumnProp, index: number) {\n const el = e.target as HTMLSelectElement;\n const type = el.value as FilterType;\n\n this.filterItems[prop][index].type = type;\n\n // this re-renders the input to know if we need extra input\n this.filterId++;\n\n // adding setTimeout will wait for the next tick DOM update then focus on input\n setTimeout(() => {\n const input = document.getElementById('filter-input-' + this.filterItems[prop][index].id) as HTMLInputElement;\n if (input) input.focus();\n }, 0);\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private debouncedApplyFilter = debounce(() => {\n this.filterChange.emit(this.filterItems);\n }, 400);\n\n private onAddNewFilter(e: Event) {\n const el = e.target as HTMLSelectElement;\n const type = el.value as FilterType;\n\n this.currentFilterType = type;\n this.addNewFilterToProp();\n\n // reset value after adding new filter\n const select = document.getElementById('add-filter') as HTMLSelectElement;\n if (select) {\n select.value = defaultType;\n this.currentFilterType = defaultType;\n }\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private addNewFilterToProp() {\n const prop = this.changes?.prop;\n if (!(prop || prop === 0)) return;\n\n if (!this.filterItems[prop]) {\n this.filterItems[prop] = [];\n }\n\n if (this.currentFilterType === 'none') return;\n\n this.filterId++;\n this.currentFilterId = this.filterId;\n\n this.filterItems[prop].push({\n id: this.currentFilterId,\n type: this.currentFilterType,\n value: '',\n relation: 'and',\n });\n\n // adding setTimeout will wait for the next tick DOM update then focus on input\n setTimeout(() => {\n const input = document.getElementById('filter-input-' + this.currentFilterId) as HTMLInputElement;\n if (input) input.focus();\n }, 0);\n }\n\n private onUserInput(index: number, prop: ColumnProp, event: Event) {\n // update the value of the filter item\n this.filterItems[prop][index].value = (event.target as HTMLInputElement).value;\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private onKeyDown(e: KeyboardEvent) {\n if (e.key.toLowerCase() === 'enter') {\n const select = document.getElementById('add-filter') as HTMLSelectElement;\n if (select) {\n select.value = defaultType;\n this.currentFilterType = defaultType;\n this.addNewFilterToProp();\n select.focus();\n }\n return;\n }\n // keep event local, don't escalate farther to dom\n e.stopPropagation();\n }\n\n private onSave() {\n this.filterChange.emit(this.filterItems);\n }\n\n private onCancel() {\n this.changes = undefined;\n }\n\n private onReset() {\n this.assertChanges();\n\n delete this.filterItems[this.changes.prop];\n\n // this updates the DOM which is used by getFilterItemsList() key\n this.filterId++;\n\n this.filterChange.emit(this.filterItems);\n }\n\n private onRemoveFilter(id: number) {\n this.assertChanges();\n\n // this is for reactivity issues for getFilterItemsList()\n this.filterId++;\n\n const prop = this.changes.prop;\n\n const items = this.filterItems[prop];\n if (!items) return;\n\n const index = items.findIndex(d => d.id === id);\n if (index === -1) return;\n items.splice(index, 1);\n\n // let's remove the prop if no more filters so the filter icon will be removed\n if (items.length === 0) delete this.filterItems[prop];\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private toggleFilterAndOr(id: number) {\n this.assertChanges();\n\n // this is for reactivity issues for getFilterItemsList()\n this.filterId++;\n\n const prop = this.changes.prop;\n\n const items = this.filterItems[prop];\n if (!items) return;\n\n const index = items.findIndex(d => d.id === id);\n if (index === -1) return;\n\n items[index].relation = items[index].relation === 'and' ? 'or' : 'and';\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private assertChanges() {\n if (!this.changes) {\n throw new Error('Changes required per edit');\n }\n }\n\n private isOutside(e: HTMLElement | null) {\n const select = document.getElementById('add-filter') as HTMLSelectElement;\n if (select) select.value = defaultType;\n\n this.currentFilterType = defaultType;\n this.changes.type = defaultType;\n this.currentFilterId = -1;\n if (e.classList.contains(`[uuid=\"${this.uuid}\"]`)) {\n return false;\n }\n return !e?.closest(`[uuid=\"${this.uuid}\"]`);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["closest","Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","s","el","this","call","parentElement","parentNode","nodeType","filterStyleCss","RevogrFilterPanelStyle0","defaultType","FILTER_LIST_CLASS","FILTER_LIST_CLASS_ACTION","FilterPanel","filterCaptionsInternal","title","save","reset","cancel","add","placeholder","and","or","debouncedApplyFilter","debounce","filterChange","emit","filterItems","onMouseDown","e","changes","defaultPrevented","target","isOutside","isFilterBtn","undefined","show","newEntity","type","getChanges","componentWillRender","isFilterIdSet","Object","keys","prop","filterId","length","renderSelectOptions","isDefaultTypeRemoved","options","_a","capts","assign","filterCaptions","push","h","selected","currentFilterType","value","filterNames","gIndex","filterTypes","map","k","disabled","renderExtra","index","currentFilter","filterEntities","extra","id","onInput","onUserInput","bind","onKeyDown","getFilterItemsList","propFilters","key","d","andOrButton","onClick","toggleFilterAndOr","AndOrButton","text","relation","class","onChange","onFilterTypeChange","onRemoveFilter","TrashButton","render","Host","style","display","left","x","top","y","onAddNewFilter","disableDynamicFiltering","onSave","onReset","onCancel","setTimeout","input","document","getElementById","focus","addNewFilterToProp","select","currentFilterId","event","toLowerCase","stopPropagation","assertChanges","items","findIndex","splice","Error","classList","contains","uuid"],"sources":["src/utils/closest.polifill.ts","src/plugins/filter/filter.style.scss?tag=revogr-filter-panel","src/plugins/filter/filter.pop.tsx"],"sourcesContent":["(function closest() {\n if (!Element.prototype.matches) {\n Element.prototype.matches =\n ((Element.prototype as unknown) as { msMatchesSelector: (selectors: string) => boolean }).msMatchesSelector || Element.prototype.webkitMatchesSelector;\n }\n\n if (!Element.prototype.closest) {\n Element.prototype.closest = function (s: string) {\n let el: HTMLElement | Element | (Node & ParentNode) = this;\n\n do {\n if (Element.prototype.matches.call(el, s)) {\n return el;\n }\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n };\n }\n})();\n","revogr-filter-panel {\n position: absolute;\n display: block;\n top: 0;\n left: 0;\n z-index: 100;\n\n opacity: 1;\n transform: none;\n background-color: #fff;\n transform-origin: 62px 0px;\n box-shadow: 0 5px 18px -2px rgba(black, 20%);\n padding: 10px;\n border-radius: 4px;\n\n min-width: 220px;\n text-align: left;\n\n .filter-holder > div {\n display: flex;\n flex-direction: column;\n }\n\n label {\n font-size: 13px;\n display: block;\n padding: 8px 0;\n }\n\n select {\n width: 100%;\n }\n\n input[type='text'] {\n border: 0;\n min-height: 34px;\n margin: 5px 0;\n background: #f3f3f3;\n border-radius: 5px;\n padding: 0 10px;\n box-sizing: border-box;\n width: 100%;\n }\n\n button {\n margin-top: 10px;\n margin-right: 5px;\n }\n\n .filter-actions {\n text-align: right;\n margin-right: -5px;\n }\n}\n\n.rgHeaderCell {\n &:hover .rv-filter {\n transition:\n opacity 267ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,\n transform 178ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;\n }\n &:hover .rv-filter,\n .rv-filter.active {\n opacity: 1;\n }\n\n .rv-filter {\n $btn-size: 24px;\n height: $btn-size;\n width: $btn-size;\n background: none;\n border: 0;\n opacity: 0;\n visibility: visible;\n cursor: pointer;\n border-radius: 4px;\n\n &.active {\n color: #10224a;\n }\n\n .filter-img {\n $img-size: 11px;\n color: gray;\n width: $img-size;\n }\n }\n}\n\n.select-css {\n $gradient: 'data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23007CB2%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E';\n $linearGradient: linear-gradient(to bottom, #ffffff 0%, #ffffff 100%);\n $borderColor: #f1f1f1;\n\n display: block;\n font-family: sans-serif;\n font-weight: 600;\n color: #444;\n line-height: 1.3;\n padding: 0.6em 1.4em 0.5em 0.8em;\n width: 100%;\n max-width: 100%; /* useful when width is set to anything other than 100% */\n box-sizing: border-box;\n margin: 0;\n border: 1px solid $borderColor;\n box-shadow: transparent;\n border-radius: 0.5em;\n appearance: none;\n background-color: #fff;\n background-image: url($gradient), $linearGradient;\n background-repeat: no-repeat, repeat;\n /* arrow icon position (1em from the right, 50% vertical) , then gradient position*/\n background-position:\n right 0.7em top 50%,\n 0 0;\n /* icon size, then gradient */\n background-size:\n 0.65em auto,\n 100%;\n\n /* Hide arrow icon in IE browsers */\n &::-ms-expand {\n display: none;\n }\n /* Hover style */\n &:hover {\n border-color: rgb(197, 197, 197);\n }\n /* Focus style */\n &:focus {\n border-color: $borderColor;\n box-shadow: 0 0 1px 3px rgba(59, 153, 252, 0.7);\n box-shadow: 0 0 0 3px -moz-mac-focusring;\n color: #222;\n outline: none;\n }\n\n /* Set options to normal weight */\n option {\n font-weight: normal;\n }\n\n /* Disabled styles */\n &:disabled,\n &[aria-disabled='true'] {\n color: gray;\n background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22graytext%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'),\n linear-gradient(to bottom, #ffffff 0%, #ffffff 100%);\n }\n\n &:disabled:hover,\n &[aria-disabled='true'] {\n border-color: $borderColor;\n }\n}\n\n.multi-filter-list {\n margin-top: 5px;\n margin-bottom: 5px;\n\n div {\n white-space: nowrap;\n }\n\n .multi-filter-list-action {\n display: flex;\n\n justify-content: space-between;\n align-items: center;\n }\n\n .and-or-button {\n margin: 0 0 0 10px;\n min-width: 58px;\n cursor: pointer;\n }\n .trash-button {\n $btn-remove-size: 22px;\n margin: 0 0 -2px 6px;\n cursor: pointer;\n\n width: $btn-remove-size;\n height: 100%;\n font-size: 16px;\n\n .trash-img {\n width: 1em;\n }\n }\n}\n\n.add-filter-divider {\n display: block;\n margin: 0 -10px 10px -10px;\n\n border-bottom: 1px solid #d9d9d9;\n height: 10px;\n}\n\n.select-input {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n","import { Component, Event, EventEmitter, h, Host, Listen, Method, Prop, State, VNode } from '@stencil/core';\nimport { FilterType } from './filter.service';\nimport { AndOrButton, isFilterBtn, TrashButton } from './filter.button';\nimport '../../utils/closest.polifill';\nimport { LogicFunction } from './filter.types';\nimport { FilterCaptions } from './filter.plugin';\nimport debounce from 'lodash/debounce';\nimport { ColumnProp } from '@type';\n\nexport type FilterItem = {\n // column id\n prop?: ColumnProp;\n // filter type definition\n type?: FilterType;\n // value for additional filtering, text value or some id\n value?: any;\n};\n\nexport type FilterData = {\n id: number;\n type: FilterType;\n value?: any;\n relation: 'and' | 'or';\n};\n\nexport type MultiFilterItem = {\n [prop: string]: FilterData[];\n};\n\nexport type ShowData = {\n x: number;\n y: number;\n} & FilterItem;\n\nconst defaultType: FilterType = 'none';\n\nconst FILTER_LIST_CLASS = 'multi-filter-list';\nconst FILTER_LIST_CLASS_ACTION = 'multi-filter-list-action';\n\n/**\n * Filter panel for editing filters\n */\n/**\n * @internal\n */\n@Component({\n tag: 'revogr-filter-panel',\n styleUrl: 'filter.style.scss',\n})\nexport class FilterPanel {\n private filterCaptionsInternal: FilterCaptions = {\n title: 'Filter by',\n save: 'Save',\n // drops the filter\n reset: 'Cancel',\n cancel: 'Close',\n add: 'Add more condition...',\n placeholder: 'Enter value...',\n and: 'and',\n or: 'or',\n };\n @State() isFilterIdSet = false;\n @State() filterId = 0;\n @State() currentFilterId = -1;\n @State() currentFilterType: FilterType = defaultType;\n @State() changes: ShowData | undefined;\n @Prop({ mutable: true, reflect: true }) uuid: string;\n @Prop() filterItems: MultiFilterItem = {};\n @Prop() filterTypes: Record<string, string[]> = {};\n @Prop() filterNames: Record<string, string> = {};\n @Prop() filterEntities: Record<string, LogicFunction> = {};\n @Prop() filterCaptions: FilterCaptions | undefined;\n @Prop() disableDynamicFiltering = false;\n @Event() filterChange: EventEmitter<MultiFilterItem>;\n @Listen('mousedown', { target: 'document' }) onMouseDown(e: MouseEvent) {\n if (this.changes && !e.defaultPrevented) {\n const el = e.target as HTMLElement;\n if (this.isOutside(el) && !isFilterBtn(el)) {\n this.changes = undefined;\n }\n }\n }\n @Method() async show(newEntity?: ShowData) {\n this.changes = newEntity;\n if (this.changes) {\n this.changes.type = this.changes.type || defaultType;\n }\n }\n\n @Method() async getChanges() {\n return this.changes;\n }\n\n componentWillRender() {\n if (!this.isFilterIdSet) {\n this.isFilterIdSet = true;\n const filterItems = Object.keys(this.filterItems);\n for (const prop of filterItems) {\n // we set the proper filterId so there won't be any conflict when removing filters\n this.filterId += this.filterItems[prop].length;\n }\n }\n }\n\n renderSelectOptions(type: FilterType, isDefaultTypeRemoved = false) {\n const options: VNode[] = [];\n const prop = this.changes?.prop;\n\n if (!isDefaultTypeRemoved) {\n const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);\n\n options.push(\n <option selected={this.currentFilterType === defaultType} value={defaultType}>\n {prop && this.filterItems[prop] && this.filterItems[prop].length > 0 ? capts.add : this.filterNames[defaultType]}\n </option>,\n );\n }\n\n for (let gIndex in this.filterTypes) {\n options.push(\n ...this.filterTypes[gIndex].map(k => (\n <option value={k} selected={type === k}>\n {this.filterNames[k]}\n </option>\n )),\n );\n options.push(<option disabled></option>);\n }\n return options;\n }\n\n renderExtra(prop: ColumnProp, index: number) {\n const currentFilter = this.filterItems[prop];\n\n if (!currentFilter) return '';\n\n if (this.filterEntities[currentFilter[index].type].extra !== 'input') return '';\n\n const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);\n\n return (\n <input\n id={`filter-input-${currentFilter[index].id}`}\n placeholder={capts.placeholder}\n type=\"text\"\n value={currentFilter[index].value}\n onInput={this.onUserInput.bind(this, index, prop)}\n onKeyDown={e => this.onKeyDown(e)}\n />\n );\n }\n\n getFilterItemsList() {\n const prop = this.changes?.prop;\n if (!(prop || prop === 0)) return '';\n\n const propFilters = this.filterItems[prop] || [];\n const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);\n return (\n <div key={this.filterId}>\n {propFilters.map((d, index) => {\n let andOrButton;\n\n // hide toggle button if there is only one filter and the last one\n if (index !== this.filterItems[prop].length - 1) {\n andOrButton = (\n <div onClick={() => this.toggleFilterAndOr(d.id)}>\n <AndOrButton text={d.relation === 'and' ? capts.and : capts.or} />\n </div>\n );\n }\n\n return (\n <div key={d.id} class={FILTER_LIST_CLASS}>\n <div class={{ 'select-input': true }}>\n <select class=\"select-css select-filter\" onChange={e => this.onFilterTypeChange(e, prop, index)}>\n {this.renderSelectOptions(this.filterItems[prop][index].type, true)}\n </select>\n <div class={FILTER_LIST_CLASS_ACTION}>{andOrButton}</div>\n <div onClick={() => this.onRemoveFilter(d.id)}>\n <TrashButton />\n </div>\n </div>\n <div>{this.renderExtra(prop, index)}</div>\n </div>\n );\n })}\n\n {propFilters.length > 0 ? <div class=\"add-filter-divider\"/> : ''}\n </div>\n );\n }\n \n render() {\n if (!this.changes) {\n return <Host style={{ display: 'none' }}></Host>;\n }\n const style = {\n display: 'block',\n left: `${this.changes.x}px`,\n top: `${this.changes.y}px`,\n };\n\n const capts = Object.assign(this.filterCaptionsInternal, this.filterCaptions);\n\n return (\n <Host style={style}>\n <label>{capts.title}</label>\n <div class=\"filter-holder\">{this.getFilterItemsList()}</div>\n\n <div class=\"add-filter\">\n <select id=\"add-filter\" class=\"select-css\" onChange={e => this.onAddNewFilter(e)}>\n {this.renderSelectOptions(this.currentFilterType)}\n </select>\n </div>\n <div class=\"filter-actions\">\n {this.disableDynamicFiltering &&\n <button class=\"revo-button green save\" onClick={() => this.onSave()}>\n {capts.save}\n </button>\n }\n <button class=\"revo-button light reset\" onClick={() => this.onReset()}>\n {capts.reset}\n </button>\n <button class=\"revo-button light cancel\" onClick={() => this.onCancel()}>\n {capts.cancel}\n </button>\n </div>\n </Host>\n );\n }\n\n private onFilterTypeChange(e: Event, prop: ColumnProp, index: number) {\n const el = e.target as HTMLSelectElement;\n this.filterItems[prop][index].type = el.value as FilterType;\n\n // this re-renders the input to know if we need extra input\n this.filterId++;\n\n // adding setTimeout will wait for the next tick DOM update then focus on input\n setTimeout(() => {\n const input = document.getElementById('filter-input-' + this.filterItems[prop][index].id) as HTMLInputElement;\n if (input) input.focus();\n }, 0);\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private debouncedApplyFilter = debounce(() => {\n this.filterChange.emit(this.filterItems);\n }, 400);\n\n private onAddNewFilter(e: Event) {\n const el = e.target as HTMLSelectElement;\n this.currentFilterType = el.value as FilterType;\n this.addNewFilterToProp();\n\n // reset value after adding new filter\n const select = document.getElementById('add-filter') as HTMLSelectElement;\n if (select) {\n select.value = defaultType;\n this.currentFilterType = defaultType;\n }\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private addNewFilterToProp() {\n const prop = this.changes?.prop;\n if (!(prop || prop === 0)) return;\n\n if (!this.filterItems[prop]) {\n this.filterItems[prop] = [];\n }\n\n if (this.currentFilterType === 'none') return;\n\n this.filterId++;\n this.currentFilterId = this.filterId;\n\n this.filterItems[prop].push({\n id: this.currentFilterId,\n type: this.currentFilterType,\n value: '',\n relation: 'and',\n });\n\n // adding setTimeout will wait for the next tick DOM update then focus on input\n setTimeout(() => {\n const input = document.getElementById('filter-input-' + this.currentFilterId) as HTMLInputElement;\n if (input) input.focus();\n }, 0);\n }\n\n private onUserInput(index: number, prop: ColumnProp, event: Event) {\n // update the value of the filter item\n this.filterItems[prop][index].value = (event.target as HTMLInputElement).value;\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private onKeyDown(e: KeyboardEvent) {\n if (e.key.toLowerCase() === 'enter') {\n const select = document.getElementById('add-filter') as HTMLSelectElement;\n if (select) {\n select.value = defaultType;\n this.currentFilterType = defaultType;\n this.addNewFilterToProp();\n select.focus();\n }\n return;\n }\n // keep event local, don't escalate farther to dom\n e.stopPropagation();\n }\n\n private onSave() {\n this.filterChange.emit(this.filterItems);\n }\n\n private onCancel() {\n this.changes = undefined;\n }\n\n private onReset() {\n this.assertChanges();\n\n delete this.filterItems[this.changes.prop];\n\n // this updates the DOM which is used by getFilterItemsList() key\n this.filterId++;\n\n this.filterChange.emit(this.filterItems);\n }\n\n private onRemoveFilter(id: number) {\n this.assertChanges();\n\n // this is for reactivity issues for getFilterItemsList()\n this.filterId++;\n\n const prop = this.changes.prop;\n\n const items = this.filterItems[prop];\n if (!items) return;\n\n const index = items.findIndex(d => d.id === id);\n if (index === -1) return;\n items.splice(index, 1);\n\n // let's remove the prop if no more filters so the filter icon will be removed\n if (items.length === 0) delete this.filterItems[prop];\n\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private toggleFilterAndOr(id: number) {\n this.assertChanges();\n\n // this is for reactivity issues for getFilterItemsList()\n this.filterId++;\n\n const prop = this.changes.prop;\n\n const items = this.filterItems[prop];\n if (!items) return;\n\n const index = items.findIndex(d => d.id === id);\n if (index === -1) return;\n\n items[index].relation = items[index].relation === 'and' ? 'or' : 'and';\n if (!this.disableDynamicFiltering) this.debouncedApplyFilter();\n }\n\n private assertChanges() {\n if (!this.changes) {\n throw new Error('Changes required per edit');\n }\n }\n\n private isOutside(e: HTMLElement | null) {\n const select = document.getElementById('add-filter') as HTMLSelectElement;\n if (select) select.value = defaultType;\n\n this.currentFilterType = defaultType;\n this.changes.type = defaultType;\n this.currentFilterId = -1;\n if (e.classList.contains(`[uuid=\"${this.uuid}\"]`)) {\n return false;\n }\n return !e?.closest(`[uuid=\"${this.uuid}\"]`);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ /*!
2
+ * Built by Revolist OU ❤️
3
+ */
4
+ import{k as t,l as e}from"./dimension.helpers-c0c2888f.js";import"./toNumber-8de324a7.js";import"./index-e661aeb5.js";function i(){return{range:null,tempRange:null,tempRangeType:null,focus:null,edit:null,lastCell:null,nextFocus:null}}class s{constructor(){this.unsubscribe=[];this.store=t(i());this.store.on("set",((t,e)=>{if(t==="tempRange"&&!e){this.store.set("tempRangeType",null)}}))}onChange(t,e){this.unsubscribe.push(this.store.onChange(t,e))}clearFocus(){e(this.store,{focus:null,range:null,edit:null,tempRange:null})}setFocus(t,i){if(!i){e(this.store,{focus:t})}else{e(this.store,{focus:t,range:u(t,i),edit:null,tempRange:null})}}setNextFocus(t){e(this.store,{nextFocus:t})}setTempArea(t){e(this.store,{tempRange:t===null||t===void 0?void 0:t.area,tempRangeType:t===null||t===void 0?void 0:t.type,edit:null})}clearTemp(){e(this.store,{tempRange:null})}setRangeArea(t){e(this.store,{range:t,edit:null,tempRange:null})}setRange(t,e){this.setRangeArea(u(t,e))}setLastCell(t){e(this.store,{lastCell:t})}setEdit(t){const i=this.store.get("focus");if(i&&typeof t==="string"){e(this.store,{edit:{x:i.x,y:i.y,val:t}});return}e(this.store,{edit:null})}dispose(){this.unsubscribe.forEach((t=>t()));this.store.dispose()}}const n=-1;class l{constructor(){this.dirty=false;this.stores={};this.columnStores={};this.rowStores={};this.storesByType={};this.storesXToType={};this.storesYToType={};this.sections=[]}get focusedStore(){var t;for(let e in this.stores){for(let i in this.stores[e]){const s=(t=this.stores[e][i])===null||t===void 0?void 0:t.store.get("focus");if(s){return{entity:this.stores[e][i],cell:s,position:{x:parseInt(i,10),y:parseInt(e,10)}}}}}return null}get edit(){var t;return(t=this.focusedStore)===null||t===void 0?void 0:t.entity.store.get("edit")}get focused(){var t;return(t=this.focusedStore)===null||t===void 0?void 0:t.entity.store.get("focus")}get selectedRange(){var t;return(t=this.focusedStore)===null||t===void 0?void 0:t.entity.store.get("range")}registerSection(t){if(!t){this.sections.length=0;this.dirty=true;return}if(this.sections.indexOf(t)===-1){this.sections.push(t)}}beforeUpdate(){if(this.dirty){for(let t in this.stores){for(let e in this.stores[t]){this.stores[t][e].dispose()}}this.dirty=false}}registerColumn(t,e){if(r(t)){return new s}if(this.columnStores[t]){return this.columnStores[t]}this.columnStores[t]=new s;this.storesByType[e]=t;this.storesXToType[t]=e;return this.columnStores[t]}registerRow(t,e){if(r(t)){return new s}if(this.rowStores[t]){return this.rowStores[t]}this.rowStores[t]=new s;this.storesByType[e]=t;this.storesYToType[t]=e;return this.rowStores[t]}register({x:t,y:e}){var i,n;if(r(t)||r(e)){return new s}if(!this.stores[e]){this.stores[e]={}}if(this.stores[e][t]){return this.stores[e][t]}this.stores[e][t]=new s;(i=this.stores[e][t])===null||i===void 0?void 0:i.onChange("range",(i=>{this.columnStores[t].setRangeArea(i);this.rowStores[e].setRangeArea(i)}));(n=this.stores[e][t])===null||n===void 0?void 0:n.store.on("dispose",(()=>this.destroy(t,e)));return this.stores[e][t]}destroy(t,e){var i,s;(i=this.columnStores[t])===null||i===void 0?void 0:i.dispose();(s=this.rowStores[e])===null||s===void 0?void 0:s.dispose();delete this.rowStores[e];delete this.columnStores[t];if(this.storesXToType[t]){const e=this.storesXToType[t];delete this.storesXToType[t];delete this.storesByType[e]}if(this.storesYToType[e]){const t=this.storesYToType[e];delete this.storesYToType[e];delete this.storesByType[t]}if(this.stores[e]){delete this.stores[e][t]}if(!Object.keys(this.stores[e]||{}).length){delete this.stores[e]}}setEditByCell(t,e){this.focusByCell(t,e,e);this.setEdit("")}beforeNextFocusCell(t){var e;if(!this.focusedStore){return}const i=this.getNextStore(t,this.focusedStore.position,this.focusedStore.entity.store.get("lastCell"));(e=i.store)===null||e===void 0?void 0:e.setNextFocus(Object.assign(Object.assign({},t),i.item))}focusByCell(t,e,i){const s=this.stores[t.y][t.x];this.focus(s,{focus:e,end:i})}focus(t,{focus:e,end:i}){const s=this.getCurrentStorePointer(t);if(!s){return null}const n=t.store.get("lastCell");const l=this.getNextStore(e,s,n);if(l===null||l===void 0?void 0:l.store){const t=Object.assign(Object.assign({},e),l.item);this.focus(l.store,{focus:t,end:t});return null}e=h(e,n);i=h(i,n);t.setFocus(e,i);return e}getCurrentStorePointer(t){let e;for(let i in this.stores){for(let s in this.stores[i]){const n=this.stores[i][s];if(n!==t){n.clearFocus()}else{e={x:parseInt(s,10),y:parseInt(i,10)}}}}return e}getNextStore(t,e,i){const s=o(t,i);let n=null;if(s){for(let t in s){let i=t;let l;switch(i){case"x":l=this.getXStores(e.y);break;case"y":l=this.getYStores(e.x);l=this.getYStores(e.x);break}if(s[i]>=0){n=l[++e[i]]}else{n=l[--e[i]];const t=n===null||n===void 0?void 0:n.store.get("lastCell");if(t){s[i]=t[i]+s[i]}}}}return{store:n,item:s}}clearAll(){var t;for(let e in this.stores){for(let i in this.stores[e]){(t=this.stores[e][i])===null||t===void 0?void 0:t.clearFocus()}}}setEdit(t){if(!this.focusedStore){return}this.focusedStore.entity.setEdit(t)}selectAll(){for(let t in this.stores){for(let e in this.stores[t]){const i=this.stores[t][e];if(!i){continue}const s=i.store.get("lastCell");i.setRange({x:0,y:0},{x:s.x-1,y:s.y-1})}}}getXStores(t){return this.stores[t]}getYStores(t){const e={};for(let i in this.stores){e[i]=this.stores[i][t]}return e}}function r(t){return t===n}function o(t,e){const i={};let s=["x","y"];for(let e of s){if(t[e]<0){i[e]=t[e];return i}}for(let n of s){if(t[n]>=e[n]){i[n]=t[n]-e[n];return i}}return null}function h(t,e){const i=Object.assign({},t);let s=["x","y"];for(let e of s){if(t[e]<0){i[e]=0}}for(let n of s){if(t[n]>=e[n]){i[n]=e[n]-1}}return i}function u(t,e){return t&&e?{x:Math.min(t.x,e.x),y:Math.min(t.y,e.y),x1:Math.max(t.x,e.x),y1:Math.max(t.y,e.y)}:null}function f(t){return t.x===t.x1&&t.y===t.y1}export{n as E,s as S,f as a,l as b,h as c,u as g,r as i,o as n};
5
+ //# sourceMappingURL=selection.helpers-dbf69cc1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["defaultState","range","tempRange","tempRangeType","focus","edit","lastCell","nextFocus","SelectionStore","constructor","this","unsubscribe","store","createStore","on","key","newVal","set","onChange","propName","cb","push","clearFocus","setStore","setFocus","end","getRange","setNextFocus","setTempArea","area","type","clearTemp","setRangeArea","setRange","start","setLastCell","setEdit","val","get","x","y","dispose","forEach","f","EMPTY_INDEX","SelectionStoreConnector","dirty","stores","columnStores","rowStores","storesByType","storesXToType","storesYToType","sections","focusedStore","focused","_a","entity","cell","position","parseInt","selectedRange","registerSection","e","length","indexOf","beforeUpdate","registerColumn","isHiddenStore","registerRow","register","c","_b","destroy","Object","keys","setEditByCell","storePos","editCell","focusByCell","beforeNextFocusCell","next","getNextStore","assign","item","currentStorePointer","getCurrentStorePointer","cropCellToMax","s","nextItem","nextCell","nextStore","i","getXStores","getYStores","nextLastCell","clearAll","selectAll","pos","types","t","newCell","Math","min","x1","max","y1","isRangeSingleCell","a"],"sources":["src/store/selection/selection.store.ts","src/services/selection.store.connector.ts","src/store/selection/selection.helpers.ts"],"sourcesContent":["/**\n * Selection store\n */\n\nimport { setStore, Observable } from '../../utils/store.utils';\nimport { getRange } from '@store';\nimport { SelectionStoreState, Cell, TempRange, RangeArea } from '@type';\nimport { createStore } from '@stencil/store';\n\nfunction defaultState(): SelectionStoreState {\n return {\n range: null,\n tempRange: null,\n tempRangeType: null,\n focus: null,\n edit: null,\n lastCell: null,\n nextFocus: null,\n };\n}\n\nexport class SelectionStore {\n readonly store: Observable<SelectionStoreState>;\n private unsubscribe: { (): void }[] = [];\n constructor() {\n this.store = createStore(defaultState());\n this.store.on('set', (key, newVal) => {\n if (key === 'tempRange' && !newVal) {\n this.store.set('tempRangeType', null);\n }\n });\n }\n\n onChange<Key extends keyof SelectionStoreState>(propName: Key, cb: (newValue: SelectionStoreState[Key]) => void) {\n this.unsubscribe.push(this.store.onChange(propName, cb));\n }\n\n clearFocus() {\n setStore(this.store, { focus: null, range: null, edit: null, tempRange: null });\n }\n\n setFocus(focus: Cell, end?: Cell) {\n if (!end) {\n setStore(this.store, { focus });\n } else {\n setStore(this.store, {\n focus,\n range: getRange(focus, end),\n edit: null,\n tempRange: null,\n });\n }\n }\n\n setNextFocus(focus: Cell) {\n setStore(this.store, { nextFocus: focus });\n }\n\n setTempArea(range: TempRange | null) {\n setStore(this.store, { tempRange: range?.area, tempRangeType: range?.type, edit: null });\n }\n\n clearTemp() {\n setStore(this.store, { tempRange: null });\n }\n\n /** Can be applied from selection change or from simple keyboard change clicks */\n setRangeArea(range: RangeArea) {\n setStore(this.store, { range, edit: null, tempRange: null });\n }\n setRange(start: Cell, end: Cell) {\n this.setRangeArea(getRange(start, end));\n }\n\n setLastCell(lastCell: Cell) {\n setStore(this.store, { lastCell });\n }\n\n setEdit(val: string | boolean) {\n const focus = this.store.get('focus');\n if (focus && typeof val === 'string') {\n setStore(this.store, {\n edit: { x: focus.x, y: focus.y, val },\n });\n return;\n }\n setStore(this.store, { edit: null });\n }\n\n dispose() {\n this.unsubscribe.forEach(f => f());\n this.store.dispose();\n }\n}\n","import { cropCellToMax, isHiddenStore, nextCell, SelectionStore } from '@store';\nimport type {\n MultiDimensionType,\n DimensionCols,\n DimensionRows,\n Cell,\n EditCellStore,\n RangeArea,\n} from '@type';\n\ntype StoreByDimension = Record<number, SelectionStore>;\ntype FocusedStore = {\n entity: SelectionStore;\n cell: Cell;\n position: Cell;\n};\n\ntype StoresMapping<T> = { [xOrY: number]: Partial<T> };\n\nexport const EMPTY_INDEX = -1;\n\nexport default class SelectionStoreConnector {\n // dirty flag required to cleanup whole store in case visibility of panels changed\n private dirty = false;\n readonly stores: { [y: number]: { [x: number]: SelectionStore } } = {};\n\n readonly columnStores: StoreByDimension = {};\n readonly rowStores: { [y: number]: SelectionStore } = {};\n\n /**\n * Helpers for data conversion\n */\n readonly storesByType: Partial<Record<MultiDimensionType, number>> = {};\n readonly storesXToType: StoresMapping<DimensionCols> = {};\n readonly storesYToType: StoresMapping<DimensionRows> = {};\n\n get focusedStore(): FocusedStore | null {\n for (let y in this.stores) {\n for (let x in this.stores[y]) {\n const focused = this.stores[y][x]?.store.get('focus');\n if (focused) {\n return {\n entity: this.stores[y][x],\n cell: focused,\n position: {\n x: parseInt(x, 10),\n y: parseInt(y, 10),\n },\n };\n }\n }\n }\n return null;\n }\n\n get edit(): EditCellStore | undefined {\n return this.focusedStore?.entity.store.get('edit');\n }\n\n get focused(): Cell | undefined {\n return this.focusedStore?.entity.store.get('focus');\n }\n\n get selectedRange(): RangeArea | undefined {\n return this.focusedStore?.entity.store.get('range');\n }\n\n private readonly sections: Element[] = [];\n\n registerSection(e?: Element) {\n if (!e) {\n this.sections.length = 0;\n // some elements removed, rebuild stores\n this.dirty = true;\n return;\n }\n if (this.sections.indexOf(e) === -1) {\n this.sections.push(e);\n }\n }\n\n // check if require to cleanup all stores\n beforeUpdate() {\n if (this.dirty) {\n for (let y in this.stores) {\n for (let x in this.stores[y]) {\n this.stores[y][x].dispose();\n }\n }\n this.dirty = false;\n }\n }\n\n registerColumn(x: number, type: DimensionCols): SelectionStore {\n // if hidden just create store but no operations needed\n if (isHiddenStore(x)) {\n return new SelectionStore();\n }\n if (this.columnStores[x]) {\n return this.columnStores[x];\n }\n this.columnStores[x] = new SelectionStore();\n // build cross linking type to position\n this.storesByType[type] = x;\n this.storesXToType[x] = type;\n return this.columnStores[x];\n }\n\n registerRow(y: number, type: DimensionRows): SelectionStore {\n // if hidden just create store\n if (isHiddenStore(y)) {\n return new SelectionStore();\n }\n if (this.rowStores[y]) {\n return this.rowStores[y];\n }\n this.rowStores[y] = new SelectionStore();\n // build cross linking type to position\n this.storesByType[type] = y;\n this.storesYToType[y] = type;\n return this.rowStores[y];\n }\n\n /**\n * Cross store proxy, based on multiple dimensions\n */\n register({ x, y }: Cell): SelectionStore {\n // if hidden just create store\n if (isHiddenStore(x) || isHiddenStore(y)) {\n return new SelectionStore();\n }\n if (!this.stores[y]) {\n this.stores[y] = {};\n }\n if (this.stores[y][x]) {\n // Store already registered. Do not register twice\n return this.stores[y][x];\n }\n this.stores[y][x] = new SelectionStore();\n // proxy update, column store trigger only range area\n this.stores[y][x]?.onChange('range', c => {\n this.columnStores[x].setRangeArea(c);\n this.rowStores[y].setRangeArea(c);\n });\n // clean up on remove\n this.stores[y][x]?.store.on('dispose', () => this.destroy(x, y));\n return this.stores[y][x];\n }\n\n private destroy(x: number, y: number) {\n this.columnStores[x]?.dispose();\n this.rowStores[y]?.dispose();\n\n delete this.rowStores[y];\n delete this.columnStores[x];\n // clear x cross link\n if (this.storesXToType[x]) {\n const type = this.storesXToType[x];\n delete this.storesXToType[x];\n delete this.storesByType[type];\n }\n // clear y cross link\n if (this.storesYToType[y]) {\n const type = this.storesYToType[y];\n delete this.storesYToType[y];\n delete this.storesByType[type];\n }\n if (this.stores[y]) {\n delete this.stores[y][x];\n }\n // clear empty rows\n if (!Object.keys(this.stores[y] || {}).length) {\n delete this.stores[y];\n }\n }\n\n setEditByCell<T extends Cell>(storePos: T, editCell: T) {\n this.focusByCell(storePos, editCell, editCell);\n this.setEdit('');\n }\n\n /**\n * Sets the next focus cell before the current one.\n * \n * @param focus - The cell to set as the next focus.\n */\n beforeNextFocusCell(focus: Cell) {\n // If there is no focused store, return early.\n if (!this.focusedStore) {\n return;\n }\n\n // Get the next store based on the current focus and the last cell.\n const next = this.getNextStore(focus, this.focusedStore.position, this.focusedStore.entity.store.get('lastCell') );\n\n // Set the next focus cell in the store.\n next.store?.setNextFocus({ ...focus, ...next.item });\n }\n\n focusByCell<T extends Cell>(storePos: T, start: T, end: T) {\n const store = this.stores[storePos.y][storePos.x];\n this.focus(store, { focus: start, end });\n }\n\n focus(store: SelectionStore, { focus, end }: { focus: Cell; end: Cell }) {\n const currentStorePointer = this.getCurrentStorePointer(store);\n if (!currentStorePointer) {\n return null;\n }\n\n // check for the focus in nearby store/viewport\n const lastCell = store.store.get('lastCell');\n const next = this.getNextStore(focus, currentStorePointer, lastCell);\n\n // if next store present - update\n if (next?.store) {\n const item = { ...focus, ...next.item };\n this.focus(next.store, { focus: item, end: item });\n return null;\n }\n\n focus = cropCellToMax(focus, lastCell);\n end = cropCellToMax(end, lastCell);\n\n store.setFocus(focus, end);\n return focus;\n }\n\n /**\n * Retrieves the current store pointer based on the active store.\n * Clears focus from all stores except the active one.\n */\n getCurrentStorePointer(store: SelectionStore): Cell {\n let currentStorePointer: Cell;\n\n // Iterate through all stores\n for (let y in this.stores) {\n for (let x in this.stores[y]) {\n const s = this.stores[y][x];\n\n // Clear focus from stores other than the active one\n if (s !== store) {\n s.clearFocus();\n } else {\n // Update the current store pointer with the active store coordinates\n currentStorePointer = { \n x: parseInt(x, 10), \n y: parseInt(y, 10) \n };\n }\n }\n }\n\n return currentStorePointer;\n }\n\n /**\n * Retrieves the next store based on the focus cell and current store pointer.\n * If the next store exists, returns an object with the next store and the item in the new store.\n * If the next store does not exist, returns null.\n */\n getNextStore(\n focus: Cell,\n currentStorePointer: Cell,\n lastCell: Cell,\n ) {\n // item in new store\n const nextItem: Partial<Cell> | null = nextCell(focus, lastCell);\n\n let nextStore: SelectionStore | null = null;\n if (nextItem) {\n for (let i in nextItem) {\n let type: keyof Cell = i as keyof Cell;\n let stores;\n switch (type) {\n case 'x':\n // Get the X stores for the current Y coordinate of the current store pointer\n stores = this.getXStores(currentStorePointer.y);\n break;\n case 'y':\n // Get the Y stores for the current X coordinate of the current store pointer\n stores = this.getYStores(currentStorePointer.x);\n stores = this.getYStores(currentStorePointer.x);\n break;\n }\n if (nextItem[type] >= 0) {\n nextStore = stores[++currentStorePointer[type]];\n } else {\n nextStore = stores[--currentStorePointer[type]];\n const nextLastCell = nextStore?.store.get('lastCell');\n if (nextLastCell) {\n nextItem[type] = nextLastCell[type] + nextItem[type];\n }\n }\n }\n }\n return {\n store: nextStore,\n item: nextItem,\n };\n }\n\n clearAll() {\n for (let y in this.stores) {\n for (let x in this.stores[y]) {\n this.stores[y][x]?.clearFocus();\n }\n }\n }\n\n setEdit(val: string | boolean) {\n if (!this.focusedStore) {\n return;\n }\n this.focusedStore.entity.setEdit(val);\n }\n\n /**\n * Select all cells across all stores\n */\n selectAll() {\n for (let y in this.stores) {\n for (let x in this.stores[y]) {\n const store = this.stores[y][x];\n if (!store) {\n continue;\n }\n const lastCell = store.store.get('lastCell');\n store.setRange(\n { x: 0, y: 0 },\n { x: lastCell.x - 1, y: lastCell.y - 1 },\n );\n }\n }\n }\n\n private getXStores(y: number) {\n return this.stores[y];\n }\n\n private getYStores(x: number) {\n const stores: { [p: number]: SelectionStore } = {};\n for (let i in this.stores) {\n stores[i] = this.stores[i][x];\n }\n return stores;\n }\n}\n","import { EMPTY_INDEX } from '../../services/selection.store.connector';\nimport { Cell, RangeArea } from '@type';\n\nexport function isHiddenStore(pos: number) {\n return pos === EMPTY_INDEX;\n}\n\nexport function nextCell(cell: Cell, lastCell: Cell): Partial<Cell> | null {\n const nextItem: Partial<Cell> = {};\n let types: (keyof Cell)[] = ['x', 'y'];\n\n // previous item check\n for (let t of types) {\n if (cell[t] < 0) {\n nextItem[t] = cell[t];\n return nextItem;\n }\n }\n // next item check\n for (let t of types) {\n if (cell[t] >= lastCell[t]) {\n nextItem[t] = cell[t] - lastCell[t];\n return nextItem;\n }\n }\n return null;\n}\n\nexport function cropCellToMax(cell: Cell, lastCell: Cell): Cell {\n const newCell: Cell = { ...cell };\n let types: (keyof Cell)[] = ['x', 'y'];\n // previous item check\n for (let t of types) {\n if (cell[t] < 0) {\n newCell[t] = 0;\n }\n }\n // next item check\n for (let t of types) {\n if (cell[t] >= lastCell[t]) {\n newCell[t] = lastCell[t] - 1;\n }\n }\n return newCell;\n}\n\nexport function getRange(start?: Cell, end?: Cell): RangeArea | null {\n return start && end\n ? {\n x: Math.min(start.x, end.x),\n y: Math.min(start.y, end.y),\n x1: Math.max(start.x, end.x),\n y1: Math.max(start.y, end.y),\n }\n : null;\n}\n\nexport function isRangeSingleCell(a: RangeArea): boolean {\n return a.x === a.x1 && a.y === a.y1;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -6,7 +6,7 @@ type Config = {
6
6
  change(val?: any): void;
7
7
  cancel(): void;
8
8
  clearCell(): void;
9
- focusNext(focus: Cell, next: Partial<Cell>): boolean;
9
+ focus(focus: Cell, changes: Partial<Cell>, focusNextViewport?: number): boolean;
10
10
  getData(): any;
11
11
  internalPaste(): void;
12
12
  range(range: RangeArea): boolean;
@@ -81,6 +81,11 @@ export declare class OverlaySelection {
81
81
  * Before cell focus.
82
82
  */
83
83
  beforeFocusCell: EventEmitter<BeforeSaveDataDetails>;
84
+ /**
85
+ * Fired when change of viewport happens.
86
+ * Usually when we switch between pinned regions.
87
+ */
88
+ beforeNextViewportFocus: EventEmitter<Cell>;
84
89
  /**
85
90
  * Set edit cell.
86
91
  */
@@ -160,6 +165,7 @@ export declare class OverlaySelection {
160
165
  private autoFillService;
161
166
  private orderEditor;
162
167
  private revogrEdit;
168
+ private unsubscribeSelectionStore;
163
169
  onMouseMove(e: MouseEvent | TouchEvent): void;
164
170
  /**
165
171
  * Action finished inside of the document.
@@ -181,7 +187,9 @@ export declare class OverlaySelection {
181
187
  * This event is fired when keyboard key is pressed.
182
188
  */
183
189
  onKeyDown(e: KeyboardEvent): void;
184
- /** Selection & Keyboard */
190
+ /**
191
+ * Selection & Keyboard
192
+ */
185
193
  selectionServiceSet(s: Observable<SelectionStoreState>): void;
186
194
  /** Autofill */
187
195
  createAutoFillService(): void;
@@ -1016,6 +1016,7 @@ declare global {
1016
1016
  "beforepasteregion": any;
1017
1017
  "celleditapply": BeforeSaveDataDetails;
1018
1018
  "beforecellfocusinit": BeforeSaveDataDetails;
1019
+ "beforenextvpfocus": Cell1;
1019
1020
  "setedit": BeforeEdit;
1020
1021
  "beforeapplyrange": FocusRenderEvent;
1021
1022
  "beforesetrange": any;
@@ -1922,6 +1923,10 @@ declare namespace LocalJSX {
1922
1923
  * Before key down event proxy, used to prevent key down trigger. If you have some custom behaviour event, use this event to check if it wasn't processed by internal logic. Call preventDefault().
1923
1924
  */
1924
1925
  "onBeforekeyup"?: (event: RevogrOverlaySelectionCustomEvent<KeyboardEvent>) => void;
1926
+ /**
1927
+ * Fired when change of viewport happens. Usually when we switch between pinned regions.
1928
+ */
1929
+ "onBeforenextvpfocus"?: (event: RevogrOverlaySelectionCustomEvent<Cell1>) => void;
1925
1930
  /**
1926
1931
  * Before region paste happened.
1927
1932
  */
@@ -8,16 +8,16 @@ type WatchConfig = {
8
8
  * Extend this class to create plugin
9
9
  */
10
10
  export declare class BasePlugin implements PluginBaseComponent {
11
- protected revogrid: HTMLRevoGridElement;
12
- protected providers: PluginProviders;
13
- protected readonly subscriptions: Record<string, (...args: any[]) => void>;
11
+ revogrid: HTMLRevoGridElement;
12
+ providers: PluginProviders;
13
+ readonly subscriptions: Record<string, (...args: any[]) => void>;
14
14
  constructor(revogrid: HTMLRevoGridElement, providers: PluginProviders);
15
15
  /**
16
16
  *
17
17
  * @param eventName - event name to subscribe to in revo-grid component (e.g. 'beforeheaderclick')
18
18
  * @param callback - callback function for event
19
19
  */
20
- protected addEventListener(eventName: string, callback: (e: CustomEvent) => void): void;
20
+ addEventListener(eventName: string, callback: (e: CustomEvent) => void): void;
21
21
  /**
22
22
  * Subscribe to property change in revo-grid component
23
23
  * You can return false in callback to prevent default value set
@@ -26,21 +26,21 @@ export declare class BasePlugin implements PluginBaseComponent {
26
26
  * @param callback - callback function
27
27
  * @param immediate - trigger callback immediately with current value
28
28
  */
29
- protected watch<T extends any>(prop: string, callback: (arg: T) => boolean | void, { immediate }?: Partial<WatchConfig>): void;
29
+ watch<T extends any>(prop: string, callback: (arg: T) => boolean | void, { immediate }?: Partial<WatchConfig>): void;
30
30
  /**
31
31
  * Remove event listener
32
32
  * @param eventName
33
33
  */
34
- protected removeEventListener(eventName: string): void;
34
+ removeEventListener(eventName: string): void;
35
35
  /**
36
36
  * Emit event from revo-grid component
37
37
  * Event can be cancelled by calling event.preventDefault() in callback
38
38
  */
39
- protected emit(eventName: string, detail?: any): CustomEvent<any>;
39
+ emit(eventName: string, detail?: any): CustomEvent<any>;
40
40
  /**
41
41
  * Clear all subscriptions
42
42
  */
43
- protected clearSubscriptions(): void;
43
+ clearSubscriptions(): void;
44
44
  /**
45
45
  * Destroy plugin and clear all subscriptions
46
46
  */
@@ -1,5 +1,15 @@
1
1
  import { BasePlugin } from './base.plugin';
2
+ import { ColumnItems } from '../services/dimension.provider';
3
+ import { DimensionCols, ColumnRegular, DataType, BeforeSaveDataDetails, BeforeRangeSaveDataDetails } from "../types/index";
2
4
  import { PluginProviders } from '../';
5
+ interface Column extends ColumnRegular {
6
+ index: number;
7
+ }
8
+ type AutoSizeColumns = Record<DimensionCols, ColumnRecords>;
9
+ type ColumnRecords = Record<any, Column>;
10
+ type EditEvent = BeforeSaveDataDetails | BeforeRangeSaveDataDetails;
11
+ type Resolve = (cols: Partial<AutoSizeColumns>) => void;
12
+ type Reject = () => void;
3
13
  export type AutoSizeColumnConfig = {
4
14
  mode?: ColumnAutoSizeMode;
5
15
  /**
@@ -23,25 +33,25 @@ declare enum ColumnAutoSizeMode {
23
33
  autoSizeAll = "autoSizeAll"
24
34
  }
25
35
  export default class AutoSizeColumnPlugin extends BasePlugin {
26
- protected providers: PluginProviders;
27
- private config?;
28
- private autoSizeColumns;
29
- private readonly letterBlockSize;
36
+ providers: PluginProviders;
37
+ config?: AutoSizeColumnConfig;
38
+ autoSizeColumns: Partial<AutoSizeColumns> | null;
39
+ readonly letterBlockSize: number;
30
40
  /** for config option when @preciseSize enabled */
31
- private readonly precsizeCalculationArea;
41
+ readonly precsizeCalculationArea: HTMLElement;
32
42
  /** for edge case when no columns defined before data */
33
- private dataResolve;
34
- private dataReject;
43
+ dataResolve: Resolve | null;
44
+ dataReject: Reject | null;
35
45
  constructor(revogrid: HTMLRevoGridElement, providers: PluginProviders, config?: AutoSizeColumnConfig);
36
- private setSource;
37
- private getLength;
38
- private afteredit;
39
- private afterEditAll;
40
- private getColumnSize;
41
- private columnSet;
42
- private clearPromise;
43
- private isRangeEdit;
44
- private initiatePresizeElement;
46
+ setSource(source: DataType[]): Promise<void>;
47
+ getLength(len?: any): number;
48
+ afteredit(e: EditEvent): void;
49
+ afterEditAll(e: EditEvent): void;
50
+ getColumnSize(index: number, type: DimensionCols): number;
51
+ columnSet(columns: ColumnItems): void;
52
+ clearPromise(): void;
53
+ isRangeEdit(e: EditEvent): e is BeforeRangeSaveDataDetails;
54
+ initiatePresizeElement(): HTMLElement;
45
55
  destroy(): void;
46
56
  }
47
57
  export {};
@@ -3,7 +3,7 @@ import { BasePlugin } from './base.plugin';
3
3
  import { PluginBaseComponent } from '../';
4
4
  import { PluginProviders } from '../';
5
5
  export default class StretchColumn extends BasePlugin {
6
- protected providers: PluginProviders;
6
+ providers: PluginProviders;
7
7
  private stretchedColumn;
8
8
  private readonly scrollSize;
9
9
  constructor(revogrid: HTMLRevoGridElement, providers: PluginProviders);
@@ -9,6 +9,6 @@ type Props = {
9
9
  };
10
10
  export declare const FilterButton: ({ column }: Props) => any;
11
11
  export declare const TrashButton: () => any;
12
- export declare const AndOrButton: ({ isAnd }: any) => any;
12
+ export declare const AndOrButton: ({ text }: any) => any;
13
13
  export declare function isFilterBtn(e: HTMLElement): true | Element;
14
14
  export {};
@@ -14,6 +14,10 @@ export type FilterCaptions = {
14
14
  save: string;
15
15
  reset: string;
16
16
  cancel: string;
17
+ add: string;
18
+ placeholder: string;
19
+ and: string;
20
+ or: string;
17
21
  };
18
22
  export type FilterLocalization = {
19
23
  captions: FilterCaptions;
@@ -42,6 +46,7 @@ export type ColumnFilterConfig = {
42
46
  multiFilterItems?: MultiFilterItem;
43
47
  disableDynamicFiltering?: boolean;
44
48
  };
49
+ type HeaderEvent = CustomEvent<ColumnRegular>;
45
50
  type FilterCollectionItem = {
46
51
  filter: LogicFunction;
47
52
  type: FilterType;
@@ -51,27 +56,30 @@ export type FilterCollection = Record<ColumnProp, FilterCollectionItem>;
51
56
  export declare const FILTER_TRIMMED_TYPE = "filter";
52
57
  export declare const FILTER_CONFIG_CHANGED_EVENT = "filterconfigchanged";
53
58
  export declare class FilterPlugin extends BasePlugin {
54
- protected revogrid: HTMLRevoGridElement;
55
- private pop;
56
- private filterCollection;
57
- private multiFilterItems;
58
- private possibleFilters;
59
- private possibleFilterNames;
60
- private possibleFilterEntities;
61
- private filterProp;
59
+ revogrid: HTMLRevoGridElement;
60
+ pop: HTMLRevogrFilterPanelElement;
61
+ filterCollection: FilterCollection;
62
+ multiFilterItems: MultiFilterItem;
63
+ possibleFilters: Record<string, string[]>;
64
+ possibleFilterNames: Record<string, string>;
65
+ possibleFilterEntities: Record<string, LogicFunction>;
66
+ filterProp: string;
62
67
  constructor(revogrid: HTMLRevoGridElement, providers: PluginProviders, uiid: string, config?: ColumnFilterConfig);
63
- private initConfig;
64
- private headerclick;
65
- private getColumnFilter;
66
- private isValidType;
67
- private onFilterChange;
68
+ initConfig(config: ColumnFilterConfig): void;
69
+ headerclick(e: HeaderEvent): Promise<void>;
70
+ getColumnFilter(type?: boolean | string | string[]): Record<string, string[]>;
71
+ isValidType(type: any): type is string;
72
+ onFilterChange(filterItems: MultiFilterItem): Promise<void>;
68
73
  /**
69
74
  * Triggers grid filtering
70
75
  */
71
76
  doFiltering(collection: FilterCollection, items: DataType[], columns: ColumnRegular[], filterItems: MultiFilterItem): Promise<void>;
72
77
  clearFiltering(): Promise<void>;
73
- private runFiltering;
74
- private getData;
75
- private getRowFilter;
78
+ runFiltering(): Promise<void>;
79
+ getData(): Promise<{
80
+ source: DataType[];
81
+ columns: ColumnRegular[];
82
+ }>;
83
+ getRowFilter(rows: DataType[], filterItems: MultiFilterItem): Record<number, boolean>;
76
84
  }
77
85
  export {};
@@ -4,8 +4,8 @@ import { GroupingOptions } from './grouping.row.types';
4
4
  import { DataType, DimensionRows, PluginProviders } from "../../types/index";
5
5
  import { Observable } from '../../utils/store.utils';
6
6
  export default class GroupingRowPlugin extends BasePlugin {
7
- protected revogrid: HTMLRevoGridElement;
8
- protected providers: PluginProviders;
7
+ revogrid: HTMLRevoGridElement;
8
+ providers: PluginProviders;
9
9
  private options;
10
10
  get hasProps(): number;
11
11
  get store(): Observable<DSourceState<DataType, DimensionRows>>;
@@ -28,8 +28,8 @@ export type EventData = {
28
28
  type: DimensionCols;
29
29
  };
30
30
  export default class ColumnPlugin extends BasePlugin {
31
- protected revogrid: HTMLRevoGridElement;
32
- protected providers: PluginProviders;
31
+ revogrid: HTMLRevoGridElement;
32
+ providers: PluginProviders;
33
33
  private moveFunc;
34
34
  private staticDragData;
35
35
  private dragData;
@@ -46,7 +46,7 @@ export default class ColumnPlugin extends BasePlugin {
46
46
  /**
47
47
  * Clearing subscription
48
48
  */
49
- protected clearSubscriptions(): void;
49
+ clearSubscriptions(): void;
50
50
  private getData;
51
51
  private getDimension;
52
52
  }
@@ -12,15 +12,15 @@ type SortingOrderFunction = Record<ColumnProp, CellCompareFunc | undefined>;
12
12
  * Note: If you prevent an event, it will not proceed to the subsequent steps.
13
13
  */
14
14
  export default class SortingPlugin extends BasePlugin {
15
- protected revogrid: HTMLRevoGridElement;
16
- private sorting;
17
- private sortingFunc;
18
- private sortingPromise;
19
- private postponeSort;
20
- private runSorting;
15
+ revogrid: HTMLRevoGridElement;
16
+ sorting: SortingOrder | null;
17
+ sortingFunc: SortingOrderFunction | null;
18
+ sortingPromise: (() => void) | null;
19
+ postponeSort: import("lodash").DebouncedFunc<(order: SortingOrder, comparison: SortingOrderFunction) => Promise<void>>;
20
+ runSorting(order: SortingOrder, comparison: SortingOrderFunction): Promise<void>;
21
21
  constructor(revogrid: HTMLRevoGridElement, providers: PluginProviders);
22
- private startSorting;
23
- private getComparer;
22
+ startSorting(order: SortingOrder, sortingFunc: SortingOrderFunction): void;
23
+ getComparer(column: ColumnRegular, order: Order): CellCompareFunc;
24
24
  /**
25
25
  * Apply sorting to data on header click
26
26
  * If additive - add to existing sorting, multiple columns can be sorted
@@ -42,11 +42,31 @@ export default class SelectionStoreConnector {
42
42
  register({ x, y }: Cell): SelectionStore;
43
43
  private destroy;
44
44
  setEditByCell<T extends Cell>(storePos: T, editCell: T): void;
45
+ /**
46
+ * Sets the next focus cell before the current one.
47
+ *
48
+ * @param focus - The cell to set as the next focus.
49
+ */
50
+ beforeNextFocusCell(focus: Cell): void;
45
51
  focusByCell<T extends Cell>(storePos: T, start: T, end: T): void;
46
52
  focus(store: SelectionStore, { focus, end }: {
47
53
  focus: Cell;
48
54
  end: Cell;
49
55
  }): Cell;
56
+ /**
57
+ * Retrieves the current store pointer based on the active store.
58
+ * Clears focus from all stores except the active one.
59
+ */
60
+ getCurrentStorePointer(store: SelectionStore): Cell;
61
+ /**
62
+ * Retrieves the next store based on the focus cell and current store pointer.
63
+ * If the next store exists, returns an object with the next store and the item in the new store.
64
+ * If the next store does not exist, returns null.
65
+ */
66
+ getNextStore(focus: Cell, currentStorePointer: Cell, lastCell: Cell): {
67
+ store: SelectionStore;
68
+ item: Partial<Cell>;
69
+ };
50
70
  clearAll(): void;
51
71
  setEdit(val: string | boolean): void;
52
72
  /**
@@ -10,6 +10,7 @@ export declare class SelectionStore {
10
10
  onChange<Key extends keyof SelectionStoreState>(propName: Key, cb: (newValue: SelectionStoreState[Key]) => void): void;
11
11
  clearFocus(): void;
12
12
  setFocus(focus: Cell, end?: Cell): void;
13
+ setNextFocus(focus: Cell): void;
13
14
  setTempArea(range: TempRange | null): void;
14
15
  clearTemp(): void;
15
16
  /** Can be applied from selection change or from simple keyboard change clicks */
@@ -597,7 +597,7 @@ export interface BeforeRowRenderEvent<T = any> extends AllDimensionType {
597
597
  /**
598
598
  * Represents the data item being rendered.
599
599
  */
600
- dataItem: T;
600
+ model: T;
601
601
  /**
602
602
  * Represents the item being rendered.
603
603
  */
@@ -646,7 +646,7 @@ export interface FocusRenderEvent extends AllDimensionType {
646
646
  */
647
647
  range: RangeArea;
648
648
  /**
649
- * Represents the next cell to focus.
649
+ * Changes for the next cell to focus. @example { y: -1 }
650
650
  */
651
651
  next?: Partial<Cell>;
652
652
  }
@@ -1,9 +1,32 @@
1
+ /**
2
+ * Interface for plugin components
3
+ */
1
4
  export interface PluginBaseComponent {
5
+ /**
6
+ * Cleans up plugin's resources
7
+ */
2
8
  destroy(): void;
3
9
  }
10
+ /**
11
+ * Interface for plugin constructors
12
+ *
13
+ * @param revogrid - The RevoGrid component instance
14
+ * @param ...[] - Additional parameters for the plugin constructor
15
+ *
16
+ * @returns The created plugin component instance
17
+ */
4
18
  export interface PluginConstructor {
5
19
  new (revogrid: HTMLRevoGridElement, ...[]: Iterable<any>): PluginBaseComponent;
6
20
  }
21
+ /**
22
+ * Interface for plugin constructors that expect a providers object
23
+ *
24
+ * @param revogrid - The RevoGrid component instance
25
+ * @param providers - The providers object to inject into the plugin's template
26
+ * @param ...[] - Additional parameters for the plugin constructor
27
+ *
28
+ * @returns The created plugin component instance
29
+ */
7
30
  export interface PluginExternalConstructor {
8
31
  new (revogrid: HTMLRevoGridElement, providers: Record<string, any>, ...[]: Iterable<any>): PluginBaseComponent;
9
32
  }