@slickgrid-universal/vanilla-bundle 5.11.0 → 5.12.1
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 +1 -1
- package/dist/cjs/components/slick-vanilla-grid-bundle.js +106 -53
- package/dist/cjs/components/slick-vanilla-grid-bundle.js.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/services/universalContainer.service.js +2 -2
- package/dist/cjs/services/universalContainer.service.js.map +1 -1
- package/dist/esm/components/slick-vanilla-grid-bundle.js +106 -53
- package/dist/esm/components/slick-vanilla-grid-bundle.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/services/universalContainer.service.js +2 -2
- package/dist/esm/services/universalContainer.service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/components/slick-vanilla-grid-bundle.d.ts +2 -2
- package/dist/types/components/slick-vanilla-grid-bundle.d.ts.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +9 -9
- package/src/components/slick-vanilla-grid-bundle.ts +218 -100
- package/src/index.ts +11 -2
- package/src/services/universalContainer.service.ts +2 -2
package/README.md
CHANGED
|
@@ -26,6 +26,6 @@ Vanilla Bundle implementation (no framework, plain TypeSript implementation). Th
|
|
|
26
26
|
- [whatwg-fetch](https://github.com/whatwg/fetch) - Fetch Standard
|
|
27
27
|
|
|
28
28
|
### Installation
|
|
29
|
-
This Vanilla Bundle is used used by the standalone [
|
|
29
|
+
This Vanilla Bundle is used used by the standalone [demos/vanilla](https://github.com/ghiscoding/slickgrid-universal/tree/master/demos/vanilla) which serves for demo purposes.
|
|
30
30
|
|
|
31
31
|
Go to the root of the repo and follow the instructions provided in the main [README](https://github.com/ghiscoding/slickgrid-universal#installation)
|
|
@@ -29,10 +29,13 @@ class SlickVanillaGridBundle {
|
|
|
29
29
|
set dataset(newDataset) {
|
|
30
30
|
const prevDatasetLn = this._currentDatasetLength;
|
|
31
31
|
const isDatasetEqual = (0, lite_1.dequal)(newDataset, this.dataset || []);
|
|
32
|
-
const isDeepCopyDataOnPageLoadEnabled = !!
|
|
32
|
+
const isDeepCopyDataOnPageLoadEnabled = !!this._gridOptions?.enableDeepCopyDatasetOnPageLoad;
|
|
33
33
|
let data = isDeepCopyDataOnPageLoadEnabled ? (0, utils_1.extend)(true, [], newDataset) : newDataset;
|
|
34
34
|
// when Tree Data is enabled and we don't yet have the hierarchical dataset filled, we can force a convert+sort of the array
|
|
35
|
-
if (this.slickGrid &&
|
|
35
|
+
if (this.slickGrid &&
|
|
36
|
+
this.gridOptions?.enableTreeData &&
|
|
37
|
+
Array.isArray(newDataset) &&
|
|
38
|
+
(newDataset.length > 0 || newDataset.length !== prevDatasetLn || !isDatasetEqual)) {
|
|
36
39
|
this._isDatasetHierarchicalInitialized = false;
|
|
37
40
|
data = this.sortTreeDataset(newDataset, !isDatasetEqual); // if dataset changed, then force a refresh anyway
|
|
38
41
|
}
|
|
@@ -85,7 +88,7 @@ class SlickVanillaGridBundle {
|
|
|
85
88
|
// if we already have grid options, when grid was already initialized, we'll merge with those options
|
|
86
89
|
// else we'll merge with global grid options
|
|
87
90
|
if (this.slickGrid?.getOptions) {
|
|
88
|
-
mergedOptions = (
|
|
91
|
+
mergedOptions = (0, utils_1.extend)(true, {}, this.slickGrid.getOptions(), options);
|
|
89
92
|
}
|
|
90
93
|
else {
|
|
91
94
|
mergedOptions = this.mergeGridOptions(options);
|
|
@@ -170,7 +173,7 @@ class SlickVanillaGridBundle {
|
|
|
170
173
|
gridParentContainerElm.appendChild(this._gridContainerElm);
|
|
171
174
|
// check if the user wants to hide the header row from the start
|
|
172
175
|
// we only want to do this check once in the constructor
|
|
173
|
-
this._hideHeaderRowAfterPageLoad =
|
|
176
|
+
this._hideHeaderRowAfterPageLoad = options?.showHeaderRow === false;
|
|
174
177
|
this._columnDefinitions = columnDefs || [];
|
|
175
178
|
if (this._columnDefinitions.length > 0) {
|
|
176
179
|
this.copyColumnWidthsReference(this._columnDefinitions);
|
|
@@ -179,7 +182,7 @@ class SlickVanillaGridBundle {
|
|
|
179
182
|
// since a deep copy of grid options would lose original resource refs but we want to keep them as singleton
|
|
180
183
|
this._registeredResources = options?.externalResources || [];
|
|
181
184
|
this._gridOptions = this.mergeGridOptions(options || {});
|
|
182
|
-
const isDeepCopyDataOnPageLoadEnabled = !!
|
|
185
|
+
const isDeepCopyDataOnPageLoadEnabled = !!this._gridOptions?.enableDeepCopyDatasetOnPageLoad;
|
|
183
186
|
// add dark mode CSS class when enabled
|
|
184
187
|
if (this._gridOptions.darkMode) {
|
|
185
188
|
this.setDarkMode(true);
|
|
@@ -195,19 +198,28 @@ class SlickVanillaGridBundle {
|
|
|
195
198
|
this.gridEventService = services?.gridEventService ?? new common_1.GridEventService();
|
|
196
199
|
this.sharedService = services?.sharedService ?? new common_1.SharedService();
|
|
197
200
|
this.collectionService = services?.collectionService ?? new common_1.CollectionService(this.translaterService);
|
|
198
|
-
this.extensionUtility =
|
|
201
|
+
this.extensionUtility =
|
|
202
|
+
services?.extensionUtility ?? new common_1.ExtensionUtility(this.sharedService, this.backendUtilityService, this.translaterService);
|
|
199
203
|
this.filterFactory = new common_1.FilterFactory(slickgridConfig, this.translaterService, this.collectionService);
|
|
204
|
+
// prettier-ignore
|
|
200
205
|
this.filterService = services?.filterService ?? new common_1.FilterService(this.filterFactory, this._eventPubSubService, this.sharedService, this.backendUtilityService);
|
|
201
206
|
this.resizerService = services?.resizerService ?? new common_1.ResizerService(this._eventPubSubService);
|
|
207
|
+
// prettier-ignore
|
|
202
208
|
this.sortService = services?.sortService ?? new common_1.SortService(this.collectionService, this.sharedService, this._eventPubSubService, this.backendUtilityService);
|
|
203
209
|
this.treeDataService = services?.treeDataService ?? new common_1.TreeDataService(this._eventPubSubService, this.sharedService, this.sortService);
|
|
210
|
+
// prettier-ignore
|
|
204
211
|
this.paginationService = services?.paginationService ?? new common_1.PaginationService(this._eventPubSubService, this.sharedService, this.backendUtilityService);
|
|
205
|
-
this.extensionService =
|
|
212
|
+
this.extensionService =
|
|
213
|
+
services?.extensionService ??
|
|
214
|
+
new common_1.ExtensionService(this.extensionUtility, this.filterService, this._eventPubSubService, this.sharedService, this.sortService, this.treeDataService, this.translaterService, () => this.gridService);
|
|
215
|
+
// prettier-ignore
|
|
206
216
|
this.gridStateService = services?.gridStateService ?? new common_1.GridStateService(this.extensionService, this.filterService, this._eventPubSubService, this.sharedService, this.sortService, this.treeDataService);
|
|
217
|
+
// prettier-ignore
|
|
207
218
|
this.gridService = services?.gridService ?? new common_1.GridService(this.gridStateService, this.filterService, this._eventPubSubService, this.paginationService, this.sharedService, this.sortService, this.treeDataService);
|
|
208
219
|
this.headerGroupingService = services?.headerGroupingService ?? new common_1.HeaderGroupingService(this.extensionUtility);
|
|
209
220
|
if (hierarchicalDataset) {
|
|
210
|
-
this.sharedService.hierarchicalDataset =
|
|
221
|
+
this.sharedService.hierarchicalDataset =
|
|
222
|
+
(isDeepCopyDataOnPageLoadEnabled ? (0, utils_1.extend)(true, [], hierarchicalDataset) : hierarchicalDataset) || [];
|
|
211
223
|
}
|
|
212
224
|
const eventHandler = new common_1.SlickEventHandler();
|
|
213
225
|
// register all service instances in the container
|
|
@@ -289,7 +301,7 @@ class SlickVanillaGridBundle {
|
|
|
289
301
|
if (shouldEmptyDomElementContainer) {
|
|
290
302
|
this.emptyGridContainerElm();
|
|
291
303
|
}
|
|
292
|
-
this._collectionObservers.forEach(obs => obs?.disconnect());
|
|
304
|
+
this._collectionObservers.forEach((obs) => obs?.disconnect());
|
|
293
305
|
this._eventPubSubService?.dispose();
|
|
294
306
|
this._slickerGridInstances = null;
|
|
295
307
|
}
|
|
@@ -306,7 +318,10 @@ class SlickVanillaGridBundle {
|
|
|
306
318
|
}
|
|
307
319
|
initialization(gridContainerElm, eventHandler, inputDataset) {
|
|
308
320
|
// when detecting a frozen grid, we'll automatically enable the mousewheel scroll handler so that we can scroll from both left/right frozen containers
|
|
309
|
-
if (this.gridOptions &&
|
|
321
|
+
if (this.gridOptions &&
|
|
322
|
+
((this.gridOptions.frozenRow !== undefined && this.gridOptions.frozenRow >= 0) ||
|
|
323
|
+
(this.gridOptions.frozenColumn !== undefined && this.gridOptions.frozenColumn >= 0)) &&
|
|
324
|
+
this.gridOptions.enableMouseWheelScrollHandler === undefined) {
|
|
310
325
|
this.gridOptions.enableMouseWheelScrollHandler = true;
|
|
311
326
|
}
|
|
312
327
|
// create the slickgrid container and add it to the user's grid container
|
|
@@ -503,7 +518,10 @@ class SlickVanillaGridBundle {
|
|
|
503
518
|
// using copy extend to do a deep clone has an unwanted side on objects and pageSizes but ES6 spread has other worst side effects
|
|
504
519
|
// so we will just overwrite the pageSizes when needed, this is the only one causing issues so far.
|
|
505
520
|
// On a deep extend, Object and Array are extended, but object wrappers on primitive types such as String, Boolean, and Number are not.
|
|
506
|
-
if (options?.pagination &&
|
|
521
|
+
if (options?.pagination &&
|
|
522
|
+
(gridOptions.enablePagination || gridOptions.backendServiceApi) &&
|
|
523
|
+
gridOptions.pagination &&
|
|
524
|
+
Array.isArray(gridOptions.pagination.pageSizes)) {
|
|
507
525
|
options.pagination.pageSizes = gridOptions.pagination.pageSizes;
|
|
508
526
|
}
|
|
509
527
|
// when we use Pagination on Local Grid, it doesn't seem to work without enableFiltering
|
|
@@ -528,10 +546,15 @@ class SlickVanillaGridBundle {
|
|
|
528
546
|
// internalPostProcess only works (for now) with a GraphQL Service, so make sure it is of that type
|
|
529
547
|
if ( /* backendApiService instanceof GraphqlService || */typeof backendApiService.getDatasetName === 'function') {
|
|
530
548
|
backendApi.internalPostProcess = (processResult) => {
|
|
549
|
+
// prettier-ignore
|
|
531
550
|
const datasetName = (backendApi && backendApiService && typeof backendApiService.getDatasetName === 'function') ? backendApiService.getDatasetName() : '';
|
|
532
551
|
if (processResult && processResult.data && processResult.data[datasetName]) {
|
|
533
|
-
const data = processResult.data[datasetName].hasOwnProperty('nodes')
|
|
534
|
-
|
|
552
|
+
const data = processResult.data[datasetName].hasOwnProperty('nodes')
|
|
553
|
+
? processResult.data[datasetName].nodes
|
|
554
|
+
: processResult.data[datasetName];
|
|
555
|
+
const totalCount = processResult.data[datasetName].hasOwnProperty('totalCount')
|
|
556
|
+
? processResult.data[datasetName].totalCount
|
|
557
|
+
: processResult.data[datasetName].length;
|
|
535
558
|
this.refreshGridData(data, totalCount || 0);
|
|
536
559
|
}
|
|
537
560
|
};
|
|
@@ -552,7 +575,8 @@ class SlickVanillaGridBundle {
|
|
|
552
575
|
this.subscriptions.push(this._eventPubSubService.subscribe('onLanguageChange', (args) => {
|
|
553
576
|
if (gridOptions.enableTranslate) {
|
|
554
577
|
this.extensionService.translateAllExtensions(args.language);
|
|
555
|
-
if ((gridOptions.createPreHeaderPanel && gridOptions.createTopHeaderPanel) ||
|
|
578
|
+
if ((gridOptions.createPreHeaderPanel && gridOptions.createTopHeaderPanel) ||
|
|
579
|
+
(gridOptions.createPreHeaderPanel && !gridOptions.enableDraggableGrouping)) {
|
|
556
580
|
this.headerGroupingService.translateHeaderGrouping();
|
|
557
581
|
}
|
|
558
582
|
}
|
|
@@ -596,20 +620,19 @@ class SlickVanillaGridBundle {
|
|
|
596
620
|
this.sharedService.isItemsDateParsed = false;
|
|
597
621
|
this.handleOnItemCountChanged(this.dataView?.getFilteredItemCount() || 0, args.itemCount);
|
|
598
622
|
// when user has resize by content enabled, we'll force a full width calculation since we change our entire dataset
|
|
599
|
-
if (args.itemCount > 0 &&
|
|
623
|
+
if (args.itemCount > 0 &&
|
|
624
|
+
(this.gridOptions.autosizeColumnsByCellContentOnFirstLoad || this.gridOptions.enableAutoResizeColumnsByCellContent)) {
|
|
600
625
|
this.resizerService.resizeColumnsByCellContent(!this.gridOptions?.resizeByContentOnlyOnFirstLoad);
|
|
601
626
|
}
|
|
602
627
|
});
|
|
603
|
-
if (gridOptions?.enableFiltering && !gridOptions.enableRowDetailView) {
|
|
628
|
+
if ((gridOptions?.enableFiltering || gridOptions?.dataView?.globalItemMetadataProvider) && !gridOptions.enableRowDetailView) {
|
|
604
629
|
this._eventHandler.subscribe(dataView.onRowsChanged, (_e, { calledOnRowCountChanged, rows }) => {
|
|
605
630
|
// filtering data with local dataset will not always show correctly unless we call this updateRow/render
|
|
606
631
|
// also don't use "invalidateRows" since it destroys the entire row and as bad user experience when updating a row
|
|
607
632
|
// see commit: https://github.com/ghiscoding/aurelia-slickgrid/commit/8c503a4d45fba11cbd8d8cc467fae8d177cc4f60
|
|
608
633
|
if (!calledOnRowCountChanged && Array.isArray(rows)) {
|
|
609
634
|
const ranges = grid.getRenderedRange();
|
|
610
|
-
rows
|
|
611
|
-
.filter(row => row >= ranges.top && row <= ranges.bottom)
|
|
612
|
-
.forEach((row) => grid.updateRow(row));
|
|
635
|
+
rows.filter((row) => row >= ranges.top && row <= ranges.bottom).forEach((row) => grid.updateRow(row));
|
|
613
636
|
grid.render();
|
|
614
637
|
}
|
|
615
638
|
});
|
|
@@ -629,6 +652,7 @@ class SlickVanillaGridBundle {
|
|
|
629
652
|
this.loadColumnPresetsWhenDatasetInitialized();
|
|
630
653
|
this.loadFilterPresetsWhenDatasetInitialized();
|
|
631
654
|
}
|
|
655
|
+
// @deprecated @user `dataview.globalItemMetadataProvider.getRowMetadata`
|
|
632
656
|
// did the user add a colspan callback? If so, hook it into the DataView getItemMetadata
|
|
633
657
|
if (gridOptions?.colspanCallback && dataView?.getItem && dataView?.getItemMetadata) {
|
|
634
658
|
dataView.getItemMetadata = (rowNumber) => {
|
|
@@ -644,6 +668,7 @@ class SlickVanillaGridBundle {
|
|
|
644
668
|
const backendApi = gridOptions.backendServiceApi;
|
|
645
669
|
const backendApiService = backendApi?.service;
|
|
646
670
|
const serviceOptions = backendApiService?.options ?? {};
|
|
671
|
+
// prettier-ignore
|
|
647
672
|
const isExecuteCommandOnInit = (!serviceOptions) ? false : ((serviceOptions?.hasOwnProperty('executeProcessCommandOnInit')) ? serviceOptions['executeProcessCommandOnInit'] : true);
|
|
648
673
|
if (backendApiService) {
|
|
649
674
|
// update backend filters (if need be) BEFORE the query runs (via the onInit command a few lines below)
|
|
@@ -673,7 +698,7 @@ class SlickVanillaGridBundle {
|
|
|
673
698
|
}
|
|
674
699
|
// execute onInit command when necessary
|
|
675
700
|
if (backendApi && backendApiService && (backendApi.onInit || isExecuteCommandOnInit)) {
|
|
676
|
-
const query =
|
|
701
|
+
const query = typeof backendApiService.buildQuery === 'function' ? backendApiService.buildQuery() : '';
|
|
677
702
|
const process = isExecuteCommandOnInit ? (backendApi.process?.(query) ?? null) : (backendApi.onInit?.(query) ?? null);
|
|
678
703
|
// 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
|
|
679
704
|
queueMicrotask(() => {
|
|
@@ -703,13 +728,16 @@ class SlickVanillaGridBundle {
|
|
|
703
728
|
}
|
|
704
729
|
}
|
|
705
730
|
addBackendInfiniteScrollCallback() {
|
|
706
|
-
if (this.slickGrid &&
|
|
731
|
+
if (this.slickGrid &&
|
|
732
|
+
this.gridOptions.backendServiceApi &&
|
|
733
|
+
this.hasBackendInfiniteScroll() &&
|
|
734
|
+
!this.gridOptions.backendServiceApi?.onScrollEnd) {
|
|
707
735
|
const onScrollEnd = () => {
|
|
708
736
|
this.backendUtilityService.setInfiniteScrollBottomHit(true);
|
|
709
737
|
// even if we're not showing pagination, we still use pagination service behind the scene
|
|
710
738
|
// to keep track of the scroll position and fetch next set of data (aka next page)
|
|
711
739
|
// we also need a flag to know if we reached the of the dataset or not (no more pages)
|
|
712
|
-
this.paginationService.goToNextPage().then(hasNext => {
|
|
740
|
+
this.paginationService.goToNextPage().then((hasNext) => {
|
|
713
741
|
if (!hasNext) {
|
|
714
742
|
this.backendUtilityService.setInfiniteScrollBottomHit(false);
|
|
715
743
|
}
|
|
@@ -720,10 +748,10 @@ class SlickVanillaGridBundle {
|
|
|
720
748
|
// run onScrollEnd() method when that happens
|
|
721
749
|
this._eventHandler.subscribe(this.slickGrid.onScroll, (_e, args) => {
|
|
722
750
|
const viewportElm = args.grid.getViewportNode();
|
|
723
|
-
if (['mousewheel', 'scroll'].includes(args.triggeredBy || '')
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
751
|
+
if (['mousewheel', 'scroll'].includes(args.triggeredBy || '') &&
|
|
752
|
+
this.paginationService?.totalItems &&
|
|
753
|
+
args.scrollTop > 0 &&
|
|
754
|
+
Math.ceil(viewportElm.offsetHeight + args.scrollTop) >= args.scrollHeight) {
|
|
727
755
|
if (!this._scrollEndCalled) {
|
|
728
756
|
onScrollEnd();
|
|
729
757
|
this._scrollEndCalled = true;
|
|
@@ -742,7 +770,8 @@ class SlickVanillaGridBundle {
|
|
|
742
770
|
}
|
|
743
771
|
}
|
|
744
772
|
bindResizeHook(grid, options) {
|
|
745
|
-
if ((options.autoFitColumnsOnFirstLoad && options.autosizeColumnsByCellContentOnFirstLoad) ||
|
|
773
|
+
if ((options.autoFitColumnsOnFirstLoad && options.autosizeColumnsByCellContentOnFirstLoad) ||
|
|
774
|
+
(options.enableAutoSizeColumns && options.enableAutoResizeColumnsByCellContent)) {
|
|
746
775
|
throw new Error(`[Slickgrid-Universal] 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").`);
|
|
747
776
|
}
|
|
748
777
|
// auto-resize grid on browser resize (optionally provide grid height or width)
|
|
@@ -753,7 +782,11 @@ class SlickVanillaGridBundle {
|
|
|
753
782
|
this.resizerService.resizeGrid();
|
|
754
783
|
}
|
|
755
784
|
// expand/autofit columns on first page load
|
|
756
|
-
if (grid &&
|
|
785
|
+
if (grid &&
|
|
786
|
+
options?.enableAutoResize &&
|
|
787
|
+
options.autoFitColumnsOnFirstLoad &&
|
|
788
|
+
options.enableAutoSizeColumns &&
|
|
789
|
+
!this._isAutosizeColsCalled) {
|
|
757
790
|
grid.autosizeColumns();
|
|
758
791
|
this._isAutosizeColsCalled = true;
|
|
759
792
|
}
|
|
@@ -774,7 +807,10 @@ class SlickVanillaGridBundle {
|
|
|
774
807
|
*/
|
|
775
808
|
paginationChanged(pagination) {
|
|
776
809
|
const isSyncGridSelectionEnabled = this.gridStateService?.needToPreserveRowSelection() ?? false;
|
|
777
|
-
if (this.slickGrid &&
|
|
810
|
+
if (this.slickGrid &&
|
|
811
|
+
!isSyncGridSelectionEnabled &&
|
|
812
|
+
this._gridOptions?.backendServiceApi &&
|
|
813
|
+
(this.gridOptions.enableRowSelection || this.gridOptions.enableCheckboxSelector)) {
|
|
778
814
|
this.slickGrid.setSelectedRows([]);
|
|
779
815
|
}
|
|
780
816
|
const { pageNumber, pageSize } = pagination;
|
|
@@ -783,7 +819,7 @@ class SlickVanillaGridBundle {
|
|
|
783
819
|
}
|
|
784
820
|
this._eventPubSubService.publish('onGridStateChanged', {
|
|
785
821
|
change: { newValues: { pageNumber, pageSize }, type: common_1.GridStateType.pagination },
|
|
786
|
-
gridState: this.gridStateService.getCurrentGridState()
|
|
822
|
+
gridState: this.gridStateService.getCurrentGridState(),
|
|
787
823
|
});
|
|
788
824
|
}
|
|
789
825
|
/**
|
|
@@ -817,12 +853,13 @@ class SlickVanillaGridBundle {
|
|
|
817
853
|
this.slickGrid.invalidate();
|
|
818
854
|
}
|
|
819
855
|
// 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
|
|
820
|
-
this.showPagination = !!(this._gridOptions &&
|
|
856
|
+
this.showPagination = !!(this._gridOptions &&
|
|
857
|
+
(this._gridOptions.enablePagination || (this._gridOptions.backendServiceApi && this._gridOptions.enablePagination === undefined)));
|
|
821
858
|
if (this._paginationOptions && this._gridOptions?.pagination && this._gridOptions?.backendServiceApi) {
|
|
822
859
|
const paginationOptions = this.setPaginationOptionsWhenPresetDefined(this._gridOptions, this._paginationOptions);
|
|
823
860
|
// when we have a totalCount use it, else we'll take it from the pagination object
|
|
824
861
|
// only update the total items if it's different to avoid refreshing the UI
|
|
825
|
-
const totalRecords =
|
|
862
|
+
const totalRecords = totalCount !== undefined ? totalCount : this._gridOptions?.pagination?.totalItems;
|
|
826
863
|
if (totalRecords !== undefined && totalRecords !== this.totalItems) {
|
|
827
864
|
this.totalItems = +totalRecords;
|
|
828
865
|
}
|
|
@@ -920,7 +957,7 @@ class SlickVanillaGridBundle {
|
|
|
920
957
|
* We will use this when doing a resize by cell content, if user provided a `width` it won't override it.
|
|
921
958
|
*/
|
|
922
959
|
copyColumnWidthsReference(columnDefinitions) {
|
|
923
|
-
columnDefinitions.forEach(col => col.originalWidth = col.width);
|
|
960
|
+
columnDefinitions.forEach((col) => (col.originalWidth = col.width));
|
|
924
961
|
}
|
|
925
962
|
displayEmptyDataWarning(showWarning = true) {
|
|
926
963
|
if (this.gridOptions.enableEmptyDataWarningMessage) {
|
|
@@ -934,7 +971,7 @@ class SlickVanillaGridBundle {
|
|
|
934
971
|
startTime: new Date(),
|
|
935
972
|
endTime: new Date(),
|
|
936
973
|
itemCount: currentPageRowItemCount,
|
|
937
|
-
totalItemCount
|
|
974
|
+
totalItemCount,
|
|
938
975
|
};
|
|
939
976
|
// if custom footer is enabled, then we'll update its metrics
|
|
940
977
|
if (this.slickFooter) {
|
|
@@ -944,6 +981,10 @@ class SlickVanillaGridBundle {
|
|
|
944
981
|
if (this._isLocalGrid && this._gridOptions?.enableEmptyDataWarningMessage) {
|
|
945
982
|
this.displayEmptyDataWarning(currentPageRowItemCount === 0);
|
|
946
983
|
}
|
|
984
|
+
// when autoResize.autoHeight is enabled, we'll want to call a resize
|
|
985
|
+
if (this._gridOptions.enableAutoResize && this.resizerService.isAutoHeightEnabled && currentPageRowItemCount > 0) {
|
|
986
|
+
this.resizerService.resizeGrid();
|
|
987
|
+
}
|
|
947
988
|
}
|
|
948
989
|
/** Initialize the Pagination Service once */
|
|
949
990
|
initializePaginationService(paginationOptions) {
|
|
@@ -954,7 +995,7 @@ class SlickVanillaGridBundle {
|
|
|
954
995
|
};
|
|
955
996
|
this.paginationService.totalItems = this.totalItems;
|
|
956
997
|
this.paginationService.init(this.slickGrid, paginationOptions, this.backendServiceApi);
|
|
957
|
-
this.subscriptions.push(this._eventPubSubService.subscribe('onPaginationChanged', paginationChanges => this.paginationChanged(paginationChanges)), this._eventPubSubService.subscribe('onPaginationVisibilityChanged', visibility => {
|
|
998
|
+
this.subscriptions.push(this._eventPubSubService.subscribe('onPaginationChanged', (paginationChanges) => this.paginationChanged(paginationChanges)), this._eventPubSubService.subscribe('onPaginationVisibilityChanged', (visibility) => {
|
|
958
999
|
this.showPagination = visibility?.visible ?? false;
|
|
959
1000
|
if (this.gridOptions?.backendServiceApi) {
|
|
960
1001
|
this.backendUtilityService?.refreshBackendDataset(this.gridOptions);
|
|
@@ -1018,12 +1059,12 @@ class SlickVanillaGridBundle {
|
|
|
1018
1059
|
}
|
|
1019
1060
|
else if (response?.status >= 200 && response.status < 300 && typeof response.json === 'function') {
|
|
1020
1061
|
if (response.bodyUsed) {
|
|
1021
|
-
console.warn(`[SlickGrid-Universal] The response body passed to collectionAsync was already read.`
|
|
1022
|
-
|
|
1062
|
+
console.warn(`[SlickGrid-Universal] The response body passed to collectionAsync was already read.` +
|
|
1063
|
+
`Either pass the dataset from the Response or clone the response first using response.clone()`);
|
|
1023
1064
|
}
|
|
1024
1065
|
else {
|
|
1025
1066
|
// from Fetch
|
|
1026
|
-
response.json().then(data => this.updateEditorCollection(column, data));
|
|
1067
|
+
response.json().then((data) => this.updateEditorCollection(column, data));
|
|
1027
1068
|
}
|
|
1028
1069
|
}
|
|
1029
1070
|
else if (response?.content) {
|
|
@@ -1041,13 +1082,11 @@ class SlickVanillaGridBundle {
|
|
|
1041
1082
|
}
|
|
1042
1083
|
insertDynamicPresetColumns(columnId, gridPresetColumns) {
|
|
1043
1084
|
if (this._columnDefinitions) {
|
|
1044
|
-
const columnPosition = this._columnDefinitions.findIndex(c => c.id === columnId);
|
|
1085
|
+
const columnPosition = this._columnDefinitions.findIndex((c) => c.id === columnId);
|
|
1045
1086
|
if (columnPosition >= 0) {
|
|
1046
1087
|
const dynColumn = this._columnDefinitions[columnPosition];
|
|
1047
|
-
if (dynColumn?.id === columnId && !gridPresetColumns.some(c => c.id === columnId)) {
|
|
1048
|
-
columnPosition > 0
|
|
1049
|
-
? gridPresetColumns.splice(columnPosition, 0, dynColumn)
|
|
1050
|
-
: gridPresetColumns.unshift(dynColumn);
|
|
1088
|
+
if (dynColumn?.id === columnId && !gridPresetColumns.some((c) => c.id === columnId)) {
|
|
1089
|
+
columnPosition > 0 ? gridPresetColumns.splice(columnPosition, 0, dynColumn) : gridPresetColumns.unshift(dynColumn);
|
|
1051
1090
|
}
|
|
1052
1091
|
}
|
|
1053
1092
|
}
|
|
@@ -1055,7 +1094,10 @@ class SlickVanillaGridBundle {
|
|
|
1055
1094
|
/** Load any possible Columns Grid Presets */
|
|
1056
1095
|
loadColumnPresetsWhenDatasetInitialized() {
|
|
1057
1096
|
// if user entered some Columns "presets", we need to reflect them all in the grid
|
|
1058
|
-
if (this.slickGrid &&
|
|
1097
|
+
if (this.slickGrid &&
|
|
1098
|
+
this.gridOptions.presets &&
|
|
1099
|
+
Array.isArray(this.gridOptions.presets.columns) &&
|
|
1100
|
+
this.gridOptions.presets.columns.length > 0) {
|
|
1059
1101
|
const gridPresetColumns = this.gridStateService.getAssociatedGridColumns(this.slickGrid, this.gridOptions.presets.columns);
|
|
1060
1102
|
if (gridPresetColumns && Array.isArray(gridPresetColumns) && gridPresetColumns.length > 0 && Array.isArray(this._columnDefinitions)) {
|
|
1061
1103
|
// make sure that the dynamic columns are included in presets (1.Row Move, 2. Row Selection, 3. Row Detail)
|
|
@@ -1073,7 +1115,7 @@ class SlickVanillaGridBundle {
|
|
|
1073
1115
|
}
|
|
1074
1116
|
// keep copy the original optional `width` properties optionally provided by the user.
|
|
1075
1117
|
// We will use this when doing a resize by cell content, if user provided a `width` it won't override it.
|
|
1076
|
-
gridPresetColumns.forEach(col => col.originalWidth = col.width);
|
|
1118
|
+
gridPresetColumns.forEach((col) => (col.originalWidth = col.width));
|
|
1077
1119
|
// finally set the new presets columns (including checkbox selector if need be)
|
|
1078
1120
|
this.slickGrid.setColumns(gridPresetColumns);
|
|
1079
1121
|
this.sharedService.visibleColumns = gridPresetColumns;
|
|
@@ -1086,7 +1128,8 @@ class SlickVanillaGridBundle {
|
|
|
1086
1128
|
// if user entered some Filter "presets", we need to reflect them all in the DOM
|
|
1087
1129
|
// also note that a presets of Tree Data Toggling will also call this method because Tree Data toggling does work with data filtering
|
|
1088
1130
|
// (collapsing a parent will basically use Filter for hidding (aka collapsing) away the child underneat it)
|
|
1089
|
-
if (this.gridOptions.presets &&
|
|
1131
|
+
if (this.gridOptions.presets &&
|
|
1132
|
+
(Array.isArray(this.gridOptions.presets.filters) || Array.isArray(this.gridOptions.presets?.treeData?.toggledItems))) {
|
|
1090
1133
|
this.filterService.populateColumnFilterSearchTermPresets(this.gridOptions.presets?.filters || []);
|
|
1091
1134
|
}
|
|
1092
1135
|
}
|
|
@@ -1116,7 +1159,12 @@ class SlickVanillaGridBundle {
|
|
|
1116
1159
|
const presets = this.gridOptions?.presets;
|
|
1117
1160
|
const selectionModel = this.slickGrid?.getSelectionModel();
|
|
1118
1161
|
const enableRowSelection = this.gridOptions && (this.gridOptions.enableCheckboxSelector || this.gridOptions.enableRowSelection);
|
|
1119
|
-
if (this.slickGrid &&
|
|
1162
|
+
if (this.slickGrid &&
|
|
1163
|
+
this.dataView &&
|
|
1164
|
+
enableRowSelection &&
|
|
1165
|
+
selectionModel &&
|
|
1166
|
+
presets?.rowSelection &&
|
|
1167
|
+
(Array.isArray(presets.rowSelection.gridRowIndexes) || Array.isArray(presets.rowSelection.dataContextIds))) {
|
|
1120
1168
|
let dataContextIds = presets.rowSelection.dataContextIds;
|
|
1121
1169
|
let gridRowIndexes = presets.rowSelection.gridRowIndexes;
|
|
1122
1170
|
// maps the IDs to the Grid Rows and vice versa, the "dataContextIds" has precedence over the other
|
|
@@ -1132,7 +1180,7 @@ class SlickVanillaGridBundle {
|
|
|
1132
1180
|
this.dataView.setSelectedIds(dataContextIds || [], {
|
|
1133
1181
|
isRowBeingAdded: true,
|
|
1134
1182
|
shouldTriggerEvent: false, // do not trigger when presetting the grid
|
|
1135
|
-
applyRowSelectionToGrid: true
|
|
1183
|
+
applyRowSelectionToGrid: true,
|
|
1136
1184
|
});
|
|
1137
1185
|
}
|
|
1138
1186
|
}
|
|
@@ -1142,7 +1190,7 @@ class SlickVanillaGridBundle {
|
|
|
1142
1190
|
if (disposePreviousResources) {
|
|
1143
1191
|
this.disposeExternalResources();
|
|
1144
1192
|
}
|
|
1145
|
-
resources.forEach(res => this._registeredResources.push(res));
|
|
1193
|
+
resources.forEach((res) => this._registeredResources.push(res));
|
|
1146
1194
|
this.initializeExternalResources(resources);
|
|
1147
1195
|
}
|
|
1148
1196
|
resetExternalResources() {
|
|
@@ -1177,7 +1225,8 @@ class SlickVanillaGridBundle {
|
|
|
1177
1225
|
// push all other Services that we want to be registered
|
|
1178
1226
|
this._registeredResources.push(this.gridService, this.gridStateService);
|
|
1179
1227
|
// when using Grouping/DraggableGrouping/Colspan register its Service
|
|
1180
|
-
if ((this.gridOptions.createPreHeaderPanel && this.gridOptions.createTopHeaderPanel) ||
|
|
1228
|
+
if ((this.gridOptions.createPreHeaderPanel && this.gridOptions.createTopHeaderPanel) ||
|
|
1229
|
+
(this.gridOptions.createPreHeaderPanel && !this.gridOptions.enableDraggableGrouping)) {
|
|
1181
1230
|
this._registeredResources.push(this.headerGroupingService);
|
|
1182
1231
|
}
|
|
1183
1232
|
// when using Tree Data View, register its Service
|
|
@@ -1235,7 +1284,7 @@ class SlickVanillaGridBundle {
|
|
|
1235
1284
|
/** Prepare and load all SlickGrid editors, if an async editor is found then we'll also execute it. */
|
|
1236
1285
|
loadSlickGridEditors(columnDefinitions) {
|
|
1237
1286
|
const columns = Array.isArray(columnDefinitions) ? columnDefinitions : [];
|
|
1238
|
-
if (columns.some(col => `${col.id}`.includes('.'))) {
|
|
1287
|
+
if (columns.some((col) => `${col.id}`.includes('.'))) {
|
|
1239
1288
|
console.error('[Slickgrid-Universal] 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".');
|
|
1240
1289
|
}
|
|
1241
1290
|
return columns.map((column) => {
|
|
@@ -1247,7 +1296,11 @@ class SlickVanillaGridBundle {
|
|
|
1247
1296
|
});
|
|
1248
1297
|
}
|
|
1249
1298
|
suggestDateParsingWhenHelpful() {
|
|
1250
|
-
if (!this.gridOptions.silenceWarnings &&
|
|
1299
|
+
if (!this.gridOptions.silenceWarnings &&
|
|
1300
|
+
this.dataView &&
|
|
1301
|
+
this.dataView.getItemCount() > WARN_NO_PREPARSE_DATE_SIZE &&
|
|
1302
|
+
!this.gridOptions.preParseDateColumns &&
|
|
1303
|
+
this.slickGrid?.getColumns().some((c) => (0, common_1.isColumnDateType)(c.type))) {
|
|
1251
1304
|
console.warn('[Slickgrid-Universal] For getting better perf, we suggest you enable the `preParseDateColumns` grid option, ' +
|
|
1252
1305
|
'for more info visit => https://ghiscoding.gitbook.io/slickgrid-universal/column-functionalities/sorting#pre-parse-date-columns-for-better-perf');
|
|
1253
1306
|
}
|
|
@@ -1262,7 +1315,7 @@ class SlickVanillaGridBundle {
|
|
|
1262
1315
|
column.editor.disabled = false;
|
|
1263
1316
|
// get current Editor, remove it from the DOm then re-enable it and re-render it with the new collection.
|
|
1264
1317
|
const currentEditor = this.slickGrid.getCellEditor();
|
|
1265
|
-
if (currentEditor?.disable && currentEditor
|
|
1318
|
+
if (currentEditor?.disable && currentEditor.renderDomElement) {
|
|
1266
1319
|
if (typeof currentEditor.destroy === 'function') {
|
|
1267
1320
|
currentEditor.destroy();
|
|
1268
1321
|
}
|