slickgrid-vue 10.1.1 → 10.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -18,7 +18,10 @@ SlickGrid-Vue is a custom component created specifically for [VueJS](https://vue
18
18
  You can also play with the live Stackbliz [Slickgrid-Vue-Demos](https://github.com/ghiscoding/slickgrid-vue-demos).
19
19
  Stackblitz is also the recommended way to provide a repro when opening a new bug or feature request.
20
20
 
21
- [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/ghiscoding/slickgrid-vue-demos)
21
+ | Stackblitz | Description |
22
+ | ---------- | ----------- |
23
+ | [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/ghiscoding/slickgrid-vue-demos) | with I18N Translate |
24
+ | [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/ghiscoding/slickgrid-vue-demos/tree/main/single-locale-without-i18n) | Single Locale (_without i18n_) |
22
25
 
23
26
  Visit the **[Docs - Quick Start](https://ghiscoding.gitbook.io/slickgrid-vue/getting-started/quick-start)** and/or clone the [Slickgrid-Vue-Demos](https://github.com/ghiscoding/slickgrid-vue-demos) repository for a fully working local demo. Please make sure to read the documentation before opening any new issue and also consider asking installation and/or general questions on [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=slickgrid) unless you think there's a bug with the library.
24
27
 
@@ -54,11 +57,11 @@ const columns: Ref<Column[]> = ref([
54
57
  { id: 'lastName', name: 'Last Name', field: 'lastName', sortable: true },
55
58
  { id: 'age', name: 'Age', field: 'age', type: 'number', sortable: true },
56
59
  ]);
60
+ const options = ref<GridOption>({ /*...*/ }); // optional grid options
57
61
  const dataset = ref<User[]>([
58
62
  { id: 1, firstName: 'John', lastName: 'Doe', age: 20 },
59
63
  { id: 2, firstName: 'Jane', lastName: 'Smith', age: 21 },
60
64
  ]);
61
- const options = ref<GridOption>({ /*...*/ }); // optional grid options
62
65
  </script>
63
66
 
64
67
  <template>
package/dist/index.d.ts CHANGED
@@ -55,6 +55,7 @@ import { OnColumnsReorderedEventArgs } from '@slickgrid-universal/common';
55
55
  import { OnColumnsResizeDblClickEventArgs } from '@slickgrid-universal/common';
56
56
  import { OnColumnsResizedEventArgs } from '@slickgrid-universal/common';
57
57
  import { OnCompositeEditorChangeEventArgs } from '@slickgrid-universal/common';
58
+ import { OnContextMenuArgs } from '@slickgrid-universal/common';
58
59
  import { OnDblClickEventArgs } from '@slickgrid-universal/common';
59
60
  import { OnDragReplaceCellsEventArgs } from '@slickgrid-universal/common';
60
61
  import { OnFooterClickEventArgs } from '@slickgrid-universal/common';
@@ -298,9 +299,7 @@ export declare interface SlickgridVueProps {
298
299
  onOnColumnsResized?: VueSlickEventHandler<OnColumnsResizedEventArgs>;
299
300
  onOnColumnsResizeDblClick?: VueSlickEventHandler<OnColumnsResizeDblClickEventArgs>;
300
301
  onOnCompositeEditorChange?: VueSlickEventHandler<OnCompositeEditorChangeEventArgs>;
301
- onOnContextMenu?: VueSlickEventHandler<{
302
- grid: SlickGrid;
303
- }>;
302
+ onOnContextMenu?: VueSlickEventHandler<OnContextMenuArgs>;
304
303
  onOnDrag?: VueSlickEventHandler<DragRowMove>;
305
304
  onOnDragEnd?: VueSlickEventHandler<DragRowMove>;
306
305
  onOnDragInit?: VueSlickEventHandler<DragRowMove>;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { GlobalGridOptions as An, SlickgridConfig as wn, SlickEventHandler as On, BackendUtilityService as kn, GridEventService as Rn, SharedService as In, CollectionService as Pn, ExtensionUtility as En, FilterFactory as Dn, FilterService as xn, ResizerService as Fn, SortService as Gn, TreeDataService as Ge, PaginationService as Bn, ExtensionService as Mn, GridService as Be, GridStateService as Me, HeaderGroupingService as ze, SlickGroupItemMetadataProvider as zn, SlickDataView as Tn, autoAddEditorFormatterToColumnsWithEditor as Te, SlickGrid as Hn, emptyElement as Vn, collectionObserver as Ln, isColumnDateType as Nn, PluginFlagMappings as He } from "@slickgrid-universal/common";
1
+ import { GlobalGridOptions as An, SlickgridConfig as wn, SlickEventHandler as On, BackendUtilityService as kn, GridEventService as Rn, SharedService as In, CollectionService as Pn, ExtensionUtility as En, FilterFactory as xn, FilterService as Dn, ResizerService as Fn, SortService as Gn, TreeDataService as Ge, PaginationService as Bn, ExtensionService as Mn, GridService as Be, GridStateService as Me, HeaderGroupingService as ze, SlickGroupItemMetadataProvider as zn, SlickDataView as Tn, autoAddEditorFormatterToColumnsWithEditor as Te, SlickGrid as Hn, emptyElement as Vn, collectionObserver as Ln, isColumnDateType as Nn, PluginFlagMappings as He } from "@slickgrid-universal/common";
2
2
  export * from "@slickgrid-universal/common";
3
3
  import { Aggregators as bt, Enums as yt, Formatters as At, GroupTotalFormatters as wt, SortComparers as Ot, Utilities as kt } from "@slickgrid-universal/common";
4
4
  import { EventPubSubService as Ve } from "@slickgrid-universal/event-pub-sub";
@@ -233,10 +233,10 @@ const rt = ["id"], lt = ["id"], st = 1e4, mt = /* @__PURE__ */ Wn({
233
233
  emits: ["update:options", "update:pagination", "update:columns", "update:dataset", "update:hierarchical"],
234
234
  setup(c) {
235
235
  const u = qn(), v = c, p = V(), _e = V(), je = V(null), t = V({}), B = V(0), $e = Le(() => `slickGridContainer-${v.gridId}`), pe = Le(() => be.value?.backendServiceApi?.service);
236
- let L = 0, d = null, o, me = [], j, $ = !1, M, J = !1, se = !1, te = !1, ue = !1, N = !1, W = !0, Ce, f = [], ce = !1, Y = !1, q = [], ie, Q, D, ae, z, P;
236
+ let L = 0, d = null, o, me = [], j, $ = !1, M, J = !1, se = !1, te = !1, ue = !1, N = !1, W = !0, Ce, f = [], ce = !1, Y = !1, q = [], ie, Q, x, ae, z, P;
237
237
  const Je = new wn(), T = new On(), s = new Ve();
238
238
  s.eventNamingStyle = "camelCaseWithExtraOnPrefix";
239
- const g = new it(), E = new at(), w = new kn(), U = new Rn(), l = new In(), de = new Pn(E), fe = new En(l, w, E), he = new Dn(Je, E, de), m = new xn(he, s, l, w), O = new Fn(s), b = new Gn(de, l, s, w), I = new Ge(s, m, l, b), k = new Bn(s, l, w), y = new Mn(
239
+ const g = new it(), E = new at(), w = new kn(), U = new Rn(), l = new In(), de = new Pn(E), fe = new En(l, w, E), he = new xn(Je, E, de), m = new Dn(he, s, l, w), O = new Fn(s), b = new Gn(de, l, s, w), I = new Ge(s, m, l, b), k = new Bn(s, l, w), y = new Mn(
240
240
  fe,
241
241
  m,
242
242
  s,
@@ -245,7 +245,7 @@ const rt = ["id"], lt = ["id"], st = 1e4, mt = /* @__PURE__ */ Wn({
245
245
  I,
246
246
  E,
247
247
  () => K
248
- ), x = new Me(
248
+ ), D = new Me(
249
249
  y,
250
250
  m,
251
251
  s,
@@ -253,7 +253,7 @@ const rt = ["id"], lt = ["id"], st = 1e4, mt = /* @__PURE__ */ Wn({
253
253
  b,
254
254
  I
255
255
  ), K = new Be(
256
- x,
256
+ D,
257
257
  m,
258
258
  s,
259
259
  k,
@@ -266,14 +266,14 @@ const rt = ["id"], lt = ["id"], st = 1e4, mt = /* @__PURE__ */ Wn({
266
266
  m,
267
267
  U,
268
268
  K,
269
- x,
269
+ D,
270
270
  Z,
271
271
  k,
272
272
  O,
273
273
  b,
274
274
  I
275
275
  ];
276
- g.registerInstance("PubSubService", s), g.registerInstance("EventPubSubService", s), g.registerInstance("ExtensionUtility", fe), g.registerInstance("FilterService", m), g.registerInstance("CollectionService", de), g.registerInstance("ExtensionService", y), g.registerInstance("GridEventService", U), g.registerInstance("GridService", K), g.registerInstance("GridStateService", x), g.registerInstance("HeaderGroupingService", Z), g.registerInstance("PaginationService", k), g.registerInstance("ResizerService", O), g.registerInstance("SharedService", l), g.registerInstance("SortService", b), g.registerInstance("TranslaterService", E), g.registerInstance("TreeDataService", I);
276
+ g.registerInstance("PubSubService", s), g.registerInstance("EventPubSubService", s), g.registerInstance("ExtensionUtility", fe), g.registerInstance("FilterService", m), g.registerInstance("CollectionService", de), g.registerInstance("ExtensionService", y), g.registerInstance("GridEventService", U), g.registerInstance("GridService", K), g.registerInstance("GridStateService", D), g.registerInstance("HeaderGroupingService", Z), g.registerInstance("PaginationService", k), g.registerInstance("ResizerService", O), g.registerInstance("SharedService", l), g.registerInstance("SortService", b), g.registerInstance("TranslaterService", E), g.registerInstance("TreeDataService", I);
277
277
  const be = ne(c, "options");
278
278
  t.value = { ...Ue, ...be.value };
279
279
  const A = V(), Ye = ne(c, "pagination");
@@ -286,7 +286,7 @@ const rt = ["id"], lt = ["id"], st = 1e4, mt = /* @__PURE__ */ Wn({
286
286
  (e) => {
287
287
  const n = L, i = le(e, G.value || []);
288
288
  let a = t.value?.enableDeepCopyDatasetOnPageLoad ? nt(e) : e;
289
- o && t.value?.enableTreeData && Array.isArray(e) && (e.length > 0 || e.length !== n || !i) && (ue = !1, a = xe(e, !i)), we(a || []), L = (e || []).length, o && t.value?.autoFitColumnsOnFirstLoad && n === 0 && !J && (o.autosizeColumns(), J = !0);
289
+ o && t.value?.enableTreeData && Array.isArray(e) && (e.length > 0 || e.length !== n || !i) && (ue = !1, a = De(e, !i)), we(a || []), L = (e || []).length, o && t.value?.autoFitColumnsOnFirstLoad && n === 0 && !J && (o.autosizeColumns(), J = !0);
290
290
  },
291
291
  { immediate: !0 }
292
292
  );
@@ -339,7 +339,7 @@ const rt = ["id"], lt = ["id"], st = 1e4, mt = /* @__PURE__ */ Wn({
339
339
  function Qe() {
340
340
  if (!t.value || !F.value)
341
341
  throw new Error(
342
- 'Using `<Slickgrid-Vue>` requires `v-model:columns="columnDefinitions"` and `v-model:options="gridOptions.value"`, it seems that you might have forgot to provide them since at least of them is undefined.'
342
+ 'Using `<Slickgrid-Vue>` requires `v-model:columns="columns"` and `v-model:options="gridOptions.value"`, it seems that you might have forgot to provide them since at least of them is undefined.'
343
343
  );
344
344
  if (t.value.translater = E, J = !1, t.value && (t.value.frozenRow !== void 0 && t.value.frozenRow >= 0 || t.value.frozenColumn !== void 0 && t.value.frozenColumn >= 0) && t.value.enableMouseWheelScrollHandler === void 0 && (t.value.enableMouseWheelScrollHandler = !0), s.eventNamingStyle = t.value?.eventNamingStyle ?? "camelCaseWithExtraOnPrefix", s.publish("onBeforeGridCreate", !0), L = G.value?.length || 0, t.value = pn(t.value), A.value = t.value?.pagination, z = t.value?.backendServiceApi, W = !z, t.value?.enableTranslate || t.value?.i18n)
345
345
  if (M = jn("i18next", null), M)
@@ -363,7 +363,7 @@ const rt = ["id"], lt = ["id"], st = 1e4, mt = /* @__PURE__ */ Wn({
363
363
  ), l.dataView = d, l.slickGrid = o, l.gridContainerElement = p.value, j && o.registerPlugin(j), Sn(), y.bindDifferentExtensions(), nn(o, t.value, d), l.frozenVisibleColumnId = o.getFrozenColumnId(), o.init();
364
364
  const i = p.value;
365
365
  if (i && O.init(o, i), !t.value?.enablePagination && t.value?.showCustomFooter && t.value?.customFooterOptions && i && (Q = new Xn(o, t.value?.customFooterOptions, s, E), Q.renderFooter(i)), d) {
366
- const r = t.value?.enableTreeData ? xe(G.value || []) : G.value;
366
+ const r = t.value?.enableTreeData ? De(G.value || []) : G.value;
367
367
  if (Array.isArray(r) && d.setItems(r, t.value.datasetIdPropertyName ?? "id"), o?.getSelectionModel() && t.value?.dataView && "syncGridSelection" in t.value.dataView) {
368
368
  let h = !1;
369
369
  t.value.backendServiceApi && "syncGridSelectionWithBackendService" in t.value.dataView && (h = t.value.dataView.syncGridSelectionWithBackendService);
@@ -388,11 +388,11 @@ const rt = ["id"], lt = ["id"], st = 1e4, mt = /* @__PURE__ */ Wn({
388
388
  eventPubSubService: s,
389
389
  filterService: m,
390
390
  gridEventService: U,
391
- gridStateService: x,
391
+ gridStateService: D,
392
392
  gridService: K,
393
393
  headerGroupingService: Z,
394
394
  extensionService: y,
395
- paginationComponent: D,
395
+ paginationComponent: x,
396
396
  paginationService: k,
397
397
  resizerService: O,
398
398
  sortService: b,
@@ -403,7 +403,7 @@ const rt = ["id"], lt = ["id"], st = 1e4, mt = /* @__PURE__ */ Wn({
403
403
  function Ae(e = !1) {
404
404
  if (s.publish("onBeforeGridDestroy", o), T?.unsubscribeAll(), typeof M?.off == "function" && M.off("languageChanged"), me.forEach((n) => n?.disconnect()), s.unsubscribeAll(), Se.forEach((n) => {
405
405
  n?.dispose && n.dispose();
406
- }), Se.length = 0, pe.value?.dispose?.(), Ze(), ie?.dispose(), Q?.dispose(), D?.dispose(), d && (d.setItems && d.setItems([]), d.destroy && d.destroy()), o?.destroy && o.destroy(e), q = ot(q), z) {
406
+ }), Se.length = 0, pe.value?.dispose?.(), Ze(), ie?.dispose(), Q?.dispose(), x?.dispose(), d && (d.setItems && d.setItems([]), d.destroy && d.destroy()), o?.destroy && o.destroy(e), q = ot(q), z) {
407
407
  for (const n of Object.keys(z))
408
408
  z[n] = null;
409
409
  z = void 0;
@@ -530,12 +530,12 @@ const rt = ["id"], lt = ["id"], st = 1e4, mt = /* @__PURE__ */ Wn({
530
530
  }
531
531
  }
532
532
  function ln(e) {
533
- const n = x?.needToPreserveRowSelection() ?? !1;
533
+ const n = D?.needToPreserveRowSelection() ?? !1;
534
534
  o && !n && t.value?.backendServiceApi && (t.value.enableSelection || t.value.enableCheckboxSelector) && o.setSelectedRows([]);
535
535
  const { pageNumber: i, pageSize: a } = e;
536
536
  l && a !== void 0 && i !== void 0 && (l.currentPagination = { pageNumber: i, pageSize: a }), s.publish("onGridStateChanged", {
537
537
  change: { newValues: { pageNumber: i, pageSize: a }, type: "pagination" },
538
- gridState: x.getCurrentGridState()
538
+ gridState: D.getCurrentGridState()
539
539
  });
540
540
  }
541
541
  function sn(e) {
@@ -593,9 +593,9 @@ const rt = ["id"], lt = ["id"], st = 1e4, mt = /* @__PURE__ */ Wn({
593
593
  t.value && (k.totalItems = B.value, k.init(o, e, z), q.push(
594
594
  s.subscribe("onPaginationChanged", (n) => ln(n)),
595
595
  s.subscribe("onPaginationVisibilityChanged", (n) => {
596
- Y = n?.visible ?? !1, t.value?.backendServiceApi && w?.refreshBackendDataset(t.value), De(Y);
596
+ Y = n?.visible ?? !1, t.value?.backendServiceApi && w?.refreshBackendDataset(t.value), xe(Y);
597
597
  })
598
- ), De(), N = !0);
598
+ ), xe(), N = !0);
599
599
  }
600
600
  function vn(e) {
601
601
  if (e?.editor) {
@@ -612,7 +612,7 @@ const rt = ["id"], lt = ["id"], st = 1e4, mt = /* @__PURE__ */ Wn({
612
612
  }
613
613
  }
614
614
  function gn() {
615
- t.value.presets && Array.isArray(t.value.presets.columns) && t.value.presets.columns.length > 0 && x.changeColumnsArrangement(t.value.presets.columns, !1);
615
+ t.value.presets && Array.isArray(t.value.presets.columns) && t.value.presets.columns.length > 0 && D.changeColumnsArrangement(t.value.presets.columns, !1);
616
616
  }
617
617
  function ge() {
618
618
  t.value && t.value.presets && (Array.isArray(t.value.presets.filters) || Array.isArray(t.value.presets?.treeData?.toggledItems)) && m.populateColumnFilterSearchTermPresets(t.value.presets?.filters || []);
@@ -679,26 +679,26 @@ const rt = ["id"], lt = ["id"], st = 1e4, mt = /* @__PURE__ */ Wn({
679
679
  }
680
680
  }
681
681
  function Sn() {
682
- Array.isArray(f) && (l.externalRegisteredResources = f), f.some((e) => e instanceof Be) || f.push(K), f.some((e) => e instanceof Me) || f.push(x), (t.value.createPreHeaderPanel && t.value.createTopHeaderPanel || t.value.createPreHeaderPanel && !t.value.enableDraggableGrouping) && !f.some((e) => e instanceof ze) && f.push(Z), t.value.enableTreeData && !f.some((e) => e instanceof Ge) && f.push(I), t.value.enableTranslate && y.translateColumnHeaders(), f.some((e) => e instanceof We) || (ie = new We(), f.push(ie)), Cn(f), t.value.enableRowDetailView && ae && ae.init(o);
682
+ Array.isArray(f) && (l.externalRegisteredResources = f), f.some((e) => e instanceof Be) || f.push(K), f.some((e) => e instanceof Me) || f.push(D), (t.value.createPreHeaderPanel && t.value.createTopHeaderPanel || t.value.createPreHeaderPanel && !t.value.enableDraggableGrouping) && !f.some((e) => e instanceof ze) && f.push(Z), t.value.enableTreeData && !f.some((e) => e instanceof Ge) && f.push(I), t.value.enableTranslate && y.translateColumnHeaders(), f.some((e) => e instanceof We) || (ie = new We(), f.push(ie)), Cn(f), t.value.enableRowDetailView && ae && ae.init(o);
683
683
  }
684
684
  function bn(e) {
685
685
  P = e, w.addRxJsResource(P), he.addRxJsResource(P), m.addRxJsResource(P), b.addRxJsResource(P), k.addRxJsResource(P), g.registerInstance("RxJsResource", P);
686
686
  }
687
- async function De(e = !0) {
687
+ async function xe(e = !0) {
688
688
  if (o && t.value?.enablePagination && !N && e) {
689
689
  if (t.value.customPaginationComponent) {
690
690
  const n = document.createElement("section"), i = $n(t.value.customPaginationComponent).mount(
691
691
  n
692
692
  );
693
- p.value.appendChild(i.$el), D = i;
693
+ p.value.appendChild(i.$el), x = i;
694
694
  } else
695
- D = new et();
695
+ x = new et();
696
696
  Jn(() => {
697
- D && (D.init(o, k, s, E), D.renderPagination(p.value), N = !0);
697
+ x && (x.init(o, k, s, E), x.renderPagination(p.value), N = !0);
698
698
  });
699
- } else e || (D?.dispose(), N = !1);
699
+ } else e || (x?.dispose(), N = !1);
700
700
  }
701
- function xe(e, n = !1) {
701
+ function De(e, n = !1) {
702
702
  const i = L;
703
703
  let a, r = [];
704
704
  return ue && _.value ? (a = I.sortHierarchicalDataset(_.value), r = a.flat) : Array.isArray(e) && e.length > 0 && (a = I.convertFlatParentChildToTreeDatasetAndSort(
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../node_modules/.pnpm/dequal@2.0.3/node_modules/dequal/lite/index.mjs","../src/global-grid-options.ts","../src/services/container.service.ts","../src/services/translaterI18Next.service.ts","../src/services/utilities.ts","../src/components/SlickgridVue.vue"],"sourcesContent":["var has = Object.prototype.hasOwnProperty;\n\nexport function dequal(foo, bar) {\n\tvar ctor, len;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","import { GlobalGridOptions as UniversalGridOptions } from '@slickgrid-universal/common';\nimport type { GridOption, RowDetailView } from './models/index.js';\n\n/** Global Grid Options Defaults */\nexport const GlobalGridOptions: Partial<GridOption> = {\n ...UniversalGridOptions,\n eventNamingStyle: 'camelCaseWithExtraOnPrefix',\n rowDetailView: {\n collapseAllOnSort: true,\n cssClass: 'detail-view-toggle',\n panelRows: 1,\n keyPrefix: '__',\n useRowClick: false,\n saveDetailViewOnScroll: false,\n } as RowDetailView,\n};\n","import type { ContainerService as UniversalContainerService } from '@slickgrid-universal/common';\n\nexport class ContainerService implements UniversalContainerService {\n private readonly container: { [key: string]: any } = {};\n\n get<T = any>(key: string): T | null {\n return this.container[key];\n }\n\n registerInstance(key: string, instance: any) {\n this.container[key] = instance;\n }\n}\n","import type { TranslaterService as UniversalTranslateService } from '@slickgrid-universal/common';\nimport type { I18Next } from '../models/i18next.interface.js';\n\n/**\n * This is a Translate Service Wrapper for Slickgrid-Universal monorepo lib to work properly,\n * it must implement Slickgrid-Universal TranslaterService interface to work properly\n */\nexport class TranslaterI18NextService implements UniversalTranslateService {\n public i18n?: I18Next;\n\n /** I18Next instance setter */\n set i18nInstance(i18n: I18Next) {\n this.i18n = i18n;\n }\n\n /**\n * Method to return the current language used by the App\n * @return {string} current language\n */\n getCurrentLanguage(): string {\n return this.i18n?.language || '';\n }\n\n /**\n * Method to set the language to use in the App and Translate Service\n * @param {string} language\n * @return {Promise} output\n */\n async use(newLang: string): Promise<any> {\n return this.i18n?.changeLanguage(newLang);\n }\n\n /**\n * Method which receives a translation key and returns the translated value assigned to that key\n * @param {string} translation key\n * @return {string} translated value\n */\n translate(translationKey: string): string {\n return this.i18n?.t(translationKey) || '';\n }\n}\n","import type { EventSubscription } from '@slickgrid-universal/common';\n\n/**\n * Loop through and dispose of all subscriptions when they are disposable\n * @param subscriptions\n * @return empty array\n */\nexport function disposeAllSubscriptions(subscriptions: Array<EventSubscription>): Array<EventSubscription> {\n if (Array.isArray(subscriptions)) {\n while (subscriptions.length > 0) {\n const subscription = subscriptions.pop() as EventSubscription;\n if ((subscription as EventSubscription)?.unsubscribe) {\n (subscription as EventSubscription).unsubscribe!();\n }\n }\n }\n return subscriptions;\n}\n","<script setup lang=\"ts\">\nimport {\n autoAddEditorFormatterToColumnsWithEditor,\n BackendUtilityService,\n collectionObserver,\n CollectionService,\n emptyElement,\n ExtensionService,\n ExtensionUtility,\n FilterFactory,\n FilterService,\n GridEventService,\n GridService,\n GridStateService,\n HeaderGroupingService,\n isColumnDateType,\n PaginationService,\n PluginFlagMappings,\n ResizerService,\n SharedService,\n SlickDataView,\n SlickEventHandler,\n SlickGrid,\n SlickgridConfig,\n SlickGroupItemMetadataProvider,\n SortService,\n TreeDataService,\n type AutocompleterEditor,\n type BackendServiceApi,\n type BackendServiceOption,\n type BasePaginationComponent,\n type BasePaginationModel,\n type Column,\n type DataViewOption,\n type EventSubscription,\n type ExtensionList,\n type ExternalResource,\n type ExternalResourceConstructor,\n type Metrics,\n type Observable,\n type Pagination,\n type PaginationMetadata,\n type RxJsFacade,\n type SelectEditor,\n} from '@slickgrid-universal/common';\nimport { SlickFooterComponent } from '@slickgrid-universal/custom-footer-component';\nimport { SlickEmptyWarningComponent } from '@slickgrid-universal/empty-warning-component';\nimport { EventPubSubService } from '@slickgrid-universal/event-pub-sub';\nimport { SlickPaginationComponent } from '@slickgrid-universal/pagination-component';\nimport { deepCopy, extend } from '@slickgrid-universal/utils';\nimport { dequal } from 'dequal/lite';\nimport {\n computed,\n createApp,\n inject,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n useAttrs,\n watch,\n type ComponentPublicInstance,\n type Ref,\n} from 'vue';\nimport { GlobalGridOptions } from '../global-grid-options.js';\nimport type { GridOption, I18Next, SlickgridVueInstance } from '../models/index.js';\nimport { ContainerService, disposeAllSubscriptions } from '../services/index.js';\nimport { TranslaterI18NextService } from '../services/translaterI18Next.service.js';\nimport type { SlickgridVueProps } from './slickgridVueProps.interface.js';\n\nconst WARN_NO_PREPARSE_DATE_SIZE = 10000; // data size to warn user when pre-parsing isn't enabled\n\nexport interface VueRowDetailView {\n create(columns: Column[], gridOptions: GridOption): any;\n init(grid: SlickGrid, containerService?: ContainerService): void;\n}\n\nconst attrs = useAttrs();\n\n// props\nconst props = withDefaults(defineProps<SlickgridVueProps>(), {\n gridId: 'myGrid',\n});\n\n// refs\nconst elm = ref<HTMLDivElement>();\nconst svExtensions = ref<ExtensionList<any>>();\nconst svInstances = ref<SlickgridVueInstance | null>(null);\nconst _gridOptions = ref<GridOption>({});\nconst totalItems = ref(0);\n\n// computed values\nconst gridContainerId = computed(() => `slickGridContainer-${props.gridId}`);\nconst backendService = computed(() => gridOptionsModel.value?.backendServiceApi?.service);\n\nlet currentDatasetLength = 0;\nlet dataview: SlickDataView<any> | null = null;\nlet grid: SlickGrid;\nlet collectionObservers: Array<null | { disconnect: () => void }> = [];\nlet groupItemMetadataProvider: SlickGroupItemMetadataProvider | undefined;\nlet hideHeaderRowAfterPageLoad = false;\nlet i18next: I18Next | null;\nlet isAutosizeColsCalled = false;\nlet isGridInitialized = false;\nlet isDatasetInitialized = false;\nlet isDatasetHierarchicalInitialized = false;\nlet isPaginationInitialized = false;\nlet isLocalGrid = true;\nlet metrics: Metrics | undefined;\nlet registeredResources: Array<ExternalResource | ExternalResourceConstructor> = [];\nlet scrollEndCalled = false;\nlet showPagination = false;\nlet subscriptions: Array<EventSubscription> = [];\n\n// components / plugins\nlet slickEmptyWarning: SlickEmptyWarningComponent | undefined;\nlet slickFooter: SlickFooterComponent | undefined;\nlet slickPagination: BasePaginationComponent | undefined;\nlet slickRowDetailView: VueRowDetailView | undefined;\n\n// initialize and assign all Service Dependencies\nlet backendServiceApi: BackendServiceApi | undefined;\nlet rxjs: RxJsFacade | undefined;\nconst slickgridConfig = new SlickgridConfig();\nconst eventHandler = new SlickEventHandler();\nconst eventPubSubService = new EventPubSubService();\neventPubSubService.eventNamingStyle = 'camelCaseWithExtraOnPrefix';\n\nconst containerService = new ContainerService();\nconst translaterService = new TranslaterI18NextService();\nconst backendUtilityService = new BackendUtilityService();\nconst gridEventService = new GridEventService();\nconst sharedService = new SharedService();\nconst collectionService = new CollectionService(translaterService);\nconst extensionUtility = new ExtensionUtility(sharedService, backendUtilityService, translaterService);\nconst filterFactory = new FilterFactory(slickgridConfig, translaterService, collectionService);\nconst filterService = new FilterService(filterFactory as any, eventPubSubService, sharedService, backendUtilityService);\nconst resizerService = new ResizerService(eventPubSubService);\nconst sortService = new SortService(collectionService, sharedService, eventPubSubService, backendUtilityService);\nconst treeDataService = new TreeDataService(eventPubSubService, filterService, sharedService, sortService);\nconst paginationService = new PaginationService(eventPubSubService, sharedService, backendUtilityService);\nconst extensionService: ExtensionService = new ExtensionService(\n extensionUtility,\n filterService,\n eventPubSubService,\n sharedService,\n sortService,\n treeDataService,\n translaterService,\n () => gridService\n);\nconst gridStateService = new GridStateService(\n extensionService,\n filterService,\n eventPubSubService,\n sharedService,\n sortService,\n treeDataService\n);\nconst gridService = new GridService(\n gridStateService,\n filterService,\n eventPubSubService,\n paginationService,\n sharedService,\n sortService,\n treeDataService\n);\nconst headerGroupingService = new HeaderGroupingService(extensionUtility);\n\nlet serviceList = [\n extensionService,\n filterService,\n gridEventService,\n gridService,\n gridStateService,\n headerGroupingService,\n paginationService,\n resizerService,\n sortService,\n treeDataService,\n];\n\n// register all Service instances in the container\ncontainerService.registerInstance('PubSubService', eventPubSubService);\ncontainerService.registerInstance('EventPubSubService', eventPubSubService);\ncontainerService.registerInstance('ExtensionUtility', extensionUtility);\ncontainerService.registerInstance('FilterService', filterService);\ncontainerService.registerInstance('CollectionService', collectionService);\ncontainerService.registerInstance('ExtensionService', extensionService);\ncontainerService.registerInstance('GridEventService', gridEventService);\ncontainerService.registerInstance('GridService', gridService);\ncontainerService.registerInstance('GridStateService', gridStateService);\ncontainerService.registerInstance('HeaderGroupingService', headerGroupingService);\ncontainerService.registerInstance('PaginationService', paginationService);\ncontainerService.registerInstance('ResizerService', resizerService);\ncontainerService.registerInstance('SharedService', sharedService);\ncontainerService.registerInstance('SortService', sortService);\ncontainerService.registerInstance('TranslaterService', translaterService);\ncontainerService.registerInstance('TreeDataService', treeDataService);\n\nconst gridOptionsModel = defineModel<GridOption>('options');\n_gridOptions.value = { ...GlobalGridOptions, ...gridOptionsModel.value };\n\nconst _paginationOptions = ref<Pagination | undefined>();\nconst paginationModel = defineModel<Pagination>('pagination');\nwatch(paginationModel, (newPaginationOptions) => paginationOptionsChanged(newPaginationOptions!));\n\nconst _columnDefinitions: Ref<Column[]> = ref([]);\nconst columnDefinitionsModel = defineModel<Column[]>('columns', { required: true, default: [] });\nwatch(columnDefinitionsModel, (columnDefinitions) => columnDefinitionsChanged(columnDefinitions), { immediate: true });\n\nconst dataModel = defineModel<any[]>('dataset', { required: false }); // technically true but user could use datasetHierarchical instead\nwatch(\n dataModel,\n (newDataset: any[]) => {\n const prevDatasetLn = currentDatasetLength;\n const isDatasetEqual = dequal(newDataset, dataModel.value || []);\n let data = _gridOptions.value?.enableDeepCopyDatasetOnPageLoad ? deepCopy(newDataset) : newDataset;\n\n // when Tree Data is enabled and we don't yet have the hierarchical dataset filled, we can force a convert+sort of the array\n if (\n grid &&\n _gridOptions.value?.enableTreeData &&\n Array.isArray(newDataset) &&\n (newDataset.length > 0 || newDataset.length !== prevDatasetLn || !isDatasetEqual)\n ) {\n isDatasetHierarchicalInitialized = false;\n data = sortTreeDataset(newDataset, !isDatasetEqual); // if dataset changed, then force a refresh anyway\n }\n\n refreshGridData(data || []);\n currentDatasetLength = (newDataset || []).length;\n\n // expand/autofit columns on first page load\n // we can assume that if the prevDataset was empty then we are on first load\n if (grid && _gridOptions.value?.autoFitColumnsOnFirstLoad && prevDatasetLn === 0 && !isAutosizeColsCalled) {\n grid.autosizeColumns();\n isAutosizeColsCalled = true;\n }\n },\n { immediate: true }\n);\n\nconst dataHierarchicalModel = defineModel<any[]>('hierarchical', { required: false }); // technically true but user could use datasetHierarchical instead\nwatch(\n dataHierarchicalModel,\n (newHierarchicalDataset: any[] | undefined) => {\n const isDatasetEqual = dequal(newHierarchicalDataset, sharedService?.hierarchicalDataset ?? []);\n const prevFlatDatasetLn = currentDatasetLength;\n if (sharedService) {\n sharedService.hierarchicalDataset = newHierarchicalDataset;\n }\n\n if (newHierarchicalDataset && _columnDefinitions.value && filterService?.clearFilters) {\n filterService.clearFilters();\n }\n\n // when a hierarchical dataset is set afterward, we can reset the flat dataset and call a tree data sort that will overwrite the flat dataset\n if (dataview && newHierarchicalDataset && grid && sortService?.processTreeDataInitialSort) {\n dataview.setItems([], _gridOptions.value?.datasetIdPropertyName ?? 'id');\n sortService.processTreeDataInitialSort();\n treeDataService.initHierarchicalTree();\n\n // we also need to reset/refresh the Tree Data filters because if we inserted new item(s) then it might not show up without doing this refresh\n // however we need to queue our process until the flat dataset is ready, so we can queue a microtask to execute the DataView refresh only after everything is ready\n queueMicrotask(() => {\n const flatDatasetLn = dataview?.getItemCount() || 0;\n if (flatDatasetLn > 0 && (flatDatasetLn !== prevFlatDatasetLn || !isDatasetEqual)) {\n filterService.refreshTreeDataFilters();\n }\n });\n isDatasetHierarchicalInitialized = true;\n }\n },\n { immediate: true }\n);\n\n// check if the user wants to hide the header row from the start\n// we only want to do this check once in the constructor\nhideHeaderRowAfterPageLoad = _gridOptions.value?.showHeaderRow === false;\n\nonBeforeUnmount(() => {\n disposing();\n});\n\nonMounted(() => {\n if (!columnDefinitionsModel.value) {\n throw new Error(\n 'Using `<Slickgrid-Vue>` requires `v-model:columns` props, it seems that you might have forgot to provide the missing bindable model.'\n );\n }\n\n if (elm.value && eventPubSubService instanceof EventPubSubService) {\n eventPubSubService.elementSource = elm.value;\n\n // Vue doesn't play well with subscribing to native Custom Events & also the render is called after the constructor which brings a second problem\n // to fix both issues, we need to do the following:\n // 1. loop through all component props and subscribe to the ones that startsWith \"on\", we'll assume that it's the custom events\n // 2. then call the assigned listener(s) when events are dispatched\n for (const attr in { ...attrs, ...props }) {\n if (attr.startsWith('onOn')) {\n const eventCallback = attrs[attr as keyof SlickgridVueProps] || props[attr as keyof SlickgridVueProps];\n if (typeof eventCallback === 'function') {\n const singlePrefixEventName = attr.replace(/^onOn/, 'on');\n subscriptions.push(\n eventPubSubService.subscribe(singlePrefixEventName, (data: unknown) => {\n const gridEventName = eventPubSubService.getEventNameByNamingConvention(singlePrefixEventName, '');\n eventCallback.call(null, new CustomEvent(gridEventName, { detail: data }));\n })\n );\n }\n }\n }\n }\n\n initialization();\n isGridInitialized = true;\n\n // if we have a backendServiceApi and the enablePagination is undefined, we'll assume that we do want to see it, else get that defined value\n if (!hasBackendInfiniteScroll()) {\n _gridOptions.value.enablePagination = !!(_gridOptions.value.backendServiceApi && _gridOptions.value.enablePagination === undefined\n ? true\n : _gridOptions.value.enablePagination);\n }\n\n if (!isPaginationInitialized && !dataHierarchicalModel.value && _gridOptions.value?.enablePagination && isLocalGrid) {\n showPagination = true;\n loadLocalGridPagination(dataModel.value);\n }\n\n // recheck the empty warning message after grid is shown so that it works in every use case\n if (_gridOptions.value?.enableEmptyDataWarningMessage) {\n const data = dataModel.value || [];\n if (Array.isArray(data)) {\n const finalTotalCount = data.length;\n displayEmptyDataWarning(finalTotalCount < 1);\n }\n }\n // add dark mode CSS class when enabled\n if (_gridOptions.value.darkMode) {\n setDarkMode(true);\n }\n\n // keep ref of hierarchical dataset when initialized\n if (dataHierarchicalModel.value) {\n sharedService.hierarchicalDataset = dataHierarchicalModel.value || [];\n }\n\n suggestDateParsingWhenHelpful();\n\n // subscribe to column definitions assignment changes\n observeColumnDefinitions();\n});\n\nfunction columnDefinitionsChanged(columnDefinitions?: Column[]) {\n if (columnDefinitions) {\n _columnDefinitions.value = columnDefinitions;\n }\n if (isGridInitialized) {\n updateColumnDefinitionsList(_columnDefinitions.value);\n }\n if (_columnDefinitions.value!.length > 0) {\n copyColumnWidthsReference(_columnDefinitions.value);\n }\n}\n\nfunction initialization() {\n if (!_gridOptions.value || !columnDefinitionsModel.value) {\n throw new Error(\n 'Using `<Slickgrid-Vue>` requires `v-model:columns=\"columnDefinitions\"` and `v-model:options=\"gridOptions.value\"`, it seems that you might have forgot to provide them since at least of them is undefined.'\n );\n }\n\n _gridOptions.value.translater = translaterService;\n isAutosizeColsCalled = false;\n\n // when detecting a frozen grid, we'll automatically enable the mousewheel scroll handler so that we can scroll from both left/right frozen containers\n if (\n _gridOptions.value &&\n ((_gridOptions.value.frozenRow !== undefined && _gridOptions.value.frozenRow >= 0) ||\n (_gridOptions.value.frozenColumn !== undefined && _gridOptions.value.frozenColumn >= 0)) &&\n _gridOptions.value.enableMouseWheelScrollHandler === undefined\n ) {\n _gridOptions.value.enableMouseWheelScrollHandler = true;\n }\n\n eventPubSubService.eventNamingStyle = _gridOptions.value?.eventNamingStyle ?? 'camelCaseWithExtraOnPrefix';\n eventPubSubService.publish('onBeforeGridCreate', true);\n\n // make sure the dataset is initialized (if not it will throw an error that it cannot getLength of null)\n // dataset.value = dataset.value || dataModel.value || [];\n currentDatasetLength = dataModel.value?.length || 0;\n _gridOptions.value = mergeGridOptions(_gridOptions.value as GridOption);\n _paginationOptions.value = _gridOptions.value?.pagination;\n backendServiceApi = _gridOptions.value?.backendServiceApi;\n isLocalGrid = !backendServiceApi; // considered a local grid if it doesn't have a backend service set\n\n // inject the I18Next instance when translation is enabled\n if (_gridOptions.value?.enableTranslate || _gridOptions.value?.i18n) {\n i18next = inject<I18Next | null>('i18next', null);\n if (i18next) {\n translaterService.i18nInstance = i18next;\n } else {\n throw new Error(\n \"[Slickgrid-Vue] Enabling translation requires you to provide I18Next in your App, for example: `provide('i18next', useTranslation().i18next)`.\"\n );\n }\n }\n\n // unless specified, we'll create an internal postProcess callback (currently only available for GraphQL)\n if (_gridOptions.value?.backendServiceApi && !_gridOptions.value.backendServiceApi?.disableInternalPostProcess) {\n createBackendApiInternalPostProcessCallback(_gridOptions.value as GridOption);\n }\n\n const dataviewInlineFilters = (_gridOptions.value?.dataView && _gridOptions.value.dataView.inlineFilters) || false;\n let dataViewOptions: Partial<DataViewOption> = {\n ..._gridOptions.value.dataView,\n inlineFilters: dataviewInlineFilters,\n } as Partial<DataViewOption>;\n\n if (_gridOptions.value?.draggableGrouping || _gridOptions.value?.enableGrouping) {\n groupItemMetadataProvider = new SlickGroupItemMetadataProvider();\n sharedService.groupItemMetadataProvider = groupItemMetadataProvider;\n dataViewOptions = { ...dataViewOptions, groupItemMetadataProvider: groupItemMetadataProvider };\n }\n dataview = new SlickDataView<any>(dataViewOptions, eventPubSubService);\n eventPubSubService.publish('onDataviewCreated', dataview);\n\n // get any possible Services that user want to register which don't require SlickGrid to be instantiated\n // RxJS Resource is in this lot because it has to be registered before anything else and doesn't require SlickGrid to be initialized\n preRegisterResources();\n\n // prepare and load all SlickGrid editors, if an async editor is found then we'll also execute it.\n // Wrap each editor class in the Factory resolver so consumers of this library.\n // Vue will allow slickgrid to pass its arguments to the editors constructor last\n // when slickgrid creates the editor\n _columnDefinitions.value = loadSlickGridEditors(columnDefinitionsModel.value || []);\n\n // if the user wants to automatically add a Custom Editor Formatter, we need to call the auto add function again\n if (_gridOptions.value?.autoAddCustomEditorFormatter) {\n autoAddEditorFormatterToColumnsWithEditor(_columnDefinitions.value as Column[], _gridOptions.value?.autoAddCustomEditorFormatter);\n }\n\n // save reference for all columns before they optionally become hidden/visible\n sharedService.allColumns = _columnDefinitions.value as Column[];\n\n // TODO: revisit later, this conflicts with Grid State (Example 15)\n // before certain extentions/plugins potentially adds extra columns not created by the user itself (RowMove, RowDetail, RowSelections)\n // we'll subscribe to the event and push back the change to the user so they always use full column defs array including extra cols\n // subscriptions.push(\n // _eventPubSubService.subscribe<{ columns: Column<any>[]; grid: SlickGrid }>('onPluginColumnsChanged', data => {\n // columnDefinitions = data.columns;\n // columnDefinitionsChanged();\n // })\n // );\n\n // after subscribing to potential columns changed, we are ready to create these optional extensions\n // when we did find some to create (RowMove, RowDetail, RowSelections), it will automatically modify column definitions (by previous subscribe)\n extensionService.createExtensionsBeforeGridCreation(_columnDefinitions.value as Column[], _gridOptions.value as GridOption);\n\n // if user entered some Pinning/Frozen \"presets\", we need to apply them in the grid options\n if (_gridOptions.value?.presets?.pinning) {\n _gridOptions.value = { ..._gridOptions.value, ..._gridOptions.value.presets.pinning };\n }\n\n // build SlickGrid Grid, also user might optionally pass a custom dataview (e.g. remote model)\n grid = new SlickGrid<any, Column<any>, GridOption<Column<any>>>(\n `#${props.gridId}`,\n dataview,\n _columnDefinitions.value as Column[],\n _gridOptions.value as GridOption,\n eventPubSubService\n );\n sharedService.dataView = dataview;\n sharedService.slickGrid = grid;\n sharedService.gridContainerElement = elm.value as HTMLDivElement;\n if (groupItemMetadataProvider) {\n grid.registerPlugin(groupItemMetadataProvider); // register GroupItemMetadataProvider when Grouping is enabled\n }\n\n // get any possible Services that user want to register\n registerResources();\n\n extensionService.bindDifferentExtensions();\n bindDifferentHooks(grid, _gridOptions.value as GridOption, dataview);\n\n // when it's a frozen grid, we need to keep the frozen column id for reference if we ever show/hide column from ColumnPicker/GridMenu afterward\n sharedService.frozenVisibleColumnId = grid.getFrozenColumnId();\n\n // initialize the SlickGrid grid\n grid.init();\n\n // initialized the resizer service only after SlickGrid is initialized\n // if we don't we end up binding our resize to a grid element that doesn't yet exist in the DOM and the resizer service will fail silently (because it has a try/catch that unbinds the resize without throwing back)\n const gridContainerElm = elm.value;\n if (gridContainerElm) {\n resizerService.init(grid, gridContainerElm);\n }\n\n // user could show a custom footer with the data metrics (dataset length and last updated timestamp)\n if (\n !_gridOptions.value?.enablePagination &&\n _gridOptions.value?.showCustomFooter &&\n _gridOptions.value?.customFooterOptions &&\n gridContainerElm\n ) {\n slickFooter = new SlickFooterComponent(grid, _gridOptions.value?.customFooterOptions, eventPubSubService, translaterService);\n slickFooter.renderFooter(gridContainerElm as HTMLDivElement);\n }\n\n if (dataview) {\n // load the data in the DataView (unless it's a hierarchical dataset, if so it will be loaded after the initial tree sort)\n const initialDataset = _gridOptions.value?.enableTreeData ? sortTreeDataset(dataModel.value || []) : dataModel.value;\n if (Array.isArray(initialDataset)) {\n dataview.setItems(initialDataset, _gridOptions.value.datasetIdPropertyName ?? 'id');\n }\n\n // if you don't want the items that are not visible (due to being filtered out or being on a different page)\n // to stay selected, pass 'false' to the second arg\n if (grid?.getSelectionModel() && _gridOptions.value?.dataView && 'syncGridSelection' in _gridOptions.value.dataView) {\n // if we are using a Backend Service, we will do an extra flag check, the reason is because it might have some unintended behaviors\n // with the BackendServiceApi because technically the data in the page changes the DataView on every page change.\n let preservedRowSelectionWithBackend = false;\n if (_gridOptions.value.backendServiceApi && 'syncGridSelectionWithBackendService' in _gridOptions.value.dataView) {\n preservedRowSelectionWithBackend = _gridOptions.value.dataView.syncGridSelectionWithBackendService as boolean;\n }\n\n const syncGridSelection = _gridOptions.value.dataView.syncGridSelection;\n if (typeof syncGridSelection === 'boolean') {\n let preservedRowSelection = syncGridSelection;\n if (!isLocalGrid) {\n // when using BackendServiceApi, we'll be using the \"syncGridSelectionWithBackendService\" flag BUT \"syncGridSelection\" must also be set to True\n preservedRowSelection = syncGridSelection && preservedRowSelectionWithBackend;\n }\n dataview.syncGridSelection(grid, preservedRowSelection);\n } else if (typeof syncGridSelection === 'object') {\n dataview.syncGridSelection(grid, syncGridSelection.preserveHidden, syncGridSelection.preserveHiddenOnSelectionChange);\n }\n }\n\n const datasetLn = dataModel.value?.length || 0;\n if (datasetLn > 0) {\n if (!isDatasetInitialized && (_gridOptions.value.enableCheckboxSelector || _gridOptions.value.enableSelection)) {\n loadRowSelectionPresetWhenExists();\n }\n loadFilterPresetsWhenDatasetInitialized();\n isDatasetInitialized = true;\n }\n }\n\n // user might want to hide the header row on page load but still have `enableFiltering: true`\n // if that is the case, we need to hide the headerRow ONLY AFTER all filters got created & dataView exist\n if (hideHeaderRowAfterPageLoad) {\n showHeaderRow(false);\n sharedService.hideHeaderRowAfterPageLoad = hideHeaderRowAfterPageLoad;\n }\n\n // publish & dispatch certain events\n eventPubSubService.publish('onGridCreated', grid);\n\n // after the DataView is created & updated execute some processes & dispatch some events\n executeAfterDataviewCreated(grid, _gridOptions.value as GridOption);\n\n // bind resize ONLY after the dataView is ready\n bindResizeHook(grid, _gridOptions.value as GridOption);\n\n // bind the Backend Service API callback functions only after the grid is initialized\n // because the preProcess() and onInit() might get triggered\n if (_gridOptions.value?.backendServiceApi) {\n bindBackendCallbackFunctions(_gridOptions.value as GridOption);\n }\n\n // create the Vue Grid Instance with reference to all Services\n const vueElementInstance: SlickgridVueInstance = {\n element: elm.value as HTMLDivElement,\n\n // Slick Grid & DataView objects\n dataView: dataview,\n slickGrid: grid,\n\n // public methods\n dispose: disposeInstance,\n\n // return all available Services (non-singleton)\n backendService: backendService.value,\n eventPubSubService: eventPubSubService,\n filterService: filterService,\n gridEventService: gridEventService,\n gridStateService: gridStateService,\n gridService: gridService,\n headerGroupingService: headerGroupingService,\n extensionService: extensionService,\n paginationComponent: slickPagination,\n paginationService: paginationService,\n resizerService: resizerService,\n sortService: sortService,\n treeDataService: treeDataService,\n };\n\n // addons (SlickGrid extra plugins/controls)\n svExtensions.value = extensionService?.extensionList;\n\n // all instances (SlickGrid, DataView & all Services)\n svInstances.value = vueElementInstance;\n eventPubSubService.publish('onVueGridCreated', vueElementInstance);\n}\n\nfunction disposing(shouldEmptyDomElementContainer = false) {\n eventPubSubService.publish('onBeforeGridDestroy', grid);\n eventHandler?.unsubscribeAll();\n if (typeof i18next?.off === 'function') {\n i18next.off('languageChanged');\n }\n\n collectionObservers.forEach((obs) => obs?.disconnect());\n eventPubSubService.unsubscribeAll();\n\n // dispose of all Services\n serviceList.forEach((service: any) => {\n if (service?.dispose) {\n service.dispose();\n }\n });\n serviceList.length = 0;\n\n // dispose backend service when defined and a dispose method exists\n backendService.value?.dispose?.();\n\n // dispose all registered external resources\n disposeExternalResources();\n\n // dispose the Components\n slickEmptyWarning?.dispose();\n slickFooter?.dispose();\n slickPagination?.dispose();\n\n if (dataview) {\n if (dataview.setItems) {\n dataview.setItems([]);\n }\n if (dataview.destroy) {\n dataview.destroy();\n }\n }\n if (grid?.destroy) {\n grid.destroy(shouldEmptyDomElementContainer);\n }\n\n // also dispose of all Subscriptions\n subscriptions = disposeAllSubscriptions(subscriptions);\n\n if (backendServiceApi) {\n for (const prop of Object.keys(backendServiceApi)) {\n (backendServiceApi as any)[prop] = null;\n }\n backendServiceApi = undefined;\n }\n for (const prop of Object.keys(columnDefinitionsModel.value)) {\n (columnDefinitionsModel.value as any)[prop] = null;\n }\n for (const prop of Object.keys(sharedService)) {\n (sharedService as any)[prop] = null;\n }\n\n // we could optionally also empty the content of the grid container DOM element\n if (shouldEmptyDomElementContainer) {\n emptyGridContainerElm();\n }\n}\n\n/** Do not rename to `dispose` as it's an Vue hook */\nfunction disposeInstance(shouldEmptyDomElementContainer = false) {\n disposing(shouldEmptyDomElementContainer);\n}\n\nfunction disposeExternalResources() {\n if (Array.isArray(registeredResources)) {\n while (registeredResources.length > 0) {\n const res = registeredResources.pop();\n if (typeof (res as ExternalResource)?.dispose === 'function') {\n (res as ExternalResource).dispose!();\n }\n }\n }\n registeredResources = [];\n}\n\nfunction emptyGridContainerElm() {\n const gridContainerId = _gridOptions.value?.gridContainerId ?? 'grid1';\n const gridContainerElm = document.querySelector(`#${gridContainerId}`) as HTMLDivElement;\n emptyElement(gridContainerElm);\n}\n\n/**\n * Define our internal Post Process callback, it will execute internally after we get back result from the Process backend call\n * Currently ONLY available with the GraphQL Backend Service.\n * The behavior is to refresh the Dataset & Pagination without requiring the user to create his own PostProcess every time\n */\nfunction createBackendApiInternalPostProcessCallback(gridOptions: GridOption) {\n const backendApi = gridOptions?.backendServiceApi;\n if (backendApi?.service) {\n const backendApiService = backendApi.service;\n\n // internalPostProcess only works (for now) with a GraphQL Service, so make sure it is of that type\n if (typeof backendApiService.getDatasetName === 'function') {\n backendApi.internalPostProcess = (processResult: any) => {\n const datasetName =\n backendApi && backendApiService && typeof backendApiService.getDatasetName === 'function'\n ? backendApiService.getDatasetName()\n : '';\n if (processResult?.data[datasetName]) {\n const data =\n 'nodes' in processResult.data[datasetName]\n ? (processResult as any).data[datasetName].nodes\n : (processResult as any).data[datasetName];\n const totalCount =\n 'totalCount' in processResult.data[datasetName]\n ? (processResult as any).data[datasetName].totalCount\n : (processResult as any).data[datasetName].length;\n refreshGridData(data, totalCount || 0);\n }\n };\n }\n }\n}\n\nfunction bindDifferentHooks(grid: SlickGrid, gridOptions: GridOption, dataView: SlickDataView<any>) {\n // translate some of them on first load, then on each language change\n if (gridOptions.enableTranslate) {\n extensionService.translateAllExtensions();\n }\n\n // on locale change, we have to manually translate the Headers, GridMenu\n if (typeof i18next?.on === 'function') {\n i18next.on('languageChanged', (lang: string) => {\n // publish event of the same name that Slickgrid-Universal uses on a language change event\n eventPubSubService.publish('onLanguageChange', lang);\n\n if (gridOptions.enableTranslate) {\n extensionService.translateAllExtensions(lang);\n if (\n (gridOptions.createPreHeaderPanel && gridOptions.createTopHeaderPanel) ||\n (gridOptions.createPreHeaderPanel && !gridOptions.enableDraggableGrouping)\n ) {\n headerGroupingService.translateHeaderGrouping();\n }\n }\n });\n }\n\n // if user set an onInit Backend, we'll run it right away (and if so, we also need to run preProcess, internalPostProcess & postProcess)\n if (gridOptions.backendServiceApi) {\n const backendApi = gridOptions.backendServiceApi;\n\n if (backendApi?.service?.init) {\n backendApi.service.init(backendApi.options, gridOptions.pagination, grid, sharedService);\n }\n }\n\n if (dataView && grid) {\n // on cell click, mainly used with the columnDef.action callback\n gridEventService.bindOnBeforeEditCell(grid);\n gridEventService.bindOnCellChange(grid);\n gridEventService.bindOnClick(grid);\n\n if (dataView && grid) {\n // bind external sorting (backend) when available or default onSort (dataView)\n if (gridOptions.enableSorting) {\n // bind external sorting (backend) unless specified to use the local one\n if (gridOptions.backendServiceApi && !gridOptions.backendServiceApi.useLocalSorting) {\n sortService.bindBackendOnSort(grid);\n } else {\n sortService.bindLocalOnSort(grid);\n }\n }\n\n // bind external filter (backend) when available or default onFilter (dataView)\n if (gridOptions.enableFiltering) {\n filterService.init(grid);\n\n // bind external filter (backend) unless specified to use the local one\n if (gridOptions.backendServiceApi && !gridOptions.backendServiceApi.useLocalFiltering) {\n filterService.bindBackendOnFilter(grid);\n } else {\n filterService.bindLocalOnFilter(grid);\n }\n }\n\n // when column are reordered, we need to update SharedService flag\n eventHandler.subscribe(grid.onColumnsReordered, () => {\n sharedService.hasColumnsReordered = true;\n });\n\n eventHandler.subscribe(grid.onSetOptions, (_e, args) => {\n // add/remove dark mode CSS class when enabled\n if (args.optionsBefore.darkMode !== args.optionsAfter.darkMode && sharedService.gridContainerElement) {\n setDarkMode(args.optionsAfter.darkMode);\n }\n });\n\n // load any presets if any (after dataset is initialized)\n loadColumnPresetsWhenDatasetInitialized();\n loadFilterPresetsWhenDatasetInitialized();\n\n // When data changes in the DataView, we need to refresh the metrics and/or display a warning if the dataset is empty\n eventHandler.subscribe(dataView.onRowCountChanged, (_e, args) => {\n if (!gridOptions.enableRowDetailView || !Array.isArray(args.changedRows) || args.changedRows.length === args.itemCount) {\n grid.invalidate();\n } else {\n grid.invalidateRows(args.changedRows);\n grid.render();\n }\n handleOnItemCountChanged(dataView.getFilteredItemCount() || 0, dataView.getItemCount() || 0);\n });\n eventHandler.subscribe(dataView.onSetItemsCalled, (_e, args) => {\n sharedService.isItemsDateParsed = false;\n handleOnItemCountChanged(dataView.getFilteredItemCount() || 0, args.itemCount);\n\n // when user has resize by content enabled, we'll force a full width calculation since we change our entire dataset\n if (\n args.itemCount > 0 &&\n (gridOptions.autosizeColumnsByCellContentOnFirstLoad || gridOptions.enableAutoResizeColumnsByCellContent)\n ) {\n resizerService.resizeColumnsByCellContent(!gridOptions?.resizeByContentOnlyOnFirstLoad);\n }\n });\n\n if ((gridOptions?.enableFiltering || gridOptions?.dataView?.globalItemMetadataProvider) && !gridOptions.enableRowDetailView) {\n eventHandler.subscribe(dataView.onRowsChanged, (_e, { calledOnRowCountChanged, rows }) => {\n // filtering data with local dataset will not always show correctly unless we call this updateRow/render\n // also don't use \"invalidateRows\" since it destroys the entire row and as bad user experience when updating a row\n // see commit: https://github.com/ghiscoding/aurelia-slickgrid/commit/8c503a4d45fba11cbd8d8cc467fae8d177cc4f60\n if (!calledOnRowCountChanged && Array.isArray(rows)) {\n const ranges = grid.getRenderedRange();\n rows.filter((row) => row >= ranges.top && row <= ranges.bottom).forEach((row: number) => grid.updateRow(row));\n grid.render();\n }\n });\n }\n }\n }\n}\n\nfunction bindBackendCallbackFunctions(gridOptions: GridOption) {\n const backendApi = gridOptions.backendServiceApi;\n const backendApiService = backendApi?.service;\n const serviceOptions: BackendServiceOption = backendApiService?.options || {};\n const isExecuteCommandOnInit = !serviceOptions\n ? false\n : serviceOptions && 'executeProcessCommandOnInit' in serviceOptions\n ? serviceOptions['executeProcessCommandOnInit']\n : true;\n\n if (backendApiService) {\n // update backend filters (if need be) BEFORE the query runs (via the onInit command a few lines below)\n // if user entered some any \"presets\", we need to reflect them all in the grid\n if (gridOptions?.presets) {\n // Filters \"presets\"\n if (backendApiService.updateFilters && Array.isArray(gridOptions.presets.filters) && gridOptions.presets.filters.length > 0) {\n backendApiService.updateFilters(gridOptions.presets.filters, true);\n }\n // Sorters \"presets\"\n if (backendApiService.updateSorters && Array.isArray(gridOptions.presets.sorters) && gridOptions.presets.sorters.length > 0) {\n // when using multi-column sort, we can have multiple but on single sort then only grab the first sort provided\n const sortColumns = _gridOptions.value?.multiColumnSort ? gridOptions.presets.sorters : gridOptions.presets.sorters.slice(0, 1);\n backendApiService.updateSorters(undefined, sortColumns);\n }\n // Pagination \"presets\"\n if (backendApiService.updatePagination && gridOptions.presets.pagination && !hasBackendInfiniteScroll()) {\n const { pageNumber, pageSize } = gridOptions.presets.pagination;\n backendApiService.updatePagination(pageNumber, pageSize);\n }\n } else {\n const columnFilters = filterService.getColumnFilters();\n if (columnFilters && backendApiService.updateFilters) {\n backendApiService.updateFilters(columnFilters, false);\n }\n }\n\n // execute onInit command when necessary\n if (backendApi && backendApiService && (backendApi.onInit || isExecuteCommandOnInit)) {\n const query = typeof backendApiService.buildQuery === 'function' ? backendApiService.buildQuery() : '';\n const process = isExecuteCommandOnInit ? (backendApi.process?.(query) ?? null) : (backendApi.onInit?.(query) ?? null);\n\n // wrap this inside a microtask to be executed at the end of the task and avoid timing issue since the gridOptions needs to be ready before running this onInit\n queueMicrotask(() => {\n // keep start time & end timestamps & return it after process execution\n const startTime = new Date();\n\n // run any pre-process, if defined, for example a spinner\n if (backendApi.preProcess) {\n backendApi.preProcess();\n }\n\n // the processes can be a Promise (like Http)\n const totalItems = _gridOptions.value?.pagination?.totalItems ?? 0;\n if (process instanceof Promise) {\n process\n .then((processResult: any) =>\n backendUtilityService.executeBackendProcessesCallback(startTime, processResult, backendApi, totalItems)\n )\n .catch((error) => backendUtilityService.onBackendError(error, backendApi));\n } else if (process && rxjs?.isObservable(process)) {\n subscriptions.push(\n (process as Observable<any>).subscribe(\n (processResult: any) =>\n backendUtilityService.executeBackendProcessesCallback(startTime, processResult, backendApi, totalItems),\n (error: any) => backendUtilityService.onBackendError(error, backendApi)\n )\n );\n }\n });\n }\n\n // when user enables Infinite Scroll\n if (backendApi.service.options?.infiniteScroll) {\n addBackendInfiniteScrollCallback();\n }\n }\n}\n\nfunction addBackendInfiniteScrollCallback(): void {\n if (grid && _gridOptions.value.backendServiceApi && hasBackendInfiniteScroll() && !_gridOptions.value.backendServiceApi?.onScrollEnd) {\n const onScrollEnd = () => {\n backendUtilityService.setInfiniteScrollBottomHit(true);\n\n // even if we're not showing pagination, we still use pagination service behind the scene\n // to keep track of the scroll position and fetch next set of data (aka next page)\n // we also need a flag to know if we reached the of the dataset or not (no more pages)\n paginationService.goToNextPage().then((hasNext) => {\n if (!hasNext) {\n backendUtilityService.setInfiniteScrollBottomHit(false);\n }\n });\n };\n _gridOptions.value.backendServiceApi.onScrollEnd = onScrollEnd;\n\n // subscribe to SlickGrid onScroll to determine when reaching the end of the scroll bottom position\n // run onScrollEnd() method when that happens\n eventHandler.subscribe(grid.onScroll, (_e, args) => {\n const viewportElm = args.grid.getViewportNode()!;\n if (\n ['mousewheel', 'scroll'].includes(args.triggeredBy || '') &&\n paginationService?.totalItems &&\n args.scrollTop > 0 &&\n Math.ceil(viewportElm.offsetHeight + args.scrollTop) >= args.scrollHeight\n ) {\n if (!scrollEndCalled) {\n onScrollEnd();\n scrollEndCalled = true;\n }\n }\n });\n\n // use postProcess to identify when scrollEnd process is finished to avoid calling the scrollEnd multiple times\n // we also need to keep a ref of the user's postProcess and call it after our own postProcess\n const orgPostProcess = _gridOptions.value.backendServiceApi.postProcess;\n _gridOptions.value.backendServiceApi.postProcess = (processResult: any) => {\n scrollEndCalled = false;\n if (orgPostProcess) {\n orgPostProcess(processResult);\n }\n };\n }\n}\n\nfunction bindResizeHook(grid: SlickGrid, options: GridOption) {\n if (\n (options.autoFitColumnsOnFirstLoad && options.autosizeColumnsByCellContentOnFirstLoad) ||\n (options.enableAutoSizeColumns && options.enableAutoResizeColumnsByCellContent)\n ) {\n throw new Error(\n `[Slickgrid-Vue] You cannot enable both autosize/fit viewport & resize by content, you must choose which resize technique to use. You can enable these 2 options (\"autoFitColumnsOnFirstLoad\" and \"enableAutoSizeColumns\") OR these other 2 options (\"autosizeColumnsByCellContentOnFirstLoad\" and \"enableAutoResizeColumnsByCellContent\").`\n );\n }\n\n // auto-resize grid on browser resize\n if (options.gridHeight || options.gridWidth) {\n resizerService.resizeGrid(0, { height: options.gridHeight, width: options.gridWidth });\n } else {\n resizerService.resizeGrid();\n }\n\n // expand/autofit columns on first page load\n if (grid && options?.enableAutoResize && options.autoFitColumnsOnFirstLoad && options.enableAutoSizeColumns && !isAutosizeColsCalled) {\n grid.autosizeColumns();\n isAutosizeColsCalled = true;\n }\n}\n\nfunction executeAfterDataviewCreated(_grid: SlickGrid, gridOptions: GridOption) {\n // if user entered some Sort \"presets\", we need to reflect them all in the DOM\n if (gridOptions.enableSorting) {\n if (gridOptions.presets && Array.isArray(gridOptions.presets.sorters)) {\n // when using multi-column sort, we can have multiple but on single sort then only grab the first sort provided\n const sortColumns = _gridOptions.value.multiColumnSort ? gridOptions.presets.sorters : gridOptions.presets.sorters.slice(0, 1);\n sortService.loadGridSorters(sortColumns);\n }\n }\n}\n\n/**\n * On a Pagination changed, we will trigger a Grid State changed with the new pagination info\n * Also if we use Row Selection or the Checkbox Selector with a Backend Service (Odata, GraphQL), we need to reset any selection\n */\nfunction paginationChanged(pagination: PaginationMetadata) {\n const isSyncGridSelectionEnabled = gridStateService?.needToPreserveRowSelection() ?? false;\n if (\n grid &&\n !isSyncGridSelectionEnabled &&\n _gridOptions.value?.backendServiceApi &&\n (_gridOptions.value.enableSelection || _gridOptions.value.enableCheckboxSelector)\n ) {\n grid.setSelectedRows([]);\n }\n const { pageNumber, pageSize } = pagination;\n if (sharedService) {\n if (pageSize !== undefined && pageNumber !== undefined) {\n sharedService.currentPagination = { pageNumber, pageSize };\n }\n }\n eventPubSubService.publish('onGridStateChanged', {\n change: { newValues: { pageNumber, pageSize }, type: 'pagination' },\n gridState: gridStateService.getCurrentGridState(),\n });\n}\n\nfunction paginationOptionsChanged(newPaginationOptions: Pagination) {\n if (newPaginationOptions && _paginationOptions.value) {\n _paginationOptions.value = { ..._paginationOptions.value, ...newPaginationOptions };\n } else {\n _paginationOptions.value = newPaginationOptions;\n }\n if (_gridOptions.value) {\n _gridOptions.value.pagination = _paginationOptions.value;\n paginationService.updateTotalItems(newPaginationOptions?.totalItems ?? 0, true);\n }\n}\n\n/**\n * When dataset changes, we need to refresh the entire grid UI & possibly resize it as well\n * @param dataset\n */\nfunction refreshGridData(dataset: any[], totalCount?: number) {\n // local grid, check if we need to show the Pagination\n // if so then also check if there's any presets and finally initialize the PaginationService\n // a local grid with Pagination presets will potentially have a different total of items, we'll need to get it from the DataView and update our total\n if (_gridOptions.value?.enablePagination && isLocalGrid) {\n showPagination = true;\n loadLocalGridPagination(dataset);\n }\n\n if (_gridOptions.value?.enableEmptyDataWarningMessage && Array.isArray(dataset)) {\n const finalTotalCount = totalCount || dataset.length;\n displayEmptyDataWarning(finalTotalCount < 1);\n }\n\n if (Array.isArray(dataset) && grid && dataview?.setItems) {\n dataview.setItems(dataset, _gridOptions.value.datasetIdPropertyName ?? 'id');\n if (!_gridOptions.value.backendServiceApi && !_gridOptions.value.enableTreeData) {\n dataview.reSort();\n }\n\n if (dataset.length > 0) {\n if (!isDatasetInitialized) {\n loadFilterPresetsWhenDatasetInitialized();\n\n if (_gridOptions.value.enableCheckboxSelector) {\n loadRowSelectionPresetWhenExists();\n }\n }\n isDatasetInitialized = true;\n }\n\n if (dataset) {\n grid.invalidate();\n }\n\n // display the Pagination component only after calling this refresh data first, we call it here so that if we preset pagination page number it will be shown correctly\n showPagination = !!(\n _gridOptions.value &&\n (_gridOptions.value.enablePagination || (_gridOptions.value.backendServiceApi && _gridOptions.value.enablePagination === undefined))\n );\n\n if (_paginationOptions.value && _gridOptions.value?.pagination && _gridOptions.value?.backendServiceApi) {\n const paginationOptions = setPaginationOptionsWhenPresetDefined(\n _gridOptions.value as GridOption,\n _paginationOptions.value as Pagination\n );\n // when we have a totalCount use it, else we'll take it from the pagination object\n // only update the total items if it's different to avoid refreshing the UI\n const totalRecords = totalCount !== undefined ? totalCount : _gridOptions.value?.pagination?.totalItems;\n if (totalRecords !== undefined && totalRecords !== totalItems.value) {\n totalItems.value = +totalRecords;\n }\n\n // initialize the Pagination Service with new pagination options (which might have presets)\n if (!isPaginationInitialized) {\n initializePaginationService(paginationOptions);\n } else {\n // update the pagination service with the new total\n paginationService.updateTotalItems(totalItems.value);\n }\n }\n\n // resize the grid inside a slight timeout, in case other DOM element changed prior to the resize (like a filter/pagination changed)\n if (grid && _gridOptions.value.enableAutoResize) {\n const delay = _gridOptions.value.autoResize && _gridOptions.value.autoResize.delay;\n resizerService.resizeGrid(delay || 10);\n }\n }\n}\n\n/**\n * Show the filter row displayed on first row, we can optionally pass false to hide it.\n * @param showing\n */\nfunction showHeaderRow(showing = true) {\n grid?.setHeaderRowVisibility(showing);\n if (showing === true && isGridInitialized) {\n grid?.setColumns(columnDefinitionsModel.value);\n }\n return showing;\n}\n\n/**\n * Check if there's any Pagination Presets defined in the Grid Options,\n * if there are then load them in the paginationOptions object\n */\nfunction setPaginationOptionsWhenPresetDefined(gridOptions: GridOption, paginationOptions: Pagination): Pagination {\n if (gridOptions.presets?.pagination && gridOptions.pagination) {\n if (hasBackendInfiniteScroll()) {\n console.warn('[Slickgrid-Vue] `presets.pagination` is not supported with Infinite Scroll, reverting to first page.');\n } else {\n paginationOptions.pageSize = gridOptions.presets.pagination.pageSize;\n paginationOptions.pageNumber = gridOptions.presets.pagination.pageNumber;\n }\n }\n return paginationOptions;\n}\n\nfunction setDarkMode(dark = false) {\n sharedService.gridContainerElement?.classList.toggle('slick-dark-mode', dark);\n}\n\n/**\n * Dynamically change or update the column definitions list.\n * We will re-render the grid so that the new header and data shows up correctly.\n * If using i18n, we also need to trigger a re-translate of the column headers\n */\nfunction updateColumnDefinitionsList(newColumns: Column<any>[]) {\n if (newColumns) {\n // map the Editor model to editorClass and load editor collectionAsync\n newColumns = loadSlickGridEditors(newColumns);\n\n // if the user wants to automatically add a Custom Editor Formatter, we need to call the auto add function again\n if (_gridOptions.value.autoAddCustomEditorFormatter) {\n autoAddEditorFormatterToColumnsWithEditor(newColumns, _gridOptions.value.autoAddCustomEditorFormatter);\n }\n\n if (_gridOptions.value.enableTranslate) {\n extensionService.translateColumnHeaders(undefined, newColumns);\n }\n extensionService.renderColumnHeaders(newColumns, true);\n\n if (_gridOptions.value?.enableAutoSizeColumns) {\n grid?.autosizeColumns();\n } else if (_gridOptions.value?.enableAutoResizeColumnsByCellContent && resizerService?.resizeColumnsByCellContent) {\n resizerService.resizeColumnsByCellContent();\n }\n }\n}\n\n/**\n * assignment changes are not triggering on the column definitions, for that\n * we can use our internal array observer for any changes done via (push, pop, shift, ...)\n */\nfunction observeColumnDefinitions() {\n collectionObservers.push(collectionObserver(columnDefinitionsModel.value, columnDefinitionsChanged));\n}\n\n/**\n * Loop through all column definitions and copy the original optional `width` properties optionally provided by the user.\n * We will use this when doing a resize by cell content, if user provided a `width` it won't override it.\n */\nfunction copyColumnWidthsReference(columns: Column<any>[]) {\n columns.forEach((col) => (col.originalWidth = col.width));\n}\n\nfunction displayEmptyDataWarning(showWarning = true) {\n slickEmptyWarning?.showEmptyDataMessage(showWarning);\n}\n\n/** When data changes in the DataView, we'll refresh the metrics and/or display a warning if the dataset is empty */\nfunction handleOnItemCountChanged(currentPageRowItemCount: number, totalItemCount: number) {\n currentDatasetLength = totalItemCount;\n metrics = {\n startTime: new Date(),\n endTime: new Date(),\n itemCount: currentPageRowItemCount,\n totalItemCount,\n };\n // if custom footer is enabled, then we'll update its metrics\n if (slickFooter) {\n slickFooter.metrics = metrics;\n }\n\n // when using local (in-memory) dataset, we'll display a warning message when filtered data is empty\n if (isLocalGrid && _gridOptions.value?.enableEmptyDataWarningMessage) {\n displayEmptyDataWarning(currentPageRowItemCount === 0);\n }\n\n // when autoResize.autoHeight is enabled, we'll want to call a resize\n if (_gridOptions.value.enableAutoResize && resizerService.isAutoHeightEnabled && currentPageRowItemCount > 0) {\n resizerService.resizeGrid();\n }\n}\n\n/** Initialize the Pagination Service once */\nfunction initializePaginationService(paginationOptions: Pagination) {\n if (_gridOptions.value) {\n paginationService.totalItems = totalItems.value;\n paginationService.init(grid!, paginationOptions, backendServiceApi);\n subscriptions.push(\n eventPubSubService.subscribe('onPaginationChanged', (paginationChanges: PaginationMetadata) => paginationChanged(paginationChanges)),\n eventPubSubService.subscribe('onPaginationVisibilityChanged', (visibility: { visible: boolean }) => {\n showPagination = visibility?.visible ?? false;\n if (_gridOptions.value?.backendServiceApi) {\n backendUtilityService?.refreshBackendDataset(_gridOptions.value as GridOption);\n }\n renderPagination(showPagination);\n })\n );\n\n // also initialize (render) the pagination component\n renderPagination();\n isPaginationInitialized = true;\n }\n}\n\n/** Load the Editor Collection asynchronously and replace the \"collection\" property when Promise resolves */\nfunction loadEditorCollectionAsync(column: Column) {\n if (column?.editor) {\n const collectionAsync = column.editor.collectionAsync;\n column.editor.disabled = true; // disable the Editor DOM element, we'll re-enable it after receiving the collection with \"updateEditorCollection()\"\n\n if (collectionAsync instanceof Promise) {\n // wait for the \"collectionAsync\", once resolved we will save it into the \"collection\"\n // the collectionAsync can be of 3 types HttpClient, HttpFetch or a Promise\n collectionAsync.then((response: any | any[]) => {\n if (Array.isArray(response)) {\n updateEditorCollection(column, response); // from Promise\n } else if (response instanceof Response && typeof response.json === 'function') {\n if (response.bodyUsed) {\n console.warn(\n `[SlickGrid-Vue] The response body passed to collectionAsync was already read. ` +\n `Either pass the dataset from the Response or clone the response first using response.clone()`\n );\n } else {\n // from Fetch\n (response as Response).json().then((data) => updateEditorCollection(column, data));\n }\n } else if (response?.content) {\n updateEditorCollection(column, response.content); // from http-client\n }\n });\n } else if (rxjs?.isObservable(collectionAsync)) {\n // wrap this inside a microtask at the end of the task to avoid timing issue since updateEditorCollection requires to call SlickGrid getColumns() method after columns are available\n queueMicrotask(() => {\n subscriptions.push(\n (collectionAsync as Observable<any>).subscribe((resolvedCollection) => updateEditorCollection(column, resolvedCollection))\n );\n });\n }\n }\n}\n\n/** Load any possible Columns Grid Presets */\nfunction loadColumnPresetsWhenDatasetInitialized() {\n // if user entered some Columns \"presets\", we need to reflect them all in the grid\n if (_gridOptions.value.presets && Array.isArray(_gridOptions.value.presets.columns) && _gridOptions.value.presets.columns.length > 0) {\n // delegate to GridStateService for centralized column arrangement logic\n // we pass `false` for triggerAutoSizeColumns to maintain original behavior on preset load\n gridStateService.changeColumnsArrangement(_gridOptions.value.presets.columns, false);\n }\n}\n\n/** Load any possible Filters Grid Presets */\nfunction loadFilterPresetsWhenDatasetInitialized() {\n if (_gridOptions.value) {\n // if user entered some Filter \"presets\", we need to reflect them all in the DOM\n // also note that a presets of Tree Data Toggling will also call this method because Tree Data toggling does work with data filtering\n // (collapsing a parent will basically use Filter for hidding (aka collapsing) away the child underneat it)\n if (\n _gridOptions.value.presets &&\n (Array.isArray(_gridOptions.value.presets.filters) || Array.isArray(_gridOptions.value.presets?.treeData?.toggledItems))\n ) {\n filterService.populateColumnFilterSearchTermPresets(_gridOptions.value.presets?.filters || []);\n }\n }\n}\n\n/**\n * local grid, check if we need to show the Pagination\n * if so then also check if there's any presets and finally initialize the PaginationService\n * a local grid with Pagination presets will potentially have a different total of items, we'll need to get it from the DataView and update our total\n */\nfunction loadLocalGridPagination(dataset?: any[]) {\n if (_gridOptions.value && _paginationOptions.value) {\n totalItems.value = Array.isArray(dataset) ? dataset.length : 0;\n if (_paginationOptions.value && dataview?.getPagingInfo) {\n const slickPagingInfo = dataview.getPagingInfo();\n if ('totalRows' in slickPagingInfo && _paginationOptions.value.totalItems !== slickPagingInfo.totalRows) {\n totalItems.value = slickPagingInfo.totalRows || 0;\n }\n }\n _paginationOptions.value.totalItems = totalItems.value;\n const paginationOptions = setPaginationOptionsWhenPresetDefined(_gridOptions.value as GridOption, _paginationOptions.value);\n initializePaginationService(paginationOptions);\n }\n}\n\n/** Load any Row Selections into the DataView that were presets by the user */\nfunction loadRowSelectionPresetWhenExists() {\n // if user entered some Row Selections \"presets\"\n const presets = _gridOptions.value?.presets;\n const enableRowSelection = _gridOptions.value && (_gridOptions.value.enableCheckboxSelector || _gridOptions.value.enableSelection);\n if (\n enableRowSelection &&\n grid?.getSelectionModel() &&\n presets?.rowSelection &&\n (Array.isArray(presets.rowSelection.gridRowIndexes) || Array.isArray(presets.rowSelection.dataContextIds))\n ) {\n let dataContextIds = presets.rowSelection.dataContextIds;\n let gridRowIndexes = presets.rowSelection.gridRowIndexes;\n\n // maps the IDs to the Grid Rows and vice versa, the \"dataContextIds\" has precedence over the other\n if (Array.isArray(dataContextIds) && dataContextIds.length > 0) {\n gridRowIndexes = dataview?.mapIdsToRows(dataContextIds) || [];\n } else if (Array.isArray(gridRowIndexes) && gridRowIndexes.length > 0) {\n dataContextIds = dataview?.mapRowsToIds(gridRowIndexes) || [];\n }\n\n // apply row selection when defined as grid presets\n if (grid && Array.isArray(gridRowIndexes)) {\n grid.setSelectedRows(gridRowIndexes);\n dataview!.setSelectedIds(dataContextIds || [], {\n isRowBeingAdded: true,\n shouldTriggerEvent: false, // do not trigger when presetting the grid\n applyRowSelectionToGrid: true,\n });\n }\n }\n}\n\nfunction hasBackendInfiniteScroll(gridOptions?: GridOption): boolean {\n return !!(gridOptions || _gridOptions.value).backendServiceApi?.service.options?.infiniteScroll;\n}\n\nfunction mergeGridOptions(gridOptions: GridOption): GridOption {\n gridOptions.gridId = props.gridId;\n gridOptions.gridContainerId = `slickGridContainer-${props.gridId}`;\n\n // use extend to deep merge & copy to avoid immutable properties being changed in GlobalGridOptions after a route change\n const options = extend<GridOption>(true, {}, GlobalGridOptions, gridOptions);\n\n // if we have a backendServiceApi and the enablePagination is undefined, we'll assume that we do want to see it, else get that defined value\n if (!hasBackendInfiniteScroll(gridOptions)) {\n gridOptions.enablePagination = !!(gridOptions.backendServiceApi && gridOptions.enablePagination === undefined\n ? true\n : gridOptions.enablePagination);\n }\n\n // using copy extend to do a deep clone has an unwanted side on objects and pageSizes but ES6 spread has other worst side effects\n // so we will just overwrite the pageSizes when needed, this is the only one causing issues so far.\n // On a deep extend, Object and Array are extended, but object wrappers on primitive types such as String, Boolean, and Number are not.\n if (\n options?.pagination &&\n (gridOptions.enablePagination || gridOptions.backendServiceApi) &&\n gridOptions.pagination &&\n Array.isArray(gridOptions.pagination.pageSizes)\n ) {\n options.pagination.pageSizes = gridOptions.pagination.pageSizes;\n }\n\n // also make sure to show the header row if user have enabled filtering\n hideHeaderRowAfterPageLoad = options.showHeaderRow === false;\n if (options.enableFiltering && !options.showHeaderRow) {\n options.showHeaderRow = options.enableFiltering;\n }\n\n // when we use Pagination on Local Grid, it doesn't seem to work without enableFiltering\n // so we'll enable the filtering but we'll keep the header row hidden\n if (options && !options.enableFiltering && options.enablePagination && isLocalGrid) {\n options.enableFiltering = true;\n options.showHeaderRow = false;\n hideHeaderRowAfterPageLoad = true;\n if (sharedService) {\n sharedService.hideHeaderRowAfterPageLoad = true;\n }\n }\n\n return options;\n}\n\n/** initialized & auto-enable external registered resources, e.g. if user registers `ExcelExportService` then let's auto-enable `enableExcelExport:true` */\nfunction autoEnableInitializedResources(resource: ExternalResource | ExternalResourceConstructor): void {\n if (grid && typeof (resource as ExternalResource).init === 'function') {\n (resource as ExternalResource).init!(grid, containerService);\n }\n\n // auto-enable unless the flag was specifically disabled by the end user\n if ('pluginName' in (resource as ExternalResource)) {\n const pluginFlagName = PluginFlagMappings.get((resource as ExternalResource).pluginName!);\n if (pluginFlagName && _gridOptions.value[pluginFlagName] !== false) {\n _gridOptions.value[pluginFlagName] = true;\n grid?.setOptions({ [pluginFlagName]: true });\n }\n }\n}\n\nfunction initializeExternalResources(resources: Array<ExternalResource | ExternalResourceConstructor>) {\n PluginFlagMappings.set('VueRowDetailView', 'enableRowDetailView'); // map the external Row Detail View resource to its flag\n\n if (Array.isArray(resources)) {\n for (const resource of resources) {\n autoEnableInitializedResources(resource);\n }\n }\n}\n\n/** Pre-Register any Resource that don't require SlickGrid to be instantiated (for example RxJS Resource & RowDetail) */\nfunction preRegisterResources() {\n registeredResources = _gridOptions.value?.externalResources || [];\n\n // bind & initialize all Components/Services that were tagged as enabled\n // register all services by executing their init method and providing them with the Grid object\n if (Array.isArray(registeredResources)) {\n for (const resource of registeredResources) {\n if ((resource as ExternalResource)?.pluginName === 'RxJsResource') {\n registerRxJsResource(resource as RxJsFacade);\n }\n }\n }\n\n if (_gridOptions.value.enableRowDetailView) {\n const RowDetailClass = registeredResources.find((res: any) => res.pluginName === 'VueRowDetailView') as\n | ExternalResourceConstructor\n | undefined;\n if (!RowDetailClass) {\n throw new Error(\n '[Slickgrid-Vue] You enabled the Row Detail View feature but you did not provide the \"VueRowDetailView\" class as an external resource.'\n );\n }\n\n if (RowDetailClass) {\n const rowDetailInstance = new RowDetailClass(eventPubSubService) as VueRowDetailView;\n slickRowDetailView = rowDetailInstance;\n rowDetailInstance.create(_columnDefinitions.value, _gridOptions.value as GridOption);\n extensionService.addExtensionToList('rowDetailView', {\n name: 'rowDetailView',\n instance: slickRowDetailView,\n });\n }\n }\n}\n\nfunction registerResources() {\n // at this point, we consider all the registered services as external services, anything else registered afterward aren't external\n if (Array.isArray(registeredResources)) {\n sharedService.externalRegisteredResources = registeredResources;\n }\n\n // push all other Services that we want to be registered\n if (!registeredResources.some((r) => r instanceof GridService)) {\n registeredResources.push(gridService);\n }\n if (!registeredResources.some((r) => r instanceof GridStateService)) {\n registeredResources.push(gridStateService);\n }\n\n // when using Grouping/DraggableGrouping/Colspan register its Service\n if (\n ((_gridOptions.value.createPreHeaderPanel && _gridOptions.value.createTopHeaderPanel) ||\n (_gridOptions.value.createPreHeaderPanel && !_gridOptions.value.enableDraggableGrouping)) &&\n !registeredResources.some((r) => r instanceof HeaderGroupingService)\n ) {\n registeredResources.push(headerGroupingService);\n }\n\n // when using Tree Data View, register its Service\n if (_gridOptions.value.enableTreeData && !registeredResources.some((r) => r instanceof TreeDataService)) {\n registeredResources.push(treeDataService);\n }\n\n // when user enables translation, we need to translate Headers on first pass & subsequently in the bindDifferentHooks\n if (_gridOptions.value.enableTranslate) {\n extensionService.translateColumnHeaders();\n }\n\n // also initialize (render) the empty warning component\n if (!registeredResources.some((r) => r instanceof SlickEmptyWarningComponent)) {\n slickEmptyWarning = new SlickEmptyWarningComponent();\n registeredResources.push(slickEmptyWarning);\n }\n\n // bind & initialize all Components/Services that were tagged as enabled\n // register all services by executing their init method and providing them with the Grid object\n initializeExternalResources(registeredResources);\n\n // initialize RowDetail separately since we already added it to the ExtensionList via `addExtensionToList()` but not in external resources,\n // because we don't want to dispose the extension/resource more than once (because externalResources/extensionList are both looping through their list to dispose of them)\n if (_gridOptions.value.enableRowDetailView && slickRowDetailView) {\n slickRowDetailView.init(grid);\n }\n}\n\n/** Register the RxJS Resource in all necessary services which uses */\nfunction registerRxJsResource(resource: RxJsFacade) {\n rxjs = resource;\n backendUtilityService.addRxJsResource(rxjs);\n filterFactory.addRxJsResource(rxjs);\n filterService.addRxJsResource(rxjs);\n sortService.addRxJsResource(rxjs);\n paginationService.addRxJsResource(rxjs);\n containerService.registerInstance('RxJsResource', rxjs);\n}\n\n/**\n * Render (or dispose) the Pagination Component, user can optionally provide False (to not show it) which will in term dispose of the Pagination,\n * also while disposing we can choose to omit the disposable of the Pagination Service (if we are simply toggling the Pagination, we want to keep the Service alive)\n * @param {Boolean} showPagination - show (new render) or not (dispose) the Pagination\n * @param {Boolean} shouldDisposePaginationService - when disposing the Pagination, do we also want to dispose of the Pagination Service? (defaults to True)\n */\nasync function renderPagination(showPagination = true) {\n if (grid && _gridOptions.value?.enablePagination && !isPaginationInitialized && showPagination) {\n if (_gridOptions.value.customPaginationComponent) {\n const paginationContainer = document.createElement('section');\n const instance = createApp(_gridOptions.value.customPaginationComponent).mount(\n paginationContainer\n ) as ComponentPublicInstance<BasePaginationModel>;\n elm.value!.appendChild(instance.$el);\n slickPagination = instance;\n } else {\n slickPagination = new SlickPaginationComponent();\n }\n\n // wait a cycle to make sure the pager ref is instanciated\n nextTick(() => {\n if (slickPagination) {\n slickPagination.init(grid, paginationService, eventPubSubService, translaterService);\n slickPagination.renderPagination(elm.value as HTMLDivElement);\n isPaginationInitialized = true;\n }\n });\n } else if (!showPagination) {\n slickPagination?.dispose();\n isPaginationInitialized = false;\n }\n}\n\n/**\n * Takes a flat dataset with parent/child relationship, sort it (via its tree structure) and return the sorted flat array\n * @param {Array<Object>} flatDatasetInput - flat dataset input\n * @param {Boolean} forceGridRefresh - optionally force a full grid refresh\n * @returns {Array<Object>} sort flat parent/child dataset\n */\nfunction sortTreeDataset<T>(flatDatasetInput: T[], forceGridRefresh = false): T[] {\n const prevDatasetLn = currentDatasetLength;\n let sortedDatasetResult;\n let flatDatasetOutput: any[] = [];\n\n // if the hierarchical dataset was already initialized then no need to re-convert it, we can use it directly from the shared service ref\n if (isDatasetHierarchicalInitialized && dataHierarchicalModel.value) {\n sortedDatasetResult = treeDataService.sortHierarchicalDataset(dataHierarchicalModel.value);\n flatDatasetOutput = sortedDatasetResult.flat;\n } else if (Array.isArray(flatDatasetInput) && flatDatasetInput.length > 0) {\n // we need to first convert the flat dataset to a hierarchical dataset and then sort it\n // we'll also add props, by mutation, required by the TreeDataService on the flat array like `__hasChildren`, `parentId` and anything else to work properly\n sortedDatasetResult = treeDataService.convertFlatParentChildToTreeDatasetAndSort(\n flatDatasetInput,\n (_columnDefinitions.value || []) as Column[],\n _gridOptions.value as GridOption\n );\n sharedService.hierarchicalDataset = sortedDatasetResult.hierarchical;\n flatDatasetOutput = sortedDatasetResult.flat;\n }\n\n // if we add/remove item(s) from the dataset, we need to also refresh our tree data filters\n if (flatDatasetInput.length > 0 && (forceGridRefresh || flatDatasetInput.length !== prevDatasetLn)) {\n filterService.refreshTreeDataFilters(flatDatasetOutput);\n }\n\n return flatDatasetOutput;\n}\n\n/** Prepare and load all SlickGrid editors, if an async editor is found then we'll also execute it. */\nfunction loadSlickGridEditors(columns: Column<any>[]): Column<any>[] {\n if (columns.some((col) => `${col.id}`.includes('.'))) {\n console.warn(\n '[Slickgrid-Vue] Make sure that none of your Column Definition \"id\" property includes a dot in its name because that will cause some problems with the Editors. For example if your column definition \"field\" property is \"user.firstName\" then use \"firstName\" as the column \"id\".'\n );\n }\n\n return columns.map((column: Column | any) => {\n // on every Editor which have a \"collection\" or a \"collectionAsync\"\n if (column.editor?.collectionAsync) {\n loadEditorCollectionAsync(column);\n }\n\n return { ...column, editorClass: column.editor?.model };\n });\n}\n\nfunction suggestDateParsingWhenHelpful() {\n if (\n dataview!.getItemCount() > WARN_NO_PREPARSE_DATE_SIZE &&\n !_gridOptions.value.silenceWarnings &&\n !_gridOptions.value.preParseDateColumns &&\n grid?.getColumns().some((c) => isColumnDateType(c.type))\n ) {\n console.warn(\n '[Slickgrid-Universal] For getting better perf, we suggest you enable the `preParseDateColumns` grid option, ' +\n 'for more info visit => https://ghiscoding.gitbook.io/slickgrid-vue/column-functionalities/sorting#pre-parse-date-columns-for-better-perf'\n );\n }\n}\n\n/**\n * When the Editor(s) has a \"editor.collection\" property, we'll load the async collection.\n * Since this is called after the async call resolves, the pointer will not be the same as the \"column\" argument passed.\n */\nfunction updateEditorCollection<T = any>(column: Column<T>, newCollection: T[]) {\n if (grid && column.editor) {\n column.editor.collection = newCollection;\n column.editor.disabled = false;\n\n // get current Editor, remove it from the DOM then re-enable it and re-render it with the new collection.\n const currentEditor = grid.getCellEditor() as AutocompleterEditor | SelectEditor;\n if (currentEditor?.disable && currentEditor?.renderDomElement) {\n currentEditor.destroy();\n currentEditor.disable(false);\n currentEditor.renderDomElement(newCollection);\n }\n }\n}\n</script>\n\n<template>\n <div :id=\"gridContainerId\" ref=\"elm\" class=\"grid-pane\">\n <!-- Header slot if you need to create a complex custom header -->\n <slot name=\"header\"></slot>\n\n <div :id=\"gridId\" class=\"slickgrid-container\"></div>\n\n <!-- Footer slot if you need to create a complex custom footer -->\n <slot name=\"footer\"></slot>\n </div>\n</template>\n"],"names":["has","dequal","foo","bar","ctor","len","GlobalGridOptions","UniversalGridOptions","ContainerService","key","instance","TranslaterI18NextService","i18n","newLang","translationKey","disposeAllSubscriptions","subscriptions","subscription","WARN_NO_PREPARSE_DATE_SIZE","attrs","useAttrs","props","__props","elm","ref","svExtensions","svInstances","_gridOptions","totalItems","gridContainerId","computed","backendService","gridOptionsModel","currentDatasetLength","dataview","grid","collectionObservers","groupItemMetadataProvider","hideHeaderRowAfterPageLoad","i18next","isAutosizeColsCalled","isGridInitialized","isDatasetInitialized","isDatasetHierarchicalInitialized","isPaginationInitialized","isLocalGrid","metrics","registeredResources","scrollEndCalled","showPagination","slickEmptyWarning","slickFooter","slickPagination","slickRowDetailView","backendServiceApi","rxjs","slickgridConfig","SlickgridConfig","eventHandler","SlickEventHandler","eventPubSubService","EventPubSubService","containerService","translaterService","backendUtilityService","BackendUtilityService","gridEventService","GridEventService","sharedService","SharedService","collectionService","CollectionService","extensionUtility","ExtensionUtility","filterFactory","FilterFactory","filterService","FilterService","resizerService","ResizerService","sortService","SortService","treeDataService","TreeDataService","paginationService","PaginationService","extensionService","ExtensionService","gridService","gridStateService","GridStateService","GridService","headerGroupingService","HeaderGroupingService","serviceList","_useModel","_paginationOptions","paginationModel","watch","newPaginationOptions","paginationOptionsChanged","_columnDefinitions","columnDefinitionsModel","columnDefinitions","columnDefinitionsChanged","dataModel","newDataset","prevDatasetLn","isDatasetEqual","data","deepCopy","sortTreeDataset","refreshGridData","dataHierarchicalModel","newHierarchicalDataset","prevFlatDatasetLn","flatDatasetLn","onBeforeUnmount","disposing","onMounted","attr","eventCallback","singlePrefixEventName","gridEventName","initialization","hasBackendInfiniteScroll","loadLocalGridPagination","finalTotalCount","displayEmptyDataWarning","setDarkMode","suggestDateParsingWhenHelpful","observeColumnDefinitions","updateColumnDefinitionsList","copyColumnWidthsReference","mergeGridOptions","inject","createBackendApiInternalPostProcessCallback","dataviewInlineFilters","dataViewOptions","SlickGroupItemMetadataProvider","SlickDataView","preRegisterResources","loadSlickGridEditors","autoAddEditorFormatterToColumnsWithEditor","SlickGrid","registerResources","bindDifferentHooks","gridContainerElm","SlickFooterComponent","initialDataset","preservedRowSelectionWithBackend","syncGridSelection","preservedRowSelection","loadRowSelectionPresetWhenExists","loadFilterPresetsWhenDatasetInitialized","showHeaderRow","executeAfterDataviewCreated","bindResizeHook","bindBackendCallbackFunctions","vueElementInstance","disposeInstance","shouldEmptyDomElementContainer","obs","service","disposeExternalResources","prop","emptyGridContainerElm","res","emptyElement","gridOptions","backendApi","backendApiService","processResult","datasetName","totalCount","dataView","lang","_e","args","loadColumnPresetsWhenDatasetInitialized","handleOnItemCountChanged","calledOnRowCountChanged","rows","ranges","row","serviceOptions","isExecuteCommandOnInit","sortColumns","pageNumber","pageSize","columnFilters","query","process","startTime","error","addBackendInfiniteScrollCallback","onScrollEnd","hasNext","viewportElm","orgPostProcess","options","_grid","paginationChanged","pagination","isSyncGridSelectionEnabled","dataset","paginationOptions","setPaginationOptionsWhenPresetDefined","totalRecords","initializePaginationService","delay","showing","dark","newColumns","collectionObserver","columns","col","showWarning","currentPageRowItemCount","totalItemCount","paginationChanges","visibility","renderPagination","loadEditorCollectionAsync","column","collectionAsync","response","updateEditorCollection","resolvedCollection","slickPagingInfo","presets","dataContextIds","gridRowIndexes","extend","autoEnableInitializedResources","resource","pluginFlagName","PluginFlagMappings","initializeExternalResources","resources","registerRxJsResource","RowDetailClass","rowDetailInstance","r","SlickEmptyWarningComponent","paginationContainer","createApp","SlickPaginationComponent","nextTick","flatDatasetInput","forceGridRefresh","sortedDatasetResult","flatDatasetOutput","c","isColumnDateType","newCollection","currentEditor","_createElementBlock","_renderSlot","_ctx","_createElementVNode"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.js","sources":["../../../node_modules/.pnpm/dequal@2.0.3/node_modules/dequal/lite/index.mjs","../src/global-grid-options.ts","../src/services/container.service.ts","../src/services/translaterI18Next.service.ts","../src/services/utilities.ts","../src/components/SlickgridVue.vue"],"sourcesContent":["var has = Object.prototype.hasOwnProperty;\n\nexport function dequal(foo, bar) {\n\tvar ctor, len;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","import { GlobalGridOptions as UniversalGridOptions } from '@slickgrid-universal/common';\nimport type { GridOption, RowDetailView } from './models/index.js';\n\n/** Global Grid Options Defaults */\nexport const GlobalGridOptions: Partial<GridOption> = {\n ...UniversalGridOptions,\n eventNamingStyle: 'camelCaseWithExtraOnPrefix',\n rowDetailView: {\n collapseAllOnSort: true,\n cssClass: 'detail-view-toggle',\n panelRows: 1,\n keyPrefix: '__',\n useRowClick: false,\n saveDetailViewOnScroll: false,\n } as RowDetailView,\n};\n","import type { ContainerService as UniversalContainerService } from '@slickgrid-universal/common';\n\nexport class ContainerService implements UniversalContainerService {\n private readonly container: { [key: string]: any } = {};\n\n get<T = any>(key: string): T | null {\n return this.container[key];\n }\n\n registerInstance(key: string, instance: any) {\n this.container[key] = instance;\n }\n}\n","import type { TranslaterService as UniversalTranslateService } from '@slickgrid-universal/common';\nimport type { I18Next } from '../models/i18next.interface.js';\n\n/**\n * This is a Translate Service Wrapper for Slickgrid-Universal monorepo lib to work properly,\n * it must implement Slickgrid-Universal TranslaterService interface to work properly\n */\nexport class TranslaterI18NextService implements UniversalTranslateService {\n public i18n?: I18Next;\n\n /** I18Next instance setter */\n set i18nInstance(i18n: I18Next) {\n this.i18n = i18n;\n }\n\n /**\n * Method to return the current language used by the App\n * @return {string} current language\n */\n getCurrentLanguage(): string {\n return this.i18n?.language || '';\n }\n\n /**\n * Method to set the language to use in the App and Translate Service\n * @param {string} language\n * @return {Promise} output\n */\n async use(newLang: string): Promise<any> {\n return this.i18n?.changeLanguage(newLang);\n }\n\n /**\n * Method which receives a translation key and returns the translated value assigned to that key\n * @param {string} translation key\n * @return {string} translated value\n */\n translate(translationKey: string): string {\n return this.i18n?.t(translationKey) || '';\n }\n}\n","import type { EventSubscription } from '@slickgrid-universal/common';\n\n/**\n * Loop through and dispose of all subscriptions when they are disposable\n * @param subscriptions\n * @return empty array\n */\nexport function disposeAllSubscriptions(subscriptions: Array<EventSubscription>): Array<EventSubscription> {\n if (Array.isArray(subscriptions)) {\n while (subscriptions.length > 0) {\n const subscription = subscriptions.pop() as EventSubscription;\n if ((subscription as EventSubscription)?.unsubscribe) {\n (subscription as EventSubscription).unsubscribe!();\n }\n }\n }\n return subscriptions;\n}\n","<script setup lang=\"ts\">\nimport {\n autoAddEditorFormatterToColumnsWithEditor,\n BackendUtilityService,\n collectionObserver,\n CollectionService,\n emptyElement,\n ExtensionService,\n ExtensionUtility,\n FilterFactory,\n FilterService,\n GridEventService,\n GridService,\n GridStateService,\n HeaderGroupingService,\n isColumnDateType,\n PaginationService,\n PluginFlagMappings,\n ResizerService,\n SharedService,\n SlickDataView,\n SlickEventHandler,\n SlickGrid,\n SlickgridConfig,\n SlickGroupItemMetadataProvider,\n SortService,\n TreeDataService,\n type AutocompleterEditor,\n type BackendServiceApi,\n type BackendServiceOption,\n type BasePaginationComponent,\n type BasePaginationModel,\n type Column,\n type DataViewOption,\n type EventSubscription,\n type ExtensionList,\n type ExternalResource,\n type ExternalResourceConstructor,\n type Metrics,\n type Observable,\n type Pagination,\n type PaginationMetadata,\n type RxJsFacade,\n type SelectEditor,\n} from '@slickgrid-universal/common';\nimport { SlickFooterComponent } from '@slickgrid-universal/custom-footer-component';\nimport { SlickEmptyWarningComponent } from '@slickgrid-universal/empty-warning-component';\nimport { EventPubSubService } from '@slickgrid-universal/event-pub-sub';\nimport { SlickPaginationComponent } from '@slickgrid-universal/pagination-component';\nimport { deepCopy, extend } from '@slickgrid-universal/utils';\nimport { dequal } from 'dequal/lite';\nimport {\n computed,\n createApp,\n inject,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n useAttrs,\n watch,\n type ComponentPublicInstance,\n type Ref,\n} from 'vue';\nimport { GlobalGridOptions } from '../global-grid-options.js';\nimport type { GridOption, I18Next, SlickgridVueInstance } from '../models/index.js';\nimport { ContainerService, disposeAllSubscriptions } from '../services/index.js';\nimport { TranslaterI18NextService } from '../services/translaterI18Next.service.js';\nimport type { SlickgridVueProps } from './slickgridVueProps.interface.js';\n\nconst WARN_NO_PREPARSE_DATE_SIZE = 10000; // data size to warn user when pre-parsing isn't enabled\n\nexport interface VueRowDetailView {\n create(columns: Column[], gridOptions: GridOption): any;\n init(grid: SlickGrid, containerService?: ContainerService): void;\n}\n\nconst attrs = useAttrs();\n\n// props\nconst props = withDefaults(defineProps<SlickgridVueProps>(), {\n gridId: 'myGrid',\n});\n\n// refs\nconst elm = ref<HTMLDivElement>();\nconst svExtensions = ref<ExtensionList<any>>();\nconst svInstances = ref<SlickgridVueInstance | null>(null);\nconst _gridOptions = ref<GridOption>({});\nconst totalItems = ref(0);\n\n// computed values\nconst gridContainerId = computed(() => `slickGridContainer-${props.gridId}`);\nconst backendService = computed(() => gridOptionsModel.value?.backendServiceApi?.service);\n\nlet currentDatasetLength = 0;\nlet dataview: SlickDataView<any> | null = null;\nlet grid: SlickGrid;\nlet collectionObservers: Array<null | { disconnect: () => void }> = [];\nlet groupItemMetadataProvider: SlickGroupItemMetadataProvider | undefined;\nlet hideHeaderRowAfterPageLoad = false;\nlet i18next: I18Next | null;\nlet isAutosizeColsCalled = false;\nlet isGridInitialized = false;\nlet isDatasetInitialized = false;\nlet isDatasetHierarchicalInitialized = false;\nlet isPaginationInitialized = false;\nlet isLocalGrid = true;\nlet metrics: Metrics | undefined;\nlet registeredResources: Array<ExternalResource | ExternalResourceConstructor> = [];\nlet scrollEndCalled = false;\nlet showPagination = false;\nlet subscriptions: Array<EventSubscription> = [];\n\n// components / plugins\nlet slickEmptyWarning: SlickEmptyWarningComponent | undefined;\nlet slickFooter: SlickFooterComponent | undefined;\nlet slickPagination: BasePaginationComponent | undefined;\nlet slickRowDetailView: VueRowDetailView | undefined;\n\n// initialize and assign all Service Dependencies\nlet backendServiceApi: BackendServiceApi | undefined;\nlet rxjs: RxJsFacade | undefined;\nconst slickgridConfig = new SlickgridConfig();\nconst eventHandler = new SlickEventHandler();\nconst eventPubSubService = new EventPubSubService();\neventPubSubService.eventNamingStyle = 'camelCaseWithExtraOnPrefix';\n\nconst containerService = new ContainerService();\nconst translaterService = new TranslaterI18NextService();\nconst backendUtilityService = new BackendUtilityService();\nconst gridEventService = new GridEventService();\nconst sharedService = new SharedService();\nconst collectionService = new CollectionService(translaterService);\nconst extensionUtility = new ExtensionUtility(sharedService, backendUtilityService, translaterService);\nconst filterFactory = new FilterFactory(slickgridConfig, translaterService, collectionService);\nconst filterService = new FilterService(filterFactory as any, eventPubSubService, sharedService, backendUtilityService);\nconst resizerService = new ResizerService(eventPubSubService);\nconst sortService = new SortService(collectionService, sharedService, eventPubSubService, backendUtilityService);\nconst treeDataService = new TreeDataService(eventPubSubService, filterService, sharedService, sortService);\nconst paginationService = new PaginationService(eventPubSubService, sharedService, backendUtilityService);\nconst extensionService: ExtensionService = new ExtensionService(\n extensionUtility,\n filterService,\n eventPubSubService,\n sharedService,\n sortService,\n treeDataService,\n translaterService,\n () => gridService\n);\nconst gridStateService = new GridStateService(\n extensionService,\n filterService,\n eventPubSubService,\n sharedService,\n sortService,\n treeDataService\n);\nconst gridService = new GridService(\n gridStateService,\n filterService,\n eventPubSubService,\n paginationService,\n sharedService,\n sortService,\n treeDataService\n);\nconst headerGroupingService = new HeaderGroupingService(extensionUtility);\n\nlet serviceList = [\n extensionService,\n filterService,\n gridEventService,\n gridService,\n gridStateService,\n headerGroupingService,\n paginationService,\n resizerService,\n sortService,\n treeDataService,\n];\n\n// register all Service instances in the container\ncontainerService.registerInstance('PubSubService', eventPubSubService);\ncontainerService.registerInstance('EventPubSubService', eventPubSubService);\ncontainerService.registerInstance('ExtensionUtility', extensionUtility);\ncontainerService.registerInstance('FilterService', filterService);\ncontainerService.registerInstance('CollectionService', collectionService);\ncontainerService.registerInstance('ExtensionService', extensionService);\ncontainerService.registerInstance('GridEventService', gridEventService);\ncontainerService.registerInstance('GridService', gridService);\ncontainerService.registerInstance('GridStateService', gridStateService);\ncontainerService.registerInstance('HeaderGroupingService', headerGroupingService);\ncontainerService.registerInstance('PaginationService', paginationService);\ncontainerService.registerInstance('ResizerService', resizerService);\ncontainerService.registerInstance('SharedService', sharedService);\ncontainerService.registerInstance('SortService', sortService);\ncontainerService.registerInstance('TranslaterService', translaterService);\ncontainerService.registerInstance('TreeDataService', treeDataService);\n\nconst gridOptionsModel = defineModel<GridOption>('options');\n_gridOptions.value = { ...GlobalGridOptions, ...gridOptionsModel.value };\n\nconst _paginationOptions = ref<Pagination | undefined>();\nconst paginationModel = defineModel<Pagination>('pagination');\nwatch(paginationModel, (newPaginationOptions) => paginationOptionsChanged(newPaginationOptions!));\n\nconst _columns: Ref<Column[]> = ref([]);\nconst columnsModel = defineModel<Column[]>('columns', { required: true, default: [] });\nwatch(columnsModel, (columns) => columnsChanged(columns), { immediate: true });\n\nconst dataModel = defineModel<any[]>('dataset', { required: false }); // technically true but user could use datasetHierarchical instead\nwatch(\n dataModel,\n (newDataset: any[]) => {\n const prevDatasetLn = currentDatasetLength;\n const isDatasetEqual = dequal(newDataset, dataModel.value || []);\n let data = _gridOptions.value?.enableDeepCopyDatasetOnPageLoad ? deepCopy(newDataset) : newDataset;\n\n // when Tree Data is enabled and we don't yet have the hierarchical dataset filled, we can force a convert+sort of the array\n if (\n grid &&\n _gridOptions.value?.enableTreeData &&\n Array.isArray(newDataset) &&\n (newDataset.length > 0 || newDataset.length !== prevDatasetLn || !isDatasetEqual)\n ) {\n isDatasetHierarchicalInitialized = false;\n data = sortTreeDataset(newDataset, !isDatasetEqual); // if dataset changed, then force a refresh anyway\n }\n\n refreshGridData(data || []);\n currentDatasetLength = (newDataset || []).length;\n\n // expand/autofit columns on first page load\n // we can assume that if the prevDataset was empty then we are on first load\n if (grid && _gridOptions.value?.autoFitColumnsOnFirstLoad && prevDatasetLn === 0 && !isAutosizeColsCalled) {\n grid.autosizeColumns();\n isAutosizeColsCalled = true;\n }\n },\n { immediate: true }\n);\n\nconst dataHierarchicalModel = defineModel<any[]>('hierarchical', { required: false }); // technically true but user could use datasetHierarchical instead\nwatch(\n dataHierarchicalModel,\n (newHierarchicalDataset: any[] | undefined) => {\n const isDatasetEqual = dequal(newHierarchicalDataset, sharedService?.hierarchicalDataset ?? []);\n const prevFlatDatasetLn = currentDatasetLength;\n if (sharedService) {\n sharedService.hierarchicalDataset = newHierarchicalDataset;\n }\n\n if (newHierarchicalDataset && _columns.value && filterService?.clearFilters) {\n filterService.clearFilters();\n }\n\n // when a hierarchical dataset is set afterward, we can reset the flat dataset and call a tree data sort that will overwrite the flat dataset\n if (dataview && newHierarchicalDataset && grid && sortService?.processTreeDataInitialSort) {\n dataview.setItems([], _gridOptions.value?.datasetIdPropertyName ?? 'id');\n sortService.processTreeDataInitialSort();\n treeDataService.initHierarchicalTree();\n\n // we also need to reset/refresh the Tree Data filters because if we inserted new item(s) then it might not show up without doing this refresh\n // however we need to queue our process until the flat dataset is ready, so we can queue a microtask to execute the DataView refresh only after everything is ready\n queueMicrotask(() => {\n const flatDatasetLn = dataview?.getItemCount() || 0;\n if (flatDatasetLn > 0 && (flatDatasetLn !== prevFlatDatasetLn || !isDatasetEqual)) {\n filterService.refreshTreeDataFilters();\n }\n });\n isDatasetHierarchicalInitialized = true;\n }\n },\n { immediate: true }\n);\n\n// check if the user wants to hide the header row from the start\n// we only want to do this check once in the constructor\nhideHeaderRowAfterPageLoad = _gridOptions.value?.showHeaderRow === false;\n\nonBeforeUnmount(() => {\n disposing();\n});\n\nonMounted(() => {\n if (!columnsModel.value) {\n throw new Error(\n 'Using `<Slickgrid-Vue>` requires `v-model:columns` props, it seems that you might have forgot to provide the missing bindable model.'\n );\n }\n\n if (elm.value && eventPubSubService instanceof EventPubSubService) {\n eventPubSubService.elementSource = elm.value;\n\n // Vue doesn't play well with subscribing to native Custom Events & also the render is called after the constructor which brings a second problem\n // to fix both issues, we need to do the following:\n // 1. loop through all component props and subscribe to the ones that startsWith \"on\", we'll assume that it's the custom events\n // 2. then call the assigned listener(s) when events are dispatched\n for (const attr in { ...attrs, ...props }) {\n if (attr.startsWith('onOn')) {\n const eventCallback = attrs[attr as keyof SlickgridVueProps] || props[attr as keyof SlickgridVueProps];\n if (typeof eventCallback === 'function') {\n const singlePrefixEventName = attr.replace(/^onOn/, 'on');\n subscriptions.push(\n eventPubSubService.subscribe(singlePrefixEventName, (data: unknown) => {\n const gridEventName = eventPubSubService.getEventNameByNamingConvention(singlePrefixEventName, '');\n eventCallback.call(null, new CustomEvent(gridEventName, { detail: data }));\n })\n );\n }\n }\n }\n }\n\n initialization();\n isGridInitialized = true;\n\n // if we have a backendServiceApi and the enablePagination is undefined, we'll assume that we do want to see it, else get that defined value\n if (!hasBackendInfiniteScroll()) {\n _gridOptions.value.enablePagination = !!(_gridOptions.value.backendServiceApi && _gridOptions.value.enablePagination === undefined\n ? true\n : _gridOptions.value.enablePagination);\n }\n\n if (!isPaginationInitialized && !dataHierarchicalModel.value && _gridOptions.value?.enablePagination && isLocalGrid) {\n showPagination = true;\n loadLocalGridPagination(dataModel.value);\n }\n\n // recheck the empty warning message after grid is shown so that it works in every use case\n if (_gridOptions.value?.enableEmptyDataWarningMessage) {\n const data = dataModel.value || [];\n if (Array.isArray(data)) {\n const finalTotalCount = data.length;\n displayEmptyDataWarning(finalTotalCount < 1);\n }\n }\n // add dark mode CSS class when enabled\n if (_gridOptions.value.darkMode) {\n setDarkMode(true);\n }\n\n // keep ref of hierarchical dataset when initialized\n if (dataHierarchicalModel.value) {\n sharedService.hierarchicalDataset = dataHierarchicalModel.value || [];\n }\n\n suggestDateParsingWhenHelpful();\n\n // subscribe to column definitions assignment changes\n observeColumns();\n});\n\nfunction columnsChanged(columns?: Column[]) {\n if (columns) {\n _columns.value = columns;\n }\n if (isGridInitialized) {\n updateColumnsList(_columns.value);\n }\n if (_columns.value!.length > 0) {\n copyColumnWidthsReference(_columns.value);\n }\n}\n\nfunction initialization() {\n if (!_gridOptions.value || !columnsModel.value) {\n throw new Error(\n 'Using `<Slickgrid-Vue>` requires `v-model:columns=\"columns\"` and `v-model:options=\"gridOptions.value\"`, it seems that you might have forgot to provide them since at least of them is undefined.'\n );\n }\n\n _gridOptions.value.translater = translaterService;\n isAutosizeColsCalled = false;\n\n // when detecting a frozen grid, we'll automatically enable the mousewheel scroll handler so that we can scroll from both left/right frozen containers\n if (\n _gridOptions.value &&\n ((_gridOptions.value.frozenRow !== undefined && _gridOptions.value.frozenRow >= 0) ||\n (_gridOptions.value.frozenColumn !== undefined && _gridOptions.value.frozenColumn >= 0)) &&\n _gridOptions.value.enableMouseWheelScrollHandler === undefined\n ) {\n _gridOptions.value.enableMouseWheelScrollHandler = true;\n }\n\n eventPubSubService.eventNamingStyle = _gridOptions.value?.eventNamingStyle ?? 'camelCaseWithExtraOnPrefix';\n eventPubSubService.publish('onBeforeGridCreate', true);\n\n // make sure the dataset is initialized (if not it will throw an error that it cannot getLength of null)\n // dataset.value = dataset.value || dataModel.value || [];\n currentDatasetLength = dataModel.value?.length || 0;\n _gridOptions.value = mergeGridOptions(_gridOptions.value as GridOption);\n _paginationOptions.value = _gridOptions.value?.pagination;\n backendServiceApi = _gridOptions.value?.backendServiceApi;\n isLocalGrid = !backendServiceApi; // considered a local grid if it doesn't have a backend service set\n\n // inject the I18Next instance when translation is enabled\n if (_gridOptions.value?.enableTranslate || _gridOptions.value?.i18n) {\n i18next = inject<I18Next | null>('i18next', null);\n if (i18next) {\n translaterService.i18nInstance = i18next;\n } else {\n throw new Error(\n \"[Slickgrid-Vue] Enabling translation requires you to provide I18Next in your App, for example: `provide('i18next', useTranslation().i18next)`.\"\n );\n }\n }\n\n // unless specified, we'll create an internal postProcess callback (currently only available for GraphQL)\n if (_gridOptions.value?.backendServiceApi && !_gridOptions.value.backendServiceApi?.disableInternalPostProcess) {\n createBackendApiInternalPostProcessCallback(_gridOptions.value as GridOption);\n }\n\n const dataviewInlineFilters = (_gridOptions.value?.dataView && _gridOptions.value.dataView.inlineFilters) || false;\n let dataViewOptions: Partial<DataViewOption> = {\n ..._gridOptions.value.dataView,\n inlineFilters: dataviewInlineFilters,\n } as Partial<DataViewOption>;\n\n if (_gridOptions.value?.draggableGrouping || _gridOptions.value?.enableGrouping) {\n groupItemMetadataProvider = new SlickGroupItemMetadataProvider();\n sharedService.groupItemMetadataProvider = groupItemMetadataProvider;\n dataViewOptions = { ...dataViewOptions, groupItemMetadataProvider: groupItemMetadataProvider };\n }\n dataview = new SlickDataView<any>(dataViewOptions, eventPubSubService);\n eventPubSubService.publish('onDataviewCreated', dataview);\n\n // get any possible Services that user want to register which don't require SlickGrid to be instantiated\n // RxJS Resource is in this lot because it has to be registered before anything else and doesn't require SlickGrid to be initialized\n preRegisterResources();\n\n // prepare and load all SlickGrid editors, if an async editor is found then we'll also execute it.\n // Wrap each editor class in the Factory resolver so consumers of this library.\n // Vue will allow slickgrid to pass its arguments to the editors constructor last\n // when slickgrid creates the editor\n _columns.value = loadSlickGridEditors(columnsModel.value || []);\n\n // if the user wants to automatically add a Custom Editor Formatter, we need to call the auto add function again\n if (_gridOptions.value?.autoAddCustomEditorFormatter) {\n autoAddEditorFormatterToColumnsWithEditor(_columns.value as Column[], _gridOptions.value?.autoAddCustomEditorFormatter);\n }\n\n // save reference for all columns before they optionally become hidden/visible\n sharedService.allColumns = _columns.value as Column[];\n\n // TODO: revisit later, this conflicts with Grid State (Example 15)\n // before certain extentions/plugins potentially adds extra columns not created by the user itself (RowMove, RowDetail, RowSelections)\n // we'll subscribe to the event and push back the change to the user so they always use full column defs array including extra cols\n // subscriptions.push(\n // _eventPubSubService.subscribe<{ columns: Column<any>[]; grid: SlickGrid }>('onPluginColumnsChanged', data => {\n // columns = data.columns;\n // columnsChanged();\n // })\n // );\n\n // after subscribing to potential columns changed, we are ready to create these optional extensions\n // when we did find some to create (RowMove, RowDetail, RowSelections), it will automatically modify column definitions (by previous subscribe)\n extensionService.createExtensionsBeforeGridCreation(_columns.value as Column[], _gridOptions.value as GridOption);\n\n // if user entered some Pinning/Frozen \"presets\", we need to apply them in the grid options\n if (_gridOptions.value?.presets?.pinning) {\n _gridOptions.value = { ..._gridOptions.value, ..._gridOptions.value.presets.pinning };\n }\n\n // build SlickGrid Grid, also user might optionally pass a custom dataview (e.g. remote model)\n grid = new SlickGrid<any, Column<any>, GridOption<Column<any>>>(\n `#${props.gridId}`,\n dataview,\n _columns.value as Column[],\n _gridOptions.value as GridOption,\n eventPubSubService\n );\n sharedService.dataView = dataview;\n sharedService.slickGrid = grid;\n sharedService.gridContainerElement = elm.value as HTMLDivElement;\n if (groupItemMetadataProvider) {\n grid.registerPlugin(groupItemMetadataProvider); // register GroupItemMetadataProvider when Grouping is enabled\n }\n\n // get any possible Services that user want to register\n registerResources();\n\n extensionService.bindDifferentExtensions();\n bindDifferentHooks(grid, _gridOptions.value as GridOption, dataview);\n\n // when it's a frozen grid, we need to keep the frozen column id for reference if we ever show/hide column from ColumnPicker/GridMenu afterward\n sharedService.frozenVisibleColumnId = grid.getFrozenColumnId();\n\n // initialize the SlickGrid grid\n grid.init();\n\n // initialized the resizer service only after SlickGrid is initialized\n // if we don't we end up binding our resize to a grid element that doesn't yet exist in the DOM and the resizer service will fail silently (because it has a try/catch that unbinds the resize without throwing back)\n const gridContainerElm = elm.value;\n if (gridContainerElm) {\n resizerService.init(grid, gridContainerElm);\n }\n\n // user could show a custom footer with the data metrics (dataset length and last updated timestamp)\n if (\n !_gridOptions.value?.enablePagination &&\n _gridOptions.value?.showCustomFooter &&\n _gridOptions.value?.customFooterOptions &&\n gridContainerElm\n ) {\n slickFooter = new SlickFooterComponent(grid, _gridOptions.value?.customFooterOptions, eventPubSubService, translaterService);\n slickFooter.renderFooter(gridContainerElm as HTMLDivElement);\n }\n\n if (dataview) {\n // load the data in the DataView (unless it's a hierarchical dataset, if so it will be loaded after the initial tree sort)\n const initialDataset = _gridOptions.value?.enableTreeData ? sortTreeDataset(dataModel.value || []) : dataModel.value;\n if (Array.isArray(initialDataset)) {\n dataview.setItems(initialDataset, _gridOptions.value.datasetIdPropertyName ?? 'id');\n }\n\n // if you don't want the items that are not visible (due to being filtered out or being on a different page)\n // to stay selected, pass 'false' to the second arg\n if (grid?.getSelectionModel() && _gridOptions.value?.dataView && 'syncGridSelection' in _gridOptions.value.dataView) {\n // if we are using a Backend Service, we will do an extra flag check, the reason is because it might have some unintended behaviors\n // with the BackendServiceApi because technically the data in the page changes the DataView on every page change.\n let preservedRowSelectionWithBackend = false;\n if (_gridOptions.value.backendServiceApi && 'syncGridSelectionWithBackendService' in _gridOptions.value.dataView) {\n preservedRowSelectionWithBackend = _gridOptions.value.dataView.syncGridSelectionWithBackendService as boolean;\n }\n\n const syncGridSelection = _gridOptions.value.dataView.syncGridSelection;\n if (typeof syncGridSelection === 'boolean') {\n let preservedRowSelection = syncGridSelection;\n if (!isLocalGrid) {\n // when using BackendServiceApi, we'll be using the \"syncGridSelectionWithBackendService\" flag BUT \"syncGridSelection\" must also be set to True\n preservedRowSelection = syncGridSelection && preservedRowSelectionWithBackend;\n }\n dataview.syncGridSelection(grid, preservedRowSelection);\n } else if (typeof syncGridSelection === 'object') {\n dataview.syncGridSelection(grid, syncGridSelection.preserveHidden, syncGridSelection.preserveHiddenOnSelectionChange);\n }\n }\n\n const datasetLn = dataModel.value?.length || 0;\n if (datasetLn > 0) {\n if (!isDatasetInitialized && (_gridOptions.value.enableCheckboxSelector || _gridOptions.value.enableSelection)) {\n loadRowSelectionPresetWhenExists();\n }\n loadFilterPresetsWhenDatasetInitialized();\n isDatasetInitialized = true;\n }\n }\n\n // user might want to hide the header row on page load but still have `enableFiltering: true`\n // if that is the case, we need to hide the headerRow ONLY AFTER all filters got created & dataView exist\n if (hideHeaderRowAfterPageLoad) {\n showHeaderRow(false);\n sharedService.hideHeaderRowAfterPageLoad = hideHeaderRowAfterPageLoad;\n }\n\n // publish & dispatch certain events\n eventPubSubService.publish('onGridCreated', grid);\n\n // after the DataView is created & updated execute some processes & dispatch some events\n executeAfterDataviewCreated(grid, _gridOptions.value as GridOption);\n\n // bind resize ONLY after the dataView is ready\n bindResizeHook(grid, _gridOptions.value as GridOption);\n\n // bind the Backend Service API callback functions only after the grid is initialized\n // because the preProcess() and onInit() might get triggered\n if (_gridOptions.value?.backendServiceApi) {\n bindBackendCallbackFunctions(_gridOptions.value as GridOption);\n }\n\n // create the Vue Grid Instance with reference to all Services\n const vueElementInstance: SlickgridVueInstance = {\n element: elm.value as HTMLDivElement,\n\n // Slick Grid & DataView objects\n dataView: dataview,\n slickGrid: grid,\n\n // public methods\n dispose: disposeInstance,\n\n // return all available Services (non-singleton)\n backendService: backendService.value,\n eventPubSubService: eventPubSubService,\n filterService: filterService,\n gridEventService: gridEventService,\n gridStateService: gridStateService,\n gridService: gridService,\n headerGroupingService: headerGroupingService,\n extensionService: extensionService,\n paginationComponent: slickPagination,\n paginationService: paginationService,\n resizerService: resizerService,\n sortService: sortService,\n treeDataService: treeDataService,\n };\n\n // addons (SlickGrid extra plugins/controls)\n svExtensions.value = extensionService?.extensionList;\n\n // all instances (SlickGrid, DataView & all Services)\n svInstances.value = vueElementInstance;\n eventPubSubService.publish('onVueGridCreated', vueElementInstance);\n}\n\nfunction disposing(shouldEmptyDomElementContainer = false) {\n eventPubSubService.publish('onBeforeGridDestroy', grid);\n eventHandler?.unsubscribeAll();\n if (typeof i18next?.off === 'function') {\n i18next.off('languageChanged');\n }\n\n collectionObservers.forEach((obs) => obs?.disconnect());\n eventPubSubService.unsubscribeAll();\n\n // dispose of all Services\n serviceList.forEach((service: any) => {\n if (service?.dispose) {\n service.dispose();\n }\n });\n serviceList.length = 0;\n\n // dispose backend service when defined and a dispose method exists\n backendService.value?.dispose?.();\n\n // dispose all registered external resources\n disposeExternalResources();\n\n // dispose the Components\n slickEmptyWarning?.dispose();\n slickFooter?.dispose();\n slickPagination?.dispose();\n\n if (dataview) {\n if (dataview.setItems) {\n dataview.setItems([]);\n }\n if (dataview.destroy) {\n dataview.destroy();\n }\n }\n if (grid?.destroy) {\n grid.destroy(shouldEmptyDomElementContainer);\n }\n\n // also dispose of all Subscriptions\n subscriptions = disposeAllSubscriptions(subscriptions);\n\n if (backendServiceApi) {\n for (const prop of Object.keys(backendServiceApi)) {\n (backendServiceApi as any)[prop] = null;\n }\n backendServiceApi = undefined;\n }\n for (const prop of Object.keys(columnsModel.value)) {\n (columnsModel.value as any)[prop] = null;\n }\n for (const prop of Object.keys(sharedService)) {\n (sharedService as any)[prop] = null;\n }\n\n // we could optionally also empty the content of the grid container DOM element\n if (shouldEmptyDomElementContainer) {\n emptyGridContainerElm();\n }\n}\n\n/** Do not rename to `dispose` as it's an Vue hook */\nfunction disposeInstance(shouldEmptyDomElementContainer = false) {\n disposing(shouldEmptyDomElementContainer);\n}\n\nfunction disposeExternalResources() {\n if (Array.isArray(registeredResources)) {\n while (registeredResources.length > 0) {\n const res = registeredResources.pop();\n if (typeof (res as ExternalResource)?.dispose === 'function') {\n (res as ExternalResource).dispose!();\n }\n }\n }\n registeredResources = [];\n}\n\nfunction emptyGridContainerElm() {\n const gridContainerId = _gridOptions.value?.gridContainerId ?? 'grid1';\n const gridContainerElm = document.querySelector(`#${gridContainerId}`) as HTMLDivElement;\n emptyElement(gridContainerElm);\n}\n\n/**\n * Define our internal Post Process callback, it will execute internally after we get back result from the Process backend call\n * Currently ONLY available with the GraphQL Backend Service.\n * The behavior is to refresh the Dataset & Pagination without requiring the user to create his own PostProcess every time\n */\nfunction createBackendApiInternalPostProcessCallback(gridOptions: GridOption) {\n const backendApi = gridOptions?.backendServiceApi;\n if (backendApi?.service) {\n const backendApiService = backendApi.service;\n\n // internalPostProcess only works (for now) with a GraphQL Service, so make sure it is of that type\n if (typeof backendApiService.getDatasetName === 'function') {\n backendApi.internalPostProcess = (processResult: any) => {\n const datasetName =\n backendApi && backendApiService && typeof backendApiService.getDatasetName === 'function'\n ? backendApiService.getDatasetName()\n : '';\n if (processResult?.data[datasetName]) {\n const data =\n 'nodes' in processResult.data[datasetName]\n ? (processResult as any).data[datasetName].nodes\n : (processResult as any).data[datasetName];\n const totalCount =\n 'totalCount' in processResult.data[datasetName]\n ? (processResult as any).data[datasetName].totalCount\n : (processResult as any).data[datasetName].length;\n refreshGridData(data, totalCount || 0);\n }\n };\n }\n }\n}\n\nfunction bindDifferentHooks(grid: SlickGrid, gridOptions: GridOption, dataView: SlickDataView<any>) {\n // translate some of them on first load, then on each language change\n if (gridOptions.enableTranslate) {\n extensionService.translateAllExtensions();\n }\n\n // on locale change, we have to manually translate the Headers, GridMenu\n if (typeof i18next?.on === 'function') {\n i18next.on('languageChanged', (lang: string) => {\n // publish event of the same name that Slickgrid-Universal uses on a language change event\n eventPubSubService.publish('onLanguageChange', lang);\n\n if (gridOptions.enableTranslate) {\n extensionService.translateAllExtensions(lang);\n if (\n (gridOptions.createPreHeaderPanel && gridOptions.createTopHeaderPanel) ||\n (gridOptions.createPreHeaderPanel && !gridOptions.enableDraggableGrouping)\n ) {\n headerGroupingService.translateHeaderGrouping();\n }\n }\n });\n }\n\n // if user set an onInit Backend, we'll run it right away (and if so, we also need to run preProcess, internalPostProcess & postProcess)\n if (gridOptions.backendServiceApi) {\n const backendApi = gridOptions.backendServiceApi;\n\n if (backendApi?.service?.init) {\n backendApi.service.init(backendApi.options, gridOptions.pagination, grid, sharedService);\n }\n }\n\n if (dataView && grid) {\n // on cell click, mainly used with the columnDef.action callback\n gridEventService.bindOnBeforeEditCell(grid);\n gridEventService.bindOnCellChange(grid);\n gridEventService.bindOnClick(grid);\n\n if (dataView && grid) {\n // bind external sorting (backend) when available or default onSort (dataView)\n if (gridOptions.enableSorting) {\n // bind external sorting (backend) unless specified to use the local one\n if (gridOptions.backendServiceApi && !gridOptions.backendServiceApi.useLocalSorting) {\n sortService.bindBackendOnSort(grid);\n } else {\n sortService.bindLocalOnSort(grid);\n }\n }\n\n // bind external filter (backend) when available or default onFilter (dataView)\n if (gridOptions.enableFiltering) {\n filterService.init(grid);\n\n // bind external filter (backend) unless specified to use the local one\n if (gridOptions.backendServiceApi && !gridOptions.backendServiceApi.useLocalFiltering) {\n filterService.bindBackendOnFilter(grid);\n } else {\n filterService.bindLocalOnFilter(grid);\n }\n }\n\n // when column are reordered, we need to update SharedService flag\n eventHandler.subscribe(grid.onColumnsReordered, () => {\n sharedService.hasColumnsReordered = true;\n });\n\n eventHandler.subscribe(grid.onSetOptions, (_e, args) => {\n // add/remove dark mode CSS class when enabled\n if (args.optionsBefore.darkMode !== args.optionsAfter.darkMode && sharedService.gridContainerElement) {\n setDarkMode(args.optionsAfter.darkMode);\n }\n });\n\n // load any presets if any (after dataset is initialized)\n loadColumnPresetsWhenDatasetInitialized();\n loadFilterPresetsWhenDatasetInitialized();\n\n // When data changes in the DataView, we need to refresh the metrics and/or display a warning if the dataset is empty\n eventHandler.subscribe(dataView.onRowCountChanged, (_e, args) => {\n if (!gridOptions.enableRowDetailView || !Array.isArray(args.changedRows) || args.changedRows.length === args.itemCount) {\n grid.invalidate();\n } else {\n grid.invalidateRows(args.changedRows);\n grid.render();\n }\n handleOnItemCountChanged(dataView.getFilteredItemCount() || 0, dataView.getItemCount() || 0);\n });\n eventHandler.subscribe(dataView.onSetItemsCalled, (_e, args) => {\n sharedService.isItemsDateParsed = false;\n handleOnItemCountChanged(dataView.getFilteredItemCount() || 0, args.itemCount);\n\n // when user has resize by content enabled, we'll force a full width calculation since we change our entire dataset\n if (\n args.itemCount > 0 &&\n (gridOptions.autosizeColumnsByCellContentOnFirstLoad || gridOptions.enableAutoResizeColumnsByCellContent)\n ) {\n resizerService.resizeColumnsByCellContent(!gridOptions?.resizeByContentOnlyOnFirstLoad);\n }\n });\n\n if ((gridOptions?.enableFiltering || gridOptions?.dataView?.globalItemMetadataProvider) && !gridOptions.enableRowDetailView) {\n eventHandler.subscribe(dataView.onRowsChanged, (_e, { calledOnRowCountChanged, rows }) => {\n // filtering data with local dataset will not always show correctly unless we call this updateRow/render\n // also don't use \"invalidateRows\" since it destroys the entire row and as bad user experience when updating a row\n // see commit: https://github.com/ghiscoding/aurelia-slickgrid/commit/8c503a4d45fba11cbd8d8cc467fae8d177cc4f60\n if (!calledOnRowCountChanged && Array.isArray(rows)) {\n const ranges = grid.getRenderedRange();\n rows.filter((row) => row >= ranges.top && row <= ranges.bottom).forEach((row: number) => grid.updateRow(row));\n grid.render();\n }\n });\n }\n }\n }\n}\n\nfunction bindBackendCallbackFunctions(gridOptions: GridOption) {\n const backendApi = gridOptions.backendServiceApi;\n const backendApiService = backendApi?.service;\n const serviceOptions: BackendServiceOption = backendApiService?.options || {};\n const isExecuteCommandOnInit = !serviceOptions\n ? false\n : serviceOptions && 'executeProcessCommandOnInit' in serviceOptions\n ? serviceOptions['executeProcessCommandOnInit']\n : true;\n\n if (backendApiService) {\n // update backend filters (if need be) BEFORE the query runs (via the onInit command a few lines below)\n // if user entered some any \"presets\", we need to reflect them all in the grid\n if (gridOptions?.presets) {\n // Filters \"presets\"\n if (backendApiService.updateFilters && Array.isArray(gridOptions.presets.filters) && gridOptions.presets.filters.length > 0) {\n backendApiService.updateFilters(gridOptions.presets.filters, true);\n }\n // Sorters \"presets\"\n if (backendApiService.updateSorters && Array.isArray(gridOptions.presets.sorters) && gridOptions.presets.sorters.length > 0) {\n // when using multi-column sort, we can have multiple but on single sort then only grab the first sort provided\n const sortColumns = _gridOptions.value?.multiColumnSort ? gridOptions.presets.sorters : gridOptions.presets.sorters.slice(0, 1);\n backendApiService.updateSorters(undefined, sortColumns);\n }\n // Pagination \"presets\"\n if (backendApiService.updatePagination && gridOptions.presets.pagination && !hasBackendInfiniteScroll()) {\n const { pageNumber, pageSize } = gridOptions.presets.pagination;\n backendApiService.updatePagination(pageNumber, pageSize);\n }\n } else {\n const columnFilters = filterService.getColumnFilters();\n if (columnFilters && backendApiService.updateFilters) {\n backendApiService.updateFilters(columnFilters, false);\n }\n }\n\n // execute onInit command when necessary\n if (backendApi && backendApiService && (backendApi.onInit || isExecuteCommandOnInit)) {\n const query = typeof backendApiService.buildQuery === 'function' ? backendApiService.buildQuery() : '';\n const process = isExecuteCommandOnInit ? (backendApi.process?.(query) ?? null) : (backendApi.onInit?.(query) ?? null);\n\n // wrap this inside a microtask to be executed at the end of the task and avoid timing issue since the gridOptions needs to be ready before running this onInit\n queueMicrotask(() => {\n // keep start time & end timestamps & return it after process execution\n const startTime = new Date();\n\n // run any pre-process, if defined, for example a spinner\n if (backendApi.preProcess) {\n backendApi.preProcess();\n }\n\n // the processes can be a Promise (like Http)\n const totalItems = _gridOptions.value?.pagination?.totalItems ?? 0;\n if (process instanceof Promise) {\n process\n .then((processResult: any) =>\n backendUtilityService.executeBackendProcessesCallback(startTime, processResult, backendApi, totalItems)\n )\n .catch((error) => backendUtilityService.onBackendError(error, backendApi));\n } else if (process && rxjs?.isObservable(process)) {\n subscriptions.push(\n (process as Observable<any>).subscribe(\n (processResult: any) =>\n backendUtilityService.executeBackendProcessesCallback(startTime, processResult, backendApi, totalItems),\n (error: any) => backendUtilityService.onBackendError(error, backendApi)\n )\n );\n }\n });\n }\n\n // when user enables Infinite Scroll\n if (backendApi.service.options?.infiniteScroll) {\n addBackendInfiniteScrollCallback();\n }\n }\n}\n\nfunction addBackendInfiniteScrollCallback(): void {\n if (grid && _gridOptions.value.backendServiceApi && hasBackendInfiniteScroll() && !_gridOptions.value.backendServiceApi?.onScrollEnd) {\n const onScrollEnd = () => {\n backendUtilityService.setInfiniteScrollBottomHit(true);\n\n // even if we're not showing pagination, we still use pagination service behind the scene\n // to keep track of the scroll position and fetch next set of data (aka next page)\n // we also need a flag to know if we reached the of the dataset or not (no more pages)\n paginationService.goToNextPage().then((hasNext) => {\n if (!hasNext) {\n backendUtilityService.setInfiniteScrollBottomHit(false);\n }\n });\n };\n _gridOptions.value.backendServiceApi.onScrollEnd = onScrollEnd;\n\n // subscribe to SlickGrid onScroll to determine when reaching the end of the scroll bottom position\n // run onScrollEnd() method when that happens\n eventHandler.subscribe(grid.onScroll, (_e, args) => {\n const viewportElm = args.grid.getViewportNode()!;\n if (\n ['mousewheel', 'scroll'].includes(args.triggeredBy || '') &&\n paginationService?.totalItems &&\n args.scrollTop > 0 &&\n Math.ceil(viewportElm.offsetHeight + args.scrollTop) >= args.scrollHeight\n ) {\n if (!scrollEndCalled) {\n onScrollEnd();\n scrollEndCalled = true;\n }\n }\n });\n\n // use postProcess to identify when scrollEnd process is finished to avoid calling the scrollEnd multiple times\n // we also need to keep a ref of the user's postProcess and call it after our own postProcess\n const orgPostProcess = _gridOptions.value.backendServiceApi.postProcess;\n _gridOptions.value.backendServiceApi.postProcess = (processResult: any) => {\n scrollEndCalled = false;\n if (orgPostProcess) {\n orgPostProcess(processResult);\n }\n };\n }\n}\n\nfunction bindResizeHook(grid: SlickGrid, options: GridOption) {\n if (\n (options.autoFitColumnsOnFirstLoad && options.autosizeColumnsByCellContentOnFirstLoad) ||\n (options.enableAutoSizeColumns && options.enableAutoResizeColumnsByCellContent)\n ) {\n throw new Error(\n `[Slickgrid-Vue] You cannot enable both autosize/fit viewport & resize by content, you must choose which resize technique to use. You can enable these 2 options (\"autoFitColumnsOnFirstLoad\" and \"enableAutoSizeColumns\") OR these other 2 options (\"autosizeColumnsByCellContentOnFirstLoad\" and \"enableAutoResizeColumnsByCellContent\").`\n );\n }\n\n // auto-resize grid on browser resize\n if (options.gridHeight || options.gridWidth) {\n resizerService.resizeGrid(0, { height: options.gridHeight, width: options.gridWidth });\n } else {\n resizerService.resizeGrid();\n }\n\n // expand/autofit columns on first page load\n if (grid && options?.enableAutoResize && options.autoFitColumnsOnFirstLoad && options.enableAutoSizeColumns && !isAutosizeColsCalled) {\n grid.autosizeColumns();\n isAutosizeColsCalled = true;\n }\n}\n\nfunction executeAfterDataviewCreated(_grid: SlickGrid, gridOptions: GridOption) {\n // if user entered some Sort \"presets\", we need to reflect them all in the DOM\n if (gridOptions.enableSorting) {\n if (gridOptions.presets && Array.isArray(gridOptions.presets.sorters)) {\n // when using multi-column sort, we can have multiple but on single sort then only grab the first sort provided\n const sortColumns = _gridOptions.value.multiColumnSort ? gridOptions.presets.sorters : gridOptions.presets.sorters.slice(0, 1);\n sortService.loadGridSorters(sortColumns);\n }\n }\n}\n\n/**\n * On a Pagination changed, we will trigger a Grid State changed with the new pagination info\n * Also if we use Row Selection or the Checkbox Selector with a Backend Service (Odata, GraphQL), we need to reset any selection\n */\nfunction paginationChanged(pagination: PaginationMetadata) {\n const isSyncGridSelectionEnabled = gridStateService?.needToPreserveRowSelection() ?? false;\n if (\n grid &&\n !isSyncGridSelectionEnabled &&\n _gridOptions.value?.backendServiceApi &&\n (_gridOptions.value.enableSelection || _gridOptions.value.enableCheckboxSelector)\n ) {\n grid.setSelectedRows([]);\n }\n const { pageNumber, pageSize } = pagination;\n if (sharedService) {\n if (pageSize !== undefined && pageNumber !== undefined) {\n sharedService.currentPagination = { pageNumber, pageSize };\n }\n }\n eventPubSubService.publish('onGridStateChanged', {\n change: { newValues: { pageNumber, pageSize }, type: 'pagination' },\n gridState: gridStateService.getCurrentGridState(),\n });\n}\n\nfunction paginationOptionsChanged(newPaginationOptions: Pagination) {\n if (newPaginationOptions && _paginationOptions.value) {\n _paginationOptions.value = { ..._paginationOptions.value, ...newPaginationOptions };\n } else {\n _paginationOptions.value = newPaginationOptions;\n }\n if (_gridOptions.value) {\n _gridOptions.value.pagination = _paginationOptions.value;\n paginationService.updateTotalItems(newPaginationOptions?.totalItems ?? 0, true);\n }\n}\n\n/**\n * When dataset changes, we need to refresh the entire grid UI & possibly resize it as well\n * @param dataset\n */\nfunction refreshGridData(dataset: any[], totalCount?: number) {\n // local grid, check if we need to show the Pagination\n // if so then also check if there's any presets and finally initialize the PaginationService\n // a local grid with Pagination presets will potentially have a different total of items, we'll need to get it from the DataView and update our total\n if (_gridOptions.value?.enablePagination && isLocalGrid) {\n showPagination = true;\n loadLocalGridPagination(dataset);\n }\n\n if (_gridOptions.value?.enableEmptyDataWarningMessage && Array.isArray(dataset)) {\n const finalTotalCount = totalCount || dataset.length;\n displayEmptyDataWarning(finalTotalCount < 1);\n }\n\n if (Array.isArray(dataset) && grid && dataview?.setItems) {\n dataview.setItems(dataset, _gridOptions.value.datasetIdPropertyName ?? 'id');\n if (!_gridOptions.value.backendServiceApi && !_gridOptions.value.enableTreeData) {\n dataview.reSort();\n }\n\n if (dataset.length > 0) {\n if (!isDatasetInitialized) {\n loadFilterPresetsWhenDatasetInitialized();\n\n if (_gridOptions.value.enableCheckboxSelector) {\n loadRowSelectionPresetWhenExists();\n }\n }\n isDatasetInitialized = true;\n }\n\n if (dataset) {\n grid.invalidate();\n }\n\n // display the Pagination component only after calling this refresh data first, we call it here so that if we preset pagination page number it will be shown correctly\n showPagination = !!(\n _gridOptions.value &&\n (_gridOptions.value.enablePagination || (_gridOptions.value.backendServiceApi && _gridOptions.value.enablePagination === undefined))\n );\n\n if (_paginationOptions.value && _gridOptions.value?.pagination && _gridOptions.value?.backendServiceApi) {\n const paginationOptions = setPaginationOptionsWhenPresetDefined(\n _gridOptions.value as GridOption,\n _paginationOptions.value as Pagination\n );\n // when we have a totalCount use it, else we'll take it from the pagination object\n // only update the total items if it's different to avoid refreshing the UI\n const totalRecords = totalCount !== undefined ? totalCount : _gridOptions.value?.pagination?.totalItems;\n if (totalRecords !== undefined && totalRecords !== totalItems.value) {\n totalItems.value = +totalRecords;\n }\n\n // initialize the Pagination Service with new pagination options (which might have presets)\n if (!isPaginationInitialized) {\n initializePaginationService(paginationOptions);\n } else {\n // update the pagination service with the new total\n paginationService.updateTotalItems(totalItems.value);\n }\n }\n\n // resize the grid inside a slight timeout, in case other DOM element changed prior to the resize (like a filter/pagination changed)\n if (grid && _gridOptions.value.enableAutoResize) {\n const delay = _gridOptions.value.autoResize && _gridOptions.value.autoResize.delay;\n resizerService.resizeGrid(delay || 10);\n }\n }\n}\n\n/**\n * Show the filter row displayed on first row, we can optionally pass false to hide it.\n * @param showing\n */\nfunction showHeaderRow(showing = true) {\n grid?.setHeaderRowVisibility(showing);\n if (showing === true && isGridInitialized) {\n grid?.setColumns(columnsModel.value);\n }\n return showing;\n}\n\n/**\n * Check if there's any Pagination Presets defined in the Grid Options,\n * if there are then load them in the paginationOptions object\n */\nfunction setPaginationOptionsWhenPresetDefined(gridOptions: GridOption, paginationOptions: Pagination): Pagination {\n if (gridOptions.presets?.pagination && gridOptions.pagination) {\n if (hasBackendInfiniteScroll()) {\n console.warn('[Slickgrid-Vue] `presets.pagination` is not supported with Infinite Scroll, reverting to first page.');\n } else {\n paginationOptions.pageSize = gridOptions.presets.pagination.pageSize;\n paginationOptions.pageNumber = gridOptions.presets.pagination.pageNumber;\n }\n }\n return paginationOptions;\n}\n\nfunction setDarkMode(dark = false) {\n sharedService.gridContainerElement?.classList.toggle('slick-dark-mode', dark);\n}\n\n/**\n * Dynamically change or update the column definitions list.\n * We will re-render the grid so that the new header and data shows up correctly.\n * If using i18n, we also need to trigger a re-translate of the column headers\n */\nfunction updateColumnsList(newColumns: Column<any>[]) {\n if (newColumns) {\n // map the Editor model to editorClass and load editor collectionAsync\n newColumns = loadSlickGridEditors(newColumns);\n\n // if the user wants to automatically add a Custom Editor Formatter, we need to call the auto add function again\n if (_gridOptions.value.autoAddCustomEditorFormatter) {\n autoAddEditorFormatterToColumnsWithEditor(newColumns, _gridOptions.value.autoAddCustomEditorFormatter);\n }\n\n if (_gridOptions.value.enableTranslate) {\n extensionService.translateColumnHeaders(undefined, newColumns);\n }\n extensionService.renderColumnHeaders(newColumns, true);\n\n if (_gridOptions.value?.enableAutoSizeColumns) {\n grid?.autosizeColumns();\n } else if (_gridOptions.value?.enableAutoResizeColumnsByCellContent && resizerService?.resizeColumnsByCellContent) {\n resizerService.resizeColumnsByCellContent();\n }\n }\n}\n\n/**\n * assignment changes are not triggering on the column definitions, for that\n * we can use our internal array observer for any changes done via (push, pop, shift, ...)\n */\nfunction observeColumns() {\n collectionObservers.push(collectionObserver(columnsModel.value, columnsChanged));\n}\n\n/**\n * Loop through all column definitions and copy the original optional `width` properties optionally provided by the user.\n * We will use this when doing a resize by cell content, if user provided a `width` it won't override it.\n */\nfunction copyColumnWidthsReference(columns: Column<any>[]) {\n columns.forEach((col) => (col.originalWidth = col.width));\n}\n\nfunction displayEmptyDataWarning(showWarning = true) {\n slickEmptyWarning?.showEmptyDataMessage(showWarning);\n}\n\n/** When data changes in the DataView, we'll refresh the metrics and/or display a warning if the dataset is empty */\nfunction handleOnItemCountChanged(currentPageRowItemCount: number, totalItemCount: number) {\n currentDatasetLength = totalItemCount;\n metrics = {\n startTime: new Date(),\n endTime: new Date(),\n itemCount: currentPageRowItemCount,\n totalItemCount,\n };\n // if custom footer is enabled, then we'll update its metrics\n if (slickFooter) {\n slickFooter.metrics = metrics;\n }\n\n // when using local (in-memory) dataset, we'll display a warning message when filtered data is empty\n if (isLocalGrid && _gridOptions.value?.enableEmptyDataWarningMessage) {\n displayEmptyDataWarning(currentPageRowItemCount === 0);\n }\n\n // when autoResize.autoHeight is enabled, we'll want to call a resize\n if (_gridOptions.value.enableAutoResize && resizerService.isAutoHeightEnabled && currentPageRowItemCount > 0) {\n resizerService.resizeGrid();\n }\n}\n\n/** Initialize the Pagination Service once */\nfunction initializePaginationService(paginationOptions: Pagination) {\n if (_gridOptions.value) {\n paginationService.totalItems = totalItems.value;\n paginationService.init(grid!, paginationOptions, backendServiceApi);\n subscriptions.push(\n eventPubSubService.subscribe('onPaginationChanged', (paginationChanges: PaginationMetadata) => paginationChanged(paginationChanges)),\n eventPubSubService.subscribe('onPaginationVisibilityChanged', (visibility: { visible: boolean }) => {\n showPagination = visibility?.visible ?? false;\n if (_gridOptions.value?.backendServiceApi) {\n backendUtilityService?.refreshBackendDataset(_gridOptions.value as GridOption);\n }\n renderPagination(showPagination);\n })\n );\n\n // also initialize (render) the pagination component\n renderPagination();\n isPaginationInitialized = true;\n }\n}\n\n/** Load the Editor Collection asynchronously and replace the \"collection\" property when Promise resolves */\nfunction loadEditorCollectionAsync(column: Column) {\n if (column?.editor) {\n const collectionAsync = column.editor.collectionAsync;\n column.editor.disabled = true; // disable the Editor DOM element, we'll re-enable it after receiving the collection with \"updateEditorCollection()\"\n\n if (collectionAsync instanceof Promise) {\n // wait for the \"collectionAsync\", once resolved we will save it into the \"collection\"\n // the collectionAsync can be of 3 types HttpClient, HttpFetch or a Promise\n collectionAsync.then((response: any | any[]) => {\n if (Array.isArray(response)) {\n updateEditorCollection(column, response); // from Promise\n } else if (response instanceof Response && typeof response.json === 'function') {\n if (response.bodyUsed) {\n console.warn(\n `[SlickGrid-Vue] The response body passed to collectionAsync was already read. ` +\n `Either pass the dataset from the Response or clone the response first using response.clone()`\n );\n } else {\n // from Fetch\n (response as Response).json().then((data) => updateEditorCollection(column, data));\n }\n } else if (response?.content) {\n updateEditorCollection(column, response.content); // from http-client\n }\n });\n } else if (rxjs?.isObservable(collectionAsync)) {\n // wrap this inside a microtask at the end of the task to avoid timing issue since updateEditorCollection requires to call SlickGrid getColumns() method after columns are available\n queueMicrotask(() => {\n subscriptions.push(\n (collectionAsync as Observable<any>).subscribe((resolvedCollection) => updateEditorCollection(column, resolvedCollection))\n );\n });\n }\n }\n}\n\n/** Load any possible Columns Grid Presets */\nfunction loadColumnPresetsWhenDatasetInitialized() {\n // if user entered some Columns \"presets\", we need to reflect them all in the grid\n if (_gridOptions.value.presets && Array.isArray(_gridOptions.value.presets.columns) && _gridOptions.value.presets.columns.length > 0) {\n // delegate to GridStateService for centralized column arrangement logic\n // we pass `false` for triggerAutoSizeColumns to maintain original behavior on preset load\n gridStateService.changeColumnsArrangement(_gridOptions.value.presets.columns, false);\n }\n}\n\n/** Load any possible Filters Grid Presets */\nfunction loadFilterPresetsWhenDatasetInitialized() {\n if (_gridOptions.value) {\n // if user entered some Filter \"presets\", we need to reflect them all in the DOM\n // also note that a presets of Tree Data Toggling will also call this method because Tree Data toggling does work with data filtering\n // (collapsing a parent will basically use Filter for hidding (aka collapsing) away the child underneat it)\n if (\n _gridOptions.value.presets &&\n (Array.isArray(_gridOptions.value.presets.filters) || Array.isArray(_gridOptions.value.presets?.treeData?.toggledItems))\n ) {\n filterService.populateColumnFilterSearchTermPresets(_gridOptions.value.presets?.filters || []);\n }\n }\n}\n\n/**\n * local grid, check if we need to show the Pagination\n * if so then also check if there's any presets and finally initialize the PaginationService\n * a local grid with Pagination presets will potentially have a different total of items, we'll need to get it from the DataView and update our total\n */\nfunction loadLocalGridPagination(dataset?: any[]) {\n if (_gridOptions.value && _paginationOptions.value) {\n totalItems.value = Array.isArray(dataset) ? dataset.length : 0;\n if (_paginationOptions.value && dataview?.getPagingInfo) {\n const slickPagingInfo = dataview.getPagingInfo();\n if ('totalRows' in slickPagingInfo && _paginationOptions.value.totalItems !== slickPagingInfo.totalRows) {\n totalItems.value = slickPagingInfo.totalRows || 0;\n }\n }\n _paginationOptions.value.totalItems = totalItems.value;\n const paginationOptions = setPaginationOptionsWhenPresetDefined(_gridOptions.value as GridOption, _paginationOptions.value);\n initializePaginationService(paginationOptions);\n }\n}\n\n/** Load any Row Selections into the DataView that were presets by the user */\nfunction loadRowSelectionPresetWhenExists() {\n // if user entered some Row Selections \"presets\"\n const presets = _gridOptions.value?.presets;\n const enableRowSelection = _gridOptions.value && (_gridOptions.value.enableCheckboxSelector || _gridOptions.value.enableSelection);\n if (\n enableRowSelection &&\n grid?.getSelectionModel() &&\n presets?.rowSelection &&\n (Array.isArray(presets.rowSelection.gridRowIndexes) || Array.isArray(presets.rowSelection.dataContextIds))\n ) {\n let dataContextIds = presets.rowSelection.dataContextIds;\n let gridRowIndexes = presets.rowSelection.gridRowIndexes;\n\n // maps the IDs to the Grid Rows and vice versa, the \"dataContextIds\" has precedence over the other\n if (Array.isArray(dataContextIds) && dataContextIds.length > 0) {\n gridRowIndexes = dataview?.mapIdsToRows(dataContextIds) || [];\n } else if (Array.isArray(gridRowIndexes) && gridRowIndexes.length > 0) {\n dataContextIds = dataview?.mapRowsToIds(gridRowIndexes) || [];\n }\n\n // apply row selection when defined as grid presets\n if (grid && Array.isArray(gridRowIndexes)) {\n grid.setSelectedRows(gridRowIndexes);\n dataview!.setSelectedIds(dataContextIds || [], {\n isRowBeingAdded: true,\n shouldTriggerEvent: false, // do not trigger when presetting the grid\n applyRowSelectionToGrid: true,\n });\n }\n }\n}\n\nfunction hasBackendInfiniteScroll(gridOptions?: GridOption): boolean {\n return !!(gridOptions || _gridOptions.value).backendServiceApi?.service.options?.infiniteScroll;\n}\n\nfunction mergeGridOptions(gridOptions: GridOption): GridOption {\n gridOptions.gridId = props.gridId;\n gridOptions.gridContainerId = `slickGridContainer-${props.gridId}`;\n\n // use extend to deep merge & copy to avoid immutable properties being changed in GlobalGridOptions after a route change\n const options = extend<GridOption>(true, {}, GlobalGridOptions, gridOptions);\n\n // if we have a backendServiceApi and the enablePagination is undefined, we'll assume that we do want to see it, else get that defined value\n if (!hasBackendInfiniteScroll(gridOptions)) {\n gridOptions.enablePagination = !!(gridOptions.backendServiceApi && gridOptions.enablePagination === undefined\n ? true\n : gridOptions.enablePagination);\n }\n\n // using copy extend to do a deep clone has an unwanted side on objects and pageSizes but ES6 spread has other worst side effects\n // so we will just overwrite the pageSizes when needed, this is the only one causing issues so far.\n // On a deep extend, Object and Array are extended, but object wrappers on primitive types such as String, Boolean, and Number are not.\n if (\n options?.pagination &&\n (gridOptions.enablePagination || gridOptions.backendServiceApi) &&\n gridOptions.pagination &&\n Array.isArray(gridOptions.pagination.pageSizes)\n ) {\n options.pagination.pageSizes = gridOptions.pagination.pageSizes;\n }\n\n // also make sure to show the header row if user have enabled filtering\n hideHeaderRowAfterPageLoad = options.showHeaderRow === false;\n if (options.enableFiltering && !options.showHeaderRow) {\n options.showHeaderRow = options.enableFiltering;\n }\n\n // when we use Pagination on Local Grid, it doesn't seem to work without enableFiltering\n // so we'll enable the filtering but we'll keep the header row hidden\n if (options && !options.enableFiltering && options.enablePagination && isLocalGrid) {\n options.enableFiltering = true;\n options.showHeaderRow = false;\n hideHeaderRowAfterPageLoad = true;\n if (sharedService) {\n sharedService.hideHeaderRowAfterPageLoad = true;\n }\n }\n\n return options;\n}\n\n/** initialized & auto-enable external registered resources, e.g. if user registers `ExcelExportService` then let's auto-enable `enableExcelExport:true` */\nfunction autoEnableInitializedResources(resource: ExternalResource | ExternalResourceConstructor): void {\n if (grid && typeof (resource as ExternalResource).init === 'function') {\n (resource as ExternalResource).init!(grid, containerService);\n }\n\n // auto-enable unless the flag was specifically disabled by the end user\n if ('pluginName' in (resource as ExternalResource)) {\n const pluginFlagName = PluginFlagMappings.get((resource as ExternalResource).pluginName!);\n if (pluginFlagName && _gridOptions.value[pluginFlagName] !== false) {\n _gridOptions.value[pluginFlagName] = true;\n grid?.setOptions({ [pluginFlagName]: true });\n }\n }\n}\n\nfunction initializeExternalResources(resources: Array<ExternalResource | ExternalResourceConstructor>) {\n PluginFlagMappings.set('VueRowDetailView', 'enableRowDetailView'); // map the external Row Detail View resource to its flag\n\n if (Array.isArray(resources)) {\n for (const resource of resources) {\n autoEnableInitializedResources(resource);\n }\n }\n}\n\n/** Pre-Register any Resource that don't require SlickGrid to be instantiated (for example RxJS Resource & RowDetail) */\nfunction preRegisterResources() {\n registeredResources = _gridOptions.value?.externalResources || [];\n\n // bind & initialize all Components/Services that were tagged as enabled\n // register all services by executing their init method and providing them with the Grid object\n if (Array.isArray(registeredResources)) {\n for (const resource of registeredResources) {\n if ((resource as ExternalResource)?.pluginName === 'RxJsResource') {\n registerRxJsResource(resource as RxJsFacade);\n }\n }\n }\n\n if (_gridOptions.value.enableRowDetailView) {\n const RowDetailClass = registeredResources.find((res: any) => res.pluginName === 'VueRowDetailView') as\n | ExternalResourceConstructor\n | undefined;\n if (!RowDetailClass) {\n throw new Error(\n '[Slickgrid-Vue] You enabled the Row Detail View feature but you did not provide the \"VueRowDetailView\" class as an external resource.'\n );\n }\n\n if (RowDetailClass) {\n const rowDetailInstance = new RowDetailClass(eventPubSubService) as VueRowDetailView;\n slickRowDetailView = rowDetailInstance;\n rowDetailInstance.create(_columns.value, _gridOptions.value as GridOption);\n extensionService.addExtensionToList('rowDetailView', {\n name: 'rowDetailView',\n instance: slickRowDetailView,\n });\n }\n }\n}\n\nfunction registerResources() {\n // at this point, we consider all the registered services as external services, anything else registered afterward aren't external\n if (Array.isArray(registeredResources)) {\n sharedService.externalRegisteredResources = registeredResources;\n }\n\n // push all other Services that we want to be registered\n if (!registeredResources.some((r) => r instanceof GridService)) {\n registeredResources.push(gridService);\n }\n if (!registeredResources.some((r) => r instanceof GridStateService)) {\n registeredResources.push(gridStateService);\n }\n\n // when using Grouping/DraggableGrouping/Colspan register its Service\n if (\n ((_gridOptions.value.createPreHeaderPanel && _gridOptions.value.createTopHeaderPanel) ||\n (_gridOptions.value.createPreHeaderPanel && !_gridOptions.value.enableDraggableGrouping)) &&\n !registeredResources.some((r) => r instanceof HeaderGroupingService)\n ) {\n registeredResources.push(headerGroupingService);\n }\n\n // when using Tree Data View, register its Service\n if (_gridOptions.value.enableTreeData && !registeredResources.some((r) => r instanceof TreeDataService)) {\n registeredResources.push(treeDataService);\n }\n\n // when user enables translation, we need to translate Headers on first pass & subsequently in the bindDifferentHooks\n if (_gridOptions.value.enableTranslate) {\n extensionService.translateColumnHeaders();\n }\n\n // also initialize (render) the empty warning component\n if (!registeredResources.some((r) => r instanceof SlickEmptyWarningComponent)) {\n slickEmptyWarning = new SlickEmptyWarningComponent();\n registeredResources.push(slickEmptyWarning);\n }\n\n // bind & initialize all Components/Services that were tagged as enabled\n // register all services by executing their init method and providing them with the Grid object\n initializeExternalResources(registeredResources);\n\n // initialize RowDetail separately since we already added it to the ExtensionList via `addExtensionToList()` but not in external resources,\n // because we don't want to dispose the extension/resource more than once (because externalResources/extensionList are both looping through their list to dispose of them)\n if (_gridOptions.value.enableRowDetailView && slickRowDetailView) {\n slickRowDetailView.init(grid);\n }\n}\n\n/** Register the RxJS Resource in all necessary services which uses */\nfunction registerRxJsResource(resource: RxJsFacade) {\n rxjs = resource;\n backendUtilityService.addRxJsResource(rxjs);\n filterFactory.addRxJsResource(rxjs);\n filterService.addRxJsResource(rxjs);\n sortService.addRxJsResource(rxjs);\n paginationService.addRxJsResource(rxjs);\n containerService.registerInstance('RxJsResource', rxjs);\n}\n\n/**\n * Render (or dispose) the Pagination Component, user can optionally provide False (to not show it) which will in term dispose of the Pagination,\n * also while disposing we can choose to omit the disposable of the Pagination Service (if we are simply toggling the Pagination, we want to keep the Service alive)\n * @param {Boolean} showPagination - show (new render) or not (dispose) the Pagination\n * @param {Boolean} shouldDisposePaginationService - when disposing the Pagination, do we also want to dispose of the Pagination Service? (defaults to True)\n */\nasync function renderPagination(showPagination = true) {\n if (grid && _gridOptions.value?.enablePagination && !isPaginationInitialized && showPagination) {\n if (_gridOptions.value.customPaginationComponent) {\n const paginationContainer = document.createElement('section');\n const instance = createApp(_gridOptions.value.customPaginationComponent).mount(\n paginationContainer\n ) as ComponentPublicInstance<BasePaginationModel>;\n elm.value!.appendChild(instance.$el);\n slickPagination = instance;\n } else {\n slickPagination = new SlickPaginationComponent();\n }\n\n // wait a cycle to make sure the pager ref is instanciated\n nextTick(() => {\n if (slickPagination) {\n slickPagination.init(grid, paginationService, eventPubSubService, translaterService);\n slickPagination.renderPagination(elm.value as HTMLDivElement);\n isPaginationInitialized = true;\n }\n });\n } else if (!showPagination) {\n slickPagination?.dispose();\n isPaginationInitialized = false;\n }\n}\n\n/**\n * Takes a flat dataset with parent/child relationship, sort it (via its tree structure) and return the sorted flat array\n * @param {Array<Object>} flatDatasetInput - flat dataset input\n * @param {Boolean} forceGridRefresh - optionally force a full grid refresh\n * @returns {Array<Object>} sort flat parent/child dataset\n */\nfunction sortTreeDataset<T>(flatDatasetInput: T[], forceGridRefresh = false): T[] {\n const prevDatasetLn = currentDatasetLength;\n let sortedDatasetResult;\n let flatDatasetOutput: any[] = [];\n\n // if the hierarchical dataset was already initialized then no need to re-convert it, we can use it directly from the shared service ref\n if (isDatasetHierarchicalInitialized && dataHierarchicalModel.value) {\n sortedDatasetResult = treeDataService.sortHierarchicalDataset(dataHierarchicalModel.value);\n flatDatasetOutput = sortedDatasetResult.flat;\n } else if (Array.isArray(flatDatasetInput) && flatDatasetInput.length > 0) {\n // we need to first convert the flat dataset to a hierarchical dataset and then sort it\n // we'll also add props, by mutation, required by the TreeDataService on the flat array like `__hasChildren`, `parentId` and anything else to work properly\n sortedDatasetResult = treeDataService.convertFlatParentChildToTreeDatasetAndSort(\n flatDatasetInput,\n (_columns.value || []) as Column[],\n _gridOptions.value as GridOption\n );\n sharedService.hierarchicalDataset = sortedDatasetResult.hierarchical;\n flatDatasetOutput = sortedDatasetResult.flat;\n }\n\n // if we add/remove item(s) from the dataset, we need to also refresh our tree data filters\n if (flatDatasetInput.length > 0 && (forceGridRefresh || flatDatasetInput.length !== prevDatasetLn)) {\n filterService.refreshTreeDataFilters(flatDatasetOutput);\n }\n\n return flatDatasetOutput;\n}\n\n/** Prepare and load all SlickGrid editors, if an async editor is found then we'll also execute it. */\nfunction loadSlickGridEditors(columns: Column<any>[]): Column<any>[] {\n if (columns.some((col) => `${col.id}`.includes('.'))) {\n console.warn(\n '[Slickgrid-Vue] Make sure that none of your Column Definition \"id\" property includes a dot in its name because that will cause some problems with the Editors. For example if your column definition \"field\" property is \"user.firstName\" then use \"firstName\" as the column \"id\".'\n );\n }\n\n return columns.map((column: Column | any) => {\n // on every Editor which have a \"collection\" or a \"collectionAsync\"\n if (column.editor?.collectionAsync) {\n loadEditorCollectionAsync(column);\n }\n\n return { ...column, editorClass: column.editor?.model };\n });\n}\n\nfunction suggestDateParsingWhenHelpful() {\n if (\n dataview!.getItemCount() > WARN_NO_PREPARSE_DATE_SIZE &&\n !_gridOptions.value.silenceWarnings &&\n !_gridOptions.value.preParseDateColumns &&\n grid?.getColumns().some((c) => isColumnDateType(c.type))\n ) {\n console.warn(\n '[Slickgrid-Universal] For getting better perf, we suggest you enable the `preParseDateColumns` grid option, ' +\n 'for more info visit => https://ghiscoding.gitbook.io/slickgrid-vue/column-functionalities/sorting#pre-parse-date-columns-for-better-perf'\n );\n }\n}\n\n/**\n * When the Editor(s) has a \"editor.collection\" property, we'll load the async collection.\n * Since this is called after the async call resolves, the pointer will not be the same as the \"column\" argument passed.\n */\nfunction updateEditorCollection<T = any>(column: Column<T>, newCollection: T[]) {\n if (grid && column.editor) {\n column.editor.collection = newCollection;\n column.editor.disabled = false;\n\n // get current Editor, remove it from the DOM then re-enable it and re-render it with the new collection.\n const currentEditor = grid.getCellEditor() as AutocompleterEditor | SelectEditor;\n if (currentEditor?.disable && currentEditor?.renderDomElement) {\n currentEditor.destroy();\n currentEditor.disable(false);\n currentEditor.renderDomElement(newCollection);\n }\n }\n}\n</script>\n\n<template>\n <div :id=\"gridContainerId\" ref=\"elm\" class=\"grid-pane\">\n <!-- Header slot if you need to create a complex custom header -->\n <slot name=\"header\"></slot>\n\n <div :id=\"gridId\" class=\"slickgrid-container\"></div>\n\n <!-- Footer slot if you need to create a complex custom footer -->\n <slot name=\"footer\"></slot>\n </div>\n</template>\n"],"names":["has","dequal","foo","bar","ctor","len","GlobalGridOptions","UniversalGridOptions","ContainerService","key","instance","TranslaterI18NextService","i18n","newLang","translationKey","disposeAllSubscriptions","subscriptions","subscription","WARN_NO_PREPARSE_DATE_SIZE","attrs","useAttrs","props","__props","elm","ref","svExtensions","svInstances","_gridOptions","totalItems","gridContainerId","computed","backendService","gridOptionsModel","currentDatasetLength","dataview","grid","collectionObservers","groupItemMetadataProvider","hideHeaderRowAfterPageLoad","i18next","isAutosizeColsCalled","isGridInitialized","isDatasetInitialized","isDatasetHierarchicalInitialized","isPaginationInitialized","isLocalGrid","metrics","registeredResources","scrollEndCalled","showPagination","slickEmptyWarning","slickFooter","slickPagination","slickRowDetailView","backendServiceApi","rxjs","slickgridConfig","SlickgridConfig","eventHandler","SlickEventHandler","eventPubSubService","EventPubSubService","containerService","translaterService","backendUtilityService","BackendUtilityService","gridEventService","GridEventService","sharedService","SharedService","collectionService","CollectionService","extensionUtility","ExtensionUtility","filterFactory","FilterFactory","filterService","FilterService","resizerService","ResizerService","sortService","SortService","treeDataService","TreeDataService","paginationService","PaginationService","extensionService","ExtensionService","gridService","gridStateService","GridStateService","GridService","headerGroupingService","HeaderGroupingService","serviceList","_useModel","_paginationOptions","paginationModel","watch","newPaginationOptions","paginationOptionsChanged","_columns","columnsModel","columns","columnsChanged","dataModel","newDataset","prevDatasetLn","isDatasetEqual","data","deepCopy","sortTreeDataset","refreshGridData","dataHierarchicalModel","newHierarchicalDataset","prevFlatDatasetLn","flatDatasetLn","onBeforeUnmount","disposing","onMounted","attr","eventCallback","singlePrefixEventName","gridEventName","initialization","hasBackendInfiniteScroll","loadLocalGridPagination","finalTotalCount","displayEmptyDataWarning","setDarkMode","suggestDateParsingWhenHelpful","observeColumns","updateColumnsList","copyColumnWidthsReference","mergeGridOptions","inject","createBackendApiInternalPostProcessCallback","dataviewInlineFilters","dataViewOptions","SlickGroupItemMetadataProvider","SlickDataView","preRegisterResources","loadSlickGridEditors","autoAddEditorFormatterToColumnsWithEditor","SlickGrid","registerResources","bindDifferentHooks","gridContainerElm","SlickFooterComponent","initialDataset","preservedRowSelectionWithBackend","syncGridSelection","preservedRowSelection","loadRowSelectionPresetWhenExists","loadFilterPresetsWhenDatasetInitialized","showHeaderRow","executeAfterDataviewCreated","bindResizeHook","bindBackendCallbackFunctions","vueElementInstance","disposeInstance","shouldEmptyDomElementContainer","obs","service","disposeExternalResources","prop","emptyGridContainerElm","res","emptyElement","gridOptions","backendApi","backendApiService","processResult","datasetName","totalCount","dataView","lang","_e","args","loadColumnPresetsWhenDatasetInitialized","handleOnItemCountChanged","calledOnRowCountChanged","rows","ranges","row","serviceOptions","isExecuteCommandOnInit","sortColumns","pageNumber","pageSize","columnFilters","query","process","startTime","error","addBackendInfiniteScrollCallback","onScrollEnd","hasNext","viewportElm","orgPostProcess","options","_grid","paginationChanged","pagination","isSyncGridSelectionEnabled","dataset","paginationOptions","setPaginationOptionsWhenPresetDefined","totalRecords","initializePaginationService","delay","showing","dark","newColumns","collectionObserver","col","showWarning","currentPageRowItemCount","totalItemCount","paginationChanges","visibility","renderPagination","loadEditorCollectionAsync","column","collectionAsync","response","updateEditorCollection","resolvedCollection","slickPagingInfo","presets","dataContextIds","gridRowIndexes","extend","autoEnableInitializedResources","resource","pluginFlagName","PluginFlagMappings","initializeExternalResources","resources","registerRxJsResource","RowDetailClass","rowDetailInstance","r","SlickEmptyWarningComponent","paginationContainer","createApp","SlickPaginationComponent","nextTick","flatDatasetInput","forceGridRefresh","sortedDatasetResult","flatDatasetOutput","c","isColumnDateType","newCollection","currentEditor","_createElementBlock","_renderSlot","_ctx","_createElementVNode"],"mappings":"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","x_google_ignoreList":[0]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "slickgrid-vue",
3
- "version": "10.1.1",
3
+ "version": "10.3.0",
4
4
  "description": "Slickgrid-Vue",
5
5
  "license": "MIT",
6
6
  "author": "Ghislain B.",
@@ -47,17 +47,17 @@
47
47
  },
48
48
  "dependencies": {
49
49
  "@formkit/tempo": "^1.0.0",
50
- "@slickgrid-universal/common": "10.1.1",
51
- "@slickgrid-universal/custom-footer-component": "10.1.1",
52
- "@slickgrid-universal/empty-warning-component": "10.1.1",
53
- "@slickgrid-universal/event-pub-sub": "10.1.1",
54
- "@slickgrid-universal/pagination-component": "10.1.1",
55
- "@slickgrid-universal/utils": "10.1.1",
50
+ "@slickgrid-universal/common": "10.3.0",
51
+ "@slickgrid-universal/custom-footer-component": "10.3.0",
52
+ "@slickgrid-universal/empty-warning-component": "10.3.0",
53
+ "@slickgrid-universal/event-pub-sub": "10.3.0",
54
+ "@slickgrid-universal/pagination-component": "10.3.0",
55
+ "@slickgrid-universal/utils": "10.3.0",
56
56
  "dequal": "^2.0.3",
57
57
  "sortablejs": "^1.15.7"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "vue": ">=3.5.0"
61
61
  },
62
- "gitHead": "3fcfc35958eb2d000e9d31ad4d195ba9cf485b5c"
62
+ "gitHead": "95f7ec4cdac5eb926916d6c22be46e689628aca1"
63
63
  }
@@ -206,9 +206,9 @@ const _paginationOptions = ref<Pagination | undefined>();
206
206
  const paginationModel = defineModel<Pagination>('pagination');
207
207
  watch(paginationModel, (newPaginationOptions) => paginationOptionsChanged(newPaginationOptions!));
208
208
 
209
- const _columnDefinitions: Ref<Column[]> = ref([]);
210
- const columnDefinitionsModel = defineModel<Column[]>('columns', { required: true, default: [] });
211
- watch(columnDefinitionsModel, (columnDefinitions) => columnDefinitionsChanged(columnDefinitions), { immediate: true });
209
+ const _columns: Ref<Column[]> = ref([]);
210
+ const columnsModel = defineModel<Column[]>('columns', { required: true, default: [] });
211
+ watch(columnsModel, (columns) => columnsChanged(columns), { immediate: true });
212
212
 
213
213
  const dataModel = defineModel<any[]>('dataset', { required: false }); // technically true but user could use datasetHierarchical instead
214
214
  watch(
@@ -252,7 +252,7 @@ watch(
252
252
  sharedService.hierarchicalDataset = newHierarchicalDataset;
253
253
  }
254
254
 
255
- if (newHierarchicalDataset && _columnDefinitions.value && filterService?.clearFilters) {
255
+ if (newHierarchicalDataset && _columns.value && filterService?.clearFilters) {
256
256
  filterService.clearFilters();
257
257
  }
258
258
 
@@ -285,7 +285,7 @@ onBeforeUnmount(() => {
285
285
  });
286
286
 
287
287
  onMounted(() => {
288
- if (!columnDefinitionsModel.value) {
288
+ if (!columnsModel.value) {
289
289
  throw new Error(
290
290
  'Using `<Slickgrid-Vue>` requires `v-model:columns` props, it seems that you might have forgot to provide the missing bindable model.'
291
291
  );
@@ -350,25 +350,25 @@ onMounted(() => {
350
350
  suggestDateParsingWhenHelpful();
351
351
 
352
352
  // subscribe to column definitions assignment changes
353
- observeColumnDefinitions();
353
+ observeColumns();
354
354
  });
355
355
 
356
- function columnDefinitionsChanged(columnDefinitions?: Column[]) {
357
- if (columnDefinitions) {
358
- _columnDefinitions.value = columnDefinitions;
356
+ function columnsChanged(columns?: Column[]) {
357
+ if (columns) {
358
+ _columns.value = columns;
359
359
  }
360
360
  if (isGridInitialized) {
361
- updateColumnDefinitionsList(_columnDefinitions.value);
361
+ updateColumnsList(_columns.value);
362
362
  }
363
- if (_columnDefinitions.value!.length > 0) {
364
- copyColumnWidthsReference(_columnDefinitions.value);
363
+ if (_columns.value!.length > 0) {
364
+ copyColumnWidthsReference(_columns.value);
365
365
  }
366
366
  }
367
367
 
368
368
  function initialization() {
369
- if (!_gridOptions.value || !columnDefinitionsModel.value) {
369
+ if (!_gridOptions.value || !columnsModel.value) {
370
370
  throw new Error(
371
- 'Using `<Slickgrid-Vue>` requires `v-model:columns="columnDefinitions"` and `v-model:options="gridOptions.value"`, it seems that you might have forgot to provide them since at least of them is undefined.'
371
+ 'Using `<Slickgrid-Vue>` requires `v-model:columns="columns"` and `v-model:options="gridOptions.value"`, it seems that you might have forgot to provide them since at least of them is undefined.'
372
372
  );
373
373
  }
374
374
 
@@ -435,29 +435,29 @@ function initialization() {
435
435
  // Wrap each editor class in the Factory resolver so consumers of this library.
436
436
  // Vue will allow slickgrid to pass its arguments to the editors constructor last
437
437
  // when slickgrid creates the editor
438
- _columnDefinitions.value = loadSlickGridEditors(columnDefinitionsModel.value || []);
438
+ _columns.value = loadSlickGridEditors(columnsModel.value || []);
439
439
 
440
440
  // if the user wants to automatically add a Custom Editor Formatter, we need to call the auto add function again
441
441
  if (_gridOptions.value?.autoAddCustomEditorFormatter) {
442
- autoAddEditorFormatterToColumnsWithEditor(_columnDefinitions.value as Column[], _gridOptions.value?.autoAddCustomEditorFormatter);
442
+ autoAddEditorFormatterToColumnsWithEditor(_columns.value as Column[], _gridOptions.value?.autoAddCustomEditorFormatter);
443
443
  }
444
444
 
445
445
  // save reference for all columns before they optionally become hidden/visible
446
- sharedService.allColumns = _columnDefinitions.value as Column[];
446
+ sharedService.allColumns = _columns.value as Column[];
447
447
 
448
448
  // TODO: revisit later, this conflicts with Grid State (Example 15)
449
449
  // before certain extentions/plugins potentially adds extra columns not created by the user itself (RowMove, RowDetail, RowSelections)
450
450
  // we'll subscribe to the event and push back the change to the user so they always use full column defs array including extra cols
451
451
  // subscriptions.push(
452
452
  // _eventPubSubService.subscribe<{ columns: Column<any>[]; grid: SlickGrid }>('onPluginColumnsChanged', data => {
453
- // columnDefinitions = data.columns;
454
- // columnDefinitionsChanged();
453
+ // columns = data.columns;
454
+ // columnsChanged();
455
455
  // })
456
456
  // );
457
457
 
458
458
  // after subscribing to potential columns changed, we are ready to create these optional extensions
459
459
  // when we did find some to create (RowMove, RowDetail, RowSelections), it will automatically modify column definitions (by previous subscribe)
460
- extensionService.createExtensionsBeforeGridCreation(_columnDefinitions.value as Column[], _gridOptions.value as GridOption);
460
+ extensionService.createExtensionsBeforeGridCreation(_columns.value as Column[], _gridOptions.value as GridOption);
461
461
 
462
462
  // if user entered some Pinning/Frozen "presets", we need to apply them in the grid options
463
463
  if (_gridOptions.value?.presets?.pinning) {
@@ -468,7 +468,7 @@ function initialization() {
468
468
  grid = new SlickGrid<any, Column<any>, GridOption<Column<any>>>(
469
469
  `#${props.gridId}`,
470
470
  dataview,
471
- _columnDefinitions.value as Column[],
471
+ _columns.value as Column[],
472
472
  _gridOptions.value as GridOption,
473
473
  eventPubSubService
474
474
  );
@@ -656,8 +656,8 @@ function disposing(shouldEmptyDomElementContainer = false) {
656
656
  }
657
657
  backendServiceApi = undefined;
658
658
  }
659
- for (const prop of Object.keys(columnDefinitionsModel.value)) {
660
- (columnDefinitionsModel.value as any)[prop] = null;
659
+ for (const prop of Object.keys(columnsModel.value)) {
660
+ (columnsModel.value as any)[prop] = null;
661
661
  }
662
662
  for (const prop of Object.keys(sharedService)) {
663
663
  (sharedService as any)[prop] = null;
@@ -1119,7 +1119,7 @@ function refreshGridData(dataset: any[], totalCount?: number) {
1119
1119
  function showHeaderRow(showing = true) {
1120
1120
  grid?.setHeaderRowVisibility(showing);
1121
1121
  if (showing === true && isGridInitialized) {
1122
- grid?.setColumns(columnDefinitionsModel.value);
1122
+ grid?.setColumns(columnsModel.value);
1123
1123
  }
1124
1124
  return showing;
1125
1125
  }
@@ -1149,7 +1149,7 @@ function setDarkMode(dark = false) {
1149
1149
  * We will re-render the grid so that the new header and data shows up correctly.
1150
1150
  * If using i18n, we also need to trigger a re-translate of the column headers
1151
1151
  */
1152
- function updateColumnDefinitionsList(newColumns: Column<any>[]) {
1152
+ function updateColumnsList(newColumns: Column<any>[]) {
1153
1153
  if (newColumns) {
1154
1154
  // map the Editor model to editorClass and load editor collectionAsync
1155
1155
  newColumns = loadSlickGridEditors(newColumns);
@@ -1176,8 +1176,8 @@ function updateColumnDefinitionsList(newColumns: Column<any>[]) {
1176
1176
  * assignment changes are not triggering on the column definitions, for that
1177
1177
  * we can use our internal array observer for any changes done via (push, pop, shift, ...)
1178
1178
  */
1179
- function observeColumnDefinitions() {
1180
- collectionObservers.push(collectionObserver(columnDefinitionsModel.value, columnDefinitionsChanged));
1179
+ function observeColumns() {
1180
+ collectionObservers.push(collectionObserver(columnsModel.value, columnsChanged));
1181
1181
  }
1182
1182
 
1183
1183
  /**
@@ -1457,7 +1457,7 @@ function preRegisterResources() {
1457
1457
  if (RowDetailClass) {
1458
1458
  const rowDetailInstance = new RowDetailClass(eventPubSubService) as VueRowDetailView;
1459
1459
  slickRowDetailView = rowDetailInstance;
1460
- rowDetailInstance.create(_columnDefinitions.value, _gridOptions.value as GridOption);
1460
+ rowDetailInstance.create(_columns.value, _gridOptions.value as GridOption);
1461
1461
  extensionService.addExtensionToList('rowDetailView', {
1462
1462
  name: 'rowDetailView',
1463
1463
  instance: slickRowDetailView,
@@ -1580,7 +1580,7 @@ function sortTreeDataset<T>(flatDatasetInput: T[], forceGridRefresh = false): T[
1580
1580
  // we'll also add props, by mutation, required by the TreeDataService on the flat array like `__hasChildren`, `parentId` and anything else to work properly
1581
1581
  sortedDatasetResult = treeDataService.convertFlatParentChildToTreeDatasetAndSort(
1582
1582
  flatDatasetInput,
1583
- (_columnDefinitions.value || []) as Column[],
1583
+ (_columns.value || []) as Column[],
1584
1584
  _gridOptions.value as GridOption
1585
1585
  );
1586
1586
  sharedService.hierarchicalDataset = sortedDatasetResult.hierarchical;
@@ -35,6 +35,7 @@ import type {
35
35
  OnColumnsResizeDblClickEventArgs,
36
36
  OnColumnsResizedEventArgs,
37
37
  OnCompositeEditorChangeEventArgs,
38
+ OnContextMenuArgs,
38
39
  OnDblClickEventArgs,
39
40
  OnDragReplaceCellsEventArgs,
40
41
  OnFooterClickEventArgs,
@@ -108,7 +109,7 @@ export interface SlickgridVueProps {
108
109
  onOnColumnsResized?: VueSlickEventHandler<OnColumnsResizedEventArgs>;
109
110
  onOnColumnsResizeDblClick?: VueSlickEventHandler<OnColumnsResizeDblClickEventArgs>;
110
111
  onOnCompositeEditorChange?: VueSlickEventHandler<OnCompositeEditorChangeEventArgs>;
111
- onOnContextMenu?: VueSlickEventHandler<{ grid: SlickGrid }>;
112
+ onOnContextMenu?: VueSlickEventHandler<OnContextMenuArgs>;
112
113
  onOnDrag?: VueSlickEventHandler<DragRowMove>;
113
114
  onOnDragEnd?: VueSlickEventHandler<DragRowMove>;
114
115
  onOnDragInit?: VueSlickEventHandler<DragRowMove>;