Skip to content

Commit 2af19e4

Browse files
committed
refactor(presets): merge duplicate column preset loading logic
1 parent 527ee2d commit 2af19e4

File tree

10 files changed

+177
-241
lines changed

10 files changed

+177
-241
lines changed

frameworks/angular-slickgrid/src/library/components/__tests__/angular-slickgrid.component.spec.ts

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,12 @@ const gridServiceStub = {
161161
const gridStateServiceStub = {
162162
init: vi.fn(),
163163
dispose: vi.fn(),
164+
changeColumnsArrangement: vi.fn((columns) => {
165+
const gridColumns = gridStateServiceStub.getAssociatedGridColumns(mockGrid, columns);
166+
if (gridColumns && Array.isArray(gridColumns)) {
167+
mockGrid.setColumns(gridColumns);
168+
}
169+
}),
164170
getAssociatedGridColumns: vi.fn(),
165171
getCurrentGridState: vi.fn(),
166172
needToPreserveRowSelection: vi.fn(),
@@ -1748,15 +1754,12 @@ describe('Angular-Slickgrid Custom Component instantiated via Constructor', () =
17481754

17491755
it('should reflect columns in the grid', () => {
17501756
const mockColsPresets = [{ columnId: 'firstName', width: 100 }];
1751-
const mockCols = [{ id: 'firstName', field: 'firstName', editorClass: undefined, hidden: false }];
1752-
const getAssocColSpy = vi.spyOn(gridStateServiceStub, 'getAssociatedGridColumns').mockReturnValue(mockCols);
1753-
const setColSpy = vi.spyOn(mockGrid, 'setColumns');
1757+
const changeColsSpy = vi.spyOn(gridStateServiceStub, 'changeColumnsArrangement');
17541758

17551759
component.options = { presets: { columns: mockColsPresets } } as unknown as GridOption;
17561760
component.initialization(slickEventHandler);
17571761

1758-
expect(getAssocColSpy).toHaveBeenCalledWith(mockGrid, mockColsPresets);
1759-
expect(setColSpy).toHaveBeenCalledWith(mockCols);
1762+
expect(changeColsSpy).toHaveBeenCalledWith(mockColsPresets, false);
17601763
});
17611764

17621765
it('should reflect columns with an extra checkbox selection column in the grid when "enableCheckboxSelector" is set', () => {
@@ -1766,15 +1769,14 @@ describe('Angular-Slickgrid Custom Component instantiated via Constructor', () =
17661769
{ id: '_checkbox_selector', field: '_checkbox_selector', editor: undefined, editorClass: undefined, hidden: false },
17671770
{ ...mockCol, editorClass: undefined, hidden: false },
17681771
];
1769-
const getAssocColSpy = vi.spyOn(gridStateServiceStub, 'getAssociatedGridColumns').mockReturnValue([mockCol]);
1770-
const setColSpy = vi.spyOn(mockGrid, 'setColumns');
1772+
vi.spyOn(gridStateServiceStub, 'getAssociatedGridColumns').mockReturnValue([mockCol]);
1773+
const changeColsSpy = vi.spyOn(gridStateServiceStub, 'changeColumnsArrangement');
17711774

17721775
component.columns = mockCols;
17731776
component.options = { ...gridOptions, enableCheckboxSelector: true, presets: { columns: mockColsPresets } } as unknown as GridOption;
17741777
component.initialization(slickEventHandler);
17751778

1776-
expect(getAssocColSpy).toHaveBeenCalledWith(mockGrid, mockColsPresets);
1777-
expect(setColSpy).toHaveBeenCalledWith(mockCols);
1779+
expect(changeColsSpy).toHaveBeenCalledWith(mockColsPresets, false);
17781780
});
17791781

17801782
it('should reflect columns with an extra row detail column in the grid when "enableRowDetailView" is set', () => {
@@ -1784,8 +1786,8 @@ describe('Angular-Slickgrid Custom Component instantiated via Constructor', () =
17841786
{ id: '_detail_selector', field: '_detail_selector', editor: undefined, editorClass: undefined, hidden: false },
17851787
{ ...mockCol, editorClass: undefined, hidden: false },
17861788
];
1787-
const getAssocColSpy = vi.spyOn(gridStateServiceStub, 'getAssociatedGridColumns').mockReturnValue([mockCol]);
1788-
const setColSpy = vi.spyOn(mockGrid, 'setColumns');
1789+
vi.spyOn(gridStateServiceStub, 'getAssociatedGridColumns').mockReturnValue([mockCol]);
1790+
const changeColsSpy = vi.spyOn(gridStateServiceStub, 'changeColumnsArrangement');
17891791

17901792
component.columns = mockCols;
17911793
component.options = {
@@ -1796,8 +1798,7 @@ describe('Angular-Slickgrid Custom Component instantiated via Constructor', () =
17961798
} as GridOption;
17971799
component.initialization(slickEventHandler);
17981800

1799-
expect(getAssocColSpy).toHaveBeenCalledWith(mockGrid, mockColsPresets);
1800-
expect(setColSpy).toHaveBeenCalledWith(mockCols);
1801+
expect(changeColsSpy).toHaveBeenCalledWith(mockColsPresets, false);
18011802
});
18021803

18031804
it('should reflect columns with an extra row move column in the grid when "enableRowMoveManager" is set', () => {
@@ -1807,15 +1808,14 @@ describe('Angular-Slickgrid Custom Component instantiated via Constructor', () =
18071808
{ id: '_move', field: '_move', editor: undefined, editorClass: undefined, hidden: false },
18081809
{ ...mockCol, editorClass: undefined, hidden: false },
18091810
];
1810-
const getAssocColSpy = vi.spyOn(gridStateServiceStub, 'getAssociatedGridColumns').mockReturnValue([mockCol]);
1811-
const setColSpy = vi.spyOn(mockGrid, 'setColumns');
1811+
vi.spyOn(gridStateServiceStub, 'getAssociatedGridColumns').mockReturnValue([mockCol]);
1812+
const changeColsSpy = vi.spyOn(gridStateServiceStub, 'changeColumnsArrangement');
18121813

18131814
component.columns = mockCols;
18141815
component.options = { ...gridOptions, enableRowMoveManager: true, presets: { columns: mockColsPresets } } as unknown as GridOption;
18151816
component.initialization(slickEventHandler);
18161817

1817-
expect(getAssocColSpy).toHaveBeenCalledWith(mockGrid, mockColsPresets);
1818-
expect(setColSpy).toHaveBeenCalledWith(mockCols);
1818+
expect(changeColsSpy).toHaveBeenCalledWith(mockColsPresets, false);
18191819
});
18201820

18211821
it('should reflect 3 dynamic columns (1-RowMove, 2-RowSelection, 3-RowDetail) when all associated extension flags are enabled', () => {
@@ -1827,8 +1827,8 @@ describe('Angular-Slickgrid Custom Component instantiated via Constructor', () =
18271827
{ id: '_detail_selector', field: '_detail_selector', editor: undefined, editorClass: undefined, hidden: false },
18281828
{ ...mockCol, editorClass: undefined, hidden: false },
18291829
];
1830-
const getAssocColSpy = vi.spyOn(gridStateServiceStub, 'getAssociatedGridColumns').mockReturnValue([mockCol]);
1831-
const setColSpy = vi.spyOn(mockGrid, 'setColumns');
1830+
vi.spyOn(gridStateServiceStub, 'getAssociatedGridColumns').mockReturnValue([mockCol]);
1831+
const changeColsSpy = vi.spyOn(gridStateServiceStub, 'changeColumnsArrangement');
18321832

18331833
component.columns = mockCols;
18341834
component.options = {
@@ -1841,8 +1841,7 @@ describe('Angular-Slickgrid Custom Component instantiated via Constructor', () =
18411841
} as unknown as GridOption;
18421842
component.initialization(slickEventHandler);
18431843

1844-
expect(getAssocColSpy).toHaveBeenCalledWith(mockGrid, mockColsPresets);
1845-
expect(setColSpy).toHaveBeenCalledWith(mockCols);
1844+
expect(changeColsSpy).toHaveBeenCalledWith(mockColsPresets, false);
18461845
});
18471846

18481847
it('should execute backend service "init" method when set', () => {

frameworks/angular-slickgrid/src/library/components/angular-slickgrid.component.ts

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ import {
3939
SlickGrid,
4040
SlickgridConfig,
4141
SlickGroupItemMetadataProvider,
42-
sortPresetColumns,
4342
SortService,
4443
TreeDataService,
4544
unsubscribeAll,
@@ -1410,46 +1409,13 @@ export class AngularSlickgridComponent<TData = any> implements AfterViewInit, On
14101409
}
14111410
}
14121411

1413-
protected insertDynamicPresetColumns(columnId: string, gridPresetColumns: Column[]) {
1414-
if (this._columnDefinitions) {
1415-
const columnPosition = this._columnDefinitions.findIndex((c) => c.id === columnId);
1416-
if (columnPosition >= 0) {
1417-
const dynColumn = this._columnDefinitions[columnPosition];
1418-
if (dynColumn?.id === columnId && !gridPresetColumns.some((c) => c.id === columnId)) {
1419-
columnPosition > 0 ? gridPresetColumns.splice(columnPosition, 0, dynColumn) : gridPresetColumns.unshift(dynColumn);
1420-
}
1421-
}
1422-
}
1423-
}
1424-
14251412
/** Load any possible Columns Grid Presets */
14261413
protected loadColumnPresetsWhenDatasetInitialized() {
14271414
// if user entered some Columns "presets", we need to reflect them all in the grid
14281415
if (Array.isArray(this.options.presets?.columns) && this.options.presets.columns.length > 0) {
1429-
const gridPresetColumns: Column[] = this.gridStateService.getAssociatedGridColumns(this.slickGrid, this.options.presets.columns);
1430-
if (Array.isArray(gridPresetColumns) && gridPresetColumns.length > 0 && Array.isArray(this._columnDefinitions)) {
1431-
// make sure that the dynamic columns are included in presets (1.Row Move, 2. Row Selection, 3. Row Detail)
1432-
if (this.options.enableRowMoveManager) {
1433-
const rmmColId = this.options?.rowMoveManager?.columnId ?? '_move';
1434-
this.insertDynamicPresetColumns(rmmColId, gridPresetColumns);
1435-
}
1436-
if (this.options.enableCheckboxSelector) {
1437-
const chkColId = this.options?.checkboxSelector?.columnId ?? '_checkbox_selector';
1438-
this.insertDynamicPresetColumns(chkColId, gridPresetColumns);
1439-
}
1440-
if (this.options.enableRowDetailView) {
1441-
const rdvColId = this.options?.rowDetailView?.columnId ?? '_detail_selector';
1442-
this.insertDynamicPresetColumns(rdvColId, gridPresetColumns);
1443-
}
1444-
1445-
// keep copy the original optional `width` properties optionally provided by the user.
1446-
// We will use this when doing a resize by cell content, if user provided a `width` it won't override it.
1447-
gridPresetColumns.forEach((col) => (col.originalWidth = col.width));
1448-
1449-
// finally sort and set the new presets columns (including checkbox selector if need be)
1450-
const orderedColumns = sortPresetColumns(this._columnDefinitions, gridPresetColumns);
1451-
this.slickGrid.setColumns(orderedColumns);
1452-
}
1416+
// delegate to GridStateService for centralized column arrangement logic
1417+
// we pass `false` for triggerAutoSizeColumns to maintain original behavior on preset load
1418+
this.gridStateService.changeColumnsArrangement(this.options.presets.columns, false);
14531419
}
14541420
}
14551421

frameworks/aurelia-slickgrid/src/custom-elements/aurelia-slickgrid.ts

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ import {
4040
SlickGrid,
4141
SlickgridConfig,
4242
SlickGroupItemMetadataProvider,
43-
sortPresetColumns,
4443
SortService,
4544
TreeDataService,
4645
type Observable,
@@ -1306,46 +1305,13 @@ export class AureliaSlickgridCustomElement {
13061305
}
13071306
}
13081307

1309-
protected insertDynamicPresetColumns(columnId: string, gridPresetColumns: Column[]) {
1310-
if (this._columns) {
1311-
const columnPosition = this._columns.findIndex((c) => c.id === columnId);
1312-
if (columnPosition >= 0) {
1313-
const dynColumn = this._columns[columnPosition];
1314-
if (dynColumn?.id === columnId && !gridPresetColumns.some((c) => c.id === columnId)) {
1315-
columnPosition > 0 ? gridPresetColumns.splice(columnPosition, 0, dynColumn) : gridPresetColumns.unshift(dynColumn);
1316-
}
1317-
}
1318-
}
1319-
}
1320-
13211308
/** Load any possible Columns Grid Presets */
13221309
protected loadColumnPresetsWhenDatasetInitialized() {
13231310
// if user entered some Columns "presets", we need to reflect them all in the grid
13241311
if (this.options.presets && Array.isArray(this.options.presets.columns) && this.options.presets.columns.length > 0) {
1325-
const gridPresetColumns: Column[] = this.gridStateService.getAssociatedGridColumns(this.grid, this.options.presets.columns);
1326-
if (gridPresetColumns && Array.isArray(gridPresetColumns) && gridPresetColumns.length > 0 && Array.isArray(this._columns)) {
1327-
// make sure that the dynamic columns are included in presets (1.Row Move, 2. Row Selection, 3. Row Detail)
1328-
if (this.options.enableRowMoveManager) {
1329-
const rmmColId = this.options?.rowMoveManager?.columnId ?? '_move';
1330-
this.insertDynamicPresetColumns(rmmColId, gridPresetColumns);
1331-
}
1332-
if (this.options.enableCheckboxSelector) {
1333-
const chkColId = this.options?.checkboxSelector?.columnId ?? '_checkbox_selector';
1334-
this.insertDynamicPresetColumns(chkColId, gridPresetColumns);
1335-
}
1336-
if (this.options.enableRowDetailView) {
1337-
const rdvColId = this.options?.rowDetailView?.columnId ?? '_detail_selector';
1338-
this.insertDynamicPresetColumns(rdvColId, gridPresetColumns);
1339-
}
1340-
1341-
// keep copy the original optional `width` properties optionally provided by the user.
1342-
// We will use this when doing a resize by cell content, if user provided a `width` it won't override it.
1343-
gridPresetColumns.forEach((col) => (col.originalWidth = col.width));
1344-
1345-
// finally sort and set the new presets columns (including checkbox selector if need be)
1346-
const orderedColumns = sortPresetColumns(this._columns, gridPresetColumns);
1347-
this.grid.setColumns(orderedColumns);
1348-
}
1312+
// delegate to GridStateService for centralized column arrangement logic
1313+
// we pass `false` for triggerAutoSizeColumns to maintain original behavior on preset load
1314+
this.gridStateService.changeColumnsArrangement(this.options.presets.columns, false);
13491315
}
13501316
}
13511317

frameworks/slickgrid-react/src/components/slickgrid-react.tsx

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import {
2222
SlickGrid,
2323
SlickgridConfig,
2424
SlickGroupItemMetadataProvider,
25-
sortPresetColumns,
2625
SortService,
2726
TreeDataService,
2827
type AutocompleterEditor,
@@ -1410,46 +1409,13 @@ export class SlickgridReact<TData = any> extends React.Component<SlickgridReactP
14101409
}
14111410
}
14121411

1413-
protected insertDynamicPresetColumns(columnId: string, gridPresetColumns: Column<TData>[]) {
1414-
if (this._columns) {
1415-
const columnPosition = this._columns.findIndex((c) => c.id === columnId);
1416-
if (columnPosition >= 0) {
1417-
const dynColumn = this._columns[columnPosition];
1418-
if (dynColumn?.id === columnId && !gridPresetColumns.some((c) => c.id === columnId)) {
1419-
columnPosition > 0 ? gridPresetColumns.splice(columnPosition, 0, dynColumn) : gridPresetColumns.unshift(dynColumn);
1420-
}
1421-
}
1422-
}
1423-
}
1424-
14251412
/** Load any possible Columns Grid Presets */
14261413
protected loadColumnPresetsWhenDatasetInitialized() {
14271414
// if user entered some Columns "presets", we need to reflect them all in the grid
14281415
if (this.grid && this.options.presets && Array.isArray(this.options.presets.columns) && this.options.presets.columns.length > 0) {
1429-
const gridPresetColumns: Column<TData>[] = this.gridStateService.getAssociatedGridColumns(this.grid, this.options.presets.columns);
1430-
if (gridPresetColumns && Array.isArray(gridPresetColumns) && gridPresetColumns.length > 0 && Array.isArray(this._columns)) {
1431-
// make sure that the dynamic columns are included in presets (1.Row Move, 2. Row Selection, 3. Row Detail)
1432-
if (this.options.enableRowMoveManager) {
1433-
const rmmColId = this.options?.rowMoveManager?.columnId ?? '_move';
1434-
this.insertDynamicPresetColumns(rmmColId, gridPresetColumns);
1435-
}
1436-
if (this.options.enableCheckboxSelector) {
1437-
const chkColId = this.options?.checkboxSelector?.columnId ?? '_checkbox_selector';
1438-
this.insertDynamicPresetColumns(chkColId, gridPresetColumns);
1439-
}
1440-
if (this.options.enableRowDetailView) {
1441-
const rdvColId = this.options?.rowDetailView?.columnId ?? '_detail_selector';
1442-
this.insertDynamicPresetColumns(rdvColId, gridPresetColumns);
1443-
}
1444-
1445-
// keep copy the original optional `width` properties optionally provided by the user.
1446-
// We will use this when doing a resize by cell content, if user provided a `width` it won't override it.
1447-
gridPresetColumns.forEach((col) => (col.originalWidth = col.width));
1448-
1449-
// finally sort and set the new presets columns (including checkbox selector if need be)
1450-
const orderedColumns = sortPresetColumns(this._columns, gridPresetColumns);
1451-
this.grid.setColumns(orderedColumns);
1452-
}
1416+
// delegate to GridStateService for centralized column arrangement logic
1417+
// we pass `false` for triggerAutoSizeColumns to maintain original behavior on preset load
1418+
this.gridStateService.changeColumnsArrangement(this.options.presets.columns, false);
14531419
}
14541420
}
14551421

frameworks/slickgrid-vue/src/components/SlickgridVue.vue

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import {
2323
SlickGrid,
2424
SlickgridConfig,
2525
SlickGroupItemMetadataProvider,
26-
sortPresetColumns,
2726
SortService,
2827
TreeDataService,
2928
type AutocompleterEditor,
@@ -1276,46 +1275,13 @@ function loadEditorCollectionAsync(column: Column) {
12761275
}
12771276
}
12781277
1279-
function insertDynamicPresetColumns(columnId: string, gridPresetColumns: Column<any>[]) {
1280-
if (_columnDefinitions.value) {
1281-
const columnPosition = _columnDefinitions.value.findIndex((c) => c.id === columnId);
1282-
if (columnPosition >= 0) {
1283-
const dynColumn = _columnDefinitions.value[columnPosition] as Column;
1284-
if (dynColumn?.id === columnId && !gridPresetColumns.some((c) => c.id === columnId)) {
1285-
columnPosition > 0 ? gridPresetColumns.splice(columnPosition, 0, dynColumn) : gridPresetColumns.unshift(dynColumn);
1286-
}
1287-
}
1288-
}
1289-
}
1290-
12911278
/** Load any possible Columns Grid Presets */
12921279
function loadColumnPresetsWhenDatasetInitialized() {
12931280
// if user entered some Columns "presets", we need to reflect them all in the grid
12941281
if (_gridOptions.value.presets && Array.isArray(_gridOptions.value.presets.columns) && _gridOptions.value.presets.columns.length > 0) {
1295-
const gridPresetColumns: Column<any>[] = gridStateService.getAssociatedGridColumns(grid!, _gridOptions.value.presets.columns);
1296-
if (gridPresetColumns && Array.isArray(gridPresetColumns) && gridPresetColumns.length > 0 && Array.isArray(_columnDefinitions.value)) {
1297-
// make sure that the dynamic columns are included in presets (1.Row Move, 2. Row Selection, 3. Row Detail)
1298-
if (_gridOptions.value.enableRowMoveManager) {
1299-
const rmmColId = _gridOptions.value?.rowMoveManager?.columnId ?? '_move';
1300-
insertDynamicPresetColumns(rmmColId, gridPresetColumns);
1301-
}
1302-
if (_gridOptions.value.enableCheckboxSelector) {
1303-
const chkColId = _gridOptions.value?.checkboxSelector?.columnId ?? '_checkbox_selector';
1304-
insertDynamicPresetColumns(chkColId, gridPresetColumns);
1305-
}
1306-
if (_gridOptions.value.enableRowDetailView) {
1307-
const rdvColId = _gridOptions.value?.rowDetailView?.columnId ?? '_detail_selector';
1308-
insertDynamicPresetColumns(rdvColId, gridPresetColumns);
1309-
}
1310-
1311-
// keep copy the original optional `width` properties optionally provided by the user.
1312-
// We will use this when doing a resize by cell content, if user provided a `width` it won't override it.
1313-
gridPresetColumns.forEach((col) => (col.originalWidth = col.width));
1314-
1315-
// finally sort and set the new presets columns (including checkbox selector if need be)
1316-
const orderedColumns = sortPresetColumns(_columnDefinitions.value, gridPresetColumns);
1317-
grid?.setColumns(orderedColumns);
1318-
}
1282+
// delegate to GridStateService for centralized column arrangement logic
1283+
// we pass `false` for triggerAutoSizeColumns to maintain original behavior on preset load
1284+
gridStateService.changeColumnsArrangement(_gridOptions.value.presets.columns, false);
13191285
}
13201286
}
13211287

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"clean": "remove --glob {demos,frameworks,frameworks-plugins,packages}/*/dist --glob=packages/*/tsconfig.tsbuildinfo --stat",
2727
"cypress": "cypress open --config-file test/cypress.config.ts",
2828
"cypress:ci": "cypress run --config-file test/cypress.config.ts",
29+
"cypress:install": "pnpm exec cypress install",
2930
"sass:bundle": "pnpm -r --stream --filter=./packages/common run sass:bundle",
3031
"build:universal": "tsc --build ./tsconfig.packages.json && pnpm sass:bundle",
3132
"build:frameworks": "pnpm -r --stream --filter=\"./{demos,frameworks,frameworks-plugins}/**\" run build",

0 commit comments

Comments
 (0)