@revolist/revogrid 4.4.0-next.2 → 4.4.0-next.21

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 (243) hide show
  1. package/custom-element/columnService.js +1 -1
  2. package/custom-element/consts.js +2 -1
  3. package/custom-element/consts.js.map +1 -1
  4. package/custom-element/localScrollService.js +1 -1
  5. package/custom-element/localScrollService.js.map +1 -1
  6. package/custom-element/revo-grid.js +163 -97
  7. package/custom-element/revo-grid.js.map +1 -1
  8. package/custom-element/revogr-clipboard.js +24 -5
  9. package/custom-element/revogr-clipboard.js.map +1 -1
  10. package/custom-element/revogr-edit2.js +12 -6
  11. package/custom-element/revogr-edit2.js.map +1 -1
  12. package/custom-element/revogr-focus2.js +1 -1
  13. package/custom-element/revogr-focus2.js.map +1 -1
  14. package/custom-element/revogr-header2.js +25 -11
  15. package/custom-element/revogr-header2.js.map +1 -1
  16. package/custom-element/revogr-overlay-selection2.js +99 -32
  17. package/custom-element/revogr-overlay-selection2.js.map +1 -1
  18. package/custom-element/revogr-row-headers2.js +1 -2
  19. package/custom-element/revogr-row-headers2.js.map +1 -1
  20. package/custom-element/revogr-viewport-scroll2.js +39 -6
  21. package/custom-element/revogr-viewport-scroll2.js.map +1 -1
  22. package/dist/cjs/{debounce-525dd66c.js → debounce-f50730b6.js} +1 -38
  23. package/dist/cjs/debounce-f50730b6.js.map +1 -0
  24. package/dist/cjs/dispatcher-20520c70.js +21 -0
  25. package/dist/cjs/dispatcher-20520c70.js.map +1 -0
  26. package/dist/cjs/events-030618fc.js +459 -0
  27. package/dist/cjs/events-030618fc.js.map +1 -0
  28. package/dist/cjs/filter.button-6badec7a.js +44 -0
  29. package/dist/cjs/filter.button-6badec7a.js.map +1 -0
  30. package/dist/cjs/{index-aad39b7b.js → index-ee2ef5ae.js} +96 -36
  31. package/dist/cjs/index-ee2ef5ae.js.map +1 -0
  32. package/dist/cjs/index-effc94b9.js +3944 -0
  33. package/dist/cjs/index-effc94b9.js.map +1 -0
  34. package/dist/cjs/isString-3dde8d95.js +38 -0
  35. package/dist/cjs/isString-3dde8d95.js.map +1 -0
  36. package/dist/cjs/keyCodes.utils-d665ebed.js +271 -0
  37. package/dist/cjs/keyCodes.utils-d665ebed.js.map +1 -0
  38. package/dist/cjs/loader.cjs.js +3 -3
  39. package/dist/cjs/loader.cjs.js.map +1 -1
  40. package/dist/cjs/localScrollService-a81823c5.js +403 -0
  41. package/dist/cjs/localScrollService-a81823c5.js.map +1 -0
  42. package/dist/cjs/revo-grid.cjs.entry.js +3858 -0
  43. package/dist/cjs/revo-grid.cjs.entry.js.map +1 -0
  44. package/dist/cjs/revo-grid.cjs.js +3 -3
  45. package/dist/cjs/revo-grid.cjs.js.map +1 -1
  46. package/dist/cjs/revogr-clipboard.cjs.entry.js +24 -6
  47. package/dist/cjs/revogr-clipboard.cjs.entry.js.map +1 -1
  48. package/dist/cjs/revogr-data_3.cjs.entry.js +1138 -0
  49. package/dist/cjs/revogr-data_3.cjs.entry.js.map +1 -0
  50. package/dist/cjs/revogr-edit_2.cjs.entry.js +325 -0
  51. package/dist/cjs/revogr-edit_2.cjs.entry.js.map +1 -0
  52. package/dist/cjs/revogr-filter-panel.cjs.entry.js +6 -5
  53. package/dist/cjs/revogr-filter-panel.cjs.entry.js.map +1 -1
  54. package/dist/cjs/revogr-focus_5.cjs.entry.js +1231 -0
  55. package/dist/cjs/revogr-focus_5.cjs.entry.js.map +1 -0
  56. package/dist/cjs/{revo-grid_11.cjs.entry.js → viewport.helpers-70ccec8f.js} +13978 -25269
  57. package/dist/cjs/viewport.helpers-70ccec8f.js.map +1 -0
  58. package/dist/collection/collection-manifest.json +1 -1
  59. package/dist/collection/components/clipboard/revogr-clipboard.d.ts +6 -2
  60. package/dist/collection/components/clipboard/revogr-clipboard.js +46 -5
  61. package/dist/collection/components/clipboard/revogr-clipboard.js.map +1 -1
  62. package/dist/collection/components/header/headerCellRenderer.d.ts +2 -1
  63. package/dist/collection/components/header/headerCellRenderer.js +1 -1
  64. package/dist/collection/components/header/headerCellRenderer.js.map +1 -1
  65. package/dist/collection/components/header/headerRenderer.d.ts +2 -2
  66. package/dist/collection/components/header/headerRenderer.js +1 -1
  67. package/dist/collection/components/header/headerRenderer.js.map +1 -1
  68. package/dist/collection/components/header/revogr-header.d.ts +15 -1
  69. package/dist/collection/components/header/revogr-header.js +34 -8
  70. package/dist/collection/components/header/revogr-header.js.map +1 -1
  71. package/dist/collection/components/overlay/autofill.service.d.ts +7 -3
  72. package/dist/collection/components/overlay/autofill.service.js +32 -12
  73. package/dist/collection/components/overlay/autofill.service.js.map +1 -1
  74. package/dist/collection/components/overlay/clipboard.service.d.ts +1 -1
  75. package/dist/collection/components/overlay/clipboard.service.js +2 -2
  76. package/dist/collection/components/overlay/clipboard.service.js.map +1 -1
  77. package/dist/collection/components/overlay/keyboard.service.js +2 -6
  78. package/dist/collection/components/overlay/keyboard.service.js.map +1 -1
  79. package/dist/collection/components/overlay/revogr-edit.d.ts +8 -0
  80. package/dist/collection/components/overlay/revogr-edit.js +34 -9
  81. package/dist/collection/components/overlay/revogr-edit.js.map +1 -1
  82. package/dist/collection/components/overlay/revogr-overlay-selection.d.ts +32 -10
  83. package/dist/collection/components/overlay/revogr-overlay-selection.js +80 -12
  84. package/dist/collection/components/overlay/revogr-overlay-selection.js.map +1 -1
  85. package/dist/collection/components/overlay/revogr-overlay-style.css +71 -4
  86. package/dist/collection/components/revoGrid/revo-grid.d.ts +15 -4
  87. package/dist/collection/components/revoGrid/revo-grid.js +60 -19
  88. package/dist/collection/components/revoGrid/revo-grid.js.map +1 -1
  89. package/dist/collection/components/revoGrid/viewport.scrolling.service.d.ts +6 -2
  90. package/dist/collection/components/revoGrid/viewport.scrolling.service.js +26 -4
  91. package/dist/collection/components/revoGrid/viewport.scrolling.service.js.map +1 -1
  92. package/dist/collection/components/revoGrid/viewport.section.d.ts +3 -2
  93. package/dist/collection/components/revoGrid/viewport.section.js +8 -4
  94. package/dist/collection/components/revoGrid/viewport.section.js.map +1 -1
  95. package/dist/collection/components/revoGrid/viewport.service.d.ts +4 -0
  96. package/dist/collection/components/revoGrid/viewport.service.js +15 -3
  97. package/dist/collection/components/revoGrid/viewport.service.js.map +1 -1
  98. package/dist/collection/components/rowHeaders/revogr-row-headers.js.map +1 -1
  99. package/dist/collection/components/scroll/revogr-viewport-scroll-style.css +3 -0
  100. package/dist/collection/components/scroll/revogr-viewport-scroll.d.ts +16 -5
  101. package/dist/collection/components/scroll/revogr-viewport-scroll.js +64 -9
  102. package/dist/collection/components/scroll/revogr-viewport-scroll.js.map +1 -1
  103. package/dist/collection/components/selectionFocus/revogr-focus-style.css +1 -1
  104. package/dist/collection/components.d.ts +110 -6
  105. package/dist/collection/interfaces.d.ts +4 -1
  106. package/dist/collection/plugins/groupingColumn/columnGroupsRenderer.d.ts +3 -2
  107. package/dist/collection/plugins/groupingColumn/columnGroupsRenderer.js +2 -2
  108. package/dist/collection/plugins/groupingColumn/columnGroupsRenderer.js.map +1 -1
  109. package/dist/collection/plugins/groupingColumn/headerGroupRenderer.d.ts +2 -2
  110. package/dist/collection/plugins/groupingColumn/headerGroupRenderer.js +1 -1
  111. package/dist/collection/plugins/groupingColumn/headerGroupRenderer.js.map +1 -1
  112. package/dist/collection/plugins/sorting/sorting.plugin.d.ts +21 -13
  113. package/dist/collection/plugins/sorting/sorting.plugin.js +77 -70
  114. package/dist/collection/plugins/sorting/sorting.plugin.js.map +1 -1
  115. package/dist/collection/serve/controller.js +183 -0
  116. package/dist/collection/services/localScrollService.js +1 -1
  117. package/dist/collection/services/localScrollService.js.map +1 -1
  118. package/dist/collection/services/resizable.directive.d.ts +8 -7
  119. package/dist/collection/services/resizable.directive.js +13 -36
  120. package/dist/collection/services/resizable.directive.js.map +1 -1
  121. package/dist/collection/services/resizable.element.d.ts +4 -0
  122. package/dist/collection/services/resizable.element.js +39 -0
  123. package/dist/collection/services/resizable.element.js.map +1 -0
  124. package/dist/collection/stencil-public-runtime.d.ts +1 -0
  125. package/dist/collection/store/viewPort/viewport.store.js +0 -1
  126. package/dist/collection/store/viewPort/viewport.store.js.map +1 -1
  127. package/dist/collection/utils/consts.d.ts +1 -0
  128. package/dist/collection/utils/consts.js +1 -0
  129. package/dist/collection/utils/consts.js.map +1 -1
  130. package/dist/collection/utils/events.d.ts +2 -1
  131. package/dist/collection/utils/events.js +18 -2
  132. package/dist/collection/utils/events.js.map +1 -1
  133. package/dist/collection/utils/mobile.d.ts +1 -0
  134. package/dist/collection/utils/mobile.js +7 -0
  135. package/dist/collection/utils/mobile.js.map +1 -0
  136. package/dist/esm/{debounce-301fd4d2.js → debounce-820b5a8b.js} +2 -34
  137. package/dist/esm/debounce-820b5a8b.js.map +1 -0
  138. package/dist/esm/dispatcher-9e9c0233.js +19 -0
  139. package/dist/esm/dispatcher-9e9c0233.js.map +1 -0
  140. package/dist/esm/events-31272e5e.js +454 -0
  141. package/dist/esm/events-31272e5e.js.map +1 -0
  142. package/dist/esm/filter.button-21ce90ef.js +38 -0
  143. package/dist/esm/filter.button-21ce90ef.js.map +1 -0
  144. package/dist/esm/{index-5e90b19b.js → index-05947c5f.js} +97 -37
  145. package/dist/esm/index-05947c5f.js.map +1 -0
  146. package/dist/esm/index-728bf6e3.js +3889 -0
  147. package/dist/esm/index-728bf6e3.js.map +1 -0
  148. package/dist/esm/isString-d539060a.js +36 -0
  149. package/dist/esm/isString-d539060a.js.map +1 -0
  150. package/dist/esm/keyCodes.utils-c0064460.js +265 -0
  151. package/dist/esm/keyCodes.utils-c0064460.js.map +1 -0
  152. package/dist/esm/loader.js +4 -4
  153. package/dist/esm/loader.js.map +1 -1
  154. package/dist/esm/localScrollService-884d8952.js +400 -0
  155. package/dist/esm/localScrollService-884d8952.js.map +1 -0
  156. package/dist/esm/revo-grid.entry.js +3854 -0
  157. package/dist/esm/revo-grid.entry.js.map +1 -0
  158. package/dist/esm/revo-grid.js +4 -4
  159. package/dist/esm/revo-grid.js.map +1 -1
  160. package/dist/esm/revogr-clipboard.entry.js +24 -6
  161. package/dist/esm/revogr-clipboard.entry.js.map +1 -1
  162. package/dist/esm/revogr-data_3.entry.js +1132 -0
  163. package/dist/esm/revogr-data_3.entry.js.map +1 -0
  164. package/dist/esm/revogr-edit_2.entry.js +320 -0
  165. package/dist/esm/revogr-edit_2.entry.js.map +1 -0
  166. package/dist/esm/revogr-filter-panel.entry.js +3 -2
  167. package/dist/esm/revogr-filter-panel.entry.js.map +1 -1
  168. package/dist/esm/revogr-focus_5.entry.js +1223 -0
  169. package/dist/esm/revogr-focus_5.entry.js.map +1 -0
  170. package/dist/esm/{revo-grid_11.entry.js → viewport.helpers-c08e729e.js} +13790 -25093
  171. package/dist/esm/viewport.helpers-c08e729e.js.map +1 -0
  172. package/dist/revo-grid/debounce-820b5a8b.js +5 -0
  173. package/dist/revo-grid/debounce-820b5a8b.js.map +1 -0
  174. package/dist/revo-grid/dispatcher-9e9c0233.js +5 -0
  175. package/dist/revo-grid/dispatcher-9e9c0233.js.map +1 -0
  176. package/dist/revo-grid/events-31272e5e.js +5 -0
  177. package/dist/revo-grid/events-31272e5e.js.map +1 -0
  178. package/dist/revo-grid/filter.button-21ce90ef.js +5 -0
  179. package/dist/revo-grid/filter.button-21ce90ef.js.map +1 -0
  180. package/dist/revo-grid/index-05947c5f.js +6 -0
  181. package/dist/revo-grid/index-05947c5f.js.map +1 -0
  182. package/dist/revo-grid/index-728bf6e3.js +5 -0
  183. package/dist/revo-grid/index-728bf6e3.js.map +1 -0
  184. package/dist/revo-grid/isString-d539060a.js +5 -0
  185. package/dist/revo-grid/isString-d539060a.js.map +1 -0
  186. package/dist/revo-grid/keyCodes.utils-c0064460.js +5 -0
  187. package/dist/revo-grid/keyCodes.utils-c0064460.js.map +1 -0
  188. package/dist/revo-grid/localScrollService-884d8952.js +5 -0
  189. package/dist/revo-grid/localScrollService-884d8952.js.map +1 -0
  190. package/dist/revo-grid/revo-grid.entry.js +5 -0
  191. package/dist/revo-grid/revo-grid.entry.js.map +1 -0
  192. package/dist/revo-grid/revo-grid.esm.js +1 -1
  193. package/dist/revo-grid/revo-grid.esm.js.map +1 -1
  194. package/dist/revo-grid/revogr-clipboard.entry.js +1 -1
  195. package/dist/revo-grid/revogr-clipboard.entry.js.map +1 -1
  196. package/dist/revo-grid/revogr-data_3.entry.js +5 -0
  197. package/dist/revo-grid/revogr-data_3.entry.js.map +1 -0
  198. package/dist/revo-grid/revogr-edit_2.entry.js +5 -0
  199. package/dist/revo-grid/revogr-edit_2.entry.js.map +1 -0
  200. package/dist/revo-grid/revogr-filter-panel.entry.js +1 -1
  201. package/dist/revo-grid/revogr-filter-panel.entry.js.map +1 -1
  202. package/dist/revo-grid/revogr-focus_5.entry.js +5 -0
  203. package/dist/revo-grid/revogr-focus_5.entry.js.map +1 -0
  204. package/dist/revo-grid/viewport.helpers-c08e729e.js +5 -0
  205. package/dist/revo-grid/viewport.helpers-c08e729e.js.map +1 -0
  206. package/dist/types/components/clipboard/revogr-clipboard.d.ts +6 -2
  207. package/dist/types/components/header/headerCellRenderer.d.ts +2 -1
  208. package/dist/types/components/header/headerRenderer.d.ts +2 -2
  209. package/dist/types/components/header/revogr-header.d.ts +15 -1
  210. package/dist/types/components/overlay/autofill.service.d.ts +7 -3
  211. package/dist/types/components/overlay/clipboard.service.d.ts +1 -1
  212. package/dist/types/components/overlay/revogr-edit.d.ts +8 -0
  213. package/dist/types/components/overlay/revogr-overlay-selection.d.ts +32 -10
  214. package/dist/types/components/revoGrid/revo-grid.d.ts +15 -4
  215. package/dist/types/components/revoGrid/viewport.scrolling.service.d.ts +6 -2
  216. package/dist/types/components/revoGrid/viewport.section.d.ts +3 -2
  217. package/dist/types/components/revoGrid/viewport.service.d.ts +4 -0
  218. package/dist/types/components/scroll/revogr-viewport-scroll.d.ts +16 -5
  219. package/dist/types/components.d.ts +110 -6
  220. package/dist/types/interfaces.d.ts +4 -1
  221. package/dist/types/plugins/groupingColumn/columnGroupsRenderer.d.ts +3 -2
  222. package/dist/types/plugins/groupingColumn/headerGroupRenderer.d.ts +2 -2
  223. package/dist/types/plugins/sorting/sorting.plugin.d.ts +21 -13
  224. package/dist/types/services/resizable.directive.d.ts +8 -7
  225. package/dist/types/services/resizable.element.d.ts +4 -0
  226. package/dist/types/stencil-public-runtime.d.ts +1 -0
  227. package/dist/types/utils/consts.d.ts +1 -0
  228. package/dist/types/utils/events.d.ts +2 -1
  229. package/dist/types/utils/mobile.d.ts +1 -0
  230. package/package.json +4 -3
  231. package/dist/cjs/debounce-525dd66c.js.map +0 -1
  232. package/dist/cjs/index-aad39b7b.js.map +0 -1
  233. package/dist/cjs/revo-grid_11.cjs.entry.js.map +0 -1
  234. package/dist/esm/debounce-301fd4d2.js.map +0 -1
  235. package/dist/esm/index-5e90b19b.js.map +0 -1
  236. package/dist/esm/revo-grid_11.entry.js.map +0 -1
  237. package/dist/revo-grid/debounce-301fd4d2.js +0 -5
  238. package/dist/revo-grid/debounce-301fd4d2.js.map +0 -1
  239. package/dist/revo-grid/index-5e90b19b.js +0 -6
  240. package/dist/revo-grid/index-5e90b19b.js.map +0 -1
  241. package/dist/revo-grid/revo-grid_11.entry.js +0 -5
  242. package/dist/revo-grid/revo-grid_11.entry.js.map +0 -1
  243. /package/dist/collection/{utilsExternal/generate-data.js → serve/data.js} +0 -0
@@ -2,50 +2,46 @@
2
2
  * Built by Revolist
3
3
  */
4
4
  import size from 'lodash/size';
5
+ import debounce from 'lodash/debounce';
5
6
  import { setStore } from '../../utils/store.utils';
6
7
  import ColumnDataProvider from '../../services/column.data.provider';
7
8
  import BasePlugin from '../basePlugin';
8
9
  /**
9
10
  * lifecycle
10
- * 1) @event beforesorting - sorting just started, nothing happened yet
11
+ * 1) @event beforesorting - sorting just started, nothing happened yet, can be from column or from source, if type is from rows - column will be undefined
11
12
  * 2) @metod updateColumnSorting - column sorting icon applied to grid and column get updated, data still untiuched
12
- * 3) @event beforesortingapply - before we applied sorting data to data source, you can prevent data apply from here
13
- * 4) @event afterSortingApply - sorting applied, just finished event
13
+ * 3) @event beforesortingapply - before we applied sorting data to data source, you can prevent event and data will not be sorted. It's called only from column sorting click
14
+ * 4) @event afterSortingApply - sorting applied, just finished event, from rows and columns
14
15
  *
15
16
  * If you prevent event it'll not reach farther steps
16
17
  */
17
18
  export default class SortingPlugin extends BasePlugin {
18
- get hasSorting() {
19
- return !!this.sorting;
20
- }
21
19
  constructor(revogrid) {
22
20
  super(revogrid);
23
21
  this.revogrid = revogrid;
22
+ // sorting order per column
24
23
  this.sorting = null;
24
+ // sorting function per column, multiple columns sorting supported
25
25
  this.sortingFunc = null;
26
- const beforesourceset = ({ detail }) => {
27
- if (this.hasSorting) {
28
- // is sorting allowed
29
- const event = this.emit('beforesourcesortingapply');
30
- // sorting prevented
31
- if (event.defaultPrevented) {
26
+ this.doSort = debounce((order, comparison) => this.sort(order, comparison), 50);
27
+ const aftersourceset = async ({ detail: { type } }) => {
28
+ // if sorting was provided - sort data
29
+ if (!!this.sorting && this.sortingFunc) {
30
+ const beforeEvent = this.emit('beforesorting', { type });
31
+ if (beforeEvent.defaultPrevented) {
32
32
  return;
33
33
  }
34
- }
35
- const data = this.setData(detail.source, detail.type);
36
- if (data) {
37
- detail.source = data;
34
+ this.doSort(this.sorting, this.sortingFunc);
38
35
  }
39
36
  };
40
37
  const aftercolumnsset = async ({ detail: { order } }) => {
41
38
  const columns = await this.revogrid.getColumns();
42
39
  const sortingFunc = {};
43
40
  for (let prop in order) {
44
- const column = ColumnDataProvider.getColumnByProp(columns, prop);
45
- const cmp = (column === null || column === void 0 ? void 0 : column.cellCompare) || this.defaultCellCompare;
46
- sortingFunc[prop] = order[prop] == 'desc' ? this.descCellCompare(cmp) : cmp;
41
+ const cmp = this.getComparer(ColumnDataProvider.getColumnByProp(columns, prop), order[prop]);
42
+ sortingFunc[prop] = cmp;
47
43
  }
48
- this.sort(order, sortingFunc);
44
+ this.doSort(order, sortingFunc);
49
45
  };
50
46
  const headerclick = async (e) => {
51
47
  var _a, _b;
@@ -57,10 +53,24 @@ export default class SortingPlugin extends BasePlugin {
57
53
  }
58
54
  this.headerclick(e.detail.column, e.detail.index, (_b = (_a = e.detail) === null || _a === void 0 ? void 0 : _a.originalEvent) === null || _b === void 0 ? void 0 : _b.shiftKey);
59
55
  };
60
- this.addEventListener('beforesourceset', beforesourceset);
56
+ this.addEventListener('after-any-source', aftersourceset);
61
57
  this.addEventListener('aftercolumnsset', aftercolumnsset);
62
58
  this.addEventListener('initialHeaderClick', headerclick);
63
59
  }
60
+ getComparer(column, order) {
61
+ const cellCmp = (column === null || column === void 0 ? void 0 : column.cellCompare.bind({ order })) || this.defaultCellCompare;
62
+ if (order == 'asc') {
63
+ return cellCmp;
64
+ }
65
+ if (order == 'desc') {
66
+ return this.descCellCompare(cellCmp);
67
+ }
68
+ return undefined;
69
+ }
70
+ /**
71
+ * Apply sorting to data on header click
72
+ * If additive - add to existing sorting, multiple columns can be sorted
73
+ */
64
74
  async headerclick(column, index, additive) {
65
75
  let order = this.getNextOrder(column.order);
66
76
  const beforeEvent = this.emit('beforesorting', { column, order, additive });
@@ -75,13 +85,13 @@ export default class SortingPlugin extends BasePlugin {
75
85
  return;
76
86
  }
77
87
  order = beforeApplyEvent.detail.order;
78
- const cellCmp = (column === null || column === void 0 ? void 0 : column.cellCompare) || this.defaultCellCompare;
79
- const cmp = order == 'asc' ? cellCmp : order == 'desc' ? this.descCellCompare(cellCmp) : undefined;
88
+ const cmp = this.getComparer(column, order);
80
89
  if (additive && this.sorting) {
81
90
  const sorting = {};
82
91
  const sortingFunc = {};
83
- Object.assign(sorting, this.sorting);
84
- Object.assign(sortingFunc, this.sortingFunc);
92
+ this.sorting = Object.assign(Object.assign({}, this.sorting), sorting);
93
+ // extend sorting function with new sorting for multiple columns sorting
94
+ this.sortingFunc = Object.assign(Object.assign({}, this.sortingFunc), sortingFunc);
85
95
  if (column.prop in sorting && size(sorting) > 1 && order === undefined) {
86
96
  delete sorting[column.prop];
87
97
  delete sortingFunc[column.prop];
@@ -90,38 +100,46 @@ export default class SortingPlugin extends BasePlugin {
90
100
  sorting[column.prop] = order;
91
101
  sortingFunc[column.prop] = cmp;
92
102
  }
93
- this.sort(sorting, sortingFunc);
94
103
  }
95
104
  else {
96
- this.sort({ [column.prop]: order }, { [column.prop]: cmp });
97
- }
98
- }
99
- setData(data, type) {
100
- // sorting available for rgRow type only
101
- if (type === 'rgRow' && this.sortingFunc) {
102
- return this.sortItems(data, this.sortingFunc);
105
+ // reset sorting
106
+ this.sorting = { [column.prop]: order };
107
+ this.sortingFunc = { [column.prop]: cmp };
103
108
  }
109
+ this.doSort(this.sorting, this.sortingFunc);
104
110
  }
105
111
  /**
106
- * Sorting apply, available for rgRow type only
112
+ * Sort items by sorting function
113
+ * @requires proxyItems applied to row store
114
+ * @requires source applied to row store
115
+ *
107
116
  * @param sorting - per column sorting
108
117
  * @param data - this.stores['rgRow'].store.get('source')
109
118
  */
110
- async sort(sorting, sortingFunc) {
119
+ async sort(sorting, sortingFunc, types = ['rgRow', 'rowPinStart', 'rowPinEnd']) {
120
+ // if no sorting - reset
111
121
  if (!size(sorting)) {
112
122
  this.sorting = null;
113
123
  this.sortingFunc = null;
114
124
  return;
115
125
  }
126
+ // set sorting
116
127
  this.sorting = sorting;
117
128
  this.sortingFunc = sortingFunc;
118
- const store = await this.revogrid.getSourceStore();
119
- const source = store.get('source');
120
- const proxyItems = this.sortIndexByItems([...store.get('proxyItems')], source, this.sortingFunc);
121
- setStore(store, {
122
- proxyItems,
123
- source: [...source],
124
- });
129
+ // by default it'll sort by rgRow store
130
+ // todo: support multiple stores
131
+ for (let type of types) {
132
+ const store = await this.revogrid.getSourceStore(type);
133
+ // row data
134
+ const source = store.get('source');
135
+ // row indexes
136
+ const proxyItems = store.get('proxyItems');
137
+ const data = this.sortIndexByItems([...proxyItems], source, sortingFunc);
138
+ setStore(store, {
139
+ proxyItems: data,
140
+ source: [...source],
141
+ });
142
+ }
125
143
  this.emit('afterSortingApply');
126
144
  }
127
145
  defaultCellCompare(prop, a, b) {
@@ -136,41 +154,30 @@ export default class SortingPlugin extends BasePlugin {
136
154
  };
137
155
  }
138
156
  sortIndexByItems(indexes, source, sortingFunc) {
139
- // TODO - is there a situation where multiple kvps in the `sorting` object would cause this to break?
140
- for (let prop in sortingFunc) {
141
- if (typeof sortingFunc[prop] === 'undefined') {
142
- // Unsort indexes
143
- return [...Array(indexes.length).keys()];
144
- }
157
+ // if no sorting - return unsorted indexes
158
+ if (Object.entries(sortingFunc).length === 0) {
159
+ // Unsort indexes
160
+ return [...Array(indexes.length).keys()];
145
161
  }
162
+ //
163
+ /**
164
+ * go through all indexes and align in new order
165
+ * performs a multi-level sorting by applying multiple comparison functions to determine the order of the items based on different properties.
166
+ */
146
167
  return indexes.sort((a, b) => {
147
- let sorted = 0;
148
- for (let prop in sortingFunc) {
149
- const cmp = sortingFunc[prop];
168
+ for (const [prop, cmp] of Object.entries(sortingFunc)) {
150
169
  const itemA = source[a];
151
170
  const itemB = source[b];
152
- sorted = cmp(prop, itemA, itemB);
153
- if (sorted) {
154
- break;
155
- }
156
- }
157
- return sorted;
158
- });
159
- }
160
- sortItems(source, sortingFunc) {
161
- return source.sort((a, b) => {
162
- let sorted = 0;
163
- for (let prop in sortingFunc) {
164
- const cmp = sortingFunc[prop];
165
- if (!cmp) {
166
- continue;
167
- }
168
- sorted = cmp(prop, a, b);
171
+ /**
172
+ * If the comparison function returns a non-zero value (sorted), it means that the items should be sorted based on the given property. In such a case, the function immediately returns the sorted value, indicating the order in which the items should be arranged.
173
+ * If none of the comparison functions result in a non-zero value, indicating that the items are equal or should remain in the same order, the function eventually returns 0.
174
+ */
175
+ const sorted = cmp(prop, itemA, itemB);
169
176
  if (sorted) {
170
- break;
177
+ return sorted;
171
178
  }
172
179
  }
173
- return sorted;
180
+ return 0;
174
181
  });
175
182
  }
176
183
  getNextOrder(currentOrder) {
@@ -1 +1 @@
1
- {"version":3,"file":"sorting.plugin.js","sourceRoot":"","sources":["../../../src/plugins/sorting/sorting.plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import size from 'lodash/size';\n\nimport { RevoGrid } from '../../interfaces';\nimport { setStore } from '../../utils/store.utils';\nimport ColumnDataProvider from '../../services/column.data.provider';\nimport BasePlugin from '../basePlugin';\n\nimport DimensionRows = RevoGrid.DimensionRows;\n\nexport type SortingOrder = Record<RevoGrid.ColumnProp, RevoGrid.Order>;\ntype SortingOrderFunction = Record<RevoGrid.ColumnProp, RevoGrid.CellCompareFunc | undefined>;\ntype SourceSetEvent = {\n type: DimensionRows;\n source: RevoGrid.DataType[];\n};\ntype ColumnSetEvent = {\n order: SortingOrder;\n};\n\n/**\n * lifecycle\n * 1) @event beforesorting - sorting just started, nothing happened yet\n * 2) @metod updateColumnSorting - column sorting icon applied to grid and column get updated, data still untiuched\n * 3) @event beforesortingapply - before we applied sorting data to data source, you can prevent data apply from here\n * 4) @event afterSortingApply - sorting applied, just finished event\n *\n * If you prevent event it'll not reach farther steps\n */\n\nexport default class SortingPlugin extends BasePlugin {\n private sorting: SortingOrder | null = null;\n private sortingFunc: SortingOrderFunction | null = null;\n\n get hasSorting() {\n return !!this.sorting;\n }\n\n constructor(protected revogrid: HTMLRevoGridElement) {\n super(revogrid);\n\n const beforesourceset = ({ detail }: CustomEvent<SourceSetEvent>) => {\n if (this.hasSorting) {\n // is sorting allowed\n const event = this.emit('beforesourcesortingapply');\n // sorting prevented\n if (event.defaultPrevented) {\n return;\n }\n }\n const data = this.setData(detail.source, detail.type);\n if (data) {\n detail.source = data;\n }\n };\n const aftercolumnsset = async ({ detail: { order } }: CustomEvent<ColumnSetEvent>) => {\n const columns = await this.revogrid.getColumns();\n const sortingFunc: SortingOrderFunction = {};\n\n for (let prop in order) {\n const column = ColumnDataProvider.getColumnByProp(columns, prop);\n const cmp: RevoGrid.CellCompareFunc = column?.cellCompare || this.defaultCellCompare;\n\n sortingFunc[prop] = order[prop] == 'desc' ? this.descCellCompare(cmp) : cmp;\n }\n this.sort(order, sortingFunc);\n };\n const headerclick = async (e: CustomEvent<RevoGrid.InitialHeaderClick>) => {\n if (e.defaultPrevented) {\n return;\n }\n\n if (!e.detail.column.sortable) {\n return;\n }\n\n this.headerclick(e.detail.column, e.detail.index, e.detail?.originalEvent?.shiftKey);\n };\n\n this.addEventListener('beforesourceset', beforesourceset);\n this.addEventListener('aftercolumnsset', aftercolumnsset);\n this.addEventListener('initialHeaderClick', headerclick);\n }\n\n private async headerclick(column: RevoGrid.ColumnRegular, index: number, additive: boolean) {\n let order: RevoGrid.Order = this.getNextOrder(column.order);\n const beforeEvent = this.emit('beforesorting', { column, order, additive });\n if (beforeEvent.defaultPrevented) {\n return;\n }\n order = beforeEvent.detail.order;\n const newCol = await this.revogrid.updateColumnSorting(beforeEvent.detail.column, index, order, additive);\n\n // apply sort data\n const beforeApplyEvent = this.emit('beforesortingapply', { column: newCol, order, additive });\n if (beforeApplyEvent.defaultPrevented) {\n return;\n }\n order = beforeApplyEvent.detail.order;\n\n const cellCmp: RevoGrid.CellCompareFunc = column?.cellCompare || this.defaultCellCompare;\n const cmp: RevoGrid.CellCompareFunc = order == 'asc' ? cellCmp : order == 'desc' ? this.descCellCompare(cellCmp) : undefined;\n\n if (additive && this.sorting) {\n const sorting: SortingOrder = {};\n const sortingFunc: SortingOrderFunction = {};\n\n Object.assign(sorting, this.sorting);\n Object.assign(sortingFunc, this.sortingFunc);\n\n if (column.prop in sorting && size(sorting) > 1 && order === undefined) {\n delete sorting[column.prop];\n delete sortingFunc[column.prop];\n } else {\n sorting[column.prop] = order;\n sortingFunc[column.prop] = cmp;\n }\n\n this.sort(sorting, sortingFunc);\n } else {\n this.sort({ [column.prop]: order }, { [column.prop]: cmp });\n }\n }\n\n private setData(data: RevoGrid.DataType[], type: DimensionRows): RevoGrid.DataType[] | void {\n // sorting available for rgRow type only\n if (type === 'rgRow' && this.sortingFunc) {\n return this.sortItems(data, this.sortingFunc);\n }\n }\n\n /**\n * Sorting apply, available for rgRow type only\n * @param sorting - per column sorting\n * @param data - this.stores['rgRow'].store.get('source')\n */\n private async sort(sorting: SortingOrder, sortingFunc: SortingOrderFunction) {\n if (!size(sorting)) {\n this.sorting = null;\n this.sortingFunc = null;\n return;\n }\n this.sorting = sorting;\n this.sortingFunc = sortingFunc;\n\n const store = await this.revogrid.getSourceStore();\n\n const source = store.get('source');\n const proxyItems = this.sortIndexByItems([...store.get('proxyItems')], source, this.sortingFunc);\n setStore(store, {\n proxyItems,\n source: [...source],\n });\n this.emit('afterSortingApply');\n }\n\n private defaultCellCompare(prop: RevoGrid.ColumnProp, a: RevoGrid.DataType, b: RevoGrid.DataType) {\n const av = a[prop]?.toString().toLowerCase();\n const bv = b[prop]?.toString().toLowerCase();\n\n return av == bv ? 0 : av > bv ? 1 : -1;\n }\n\n private descCellCompare(cmp: RevoGrid.CellCompareFunc) {\n return (prop: RevoGrid.ColumnProp, a: RevoGrid.DataType, b: RevoGrid.DataType): number => {\n return -1 * cmp(prop, a, b);\n };\n }\n\n private sortIndexByItems(indexes: number[], source: RevoGrid.DataType[], sortingFunc: SortingOrderFunction): number[] {\n // TODO - is there a situation where multiple kvps in the `sorting` object would cause this to break?\n for (let prop in sortingFunc) {\n if (typeof sortingFunc[prop] === 'undefined') {\n // Unsort indexes\n return [...Array(indexes.length).keys()];\n }\n }\n return indexes.sort((a, b) => {\n let sorted = 0;\n for (let prop in sortingFunc) {\n const cmp = sortingFunc[prop];\n const itemA = source[a];\n const itemB = source[b];\n sorted = cmp(prop, itemA, itemB);\n if (sorted) {\n break;\n }\n }\n return sorted;\n });\n }\n\n private sortItems(source: RevoGrid.DataType[], sortingFunc: SortingOrderFunction): RevoGrid.DataType[] {\n return source.sort((a, b) => {\n let sorted = 0;\n for (let prop in sortingFunc) {\n const cmp: RevoGrid.CellCompareFunc | undefined = sortingFunc[prop];\n if (!cmp) {\n continue;\n }\n sorted = cmp(prop, a, b);\n if (sorted) {\n break;\n }\n }\n return sorted;\n });\n }\n\n private getNextOrder(currentOrder: RevoGrid.Order): RevoGrid.Order {\n switch (currentOrder) {\n case undefined:\n return 'asc';\n case 'asc':\n return 'desc';\n case 'desc':\n return undefined;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"sorting.plugin.js","sourceRoot":"","sources":["../../../src/plugins/sorting/sorting.plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import size from 'lodash/size';\nimport debounce from 'lodash/debounce';\n\nimport { RevoGrid } from '../../interfaces';\nimport { setStore } from '../../utils/store.utils';\nimport ColumnDataProvider from '../../services/column.data.provider';\nimport BasePlugin from '../basePlugin';\n\nexport type SortingOrder = Record<RevoGrid.ColumnProp, RevoGrid.Order>;\ntype SortingOrderFunction = Record<RevoGrid.ColumnProp, RevoGrid.CellCompareFunc | undefined>;\ntype ColumnSetEvent = {\n order: SortingOrder;\n};\n\n/**\n * lifecycle\n * 1) @event beforesorting - sorting just started, nothing happened yet, can be from column or from source, if type is from rows - column will be undefined\n * 2) @metod updateColumnSorting - column sorting icon applied to grid and column get updated, data still untiuched\n * 3) @event beforesortingapply - before we applied sorting data to data source, you can prevent event and data will not be sorted. It's called only from column sorting click\n * 4) @event afterSortingApply - sorting applied, just finished event, from rows and columns\n *\n * If you prevent event it'll not reach farther steps\n */\n\nexport default class SortingPlugin extends BasePlugin {\n // sorting order per column\n private sorting: SortingOrder | null = null;\n\n // sorting function per column, multiple columns sorting supported\n private sortingFunc: SortingOrderFunction | null = null;\n private doSort = debounce((order: SortingOrder, comparison: SortingOrderFunction) => this.sort(order, comparison), 50);\n\n\n constructor(protected revogrid: HTMLRevoGridElement) {\n super(revogrid);\n\n const aftersourceset = async ({ detail: { type } }: CustomEvent<{\n type: RevoGrid.DimensionRows\n }>) => {\n // if sorting was provided - sort data\n if (!!this.sorting && this.sortingFunc) {\n const beforeEvent = this.emit('beforesorting', { type });\n if (beforeEvent.defaultPrevented) {\n return;\n }\n this.doSort(this.sorting, this.sortingFunc);\n }\n };\n const aftercolumnsset = async ({ detail: { order } }: CustomEvent<ColumnSetEvent>) => {\n const columns = await this.revogrid.getColumns();\n const sortingFunc: SortingOrderFunction = {};\n\n for (let prop in order) {\n const cmp = this.getComparer(ColumnDataProvider.getColumnByProp(columns, prop), order[prop]);\n sortingFunc[prop] = cmp;\n }\n this.doSort(order, sortingFunc);\n };\n const headerclick = async (e: CustomEvent<RevoGrid.InitialHeaderClick>) => {\n if (e.defaultPrevented) {\n return;\n }\n\n if (!e.detail.column.sortable) {\n return;\n }\n\n this.headerclick(e.detail.column, e.detail.index, e.detail?.originalEvent?.shiftKey);\n };\n\n this.addEventListener('after-any-source', aftersourceset);\n this.addEventListener('aftercolumnsset', aftercolumnsset);\n this.addEventListener('initialHeaderClick', headerclick);\n }\n\n private getComparer(column: RevoGrid.ColumnRegular, order: RevoGrid.Order): RevoGrid.CellCompareFunc {\n const cellCmp: RevoGrid.CellCompareFunc = column?.cellCompare.bind({ order }) || this.defaultCellCompare;\n if (order == 'asc') {\n return cellCmp;\n }\n if (order == 'desc') {\n return this.descCellCompare(cellCmp);\n }\n return undefined;\n }\n\n /**\n * Apply sorting to data on header click\n * If additive - add to existing sorting, multiple columns can be sorted\n */\n async headerclick(column: RevoGrid.ColumnRegular, index: number, additive: boolean) {\n let order: RevoGrid.Order = this.getNextOrder(column.order);\n const beforeEvent = this.emit('beforesorting', { column, order, additive });\n if (beforeEvent.defaultPrevented) {\n return;\n }\n order = beforeEvent.detail.order;\n const newCol = await this.revogrid.updateColumnSorting(beforeEvent.detail.column, index, order, additive);\n\n // apply sort data\n const beforeApplyEvent = this.emit('beforesortingapply', { column: newCol, order, additive });\n if (beforeApplyEvent.defaultPrevented) {\n return;\n }\n order = beforeApplyEvent.detail.order;\n const cmp = this.getComparer(column, order);\n\n if (additive && this.sorting) {\n const sorting: SortingOrder = {};\n const sortingFunc: SortingOrderFunction = {};\n\n this.sorting = {\n ...this.sorting,\n ...sorting,\n };\n // extend sorting function with new sorting for multiple columns sorting\n this.sortingFunc = {\n ...this.sortingFunc,\n ...sortingFunc,\n };\n\n if (column.prop in sorting && size(sorting) > 1 && order === undefined) {\n delete sorting[column.prop];\n delete sortingFunc[column.prop];\n } else {\n sorting[column.prop] = order;\n sortingFunc[column.prop] = cmp;\n }\n } else {\n // reset sorting\n this.sorting = { [column.prop]: order };\n this.sortingFunc = { [column.prop]: cmp };\n }\n\n this.doSort(this.sorting, this.sortingFunc);\n }\n\n /**\n * Sort items by sorting function\n * @requires proxyItems applied to row store\n * @requires source applied to row store\n * \n * @param sorting - per column sorting\n * @param data - this.stores['rgRow'].store.get('source')\n */\n async sort(sorting: SortingOrder, sortingFunc: SortingOrderFunction, types: RevoGrid.DimensionRows[] = ['rgRow', 'rowPinStart', 'rowPinEnd']) {\n // if no sorting - reset\n if (!size(sorting)) {\n this.sorting = null;\n this.sortingFunc = null;\n return;\n }\n // set sorting\n this.sorting = sorting;\n this.sortingFunc = sortingFunc;\n\n // by default it'll sort by rgRow store\n // todo: support multiple stores\n for (let type of types) {\n const store = await this.revogrid.getSourceStore(type);\n // row data\n const source = store.get('source');\n // row indexes\n const proxyItems = store.get('proxyItems');\n const data = this.sortIndexByItems([...proxyItems], source, sortingFunc);\n setStore(store, {\n proxyItems: data,\n source: [...source],\n });\n }\n this.emit('afterSortingApply');\n }\n\n defaultCellCompare(prop: RevoGrid.ColumnProp, a: RevoGrid.DataType, b: RevoGrid.DataType) {\n const av = a[prop]?.toString().toLowerCase();\n const bv = b[prop]?.toString().toLowerCase();\n\n return av == bv ? 0 : av > bv ? 1 : -1;\n }\n\n descCellCompare(cmp: RevoGrid.CellCompareFunc) {\n return (prop: RevoGrid.ColumnProp, a: RevoGrid.DataType, b: RevoGrid.DataType): number => {\n return -1 * cmp(prop, a, b);\n };\n }\n\n sortIndexByItems(indexes: number[], source: RevoGrid.DataType[], sortingFunc: SortingOrderFunction): number[] {\n // if no sorting - return unsorted indexes\n if (Object.entries(sortingFunc).length === 0) {\n // Unsort indexes\n return [...Array(indexes.length).keys()];\n }\n // \n /**\n * go through all indexes and align in new order\n * performs a multi-level sorting by applying multiple comparison functions to determine the order of the items based on different properties.\n */\n return indexes.sort((a, b) => {\n for (const [prop, cmp] of Object.entries(sortingFunc)) {\n const itemA = source[a];\n const itemB = source[b];\n\n /**\n * If the comparison function returns a non-zero value (sorted), it means that the items should be sorted based on the given property. In such a case, the function immediately returns the sorted value, indicating the order in which the items should be arranged.\n * If none of the comparison functions result in a non-zero value, indicating that the items are equal or should remain in the same order, the function eventually returns 0.\n */\n const sorted = cmp(prop, itemA, itemB);\n if (sorted) {\n return sorted;\n }\n }\n return 0;\n });\n }\n\n getNextOrder(currentOrder: RevoGrid.Order): RevoGrid.Order {\n switch (currentOrder) {\n case undefined:\n return 'asc';\n case 'asc':\n return 'desc';\n case 'desc':\n return undefined;\n }\n }\n}\n"]}
@@ -0,0 +1,183 @@
1
+ import { generateFakeDataObject } from './data.js';
2
+
3
+ window.eventsPrevented = {};
4
+ window.showRowHeaders = function (isShow) {
5
+ const grid = document.querySelector('revo-grid');
6
+ grid.rowHeaders = isShow;
7
+ };
8
+ window.showColGrouping = function (isShow) {
9
+ setData({
10
+ groupedHeader: isShow,
11
+ });
12
+ };
13
+ window.setRowSize = function (s) {
14
+ const grid = document.querySelector('revo-grid');
15
+ grid.rowSize = s;
16
+ };
17
+ window.setEdit = function (rgRow, prop) {
18
+ const grid = document.querySelector('revo-grid');
19
+ grid.setCellEdit(rgRow, prop);
20
+ };
21
+ window.scrollToCol = function (x = 30) {
22
+ const grid = document.querySelector('revo-grid');
23
+ grid.scrollToColumnProp(x);
24
+ };
25
+ window.clearGrouping = function () {
26
+ const grid = document.querySelector('revo-grid');
27
+ grid.grouping = {};
28
+ };
29
+ window.setGrouping = function (props = [], expandedAll = false, groupLabelTemplate) {
30
+ const grid = document.querySelector('revo-grid');
31
+ groupLabelTemplate = (createElement, { name, depth }) => {
32
+ return createElement('span', null, `${props[depth]}: ${name}`);
33
+ };
34
+ grid.grouping = { props, expandedAll, groupLabelTemplate };
35
+ };
36
+ window.setTrimmed = function (rows = []) {
37
+ const grid = document.querySelector('revo-grid');
38
+ grid.trimmedRows = rows.reduce((r, v) => {
39
+ r[v] = true;
40
+ return r;
41
+ }, {});
42
+ };
43
+
44
+ window.exportGrid = function (filename = 'new file') {
45
+ const grid = document.querySelector('revo-grid');
46
+ grid.getPlugins().then(plugins => {
47
+ plugins.forEach(p => {
48
+ if (p.exportFile) {
49
+ const exportPlugin = p;
50
+ exportPlugin.exportFile({ filename });
51
+ }
52
+ });
53
+ });
54
+ };
55
+
56
+ let defaultData = {
57
+ rows: 0,
58
+ cols: 0,
59
+ topPinned: [],
60
+ bottomPinned: [],
61
+ colPinEnd: [],
62
+ colPinStart: [],
63
+ // groupedHeader: true,
64
+ // order: 5
65
+ };
66
+ window.setData = function (config = {}) {
67
+ defaultData = { ...defaultData, ...config };
68
+ const $loader = document.querySelector('.loader');
69
+ $loader.style.display = 'block';
70
+ setTimeout(() => {
71
+ const grid = document.querySelector('revo-grid');
72
+ const data = generateFakeDataObject(defaultData);
73
+
74
+ grid.columns = data.headers;
75
+ grid.source = data.rows;
76
+
77
+ grid.pinnedTopSource = data.pinnedTopRows;
78
+ grid.pinnedBottomSource = data.pinnedBottomRows;
79
+ $loader.style.display = 'none';
80
+ }, 0);
81
+ };
82
+ window.setPinned = function (type, checked) {
83
+ const val = [];
84
+ if (checked) {
85
+ switch (type) {
86
+ case 'colPinStart':
87
+ val.push(0);
88
+ break;
89
+ case 'colPinEnd':
90
+ val.push(1);
91
+ break;
92
+ case 'topPinned':
93
+ val.push(0);
94
+ break;
95
+ case 'bottomPinned':
96
+ val.push(1);
97
+ break;
98
+ }
99
+ }
100
+ setData({
101
+ [type]: val,
102
+ });
103
+ };
104
+ window.preventEvent = function (name, checked) {
105
+ eventsPrevented[name] = checked;
106
+ };
107
+ let keys = 2;
108
+ window.toggleVisibility = function (checked) {
109
+ if (!checked) {
110
+ const grid = document.querySelector('revo-grid');
111
+ grid.remove();
112
+ } else {
113
+ const holder = document.querySelector('.grid-holder');
114
+ const grid = document.createElement('revo-grid', { is: 'revo-grid' });
115
+ grid.setAttribute('key', keys++);
116
+ holder.appendChild(grid);
117
+ setData();
118
+ }
119
+ };
120
+
121
+
122
+ window.onload = onLoad;
123
+
124
+ function onLoad() {
125
+ const grid = document.querySelector('revo-grid');
126
+
127
+ grid.readonly = false;
128
+ grid.range = true;
129
+ grid.resize = true;
130
+
131
+ const filterFunc = (cellValue, extraValue) => {
132
+ if (!cellValue) {
133
+ return false;
134
+ }
135
+ if (typeof cellValue !== 'string') {
136
+ cellValue = JSON.stringify(cellValue);
137
+ }
138
+ return cellValue === extraValue;
139
+ };
140
+ // if you want extra input field for @extraValue
141
+ filterFunc.extra = 'input';
142
+
143
+ const filterConfig = {
144
+ include: ['newEqual'],
145
+ customFilters: {
146
+ newEqual: {
147
+ columnFilterType: 'myFilterType', // column filter type id
148
+ name: 'myEqual',
149
+ func: filterFunc,
150
+ },
151
+ },
152
+ disableDynamicFiltering: true,
153
+ };
154
+
155
+ grid.filter = filterConfig;
156
+ // grid.stretch = true;
157
+ grid.exporting = true;
158
+ grid.rowDefinitions = [
159
+ {
160
+ type: 'rgRow',
161
+ index: 1,
162
+ size: 100,
163
+ },
164
+ ];
165
+ /*
166
+ grid.autoSizeColumn = {
167
+ mode: 'autoSizeAll',
168
+ };*/
169
+ // default
170
+ setData({ rows: 100, cols: 10 });
171
+
172
+ // events testing
173
+ // 'beforerange', 'setRange', 'beforefocuslost', 'beforecellfocus', 'afterfocus', 'beforeedit', 'aftercolumnresize'
174
+ const events = ['beforeedit', 'beforerange', 'setRange', 'afteredit'];
175
+ events.forEach(e => {
176
+ grid.addEventListener(e, $e => {
177
+ if (window.eventsPrevented[e]) {
178
+ $e.preventDefault();
179
+ }
180
+ console.log(`%c${e}`, 'background: #50d260; color: #fff; border-radius: 3px; padding: 2px 5px;', $e);
181
+ });
182
+ });
183
+ }
@@ -29,7 +29,7 @@ export default class LocalScrollService {
29
29
  this.cancelScroll(e.dimension);
30
30
  const frameAnimation = new Promise((resolve, reject) => {
31
31
  const animationId = window.requestAnimationFrame(() => {
32
- resolve(true);
32
+ resolve();
33
33
  });
34
34
  this.preventArtificialScroll[e.dimension] = reject.bind(null, animationId);
35
35
  });
@@ -1 +1 @@
1
- {"version":3,"file":"localScrollService.js","sourceRoot":"","sources":["../../src/services/localScrollService.ts"],"names":[],"mappings":"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","sourcesContent":["import { scaleValue } from '../utils';\nimport { RevoGrid } from '../interfaces';\n\ninterface Config {\n beforeScroll(e: RevoGrid.ViewPortScrollEvent): void;\n afterScroll(e: RevoGrid.ViewPortScrollEvent): void;\n}\n\ntype Params = {\n contentSize: number;\n virtualContentSize?: number;\n clientSize: number;\n virtualSize: number;\n maxSize?: number;\n};\n\nconst initialParams: Params = {\n contentSize: 0,\n clientSize: 0,\n virtualSize: 0,\n maxSize: 0,\n};\nconst NO_COORDINATE = -1;\nexport default class LocalScrollService {\n private preventArtificialScroll: Record<RevoGrid.DimensionType, () => void | null> = { rgRow: null, rgCol: null };\n // to check if scroll changed\n private previousScroll: Record<RevoGrid.DimensionType, number> = { rgRow: NO_COORDINATE, rgCol: NO_COORDINATE };\n private params: Record<RevoGrid.DimensionType, Params> = { rgRow: { ...initialParams }, rgCol: { ...initialParams } };\n\n constructor(private cfg: Config) {}\n\n static getVirtualContentSize(contentSize: number, clientSize: number, virtualSize: number = 0): number {\n return contentSize + (virtualSize ? clientSize - virtualSize : 0);\n }\n\n setParams(params: Params, dimension: RevoGrid.DimensionType) {\n const virtualContentSize = LocalScrollService.getVirtualContentSize(params.contentSize, params.clientSize, params.virtualSize);\n this.params[dimension] = {\n ...params,\n maxSize: virtualContentSize - params.clientSize,\n virtualContentSize,\n };\n }\n\n // apply scroll values after scroll done\n async setScroll(e: RevoGrid.ViewPortScrollEvent) {\n this.cancelScroll(e.dimension);\n\n const frameAnimation = new Promise<boolean>((resolve, reject) => {\n const animationId = window.requestAnimationFrame(() => {\n resolve(true);\n });\n this.preventArtificialScroll[e.dimension] = reject.bind(null, animationId);\n });\n try {\n await frameAnimation;\n const params = this.getParams(e.dimension);\n e.coordinate = Math.ceil(e.coordinate);\n this.previousScroll[e.dimension] = this.wrapCoordinate(e.coordinate, params);\n this.preventArtificialScroll[e.dimension] = null;\n this.cfg.afterScroll({\n ...e,\n coordinate: params.virtualSize ? this.convert(e.coordinate, params, false) : e.coordinate,\n });\n\n } catch (id) {\n window.cancelAnimationFrame(id);\n }\n }\n\n // initiate scrolling event\n scroll(\n coordinate: number,\n dimension: RevoGrid.DimensionType,\n force = false,\n delta?: number,\n outside = false\n ) {\n this.cancelScroll(dimension);\n if (!force && this.previousScroll[dimension] === coordinate) {\n this.previousScroll[dimension] = NO_COORDINATE;\n return;\n }\n\n const param = this.getParams(dimension);\n this.cfg.beforeScroll({\n dimension: dimension,\n coordinate: param.virtualSize ? this.convert(coordinate, param) : coordinate,\n delta,\n outside\n });\n }\n\n private getParams(dimension: RevoGrid.DimensionType): Params {\n return this.params[dimension];\n }\n\n // check if scroll outside of region to avoid looping\n private wrapCoordinate(c: number, param: Params): number {\n if (c < 0) {\n return NO_COORDINATE;\n }\n\n if (c > param.maxSize) {\n return param.maxSize;\n }\n return c;\n }\n\n // prevent already started scroll, performance optimization\n private cancelScroll(dimension: RevoGrid.DimensionType) {\n const canceler = this.preventArtificialScroll[dimension];\n if (canceler) {\n canceler();\n this.preventArtificialScroll[dimension] = null;\n }\n }\n\n /* convert virtual to real and back, scale range */\n private convert(pos: number, param: Params, toReal: boolean = true): number {\n const minRange: number = param.clientSize;\n const from: [number, number] = [0, param.virtualContentSize - minRange];\n const to: [number, number] = [0, param.contentSize - param.virtualSize];\n if (toReal) {\n return scaleValue(pos, from, to);\n }\n return scaleValue(pos, to, from);\n }\n}\n"]}
1
+ {"version":3,"file":"localScrollService.js","sourceRoot":"","sources":["../../src/services/localScrollService.ts"],"names":[],"mappings":"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","sourcesContent":["import { scaleValue } from '../utils';\nimport { RevoGrid } from '../interfaces';\n\ninterface Config {\n beforeScroll(e: RevoGrid.ViewPortScrollEvent): void;\n afterScroll(e: RevoGrid.ViewPortScrollEvent): void;\n}\n\ntype Params = {\n contentSize: number;\n virtualContentSize?: number;\n clientSize: number;\n virtualSize: number;\n maxSize?: number;\n};\n\nconst initialParams: Params = {\n contentSize: 0,\n clientSize: 0,\n virtualSize: 0,\n maxSize: 0,\n};\nconst NO_COORDINATE = -1;\nexport default class LocalScrollService {\n private preventArtificialScroll: Record<RevoGrid.DimensionType, () => void | null> = { rgRow: null, rgCol: null };\n // to check if scroll changed\n private previousScroll: Record<RevoGrid.DimensionType, number> = { rgRow: NO_COORDINATE, rgCol: NO_COORDINATE };\n private params: Record<RevoGrid.DimensionType, Params> = { rgRow: { ...initialParams }, rgCol: { ...initialParams } };\n\n constructor(private cfg: Config) {}\n\n static getVirtualContentSize(contentSize: number, clientSize: number, virtualSize: number = 0): number {\n return contentSize + (virtualSize ? clientSize - virtualSize : 0);\n }\n\n setParams(params: Params, dimension: RevoGrid.DimensionType) {\n const virtualContentSize = LocalScrollService.getVirtualContentSize(params.contentSize, params.clientSize, params.virtualSize);\n this.params[dimension] = {\n ...params,\n maxSize: virtualContentSize - params.clientSize,\n virtualContentSize,\n };\n }\n\n // apply scroll values after scroll done\n async setScroll(e: RevoGrid.ViewPortScrollEvent) {\n this.cancelScroll(e.dimension);\n\n const frameAnimation = new Promise<void>((resolve, reject) => {\n const animationId = window.requestAnimationFrame(() => {\n resolve();\n });\n this.preventArtificialScroll[e.dimension] = reject.bind(null, animationId);\n });\n try {\n await frameAnimation;\n const params = this.getParams(e.dimension);\n e.coordinate = Math.ceil(e.coordinate);\n this.previousScroll[e.dimension] = this.wrapCoordinate(e.coordinate, params);\n this.preventArtificialScroll[e.dimension] = null;\n this.cfg.afterScroll({\n ...e,\n coordinate: params.virtualSize ? this.convert(e.coordinate, params, false) : e.coordinate,\n });\n\n } catch (id) {\n window.cancelAnimationFrame(id);\n }\n }\n\n // initiate scrolling event\n scroll(\n coordinate: number,\n dimension: RevoGrid.DimensionType,\n force = false,\n delta?: number,\n outside = false\n ) {\n this.cancelScroll(dimension);\n if (!force && this.previousScroll[dimension] === coordinate) {\n this.previousScroll[dimension] = NO_COORDINATE;\n return;\n }\n\n const param = this.getParams(dimension);\n this.cfg.beforeScroll({\n dimension: dimension,\n coordinate: param.virtualSize ? this.convert(coordinate, param) : coordinate,\n delta,\n outside\n });\n }\n\n private getParams(dimension: RevoGrid.DimensionType): Params {\n return this.params[dimension];\n }\n\n // check if scroll outside of region to avoid looping\n private wrapCoordinate(c: number, param: Params): number {\n if (c < 0) {\n return NO_COORDINATE;\n }\n\n if (c > param.maxSize) {\n return param.maxSize;\n }\n return c;\n }\n\n // prevent already started scroll, performance optimization\n private cancelScroll(dimension: RevoGrid.DimensionType) {\n const canceler = this.preventArtificialScroll[dimension];\n if (canceler) {\n canceler();\n this.preventArtificialScroll[dimension] = null;\n }\n }\n\n /* convert virtual to real and back, scale range */\n private convert(pos: number, param: Params, toReal: boolean = true): number {\n const minRange: number = param.clientSize;\n const from: [number, number] = [0, param.virtualContentSize - minRange];\n const to: [number, number] = [0, param.contentSize - param.virtualSize];\n if (toReal) {\n return scaleValue(pos, from, to);\n }\n return scaleValue(pos, to, from);\n }\n}\n"]}
@@ -1,6 +1,4 @@
1
- import { VNode } from '../stencil-public-runtime';
2
- import { RevoGrid } from '../interfaces';
3
- type Props = {
1
+ export type ResizeProps = {
4
2
  active: ('r' | 'rb' | 'b' | 'lb' | 'l' | 'lt' | 't' | 'rt')[];
5
3
  fitParent: boolean;
6
4
  minWidth: number;
@@ -9,7 +7,7 @@ type Props = {
9
7
  maxWidth?: number;
10
8
  maxHeight?: number;
11
9
  onResize?(e: ResizeEvent): void;
12
- onDoubleClick?(): void;
10
+ onDoubleClick?(originalEvent: MouseEvent): void;
13
11
  };
14
12
  export type ResizeEvent = {
15
13
  eventName: string;
@@ -18,6 +16,11 @@ export type ResizeEvent = {
18
16
  width?: number;
19
17
  height?: number;
20
18
  };
19
+ export declare enum ResizeEvents {
20
+ start = "resize:start",
21
+ move = "resize:move",
22
+ end = "resize:end"
23
+ }
21
24
  export declare class ResizeDirective {
22
25
  private initialProps;
23
26
  private $event?;
@@ -39,7 +42,7 @@ export declare class ResizeDirective {
39
42
  private disableCalcMap;
40
43
  private mouseMoveFunc;
41
44
  private mouseUpFunc;
42
- constructor(initialProps: Partial<Props>, $event?: (e: ResizeEvent) => void);
45
+ constructor(initialProps: Partial<ResizeProps>, $event?: (e: ResizeEvent) => void);
43
46
  set($el: HTMLElement): void;
44
47
  emitEvent(eventName: string, additionalOptions?: any): void;
45
48
  private static isTouchEvent;
@@ -51,5 +54,3 @@ export declare class ResizeDirective {
51
54
  private bindMove;
52
55
  private unbindMove;
53
56
  }
54
- export declare const ResizableElement: (props: Partial<Props> & RevoGrid.CellProps, children: VNode[]) => any;
55
- export {};