@revolist/revogrid 4.9.4 → 4.9.6

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 (203) hide show
  1. package/dist/cjs/{column.service-01f4a6c7.js → column.service-0615a373.js} +11 -12
  2. package/dist/cjs/column.service-0615a373.js.map +1 -0
  3. package/dist/cjs/{base.plugin-bf5f43a0.js → column.utils-694677fa.js} +136 -11
  4. package/dist/cjs/column.utils-694677fa.js.map +1 -0
  5. package/dist/cjs/edit.utils-2e1f4278.js +20 -0
  6. package/dist/cjs/edit.utils-2e1f4278.js.map +1 -0
  7. package/dist/cjs/{events-b28cc194.js → events-af8f6914.js} +1 -8
  8. package/dist/cjs/events-af8f6914.js.map +1 -0
  9. package/dist/cjs/{header-cell-renderer-3bc70679.js → header-cell-renderer-360528aa.js} +2 -2
  10. package/dist/cjs/{header-cell-renderer-3bc70679.js.map → header-cell-renderer-360528aa.js.map} +1 -1
  11. package/dist/cjs/{dimension.helpers-a6788214.js → index-2991afbb.js} +262 -4
  12. package/dist/cjs/index-2991afbb.js.map +1 -0
  13. package/dist/cjs/index.cjs.js +97 -35
  14. package/dist/cjs/index.cjs.js.map +1 -1
  15. package/dist/cjs/key.utils-b84b0eba.js +111 -0
  16. package/dist/cjs/key.utils-b84b0eba.js.map +1 -0
  17. package/dist/cjs/revo-grid.cjs.entry.js +140 -311
  18. package/dist/cjs/revo-grid.cjs.entry.js.map +1 -1
  19. package/dist/cjs/revogr-attribution_6.cjs.entry.js +37 -37
  20. package/dist/cjs/revogr-attribution_6.cjs.entry.js.map +1 -1
  21. package/dist/cjs/revogr-clipboard_3.cjs.entry.js +10 -10
  22. package/dist/cjs/revogr-clipboard_3.cjs.entry.js.map +1 -1
  23. package/dist/cjs/revogr-data_4.cjs.entry.js +13 -14
  24. package/dist/cjs/revogr-data_4.cjs.entry.js.map +1 -1
  25. package/dist/cjs/{viewport.store-35a3e7ee.js → row-header-utils-b5266b12.js} +13 -6
  26. package/dist/cjs/row-header-utils-b5266b12.js.map +1 -0
  27. package/dist/cjs/{selection.helpers-1a8c8d49.js → selection.helpers-4374518f.js} +13 -13
  28. package/dist/cjs/selection.helpers-4374518f.js.map +1 -0
  29. package/dist/cjs/{throttle-52be9e67.js → throttle-8885fd65.js} +2 -2
  30. package/dist/cjs/{throttle-52be9e67.js.map → throttle-8885fd65.js.map} +1 -1
  31. package/dist/collection/components/clipboard/revogr-clipboard.js +2 -2
  32. package/dist/collection/components/clipboard/revogr-clipboard.js.map +1 -1
  33. package/dist/collection/components/editors/revogr-edit.js +1 -1
  34. package/dist/collection/components/header/revogr-header.js +1 -1
  35. package/dist/collection/components/overlay/revogr-overlay-selection.js +1 -1
  36. package/dist/collection/components/revoGrid/revo-grid.js +12 -11
  37. package/dist/collection/components/revoGrid/revo-grid.js.map +1 -1
  38. package/dist/collection/index.js +1 -1
  39. package/dist/collection/index.js.map +1 -1
  40. package/dist/collection/plugins/base.plugin.js.map +1 -1
  41. package/dist/collection/plugins/column.auto-size.plugin.js +2 -2
  42. package/dist/collection/plugins/column.auto-size.plugin.js.map +1 -1
  43. package/dist/collection/plugins/column.stretch.plugin.js.map +1 -1
  44. package/dist/collection/plugins/groupingRow/grouping.row.plugin.js.map +1 -1
  45. package/dist/collection/plugins/moveColumn/column.drag.plugin.js +1 -1
  46. package/dist/collection/plugins/moveColumn/column.drag.plugin.js.map +1 -1
  47. package/dist/collection/plugins/sorting/sorting.plugin.js +2 -2
  48. package/dist/collection/plugins/sorting/sorting.plugin.js.map +1 -1
  49. package/dist/collection/services/column.data.provider.js +32 -88
  50. package/dist/collection/services/column.data.provider.js.map +1 -1
  51. package/dist/collection/services/dimension.provider.js +2 -2
  52. package/dist/collection/services/dimension.provider.js.map +1 -1
  53. package/dist/collection/types/interfaces.js.map +1 -1
  54. package/dist/collection/utils/column.utils.js +124 -0
  55. package/dist/collection/utils/column.utils.js.map +1 -0
  56. package/dist/collection/utils/index.js +7 -0
  57. package/dist/collection/utils/index.js.map +1 -1
  58. package/dist/esm/{column.service-5d14e7e9.js → column.service-af0694c5.js} +3 -4
  59. package/dist/esm/column.service-af0694c5.js.map +1 -0
  60. package/dist/esm/{base.plugin-5e7a3c51.js → column.utils-78dd3ef2.js} +122 -3
  61. package/dist/esm/column.utils-78dd3ef2.js.map +1 -0
  62. package/dist/esm/edit.utils-ca303802.js +17 -0
  63. package/dist/esm/edit.utils-ca303802.js.map +1 -0
  64. package/dist/esm/{events-77b43b40.js → events-cf0893a3.js} +2 -8
  65. package/dist/esm/events-cf0893a3.js.map +1 -0
  66. package/dist/esm/{header-cell-renderer-fc999784.js → header-cell-renderer-261317c3.js} +2 -2
  67. package/dist/esm/{header-cell-renderer-fc999784.js.map → header-cell-renderer-261317c3.js.map} +1 -1
  68. package/dist/esm/{dimension.helpers-56298828.js → index-f65def08.js} +231 -4
  69. package/dist/esm/index-f65def08.js.map +1 -0
  70. package/dist/esm/index.js +5 -4
  71. package/dist/esm/index.js.map +1 -1
  72. package/dist/esm/key.utils-4b0093d5.js +98 -0
  73. package/dist/esm/key.utils-4b0093d5.js.map +1 -0
  74. package/dist/esm/revo-grid.entry.js +50 -221
  75. package/dist/esm/revo-grid.entry.js.map +1 -1
  76. package/dist/esm/revogr-attribution_6.entry.js +8 -8
  77. package/dist/esm/revogr-clipboard_3.entry.js +5 -5
  78. package/dist/esm/revogr-clipboard_3.entry.js.map +1 -1
  79. package/dist/esm/revogr-data_4.entry.js +5 -6
  80. package/dist/esm/revogr-data_4.entry.js.map +1 -1
  81. package/dist/esm/{viewport.store-d8e03528.js → row-header-utils-6081260c.js} +9 -3
  82. package/dist/esm/row-header-utils-6081260c.js.map +1 -0
  83. package/dist/esm/{selection.helpers-accaad4a.js → selection.helpers-d92697e1.js} +2 -2
  84. package/dist/esm/{selection.helpers-accaad4a.js.map → selection.helpers-d92697e1.js.map} +1 -1
  85. package/dist/esm/{throttle-7283692c.js → throttle-041ded8e.js} +2 -2
  86. package/dist/esm/{throttle-7283692c.js.map → throttle-041ded8e.js.map} +1 -1
  87. package/dist/revo-grid/column.service-af0694c5.js +5 -0
  88. package/dist/revo-grid/{column.service-5d14e7e9.js.map → column.service-af0694c5.js.map} +1 -1
  89. package/dist/revo-grid/column.utils-78dd3ef2.js +5 -0
  90. package/dist/revo-grid/column.utils-78dd3ef2.js.map +1 -0
  91. package/dist/revo-grid/edit.utils-ca303802.js +5 -0
  92. package/dist/revo-grid/edit.utils-ca303802.js.map +1 -0
  93. package/dist/revo-grid/events-cf0893a3.js +5 -0
  94. package/dist/revo-grid/events-cf0893a3.js.map +1 -0
  95. package/dist/revo-grid/{header-cell-renderer-fc999784.js → header-cell-renderer-261317c3.js} +2 -2
  96. package/dist/revo-grid/index-f65def08.js +5 -0
  97. package/dist/revo-grid/index-f65def08.js.map +1 -0
  98. package/dist/revo-grid/index.esm.js +1 -1
  99. package/dist/revo-grid/key.utils-4b0093d5.js +5 -0
  100. package/dist/revo-grid/key.utils-4b0093d5.js.map +1 -0
  101. package/dist/revo-grid/revo-grid.entry.js +1 -1
  102. package/dist/revo-grid/revo-grid.entry.js.map +1 -1
  103. package/dist/revo-grid/revogr-attribution_6.entry.js +1 -1
  104. package/dist/revo-grid/revogr-clipboard_3.entry.js +1 -1
  105. package/dist/revo-grid/revogr-clipboard_3.entry.js.map +1 -1
  106. package/dist/revo-grid/revogr-data_4.entry.js +1 -1
  107. package/dist/revo-grid/revogr-data_4.entry.js.map +1 -1
  108. package/dist/revo-grid/row-header-utils-6081260c.js +5 -0
  109. package/dist/revo-grid/row-header-utils-6081260c.js.map +1 -0
  110. package/dist/revo-grid/selection.helpers-d92697e1.js +5 -0
  111. package/dist/revo-grid/{selection.helpers-accaad4a.js.map → selection.helpers-d92697e1.js.map} +1 -1
  112. package/dist/revo-grid/{throttle-7283692c.js → throttle-041ded8e.js} +2 -2
  113. package/dist/types/components/revoGrid/revo-grid.d.ts +2 -1
  114. package/dist/types/components.d.ts +2 -2
  115. package/dist/types/index.d.ts +1 -1
  116. package/dist/types/plugins/base.plugin.d.ts +1 -1
  117. package/dist/types/plugins/column.auto-size.plugin.d.ts +2 -4
  118. package/dist/types/plugins/column.stretch.plugin.d.ts +2 -4
  119. package/dist/types/services/column.data.provider.d.ts +2 -13
  120. package/dist/types/services/dimension.provider.d.ts +0 -1
  121. package/dist/types/types/interfaces.d.ts +11 -11
  122. package/dist/types/utils/column.utils.d.ts +46 -0
  123. package/dist/types/utils/index.d.ts +7 -0
  124. package/hydrate/index.js +304 -357
  125. package/hydrate/index.mjs +304 -357
  126. package/package.json +2 -2
  127. package/standalone/_stringToPath.js +1389 -0
  128. package/standalone/_stringToPath.js.map +1 -0
  129. package/standalone/column.service.js +4 -3
  130. package/standalone/column.service.js.map +1 -1
  131. package/standalone/consts.js +1 -1
  132. package/standalone/data.store.js +31 -1410
  133. package/standalone/data.store.js.map +1 -1
  134. package/standalone/debounce.js +2 -1
  135. package/standalone/debounce.js.map +1 -1
  136. package/standalone/dimension.helpers.js +2 -2
  137. package/standalone/index.js +6 -3
  138. package/standalone/index.js.map +1 -1
  139. package/standalone/index2.js +160 -1
  140. package/standalone/index2.js.map +1 -1
  141. package/standalone/isObjectLike.js +195 -0
  142. package/standalone/isObjectLike.js.map +1 -0
  143. package/standalone/revo-grid.js +168 -218
  144. package/standalone/revo-grid.js.map +1 -1
  145. package/standalone/revogr-clipboard2.js +2 -2
  146. package/standalone/revogr-clipboard2.js.map +1 -1
  147. package/standalone/revogr-data2.js +3 -2
  148. package/standalone/revogr-data2.js.map +1 -1
  149. package/standalone/revogr-edit.js +1 -1
  150. package/standalone/revogr-edit2.js +57 -83
  151. package/standalone/revogr-edit2.js.map +1 -1
  152. package/standalone/revogr-focus2.js +2 -1
  153. package/standalone/revogr-focus2.js.map +1 -1
  154. package/standalone/revogr-header2.js +4 -3
  155. package/standalone/revogr-header2.js.map +1 -1
  156. package/standalone/revogr-order-editor2.js +3 -2
  157. package/standalone/revogr-order-editor2.js.map +1 -1
  158. package/standalone/revogr-overlay-selection2.js +5 -5
  159. package/standalone/revogr-row-headers2.js +3 -2
  160. package/standalone/revogr-row-headers2.js.map +1 -1
  161. package/standalone/selection.utils.js +2 -1
  162. package/standalone/selection.utils.js.map +1 -1
  163. package/standalone/throttle.js +1 -1
  164. package/standalone/toNumber.js +2 -189
  165. package/standalone/toNumber.js.map +1 -1
  166. package/dist/cjs/base.plugin-bf5f43a0.js.map +0 -1
  167. package/dist/cjs/column.service-01f4a6c7.js.map +0 -1
  168. package/dist/cjs/dimension.helpers-a6788214.js.map +0 -1
  169. package/dist/cjs/events-b28cc194.js.map +0 -1
  170. package/dist/cjs/index-2410bbd9.js +0 -103
  171. package/dist/cjs/index-2410bbd9.js.map +0 -1
  172. package/dist/cjs/key.utils-1e48ab8f.js +0 -144
  173. package/dist/cjs/key.utils-1e48ab8f.js.map +0 -1
  174. package/dist/cjs/selection.helpers-1a8c8d49.js.map +0 -1
  175. package/dist/cjs/viewport.store-35a3e7ee.js.map +0 -1
  176. package/dist/collection/plugins/groupingColumn/grouping.col.plugin.js +0 -43
  177. package/dist/collection/plugins/groupingColumn/grouping.col.plugin.js.map +0 -1
  178. package/dist/esm/base.plugin-5e7a3c51.js.map +0 -1
  179. package/dist/esm/column.service-5d14e7e9.js.map +0 -1
  180. package/dist/esm/dimension.helpers-56298828.js.map +0 -1
  181. package/dist/esm/events-77b43b40.js.map +0 -1
  182. package/dist/esm/index-4e881436.js +0 -77
  183. package/dist/esm/index-4e881436.js.map +0 -1
  184. package/dist/esm/key.utils-425c987d.js +0 -133
  185. package/dist/esm/key.utils-425c987d.js.map +0 -1
  186. package/dist/esm/viewport.store-d8e03528.js.map +0 -1
  187. package/dist/revo-grid/base.plugin-5e7a3c51.js +0 -5
  188. package/dist/revo-grid/base.plugin-5e7a3c51.js.map +0 -1
  189. package/dist/revo-grid/column.service-5d14e7e9.js +0 -5
  190. package/dist/revo-grid/dimension.helpers-56298828.js +0 -5
  191. package/dist/revo-grid/dimension.helpers-56298828.js.map +0 -1
  192. package/dist/revo-grid/events-77b43b40.js +0 -5
  193. package/dist/revo-grid/events-77b43b40.js.map +0 -1
  194. package/dist/revo-grid/index-4e881436.js +0 -5
  195. package/dist/revo-grid/index-4e881436.js.map +0 -1
  196. package/dist/revo-grid/key.utils-425c987d.js +0 -5
  197. package/dist/revo-grid/key.utils-425c987d.js.map +0 -1
  198. package/dist/revo-grid/selection.helpers-accaad4a.js +0 -5
  199. package/dist/revo-grid/viewport.store-d8e03528.js +0 -5
  200. package/dist/revo-grid/viewport.store-d8e03528.js.map +0 -1
  201. package/dist/types/plugins/groupingColumn/grouping.col.plugin.d.ts +0 -17
  202. /package/dist/revo-grid/{header-cell-renderer-fc999784.js.map → header-cell-renderer-261317c3.js.map} +0 -0
  203. /package/dist/revo-grid/{throttle-7283692c.js.map → throttle-041ded8e.js.map} +0 -0
@@ -1 +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","entries","nextItemCoord","getXStores","getYStores","nextLastCell","clearAll","selectAll","i","pos","types","t","croppedCell","cellCoordinates","coordinate","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, Nullable } 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: Nullable<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 | null) {\n setStore(this.store, { range, edit: null, tempRange: null });\n }\n setRange(start: Cell, end: Cell) {\n const range = getRange(start, end);\n this.setRangeArea(range);\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} 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() {\n return this.focusedStore?.entity.store.get('edit');\n }\n\n get focused() {\n return this.focusedStore?.entity.store.get('focus');\n }\n\n get selectedRange() {\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 lastCell = this.focusedStore.entity.store.get('lastCell');\n const next = lastCell && this.getNextStore(focus, this.focusedStore.position, 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 = lastCell && 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 if (lastCell) {\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) {\n let currentStorePointer: Cell | undefined;\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 | undefined;\n if (nextItem) {\n Object.entries(nextItem).forEach(([type, nextItemCoord]: [keyof Cell, number]) => {\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 break;\n }\n\n // Get the next store based on the item in the new store\n if (nextItemCoord >= 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] + nextItemCoord;\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 if (lastCell) {\n store.setRange(\n { x: 0, y: 0 },\n { x: lastCell.x - 1, y: lastCell.y - 1 },\n );\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 croppedCell: Cell = { ...cell };\n const cellCoordinates: (keyof Cell)[] = ['x', 'y'];\n\n for (const coordinate of cellCoordinates) {\n if (cell[coordinate] < 0) {\n croppedCell[coordinate] = 0;\n } else if (cell[coordinate] >= lastCell[coordinate]) {\n croppedCell[coordinate] = lastCell[coordinate] - 1;\n }\n }\n\n return croppedCell;\n}\n\nexport function getRange(start?: Cell | null, end?: Cell | null): 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":[]}
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","entries","nextItemCoord","getXStores","getYStores","nextLastCell","clearAll","selectAll","i","pos","types","t","croppedCell","cellCoordinates","coordinate","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, Nullable } 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: Nullable<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 | null) {\n setStore(this.store, { range, edit: null, tempRange: null });\n }\n setRange(start: Cell, end: Cell) {\n const range = getRange(start, end);\n this.setRangeArea(range);\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} 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() {\n return this.focusedStore?.entity.store.get('edit');\n }\n\n get focused() {\n return this.focusedStore?.entity.store.get('focus');\n }\n\n get selectedRange() {\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 lastCell = this.focusedStore.entity.store.get('lastCell');\n const next = lastCell && this.getNextStore(focus, this.focusedStore.position, 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 = lastCell && 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 if (lastCell) {\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) {\n let currentStorePointer: Cell | undefined;\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 | undefined;\n if (nextItem) {\n Object.entries(nextItem).forEach(([type, nextItemCoord]: [keyof Cell, number]) => {\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 break;\n }\n\n // Get the next store based on the item in the new store\n if (nextItemCoord >= 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] + nextItemCoord;\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 if (lastCell) {\n store.setRange(\n { x: 0, y: 0 },\n { x: lastCell.x - 1, y: lastCell.y - 1 },\n );\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 croppedCell: Cell = { ...cell };\n const cellCoordinates: (keyof Cell)[] = ['x', 'y'];\n\n for (const coordinate of cellCoordinates) {\n if (cell[coordinate] < 0) {\n croppedCell[coordinate] = 0;\n } else if (cell[coordinate] >= lastCell[coordinate]) {\n croppedCell[coordinate] = lastCell[coordinate] - 1;\n }\n }\n\n return croppedCell;\n}\n\nexport function getRange(start?: Cell | null, end?: Cell | null): 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":[]}
@@ -1,5 +1,5 @@
1
1
  /*!
2
2
  * Built by Revolist OU ❤️
3
3
  */
4
- import{s as t}from"./index-4e881436.js";import{d as i}from"./debounce-7781346d.js";import{i as r}from"./toNumber-8de324a7.js";const s={contentSize:0,clientSize:0,virtualSize:0,maxSize:0};const e=-1;function n(t,i,r=0){return t+(r?i-r:0)}class o{constructor(t){this.cfg=t;this.preventArtificialScroll={rgRow:null,rgCol:null};this.previousScroll={rgRow:e,rgCol:e};this.params={rgRow:Object.assign({},s),rgCol:Object.assign({},s)}}setParams(t,i){const r=n(t.contentSize,t.clientSize,t.virtualSize);this.params[i]=Object.assign(Object.assign({},t),{maxSize:r-t.clientSize,virtualContentSize:r})}async setScroll(t){this.cancelScroll(t.dimension);const i=new Promise(((i,r)=>{if(this.cfg.skipAnimationFrame){return i()}const s=window.requestAnimationFrame((()=>{i()}));this.preventArtificialScroll[t.dimension]=r.bind(null,s)}));try{await i;const r=this.getParams(t.dimension);t.coordinate=Math.ceil(t.coordinate);this.previousScroll[t.dimension]=this.wrapCoordinate(t.coordinate,r);this.preventArtificialScroll[t.dimension]=null;this.cfg.applyScroll(Object.assign(Object.assign({},t),{coordinate:r.virtualSize?this.convert(t.coordinate,r,false):t.coordinate}))}catch(t){window.cancelAnimationFrame(t)}}scroll(t,i,r=false,s,n=false){this.cancelScroll(i);if(!r&&this.previousScroll[i]===t){this.previousScroll[i]=e;return}const o=this.getParams(i);this.cfg.runScroll({dimension:i,coordinate:o.virtualSize?this.convert(t,o):t,delta:s,outside:n})}getParams(t){return this.params[t]}wrapCoordinate(t,i){if(t<0){return e}if(typeof i.maxSize==="number"&&t>i.maxSize){return i.maxSize}return t}cancelScroll(t){var i,r;(r=(i=this.preventArtificialScroll)[t])===null||r===void 0?void 0:r.call(i);this.preventArtificialScroll[t]=null}convert(i,r,s=true){var e;const n=r.clientSize;const o=[0,((e=r.virtualContentSize)!==null&&e!==void 0?e:n)-n];const a=[0,r.contentSize-r.virtualSize];if(s){return t(i,o,a)}return t(i,a,o)}}class a{constructor(t=10){this.scrollThrottling=t;this.mouseWheelScrollTimestamp={rgCol:0,rgRow:0};this.lastKnownScrollCoordinate={rgCol:0,rgRow:0}}setCoordinate(t){this.lastKnownScrollCoordinate[t.dimension]=t.coordinate}latestScrollUpdate(t){this.mouseWheelScrollTimestamp[t]=(new Date).getTime()}isReady(t,i){const r=(new Date).getTime()-this.mouseWheelScrollTimestamp[t];return r>this.scrollThrottling&&i!==this.lastKnownScrollCoordinate[t]}}var c=i,l=r;var h="Expected a function";function u(t,i,r){var s=true,e=true;if(typeof t!="function"){throw new TypeError(h)}if(l(r)){s="leading"in r?!!r.leading:s;e="trailing"in r?!!r.trailing:e}return c(t,i,{leading:s,maxWait:i,trailing:e})}var d=u;export{a as L,o as a,n as g,d as t};
5
- //# sourceMappingURL=throttle-7283692c.js.map
4
+ import{o as t}from"./index-f65def08.js";import{d as i}from"./debounce-7781346d.js";import{i as r}from"./toNumber-8de324a7.js";const s={contentSize:0,clientSize:0,virtualSize:0,maxSize:0};const e=-1;function n(t,i,r=0){return t+(r?i-r:0)}class o{constructor(t){this.cfg=t;this.preventArtificialScroll={rgRow:null,rgCol:null};this.previousScroll={rgRow:e,rgCol:e};this.params={rgRow:Object.assign({},s),rgCol:Object.assign({},s)}}setParams(t,i){const r=n(t.contentSize,t.clientSize,t.virtualSize);this.params[i]=Object.assign(Object.assign({},t),{maxSize:r-t.clientSize,virtualContentSize:r})}async setScroll(t){this.cancelScroll(t.dimension);const i=new Promise(((i,r)=>{if(this.cfg.skipAnimationFrame){return i()}const s=window.requestAnimationFrame((()=>{i()}));this.preventArtificialScroll[t.dimension]=r.bind(null,s)}));try{await i;const r=this.getParams(t.dimension);t.coordinate=Math.ceil(t.coordinate);this.previousScroll[t.dimension]=this.wrapCoordinate(t.coordinate,r);this.preventArtificialScroll[t.dimension]=null;this.cfg.applyScroll(Object.assign(Object.assign({},t),{coordinate:r.virtualSize?this.convert(t.coordinate,r,false):t.coordinate}))}catch(t){window.cancelAnimationFrame(t)}}scroll(t,i,r=false,s,n=false){this.cancelScroll(i);if(!r&&this.previousScroll[i]===t){this.previousScroll[i]=e;return}const o=this.getParams(i);this.cfg.runScroll({dimension:i,coordinate:o.virtualSize?this.convert(t,o):t,delta:s,outside:n})}getParams(t){return this.params[t]}wrapCoordinate(t,i){if(t<0){return e}if(typeof i.maxSize==="number"&&t>i.maxSize){return i.maxSize}return t}cancelScroll(t){var i,r;(r=(i=this.preventArtificialScroll)[t])===null||r===void 0?void 0:r.call(i);this.preventArtificialScroll[t]=null}convert(i,r,s=true){var e;const n=r.clientSize;const o=[0,((e=r.virtualContentSize)!==null&&e!==void 0?e:n)-n];const a=[0,r.contentSize-r.virtualSize];if(s){return t(i,o,a)}return t(i,a,o)}}class a{constructor(t=10){this.scrollThrottling=t;this.mouseWheelScrollTimestamp={rgCol:0,rgRow:0};this.lastKnownScrollCoordinate={rgCol:0,rgRow:0}}setCoordinate(t){this.lastKnownScrollCoordinate[t.dimension]=t.coordinate}latestScrollUpdate(t){this.mouseWheelScrollTimestamp[t]=(new Date).getTime()}isReady(t,i){const r=(new Date).getTime()-this.mouseWheelScrollTimestamp[t];return r>this.scrollThrottling&&i!==this.lastKnownScrollCoordinate[t]}}var c=i,l=r;var h="Expected a function";function u(t,i,r){var s=true,e=true;if(typeof t!="function"){throw new TypeError(h)}if(l(r)){s="leading"in r?!!r.leading:s;e="trailing"in r?!!r.trailing:e}return c(t,i,{leading:s,maxWait:i,trailing:e})}var d=u;export{a as L,o as a,n as g,d as t};
5
+ //# sourceMappingURL=throttle-041ded8e.js.map
@@ -1,5 +1,5 @@
1
1
  import { EventEmitter, VNode } from '../../stencil-public-runtime';
2
- import ColumnDataProvider, { ColumnCollection } from '../../services/column.data.provider';
2
+ import ColumnDataProvider from '../../services/column.data.provider';
3
3
  import { DataProvider } from '../../services/data.provider';
4
4
  import { DSourceState } from "../../store/index";
5
5
  import DimensionProvider from '../../services/dimension.provider';
@@ -12,6 +12,7 @@ import { FocusedData } from './viewport.service';
12
12
  import { MultiDimensionType, DimensionRows, DimensionCols, DimensionTypeCol, RowHeaders, ColumnRegular, ColumnGrouping, DataType, RowDefinition, ColumnType, FocusTemplateFunc, PositionItem, ColumnProp, ViewPortScrollEvent, InitialHeaderClick, AllDimensionType, Editors, BeforeSaveDataDetails, BeforeRangeSaveDataDetails, Cell, ChangedRange, RangeArea, AfterEditEvent, Theme, PluginBaseComponent } from "../../types/index";
13
13
  import type { Observable } from '../../utils/store.utils';
14
14
  import type { GridPlugin } from '../../plugins/base.plugin';
15
+ import { ColumnCollection } from '../../utils/column.utils';
15
16
  /**
16
17
  * Revogrid - High-performance, customizable grid library for managing large datasets.
17
18
  *
@@ -12,7 +12,7 @@ import { ColumnFilterConfig, FilterCaptions, FilterCollection } from "./plugins/
12
12
  import { GroupingOptions } from "./plugins/groupingRow/grouping.row.types";
13
13
  import { VNode } from "./stencil-public-runtime";
14
14
  import { FocusedData } from "./components/revoGrid/viewport.service";
15
- import { ColumnCollection } from "./services/column.data.provider";
15
+ import { ColumnCollection } from "./utils/column.utils";
16
16
  import { DataInput } from "./plugins/export/types";
17
17
  import { Observable } from "./utils/store.utils";
18
18
  import { DSourceState, Groups } from "./store/index";
@@ -28,7 +28,7 @@ export { ColumnFilterConfig, FilterCaptions, FilterCollection } from "./plugins/
28
28
  export { GroupingOptions } from "./plugins/groupingRow/grouping.row.types";
29
29
  export { VNode } from "./stencil-public-runtime";
30
30
  export { FocusedData } from "./components/revoGrid/viewport.service";
31
- export { ColumnCollection } from "./services/column.data.provider";
31
+ export { ColumnCollection } from "./utils/column.utils";
32
32
  export { DataInput } from "./plugins/export/types";
33
33
  export { Observable } from "./utils/store.utils";
34
34
  export { DSourceState, Groups } from "./store/index";
@@ -3,5 +3,5 @@ export * from './store';
3
3
  export * from './plugins/base.plugin';
4
4
  export * from './plugins/dispatcher';
5
5
  export * from './components';
6
- export * from './utils/store.utils';
6
+ export * from './utils';
7
7
  export { h } from './stencil-public-runtime';
@@ -19,7 +19,7 @@ export declare class BasePlugin implements PluginBaseComponent {
19
19
  * @param eventName - event name to subscribe to in revo-grid component (e.g. 'beforeheaderclick')
20
20
  * @param callback - callback function for event
21
21
  */
22
- addEventListener(eventName: string, callback: (e: CustomEvent) => void): void;
22
+ addEventListener<T = any>(eventName: string, callback: (e: CustomEvent<T>) => void): void;
23
23
  /**
24
24
  * Subscribe to property change in revo-grid component
25
25
  * You can return false in callback to prevent default value set
@@ -1,7 +1,5 @@
1
1
  import { BasePlugin } from './base.plugin';
2
- import { ColumnItems } from '../services/dimension.provider';
3
- import { DimensionCols, ColumnRegular, DataType, BeforeSaveDataDetails, BeforeRangeSaveDataDetails } from "../types/index";
4
- import { PluginProviders } from '../';
2
+ import { DimensionCols, ColumnRegular, DataType, BeforeSaveDataDetails, BeforeRangeSaveDataDetails, PluginProviders } from "../types/index";
5
3
  interface Column extends ColumnRegular {
6
4
  index: number;
7
5
  }
@@ -48,7 +46,7 @@ export default class AutoSizeColumnPlugin extends BasePlugin {
48
46
  afteredit(e: EditEvent): void;
49
47
  afterEditAll(e: EditEvent): void;
50
48
  getColumnSize(index: number, type: DimensionCols): number;
51
- columnSet(columns: ColumnItems): void;
49
+ columnSet(columns: Record<DimensionCols, ColumnRegular[]>): void;
52
50
  clearPromise(): void;
53
51
  isRangeEdit(e: EditEvent): e is BeforeRangeSaveDataDetails;
54
52
  initiatePresizeElement(): HTMLElement;
@@ -1,7 +1,5 @@
1
- import { ColumnItems } from '../services/dimension.provider';
2
1
  import { BasePlugin } from './base.plugin';
3
- import { PluginBaseComponent } from '../';
4
- import { PluginProviders } from '../';
2
+ import { DimensionCols, PluginBaseComponent, PluginProviders, ColumnRegular } from "../types/index";
5
3
  export default class StretchColumn extends BasePlugin {
6
4
  providers: PluginProviders;
7
5
  private stretchedColumn;
@@ -14,7 +12,7 @@ export default class StretchColumn extends BasePlugin {
14
12
  /**
15
13
  * Apply stretch changes
16
14
  */
17
- applyStretch(columns: ColumnItems): void;
15
+ applyStretch(columns: Record<DimensionCols, ColumnRegular[]>): void;
18
16
  }
19
17
  /**
20
18
  * Check plugin type is Stretch
@@ -1,13 +1,6 @@
1
- import { ColumnGroupingCollection } from '../plugins/groupingColumn/grouping.col.plugin';
2
1
  import { DataStore } from "../store/index";
3
- import type { ColumnData, ColumnProp, ColumnRegular, ColumnTypes, ViewSettingSizeProp, DimensionCols, DimensionColPin } from "../types/index";
4
- export type ColumnCollection = {
5
- columns: Record<DimensionCols, ColumnRegular[]>;
6
- columnByProp: Record<ColumnProp, ColumnRegular[]>;
7
- columnGrouping: ColumnGroupingCollection;
8
- maxLevel: number;
9
- sort: Record<ColumnProp, ColumnRegular>;
10
- };
2
+ import type { ColumnProp, ColumnRegular, DimensionCols, DimensionColPin } from "../types/index";
3
+ import { ColumnCollection } from '../utils/column.utils';
11
4
  export type ColumnDataSources = Record<DimensionCols, DataStore<ColumnRegular, DimensionCols>>;
12
5
  type Sorting = Record<ColumnProp, ColumnRegular>;
13
6
  type SortingOrder = Record<ColumnProp, 'asc' | 'desc' | undefined>;
@@ -29,9 +22,5 @@ export default class ColumnDataProvider {
29
22
  updateColumn(column: ColumnRegular, index: number): void;
30
23
  updateColumnSorting(column: ColumnRegular, index: number, sorting: 'asc' | 'desc' | undefined, additive: boolean): ColumnRegular;
31
24
  clearSorting(): void;
32
- static getSizes(cols: ColumnRegular[]): ViewSettingSizeProp;
33
- static getColumnByProp(columns: ColumnData, prop: ColumnProp): ColumnRegular | undefined;
34
- static getColumns(columns: ColumnData, level?: number, types?: ColumnTypes): ColumnCollection;
35
- static getColumnType(rgCol: ColumnRegular): DimensionCols;
36
25
  }
37
26
  export {};
@@ -1,7 +1,6 @@
1
1
  import ViewportProvider from './viewport.provider';
2
2
  import { DimensionStoreCollection, Trimmed } from "../store/index";
3
3
  import { DimensionCols, DimensionType, MultiDimensionType, ColumnRegular, DimensionSettingsState, ViewPortScrollEvent, ViewSettingSizeProp } from "../types/index";
4
- export type ColumnItems = Record<DimensionCols, ColumnRegular[]>;
5
4
  export type DimensionConfig = {
6
5
  realSizeChanged(k: MultiDimensionType): void;
7
6
  };
@@ -72,15 +72,15 @@ export type RowDrag = boolean | {
72
72
  /**
73
73
  * `ColumnGrouping` type is used to define a grouping in a column.
74
74
  */
75
- export type ColumnGrouping = {
75
+ export type ColumnGrouping<T = any> = {
76
76
  /**
77
77
  * An array of objects that represent the children of the grouping.
78
78
  */
79
- children: (ColumnGrouping | ColumnRegular)[];
79
+ children: (ColumnGrouping<T> | ColumnRegular)[];
80
80
  /**
81
81
  * A `DataFormat` object that represents the name of the grouping.
82
82
  */
83
- name: DataFormat;
83
+ name: DataFormat<T>;
84
84
  };
85
85
  /**
86
86
  * Configuration for header inner template properties
@@ -178,7 +178,7 @@ export interface ColumnRegular extends ColumnType {
178
178
  /**
179
179
  * Column header text.
180
180
  */
181
- name?: DataFormat;
181
+ name?: any;
182
182
  /**
183
183
  * Column size would be changed based on space left.
184
184
  */
@@ -229,7 +229,7 @@ export interface ColumnTemplateProp extends ColumnRegular {
229
229
  }
230
230
  export type ColumnPropProp = ColumnGrouping | ColumnTemplateProp;
231
231
  export type ColumnProp = string | number;
232
- export type DataFormat = any;
232
+ export type DataFormat<T = any> = T;
233
233
  export type CellProp = string | number | object | boolean | undefined;
234
234
  /**
235
235
  * Additional properties applied to the cell.
@@ -346,11 +346,11 @@ export type CellCompareFunc = (prop: ColumnProp, a: DataType, b: DataType) => nu
346
346
  export type ColumnTemplateFunc = (createElement: HyperFunc<VNode>, props: ColumnTemplateProp, additionalData?: any) => any;
347
347
  export type PropertiesFunc = (props: ColumnDataSchemaModel) => CellProps | void | undefined;
348
348
  export type ColPropertiesFunc = (props: ColumnPropProp) => CellProps | void | undefined;
349
- export type DataType = {
350
- [T in ColumnProp]: DataFormat;
349
+ export type DataType<D = any> = {
350
+ [T in ColumnProp]: DataFormat<D>;
351
351
  };
352
- export type DataLookup = {
353
- [rowIndex: number]: DataType;
352
+ export type DataLookup<T = any> = {
353
+ [rowIndex: number]: DataType<T>;
354
354
  };
355
355
  /**
356
356
  * `RowDefinition` is a type that represents a row definition in the
@@ -680,8 +680,8 @@ export type RangeClipboardPasteEvent = {
680
680
  range: RangeArea | null;
681
681
  } & AllDimensionType;
682
682
  /** Range copy. */
683
- export type RangeClipboardCopyEventProps = {
684
- data: DataFormat[][];
683
+ export type RangeClipboardCopyEventProps<T = any> = {
684
+ data: DataFormat<T>[][];
685
685
  range: RangeArea;
686
686
  mapping: OldNewRangeMapping;
687
687
  } & AllDimensionType;
@@ -0,0 +1,46 @@
1
+ import { ColumnData, ColumnGrouping, ColumnProp, ColumnRegular, ColumnTypes, DimensionCols, ViewSettingSizeProp } from "../types/index";
2
+ import { Group as StoreGroup } from "../store/index";
3
+ export type ColumnItems = Record<DimensionCols, ColumnRegular[]>;
4
+ export interface ColumnGroup extends StoreGroup {
5
+ level: number;
6
+ }
7
+ export type ColumnGroupingCollection = Record<DimensionCols, ColumnGroup[]>;
8
+ /**
9
+ * Column collection definition.
10
+ * Used to access indexed data for columns.
11
+ * Can be accessed via different events.
12
+ */
13
+ export type ColumnCollection = {
14
+ /**
15
+ * Columns as they are in stores
16
+ */
17
+ columns: Record<DimensionCols, ColumnRegular[]>;
18
+ /**
19
+ * Columns indexed by prop for quick access, it's possible to have multiple columns with same prop but not recommended
20
+ */
21
+ columnByProp: Record<ColumnProp, ColumnRegular[]>;
22
+ /**
23
+ * Grouped columns
24
+ */
25
+ columnGrouping: ColumnGroupingCollection;
26
+ /**
27
+ * Max level of grouping
28
+ */
29
+ maxLevel: number;
30
+ /**
31
+ * Sorting
32
+ */
33
+ sort: Record<ColumnProp, ColumnRegular>;
34
+ };
35
+ export declare function getColumnType(rgCol: ColumnRegular): DimensionCols;
36
+ export declare function getColumnSizes(cols: ColumnRegular[]): ViewSettingSizeProp;
37
+ /**
38
+ * Check if column is grouping column
39
+ */
40
+ export declare function isColGrouping(colData: ColumnGrouping | ColumnRegular): colData is ColumnGrouping;
41
+ /**
42
+ * This function is used to create a collection of columns.
43
+ */
44
+ export declare function getColumns(columns: ColumnData, level?: number, types?: ColumnTypes): ColumnCollection;
45
+ export declare function gatherGroup<T extends ColumnCollection>(res: T, colData: ColumnGrouping, collection: T, level?: number): T;
46
+ export declare function getColumnByProp(columns: ColumnData, prop: ColumnProp): ColumnRegular | undefined;
@@ -1,3 +1,10 @@
1
+ export * from './store.utils';
2
+ export * from './store.types';
3
+ export * from './column.utils';
4
+ export * from './consts';
5
+ export * from './key.utils';
6
+ export * from './key.codes';
7
+ export * from './row-header-utils';
1
8
  export declare function range(size: number, startAt?: number): number[];
2
9
  export declare function findPositionInArray<T>(this: T[], el: T, compareFn: (el: T, el2: T) => number): number;
3
10
  /**