Skip to content

Commit eb710b5

Browse files
committed
chore(deps): update Slickgrid-Universal to v10.7.0
1 parent a8de1b5 commit eb710b5

15 files changed

Lines changed: 329 additions & 398 deletions

package-lock.json

Lines changed: 127 additions & 127 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,28 +30,28 @@
3030
"dependencies": {
3131
"@faker-js/faker": "^10.4.0",
3232
"@fnando/sparkline": "^0.3.10",
33-
"@formkit/tempo": "^1.0.0",
34-
"@slickgrid-universal/common": "^10.6.0",
35-
"@slickgrid-universal/composite-editor-component": "^10.6.0",
36-
"@slickgrid-universal/custom-tooltip-plugin": "^10.6.0",
37-
"@slickgrid-universal/excel-export": "^10.6.0",
38-
"@slickgrid-universal/graphql": "^10.6.0",
39-
"@slickgrid-universal/odata": "^10.6.0",
40-
"@slickgrid-universal/pdf-export": "^10.6.0",
41-
"@slickgrid-universal/row-detail-view-plugin": "^10.6.0",
42-
"@slickgrid-universal/rxjs-observable": "^10.6.0",
43-
"@slickgrid-universal/sql": "^10.6.0",
44-
"@slickgrid-universal/text-export": "^10.6.0",
45-
"@slickgrid-universal/vanilla-bundle": "^10.6.0",
46-
"@slickgrid-universal/vanilla-force-bundle": "^10.6.0",
33+
"@formkit/tempo": "^1.1.0",
34+
"@slickgrid-universal/common": "^10.7.0",
35+
"@slickgrid-universal/composite-editor-component": "^10.7.0",
36+
"@slickgrid-universal/custom-tooltip-plugin": "^10.7.0",
37+
"@slickgrid-universal/excel-export": "^10.7.0",
38+
"@slickgrid-universal/graphql": "^10.7.0",
39+
"@slickgrid-universal/odata": "^10.7.0",
40+
"@slickgrid-universal/pdf-export": "^10.7.0",
41+
"@slickgrid-universal/row-detail-view-plugin": "^10.7.0",
42+
"@slickgrid-universal/rxjs-observable": "^10.7.0",
43+
"@slickgrid-universal/sql": "^10.7.0",
44+
"@slickgrid-universal/text-export": "^10.7.0",
45+
"@slickgrid-universal/vanilla-bundle": "^10.7.0",
46+
"@slickgrid-universal/vanilla-force-bundle": "^10.7.0",
4747
"alien-signals": "^3.1.2",
4848
"bulma": "^1.0.4",
4949
"dompurify": "^3.4.2",
5050
"rxjs": "^7.8.2"
5151
},
5252
"devDependencies": {
5353
"@types/fnando__sparkline": "^0.3.7",
54-
"@types/node": "^25.6.0",
54+
"@types/node": "^25.6.2",
5555
"@types/webpack": "^5.28.5",
5656
"clean-webpack-plugin": "4.0.0",
5757
"copy-webpack-plugin": "^14.0.0",
@@ -63,7 +63,7 @@
6363
"html-webpack-plugin": "5.6.7",
6464
"mini-css-extract-plugin": "^2.10.2",
6565
"sass": "^1.99.0",
66-
"sass-loader": "^16.0.7",
66+
"sass-loader": "^16.0.8",
6767
"style-loader": "^4.0.0",
6868
"typescript": "^5.9.3",
6969
"url-loader": "^4.1.1",

src/examples/example02.ts

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ import {
1010
type Column,
1111
type GridOption,
1212
type Grouping,
13+
type OnFormattedDataCacheCompletedEventArgs,
1314
type SliderOption,
1415
} from '@slickgrid-universal/common';
1516
import { ExcelExportService } from '@slickgrid-universal/excel-export';
1617
import { PdfExportService } from '@slickgrid-universal/pdf-export';
1718
import { TextExportService } from '@slickgrid-universal/text-export';
1819
import { Slicker, type SlickVanillaGridBundle } from '@slickgrid-universal/vanilla-bundle';
1920
import { ExampleGridOptions } from './example-grid-options';
21+
import { showToast } from './utilities';
2022
import '../material-styles.scss';
2123
import './example02.scss';
2224

@@ -65,6 +67,11 @@ export default class Example02 {
6567
console.log(`sort: ${window.performance.now() - this.sortStart} ms`); // use console for Cypress tests
6668
});
6769
});
70+
this._bindingEventService.bind(
71+
gridContainerElm,
72+
'onformatteddatacachecompleted',
73+
this.handleFormattedDataCacheCompleted.bind(this) as EventListener
74+
);
6875
this.sgb = new Slicker.GridBundle(gridContainerElm, this.columns, { ...ExampleGridOptions, ...this.gridOptions }, this.dataset);
6976

7077
// you could group by duration on page load (must be AFTER the DataView is created, so after GridBundle)
@@ -216,18 +223,8 @@ export default class Example02 {
216223
groupTotalsExcelExportOptions: {
217224
style: {
218225
alignment: { horizontal: 'center' },
219-
font: {
220-
bold: true,
221-
color: 'FF005289',
222-
underline: 'single',
223-
fontName: 'Consolas',
224-
size: 10,
225-
},
226-
fill: {
227-
type: 'pattern',
228-
patternType: 'solid',
229-
fgColor: 'FFE6F2F6',
230-
},
226+
font: { bold: true, color: 'FF005289', underline: 'single', fontName: 'Consolas', size: 10 },
227+
fill: { type: 'pattern', patternType: 'solid', fgColor: 'FFE6F2F6' },
231228
border: {
232229
top: { color: 'FFa500ff', style: 'thick' },
233230
left: { color: 'FFa500ff', style: 'medium' },
@@ -280,9 +277,13 @@ export default class Example02 {
280277
enablePdfExport: true,
281278
enableFiltering: true,
282279
enableGrouping: true,
280+
enableFormattedDataCache: false, // enable it when you have a large dataset (e.g. we'll enable it when loading over 10K)
283281
columnPicker: {
284282
onColumnsChanged: (e, args) => console.log(e, args),
285283
},
284+
groupItemMetadataOption: {
285+
toggleOnNodeTitle: true, // enable toggle of group by clicking on the toggle icon or its title (not just the toggle icon)
286+
},
286287
enableExcelExport: true,
287288
excelExportOptions: {
288289
filename: 'my-export',
@@ -298,18 +299,9 @@ export default class Example02 {
298299
customExcelHeader: (workbook, sheet) => {
299300
const excelFormat = workbook.getStyleSheet().createFormat({
300301
// every color is prefixed with FF, then regular HTML color
301-
font: {
302-
size: 18,
303-
fontName: 'Calibri',
304-
bold: true,
305-
color: 'FFFFFFFF',
306-
},
302+
font: { size: 18, fontName: 'Calibri', bold: true, color: 'FFFFFFFF' },
307303
alignment: { wrapText: true, horizontal: 'center' },
308-
fill: {
309-
type: 'pattern',
310-
patternType: 'solid',
311-
fgColor: 'FF203764',
312-
},
304+
fill: { type: 'pattern', patternType: 'solid', fgColor: 'FF203764' },
313305
});
314306
sheet.setRowInstructions(0, { height: 50 }); // change height of row 0
315307

@@ -370,6 +362,7 @@ export default class Example02 {
370362
};
371363
}
372364
if (this.sgb) {
365+
this.sgb.slickGrid?.setOptions({ enableFormattedDataCache: rowCount > 10000 });
373366
this.sgb.dataset = tmpArray;
374367
}
375368
return tmpArray;
@@ -388,10 +381,7 @@ export default class Example02 {
388381
}
389382

390383
exportToExcel() {
391-
this.excelExportService.exportToExcel({
392-
filename: 'export',
393-
format: 'xlsx',
394-
});
384+
this.excelExportService.exportToExcel({ filename: 'export', format: 'xlsx' });
395385
}
396386

397387
exportToPdf() {
@@ -412,7 +402,7 @@ export default class Example02 {
412402
this.sgb?.slickGrid?.invalidate(); // invalidate all rows and re-render
413403
}
414404

415-
groupByDurationOrderByCount(aggregateCollapsed) {
405+
groupByDurationOrderByCount(aggregateCollapsed: boolean) {
416406
this.sgb?.slickGrid?.setSortColumns([]);
417407
this.sgb?.dataView?.setGrouping({
418408
getter: 'duration',
@@ -484,4 +474,14 @@ export default class Example02 {
484474
] as Grouping[]);
485475
this.sgb?.slickGrid?.invalidate(); // invalidate all rows and re-render
486476
}
477+
478+
handleFormattedDataCacheCompleted(e: CustomEvent<{ args: OnFormattedDataCacheCompletedEventArgs }>) {
479+
const args = e.detail.args;
480+
showToast(
481+
`Formatted Data Cache completed: ${args.totalRows} rows, ${args.totalFormattedCells} cells in ${args.durationMs} ms`,
482+
'info',
483+
5000
484+
);
485+
console.log('onFormattedDataCacheCompleted', e, args);
486+
}
487487
}

src/examples/example03.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
type GridOption,
1414
type Grouping,
1515
type GroupingGetterFunction,
16+
type OnFormattedDataCacheCompletedEventArgs,
1617
type SlickDraggableGrouping,
1718
type VanillaCalendarOption,
1819
} from '@slickgrid-universal/common';
@@ -65,6 +66,11 @@ export default class Example03 {
6566
this._bindingEventService.bind(gridContainerElm, 'oncellchange', this.handleOnCellChange.bind(this));
6667
this._bindingEventService.bind(gridContainerElm, 'onvalidationerror', this.handleValidationError.bind(this));
6768
this._bindingEventService.bind(gridContainerElm, 'onitemsdeleted', this.handleItemsDeleted.bind(this));
69+
this._bindingEventService.bind(
70+
gridContainerElm,
71+
'onformatteddatacachecompleted',
72+
this.handleFormattedDataCacheCompleted.bind(this) as EventListener
73+
);
6874
this._bindingEventService.bind(
6975
gridContainerElm,
7076
['onbeforeexporttoexcel', 'onbeforeexporttopdf'],
@@ -342,6 +348,7 @@ export default class Example03 {
342348
dataView: {
343349
useCSPSafeFilter: true,
344350
},
351+
enableFormattedDataCache: false, // enable it when you have a large dataset (e.g. we'll enable it when loading over 10K)
345352
headerMenu: {
346353
hideFreezeColumnsCommand: false,
347354
},
@@ -430,12 +437,12 @@ export default class Example03 {
430437
};
431438
}
432439

433-
loadData(count: number) {
440+
loadData(rowCount: number) {
434441
// mock data
435442
const tmpArray: any[] = [];
436443
const currentYear = new Date().getFullYear();
437444

438-
for (let i = 0; i < count; i++) {
445+
for (let i = 0; i < rowCount; i++) {
439446
const randomFinishYear = new Date().getFullYear() - 3 + Math.floor(Math.random() * 10); // use only years not lower than 3 years ago
440447
const randomMonth = Math.floor(Math.random() * 10);
441448
const randomDay = Math.floor(Math.random() * 29);
@@ -458,6 +465,7 @@ export default class Example03 {
458465
// }
459466
}
460467
if (this.sgb) {
468+
this.sgb.slickGrid?.setOptions({ enableFormattedDataCache: rowCount > 10000 });
461469
this.sgb.dataset = tmpArray;
462470
}
463471
// const item = this.sgb.dataView?.getItemById<ReportItem & { myAction: string; }>(0);
@@ -590,6 +598,16 @@ export default class Example03 {
590598
console.log('item deleted with id:', itemId);
591599
}
592600

601+
handleFormattedDataCacheCompleted(e: CustomEvent<{ args: OnFormattedDataCacheCompletedEventArgs }>) {
602+
const args = e.detail.args;
603+
showToast(
604+
`Formatted Data Cache completed: ${args.totalRows} rows, ${args.totalFormattedCells} cells in ${args.durationMs} ms`,
605+
'info',
606+
5000
607+
);
608+
console.log('onFormattedDataCacheCompleted', e, args);
609+
}
610+
593611
executeCommand(_e, args) {
594612
// const columnDef = args.column;
595613
const command = args.command;

src/examples/example05.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ export default class Example05 {
273273
enableTreeData: true, // you must enable this flag for the filtering & sorting to work as expected
274274
treeDataOptions: {
275275
columnId: 'title',
276+
toggleOnNodeTitle: true, // enable toggle of tree by clicking on the toggle icon or its title (not just the toggle icon)
276277
parentPropName: 'parentId',
277278
// this is optional, you can define the tree level property name that will be used for the sorting/indentation, internally it will use "__treeLevel"
278279
levelPropName: 'treeLevel',

src/examples/example06.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,16 +262,17 @@ export default class Example06 {
262262
value = value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
263263
const spacer = `<span class="display-inline-block width-${15 * treeLevel}px"></span>`;
264264
const indentSpacer = addWhiteSpaces(5 * treeLevel);
265+
const spanValue = `<span class="slick-tree-title">${value}</span>`;
265266

266267
if (data[idx + 1]?.[treeLevelPropName] > data[idx][treeLevelPropName] || data[idx]['__hasChildren']) {
267268
const folderPrefix = `<i class="mdi font-22px ${dataContext.__collapsed ? 'mdi-folder' : 'mdi-folder-open'}"></i>`;
268269
if (dataContext.__collapsed) {
269-
return `<span class="hidden">${exportIndentationLeadingChar}</span>${spacer}${indentSpacer} <span class="slick-group-toggle collapsed" level="${treeLevel}"></span>${folderPrefix} ${prefix} ${value}`;
270+
return `<span class="hidden">${exportIndentationLeadingChar}</span>${spacer}${indentSpacer} <span class="slick-group-toggle collapsed" level="${treeLevel}"></span>${folderPrefix} ${prefix} ${spanValue}`;
270271
} else {
271-
return `<span class="hidden">${exportIndentationLeadingChar}</span>${spacer}${indentSpacer} <span class="slick-group-toggle expanded" level="${treeLevel}"></span>${folderPrefix} ${prefix} ${value}`;
272+
return `<span class="hidden">${exportIndentationLeadingChar}</span>${spacer}${indentSpacer} <span class="slick-group-toggle expanded" level="${treeLevel}"></span>${folderPrefix} ${prefix} ${spanValue}`;
272273
}
273274
} else {
274-
return `<span class="hidden">${exportIndentationLeadingChar}</span>${spacer}${indentSpacer} <span class="slick-group-toggle" level="${treeLevel}"></span>${prefix} ${value}`;
275+
return `<span class="hidden">${exportIndentationLeadingChar}</span>${spacer}${indentSpacer} <span class="slick-group-toggle" level="${treeLevel}"></span>${prefix} ${spanValue}`;
275276
}
276277
};
277278

src/examples/example07.ts

Lines changed: 8 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -402,8 +402,14 @@ export default class Example07 {
402402
disableRowSelection: true,
403403
cancelEditOnDrag: true,
404404
hideRowMoveShadow: false,
405-
onBeforeMoveRows: this.onBeforeMoveRow.bind(this),
406-
onMoveRows: this.onMoveRows.bind(this),
405+
// you can provide your own `onBeforeMoveRows` and/or `onMoveRows` implementation
406+
// or use the default implementation, however the default won't work with Tree Data
407+
// onBeforeMoveRows: () => {},
408+
// onMoveRows: () => {},
409+
onAfterMoveRows: (_e, args) => {
410+
// update dataset for the ms-select list to be updated
411+
this.dataset = args.updatedItems;
412+
},
407413

408414
// you can also override the usability of the rows, for example make every 2nd row the only moveable rows,
409415
// usabilityOverride: (row, dataContext, grid) => dataContext.id % 2 === 1
@@ -559,71 +565,6 @@ export default class Example07 {
559565
return collection.sort((item1, item2) => item1.value - item2.value);
560566
}
561567

562-
onBeforeMoveRow(e: MouseEvent | TouchEvent, data: { rows: number[]; insertBefore: number }) {
563-
for (const rowIdx of data.rows) {
564-
// no point in moving before or after itself
565-
if (
566-
rowIdx === data.insertBefore ||
567-
(rowIdx === data.insertBefore - 1 && data.insertBefore - 1 !== this.sgb.dataView?.getItemCount())
568-
) {
569-
e.stopPropagation();
570-
return false;
571-
}
572-
}
573-
return true;
574-
}
575-
576-
onMoveRows(_e: MouseEvent | TouchEvent, args: { rows: number[]; insertBefore: number }) {
577-
// rows and insertBefore references,
578-
// note that these references are assuming that the dataset isn't filtered at all
579-
// which is not always the case so we will recalcualte them and we won't use these reference afterward
580-
const rows = args.rows as number[];
581-
const insertBefore = args.insertBefore;
582-
const extractedRows: any[] = [];
583-
584-
// when moving rows, we need to cancel any sorting that might happen
585-
// we can do this by providing an undefined sort comparer
586-
// which basically destroys the current sort comparer without resorting the dataset, it basically keeps the previous sorting
587-
this.sgb.dataView?.sort(undefined as any, true);
588-
589-
// the dataset might be filtered/sorted,
590-
// so we need to get the same dataset as the one that the SlickGrid DataView uses
591-
const tmpDataset = this.sgb.dataView?.getItems() as any[];
592-
const filteredItems = this.sgb.dataView?.getFilteredItems() as any[];
593-
594-
const itemOnRight = this.sgb.dataView?.getItem(insertBefore);
595-
const insertBeforeFilteredIdx = (
596-
itemOnRight ? this.sgb.dataView?.getIdxById(itemOnRight.id) : this.sgb.dataView?.getItemCount()
597-
) as number;
598-
599-
const filteredRowItems: any[] = [];
600-
rows.forEach((row) => filteredRowItems.push(filteredItems[row] as any));
601-
const filteredRows = filteredRowItems.map((item) => this.sgb.dataView?.getIdxById(item.id)) as number[];
602-
603-
const left = tmpDataset.slice(0, insertBeforeFilteredIdx);
604-
const right = tmpDataset.slice(insertBeforeFilteredIdx, tmpDataset.length);
605-
606-
// convert into a final new dataset that has the new order
607-
// we need to resort with
608-
rows.sort((a: number, b: number) => a - b);
609-
for (const filteredRow of filteredRows) {
610-
extractedRows.push(tmpDataset[filteredRow as number]);
611-
}
612-
filteredRows.reverse();
613-
for (const row of filteredRows) {
614-
if (row < insertBeforeFilteredIdx) {
615-
left.splice(row, 1);
616-
} else {
617-
right.splice(row - insertBeforeFilteredIdx, 1);
618-
}
619-
}
620-
621-
// final updated dataset, we need to overwrite the DataView dataset (and our local one) with this new dataset that has a new order
622-
const finalDataset = left.concat(extractedRows.concat(right));
623-
this.dataset = finalDataset;
624-
this.sgb.dataset = this.dataset; // update dataset and re-render the grid
625-
}
626-
627568
handleOnCellChange(event) {
628569
console.log('onCellChanged', event.detail, event.detail.args.item.start);
629570
}

0 commit comments

Comments
 (0)