Skip to content

Commit 4579aa0

Browse files
committed
SampleTableCustomizer: adjust to api changes
427023
1 parent 1e1c7f3 commit 4579aa0

File tree

3 files changed

+134
-61
lines changed

3 files changed

+134
-61
lines changed

code/widgets/org.eclipse.scout.jswidgets.ui.html/src/main/js/page/SampleColumnFactory.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
* SPDX-License-Identifier: EPL-2.0
99
*/
10-
import {BooleanColumn, Column, Constructor, DateColumn, NumberColumn, ObjectOrChildModel, scout} from '@eclipse-scout/core';
10+
import {BooleanColumn, Column, Constructor, DateColumn, NumberColumn, scout, Table} from '@eclipse-scout/core';
1111
import {SampleCustomColumnDo, SampleCustomColumnType} from '../index';
1212

1313
export class SampleColumnFactory {
@@ -21,13 +21,15 @@ export class SampleColumnFactory {
2121
return SampleColumnFactory._INSTANCE;
2222
}
2323

24-
createColumn(columnData: SampleCustomColumnDo): ObjectOrChildModel<Column> {
25-
return {
26-
uuid: columnData.columnId,
27-
objectType: this._columnTypeToObjectType(columnData.columnType),
28-
text: columnData.name,
29-
width: columnData.width
30-
};
24+
createColumn(param: SampleColumnFactoryParam): Column<any> {
25+
let columnConfig = param.columnConfig;
26+
let objectType = this._columnTypeToObjectType(columnConfig.columnType);
27+
return scout.create(objectType, {
28+
parent: param.parent,
29+
uuid: columnConfig.columnId,
30+
text: columnConfig.name,
31+
width: columnConfig.width
32+
});
3133
}
3234

3335
protected _columnTypeToObjectType(columnType: SampleCustomColumnType): Constructor<Column<any>> {
@@ -43,3 +45,8 @@ export class SampleColumnFactory {
4345
}
4446
}
4547
}
48+
49+
export class SampleColumnFactoryParam {
50+
parent: Table;
51+
columnConfig: SampleCustomColumnDo;
52+
}

code/widgets/org.eclipse.scout.jswidgets.ui.html/src/main/js/page/SamplePageWithTable.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ export class SamplePageWithTable extends PageWithTable {
106106
let contribution = scout.create(SampleCustomColumnRestrictionContributionDo, {
107107
columnTypes: new Map()
108108
});
109-
customizerData.columns.forEach(customColumn => {
109+
customizerData.customColumns.forEach(customColumn => {
110110
contribution.columnTypes.set(customColumn.columnId, customColumn.columnType);
111111
});
112112
dataObjects.addContribution(contribution, restriction);

code/widgets/org.eclipse.scout.jswidgets.ui.html/src/main/js/page/SampleTableCustomizer.ts

Lines changed: 118 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -7,114 +7,180 @@
77
*
88
* SPDX-License-Identifier: EPL-2.0
99
*/
10-
import {arrays, BaseDoEntity, Column, ITableCustomizerDo, scout, Table, TableCustomizer, typeName} from '@eclipse-scout/core';
10+
import {arrays, BaseDoEntity, Column, IColumnConfigDo, ITableCustomizerDo, scout, Table, TableCustomizer, TableCustomizerCreateColumnsOptions, tableUiPreferences, typeName} from '@eclipse-scout/core';
1111
import {SampleColumnFactory, SampleCustomColumnForm} from '../index';
1212

1313
export class SampleTableCustomizer extends TableCustomizer {
1414

15-
columnDatas: SampleCustomColumnDo[] = [];
15+
customColumnConfigs: SampleCustomColumnDo[] = [];
1616

17-
override setCustomizerData(customizerData: ITableCustomizerDo) {
18-
let oldCustomColumnIds = new Set(this.columnDatas.map(columnData => columnData.columnId).filter(Boolean));
17+
override async setCustomizerData(customizerData: SampleTableCustomizerDo): Promise<void> {
18+
let oldCustomColumnIds = new Set(this.customColumnConfigs.map(columnConfig => columnConfig.columnId).filter(Boolean));
1919

20-
if (customizerData instanceof SampleTableCustomizerDo) {
21-
this.columnDatas = [...arrays.ensure(customizerData.columns).filter(columnData => !!columnData.columnId)];
22-
} else {
23-
this.columnDatas = [];
24-
}
20+
this.customColumnConfigs = arrays.ensure(customizerData?.customColumns).filter(columnConfig => !!columnConfig.columnId);
21+
22+
// Delete all custom columns that are no longer part of the customizer data
23+
let preservedColumns = this.table.columns.filter(column => !oldCustomColumnIds.has(column.buildUuid()));
24+
tableUiPreferences.withIgnoreTableEvents(() => {
25+
this.table.setColumns(preservedColumns);
26+
});
2527

26-
let newCustomColumnIds = new Set(this.columnDatas.map(columnData => columnData.columnId).filter(Boolean));
27-
let customColumnIdsToDelete = new Set([...oldCustomColumnIds].filter(columnId => !newCustomColumnIds.has(columnId)));
28-
29-
// Preserve non-custom columns and all custom columns that are still existing
30-
let preservedColumns = this.table.columns
31-
.filter(column => !customColumnIdsToDelete.has(column.buildUuid()));
32-
// Create new column instances for all custom columns that don't yet exist
33-
let newColumns = this.columnDatas
34-
.filter(columnData => !oldCustomColumnIds.has(columnData.columnId))
35-
.map(columnData => SampleColumnFactory.get().createColumn(columnData))
36-
.filter(Boolean);
37-
38-
this.table.setColumns([
39-
...preservedColumns,
40-
...newColumns
41-
]);
28+
// Create and insert new columns
29+
await this.createColumns(this.customColumnConfigs, {
30+
insertIntoTable: true,
31+
applyPreferences: true
32+
});
4233
}
4334

44-
override getCustomizerData(): ITableCustomizerDo {
45-
if (arrays.empty(this.columnDatas)) {
35+
override getCustomizerData(): SampleTableCustomizerDo {
36+
if (arrays.empty(this.customColumnConfigs)) {
4637
return null;
4738
}
4839
return scout.create(SampleTableCustomizerDo, {
49-
columns: [...this.columnDatas]
40+
customColumns: [...this.customColumnConfigs]
5041
});
5142
}
5243

53-
override addColumn(insertAfterColumn?: Column<any>): JQuery.Promise<void> {
44+
override async createColumns(columnConfigs: SampleCustomColumnDo[], options?: TableCustomizerCreateColumnsOptions): Promise<Column<any>[]> {
45+
columnConfigs = arrays.ensure(columnConfigs).filter(columnConfig => !!columnConfig.columnId);
46+
47+
if (arrays.empty(columnConfigs)) {
48+
return []; // done
49+
}
50+
51+
let newColumns = columnConfigs.map(columnConfig => this._createColumn(columnConfig));
52+
53+
if (options?.insertIntoTable) {
54+
let newColumnIds = new Set(columnConfigs.map(columnConfig => columnConfig.columnId).filter(Boolean));
55+
let preservedColumns = this.table.columns.filter(column => !newColumnIds.has(column.buildUuid()));
56+
let columns = [...preservedColumns];
57+
58+
let insertPosition = columns.length;
59+
if (options?.positionOrInsertAfterColumn instanceof Column) {
60+
let index = preservedColumns.indexOf(options.positionOrInsertAfterColumn);
61+
if (index !== -1) {
62+
insertPosition = index + 1;
63+
}
64+
} else if (typeof options?.positionOrInsertAfterColumn === 'number') {
65+
insertPosition = Math.max(0, options.positionOrInsertAfterColumn);
66+
}
67+
arrays.insertAll(columns, newColumns, insertPosition);
68+
69+
// Set new column structure synchronously (this will also save it to the ui preferences)
70+
this.table.setColumns(columns);
71+
}
72+
73+
return newColumns;
74+
}
75+
76+
protected _createColumn(columnConfig: SampleCustomColumnDo): Column<any> {
77+
return SampleColumnFactory.get().createColumn({
78+
parent: this.table,
79+
columnConfig: columnConfig
80+
});
81+
}
82+
83+
override async addCustomColumn(positionOrInsertAfterColumn?: number | Column<any>): Promise<Column<any>[]> {
5484
let form = scout.create(SampleCustomColumnForm, {
5585
parent: this.table,
5686
hiddenColumns: this.table.organizer.getInvisibleColumns()
5787
});
5888
form.open();
59-
return form.whenSave().then(() => {
89+
let newColumns: Column<any>[] = [];
90+
form.whenSave().then(async () => {
6091
if (form.data) {
61-
let columnData = form.data;
62-
this.columnDatas.push(columnData);
63-
this.table.insertColumn(SampleColumnFactory.get().createColumn(columnData), insertAfterColumn);
64-
this.table.reload(Table.ReloadReason.ORGANIZE_COLUMNS);
92+
let newColumnConfig = form.data;
93+
let newColumn = await this.addCustomColumnConfig(newColumnConfig, positionOrInsertAfterColumn);
94+
newColumns.push(newColumn);
6595
} else if (form.hiddenColumns) {
6696
form.hiddenColumns.forEach(column => {
6797
column.setVisible(true);
68-
let position = this.table.visibleColumns().indexOf(insertAfterColumn);
98+
let position = typeof positionOrInsertAfterColumn === 'number' ? positionOrInsertAfterColumn : this.table.visibleColumns().indexOf(positionOrInsertAfterColumn);
6999
if (position >= 0) {
70100
this.table.moveColumn(column, position);
71101
}
72102
});
103+
arrays.pushAll(newColumns, form.hiddenColumns);
73104
}
74105
});
106+
await form.whenClose();
107+
return newColumns;
108+
}
109+
110+
override async addCustomColumnConfig(columnConfig: SampleCustomColumnDo, positionOrInsertAfterColumn?: number | Column<any>): Promise<Column<any>> {
111+
this.customColumnConfigs.push(columnConfig);
112+
113+
let column = this._createColumn(columnConfig);
114+
this.table.insertColumn(column, positionOrInsertAfterColumn);
115+
this.table.reload(Table.ReloadReason.ORGANIZE_COLUMNS);
116+
117+
return this.table.columnByUuid(columnConfig.columnId);
75118
}
76119

77-
override modifyColumn(column: Column<any>): JQuery.Promise<void> {
78-
let oldColumnData = this.columnDatas.find(columnData => columnData.columnId === column.buildUuid());
120+
override async modifyCustomColumn(column: Column<any>): Promise<Column<any>[]> {
121+
let oldColumnConfigs = this.customColumnConfigs.find(columnConfig => columnConfig.columnId === column.buildUuid());
79122
let form = scout.create(SampleCustomColumnForm, {
80123
parent: this.table,
81-
data: oldColumnData
124+
data: oldColumnConfigs
82125
});
83126
form.open();
84-
return form.whenSave().then(() => {
85-
let newColumnData = form.data;
86-
arrays.replace(this.columnDatas, oldColumnData, newColumnData);
87-
this.table.setColumns(this.table.columns.map(col => col === column ? SampleColumnFactory.get().createColumn(newColumnData) : col));
88-
this.table.reload(Table.ReloadReason.ORGANIZE_COLUMNS);
127+
let newColumns: Column<any>[] = [];
128+
form.whenSave().then(() => {
129+
let newColumnConfig = form.data;
130+
let newColumn = this._modifyColumnConfig(column, oldColumnConfigs, newColumnConfig);
131+
newColumns.push(newColumn);
89132
});
133+
await form.whenClose();
134+
return newColumns;
135+
}
136+
137+
override async modifyCustomColumnConfig(newColumnConfig: SampleCustomColumnDo): Promise<Column<any>> {
138+
let oldColumnConfig = this.customColumnConfigs.find(columnConfig => columnConfig.columnId === newColumnConfig.columnId);
139+
if (!oldColumnConfig) {
140+
return null;
141+
}
142+
let column = this.table.columnByUuid(newColumnConfig.columnId);
143+
if (!column) {
144+
return null;
145+
}
146+
return this._modifyColumnConfig(column, oldColumnConfig, newColumnConfig);
147+
}
148+
149+
protected _modifyColumnConfig(column: Column<any>, oldColumnConfig: SampleCustomColumnDo, newColumnConfig: SampleCustomColumnDo): Column<any> {
150+
arrays.replace(this.customColumnConfigs, oldColumnConfig, newColumnConfig);
151+
152+
this.table.setColumns(this.table.columns.map(col => col === column ? this._createColumn(newColumnConfig) : col));
153+
this.table.reload(Table.ReloadReason.ORGANIZE_COLUMNS);
154+
155+
return this.table.columnByUuid(newColumnConfig.columnId);
90156
}
91157

92-
override removeColumns(columns: Column<any>[]) {
158+
override removeCustomColumns(columns: Column<any>[]) {
93159
columns.forEach(column => {
94-
let oldColumnData = this.columnDatas.find(columnData => columnData.columnId === column.buildUuid());
95-
arrays.remove(this.columnDatas, oldColumnData);
160+
let oldColumnConfig = this.customColumnConfigs.find(columnConfig => columnConfig.columnId === column.buildUuid());
161+
arrays.remove(this.customColumnConfigs, oldColumnConfig);
96162
});
97163
this.table.deleteColumns(columns);
98164
}
99165

100-
override removeAllColumns() {
101-
let columnsToDelete = this.columnDatas.map(columnData => this.table.columnByUuid(columnData.columnId)).filter(Boolean);
102-
arrays.clear(this.columnDatas);
166+
override removeAllCustomColumns() {
167+
let columnsToDelete = this.customColumnConfigs.map(columnConfig => this.table.columnByUuid(columnConfig.columnId)).filter(Boolean);
168+
arrays.clear(this.customColumnConfigs);
103169
this.table.deleteColumns(columnsToDelete);
104170
}
105171

106172
override isCustomizable(column: Column<any>): boolean {
107-
return this.columnDatas.some(columnData => columnData.columnId === column.buildUuid());
173+
return this.customColumnConfigs.some(columnConfig => columnConfig.columnId === column.buildUuid());
108174
}
109175
}
110176

111177
@typeName('jswidgets.SampleTableCustomizer')
112178
export class SampleTableCustomizerDo extends BaseDoEntity implements ITableCustomizerDo {
113-
columns: SampleCustomColumnDo[];
179+
customColumns: SampleCustomColumnDo[];
114180
}
115181

116182
@typeName('jswidgets.SampleCustomColumn')
117-
export class SampleCustomColumnDo extends BaseDoEntity {
183+
export class SampleCustomColumnDo extends BaseDoEntity implements IColumnConfigDo {
118184
columnId: string;
119185
columnType: SampleCustomColumnType;
120186
name?: string;

0 commit comments

Comments
 (0)