|
7 | 7 | * |
8 | 8 | * SPDX-License-Identifier: EPL-2.0 |
9 | 9 | */ |
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'; |
11 | 11 | import {SampleColumnFactory, SampleCustomColumnForm} from '../index'; |
12 | 12 |
|
13 | 13 | export class SampleTableCustomizer extends TableCustomizer { |
14 | 14 |
|
15 | | - columnDatas: SampleCustomColumnDo[] = []; |
| 15 | + customColumnConfigs: SampleCustomColumnDo[] = []; |
16 | 16 |
|
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)); |
19 | 19 |
|
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 | + }); |
25 | 27 |
|
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 | + }); |
42 | 33 | } |
43 | 34 |
|
44 | | - override getCustomizerData(): ITableCustomizerDo { |
45 | | - if (arrays.empty(this.columnDatas)) { |
| 35 | + override getCustomizerData(): SampleTableCustomizerDo { |
| 36 | + if (arrays.empty(this.customColumnConfigs)) { |
46 | 37 | return null; |
47 | 38 | } |
48 | 39 | return scout.create(SampleTableCustomizerDo, { |
49 | | - columns: [...this.columnDatas] |
| 40 | + customColumns: [...this.customColumnConfigs] |
50 | 41 | }); |
51 | 42 | } |
52 | 43 |
|
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>[]> { |
54 | 84 | let form = scout.create(SampleCustomColumnForm, { |
55 | 85 | parent: this.table, |
56 | 86 | hiddenColumns: this.table.organizer.getInvisibleColumns() |
57 | 87 | }); |
58 | 88 | form.open(); |
59 | | - return form.whenSave().then(() => { |
| 89 | + let newColumns: Column<any>[] = []; |
| 90 | + form.whenSave().then(async () => { |
60 | 91 | 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); |
65 | 95 | } else if (form.hiddenColumns) { |
66 | 96 | form.hiddenColumns.forEach(column => { |
67 | 97 | column.setVisible(true); |
68 | | - let position = this.table.visibleColumns().indexOf(insertAfterColumn); |
| 98 | + let position = typeof positionOrInsertAfterColumn === 'number' ? positionOrInsertAfterColumn : this.table.visibleColumns().indexOf(positionOrInsertAfterColumn); |
69 | 99 | if (position >= 0) { |
70 | 100 | this.table.moveColumn(column, position); |
71 | 101 | } |
72 | 102 | }); |
| 103 | + arrays.pushAll(newColumns, form.hiddenColumns); |
73 | 104 | } |
74 | 105 | }); |
| 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); |
75 | 118 | } |
76 | 119 |
|
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()); |
79 | 122 | let form = scout.create(SampleCustomColumnForm, { |
80 | 123 | parent: this.table, |
81 | | - data: oldColumnData |
| 124 | + data: oldColumnConfigs |
82 | 125 | }); |
83 | 126 | 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); |
89 | 132 | }); |
| 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); |
90 | 156 | } |
91 | 157 |
|
92 | | - override removeColumns(columns: Column<any>[]) { |
| 158 | + override removeCustomColumns(columns: Column<any>[]) { |
93 | 159 | 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); |
96 | 162 | }); |
97 | 163 | this.table.deleteColumns(columns); |
98 | 164 | } |
99 | 165 |
|
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); |
103 | 169 | this.table.deleteColumns(columnsToDelete); |
104 | 170 | } |
105 | 171 |
|
106 | 172 | 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()); |
108 | 174 | } |
109 | 175 | } |
110 | 176 |
|
111 | 177 | @typeName('jswidgets.SampleTableCustomizer') |
112 | 178 | export class SampleTableCustomizerDo extends BaseDoEntity implements ITableCustomizerDo { |
113 | | - columns: SampleCustomColumnDo[]; |
| 179 | + customColumns: SampleCustomColumnDo[]; |
114 | 180 | } |
115 | 181 |
|
116 | 182 | @typeName('jswidgets.SampleCustomColumn') |
117 | | -export class SampleCustomColumnDo extends BaseDoEntity { |
| 183 | +export class SampleCustomColumnDo extends BaseDoEntity implements IColumnConfigDo { |
118 | 184 | columnId: string; |
119 | 185 | columnType: SampleCustomColumnType; |
120 | 186 | name?: string; |
|
0 commit comments