From 477d49eaee3674c50104875fbdc776c483ac7dd8 Mon Sep 17 00:00:00 2001 From: tomasz hanaj <12088991+tomaszhanaj@users.noreply.github.com> Date: Mon, 20 Feb 2023 16:11:16 +0100 Subject: [PATCH] AAE-12578 added fn to save col width with preferences (#8296) * AAE-12578 added fn to save col width with preferences Resolved Conflict * AAE-12578 fixed formatting issues * Empty-Commit * AAE-12578 added resizing column feature to process list * AAE-12578: Removed duplicate component entry --------- Co-authored-by: Ehsan Rezaei --- .../datatable/datatable.component.html | 6 +- .../datatable/datatable.component.spec.ts | 24 ++++++++ .../datatable/datatable.component.ts | 9 +++ .../lib/datatable/data/data-table.schema.ts | 14 ++++- .../datatable/data/object-datacolumn.model.ts | 2 + .../process-list-cloud.component.html | 4 +- .../process-list-cloud.component.ts | 28 ++++++++- .../models/process-cloud-preferences.ts | 3 +- .../base-task-list-cloud.component.html | 4 +- .../base-task-list-cloud.component.ts | 59 +++++++++++++------ .../models/tasks-cloud-preferences.ts | 3 +- 11 files changed, 128 insertions(+), 28 deletions(-) diff --git a/lib/core/src/lib/datatable/components/datatable/datatable.component.html b/lib/core/src/lib/datatable/components/datatable/datatable.component.html index 6fe0ea69e4..120b13774c 100644 --- a/lib/core/src/lib/datatable/components/datatable/datatable.component.html +++ b/lib/core/src/lib/datatable/components/datatable/datatable.component.html @@ -31,7 +31,7 @@ let col of (data.getColumns() | filterOutEvery:'isHidden':true); let columnIndex = index" [attr.data-automation-id]="'auto_id_' + col.key" - [ngClass]="{ + [ngClass]="{ 'adf-sortable': col.sortable, 'adf-datatable__cursor--pointer': !isResizing, 'adf-datatable__header--sorted-asc': isColumnSorted(col, 'asc'), @@ -58,7 +58,7 @@ #resizableElement="adf-resizable" (resizing)="onResizing($event, columnIndex)" (resizeStart)="isResizing = true" - (resizeEnd)="isResizing = false" + (resizeEnd)="onResizingEnd()" [attr.data-automation-id]="'auto_header_content_id_' + col.key" class="adf-datatable-cell-header-content" [ngClass]="{ 'adf-datatable-cell-header-content--hovered': @@ -93,7 +93,7 @@ [class.adf-datatable__header--sorted-desc]="isColumnSorted(col, 'desc')"> -
{ expect(dataTable.isResizing).toBeFalse(); expect(tableBody.classList).not.toContain('adf-blur-datatable-body'); }); + + it('should emit on columns width change when resizing ends', () => { + spyOn(dataTable.columnsWidthChanged,'emit'); + + dataTable.isResizingEnabled = true; + fixture.detectChanges(); + + const resizeHandle: HTMLElement = fixture.debugElement.nativeElement.querySelector('.adf-datatable__resize-handle'); + resizeHandle.dispatchEvent(new MouseEvent('mousedown')); + fixture.detectChanges(); + + expect(dataTable.isResizing).toBeTrue(); + + resizeHandle.dispatchEvent(new MouseEvent('mousemove')); + fixture.detectChanges(); + + resizeHandle.dispatchEvent(new MouseEvent('mouseup')); + fixture.detectChanges(); + + expect(dataTable.isResizing).toBeFalse(); + expect(dataTable.columnsWidthChanged.emit).toHaveBeenCalled(); + + }); + }); diff --git a/lib/core/src/lib/datatable/components/datatable/datatable.component.ts b/lib/core/src/lib/datatable/components/datatable/datatable.component.ts index 9656c4cc25..f15625e116 100644 --- a/lib/core/src/lib/datatable/components/datatable/datatable.component.ts +++ b/lib/core/src/lib/datatable/components/datatable/datatable.component.ts @@ -175,6 +175,9 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, @Output() columnOrderChanged = new EventEmitter(); + @Output() + columnsWidthChanged = new EventEmitter(); + /** Flag that indicates if the datatable is in loading state and needs to show the * loading template (see the docs to learn how to configure a loading template). */ @@ -935,6 +938,12 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, allColumns[colIndex].width = width; this.data.setColumns(allColumns); } + + onResizingEnd(): void { + this.isResizing = false; + const allColumns = this.data.getColumns(); + this.columnsWidthChanged.emit(allColumns); + } } export interface DataTableDropEvent { diff --git a/lib/core/src/lib/datatable/data/data-table.schema.ts b/lib/core/src/lib/datatable/data/data-table.schema.ts index 263038d8e6..6bc6fc146a 100644 --- a/lib/core/src/lib/datatable/data/data-table.schema.ts +++ b/lib/core/src/lib/datatable/data/data-table.schema.ts @@ -39,6 +39,7 @@ export abstract class DataTableSchema { protected columnsOrderedByKey: string = 'id'; protected columnsVisibility: { [columnId: string]: boolean } | undefined; + protected columnsWidths: { [columnId: string]: number} | undefined; private layoutPresets = {}; @@ -62,7 +63,8 @@ export abstract class DataTableSchema { public createColumns(): void { const allColumns = this.mergeJsonAndHtmlSchema(); - const columns = this.setHiddenColumns(allColumns); + const allColumnsWithWidth = this.setColumnsWidth(allColumns); + const columns = this.setHiddenColumns(allColumnsWithWidth); this.columns = this.sortColumnsByKey(columns); } @@ -144,4 +146,14 @@ export abstract class DataTableSchema { return columns; } + + private setColumnsWidth(columns: DataColumn[]): DataColumn[] { + if(this.columnsWidths) { + return columns.map(column => { + const columnWidth = this.columnsWidths[column.id]; + return columnWidth === undefined ? column : {...column, width:columnWidth}; + }); + } + return columns; + } } diff --git a/lib/core/src/lib/datatable/data/object-datacolumn.model.ts b/lib/core/src/lib/datatable/data/object-datacolumn.model.ts index afcbc34d32..66332cbc47 100644 --- a/lib/core/src/lib/datatable/data/object-datacolumn.model.ts +++ b/lib/core/src/lib/datatable/data/object-datacolumn.model.ts @@ -36,6 +36,7 @@ export class ObjectDataColumn implements DataColumn { draggable: boolean; isHidden: boolean; customData?: T; + width?: number; constructor(input: any) { this.id = input.id ?? ''; @@ -54,5 +55,6 @@ export class ObjectDataColumn implements DataColumn { this.draggable = input.draggable ?? false; this.isHidden = input.isHidden ?? false; this.customData = input.customData; + this.width = input.width; } } diff --git a/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.html b/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.html index e479b832ab..5b1bb46276 100644 --- a/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.html +++ b/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.html @@ -20,7 +20,9 @@ (row-unselect)="onRowUnselect($any($event))" (row-keyup)="onRowKeyUp($any($event))" (sorting-changed)="onSortingChanged($any($event))" - (columnOrderChanged)="onColumnOrderChanged($event)"> + (columnOrderChanged)="onColumnOrderChanged($event)" + (columnsWidthChanged)="onColumnsWidthChanged($event)" + > preference.entry.key === ProcessListCloudPreferences.columnOrder); const columnsVisibility = preferencesList.find(preference => preference.entry.key === ProcessListCloudPreferences.columnsVisibility); + const columnsWidths = preferencesList.find(preference => preference.entry.key === ProcessListCloudPreferences.columnsWidths); return { columnsOrder: columnsOrder ? JSON.parse(columnsOrder.entry.value) : undefined, - columnsVisibility: columnsVisibility ? JSON.parse(columnsVisibility.entry.value) : this.columnsVisibility + columnsVisibility: columnsVisibility ? JSON.parse(columnsVisibility.entry.value) : this.columnsVisibility, + columnsWidths: columnsWidths ? JSON.parse(columnsWidths.entry.value) : undefined }; })) ) - .subscribe(({ columnsOrder, columnsVisibility }) => { + .subscribe(({ columnsOrder, columnsVisibility, columnsWidths }) => { if (columnsVisibility) { this.columnsVisibility = columnsVisibility; } @@ -254,6 +256,11 @@ export class ProcessListCloudComponent extends DataTableSchema { + if (column.width) { + widthsColumnsMap[column.id] = Math.ceil(column.width); + } + return widthsColumnsMap; + }, {}); + + if (this.appName) { + this.cloudPreferenceService.updatePreference( + this.appName, + ProcessListCloudPreferences.columnsWidths, + this.columnsWidths + ); + } + } + onRowClick(item: DataRowEvent) { this.currentInstanceId = item.value.getValue('id'); this.rowClick.emit(this.currentInstanceId); diff --git a/lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-preferences.ts b/lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-preferences.ts index fcab1e819a..0b752d8cc0 100644 --- a/lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-preferences.ts +++ b/lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-preferences.ts @@ -18,5 +18,6 @@ // eslint-disable-next-line no-shadow export enum ProcessListCloudPreferences { columnOrder = 'processes-cloud-list-columns-order', - columnsVisibility = 'processes-cloud-columns-visibility' + columnsVisibility = 'processes-cloud-columns-visibility', + columnsWidths = 'processes-cloud-columns-widths' } diff --git a/lib/process-services-cloud/src/lib/task/task-list/components/base-task-list-cloud.component.html b/lib/process-services-cloud/src/lib/task/task-list/components/base-task-list-cloud.component.html index 919eca0713..388f4e69d5 100644 --- a/lib/process-services-cloud/src/lib/task/task-list/components/base-task-list-cloud.component.html +++ b/lib/process-services-cloud/src/lib/task/task-list/components/base-task-list-cloud.component.html @@ -23,7 +23,9 @@ (rowClick)="onRowClick($any($event))" (row-keyup)="onRowKeyUp($any($event))" (sorting-changed)="onSortingChanged($any($event))" - (columnOrderChanged)="onColumnOrderChanged($event)"> + (columnOrderChanged)="onColumnOrderChanged($event)" + (columnsWidthChanged)="onColumnsWidthChanged($event)" + > diff --git a/lib/process-services-cloud/src/lib/task/task-list/components/base-task-list-cloud.component.ts b/lib/process-services-cloud/src/lib/task/task-list/components/base-task-list-cloud.component.ts index 26a813f6c0..5c0fe29ebb 100644 --- a/lib/process-services-cloud/src/lib/task/task-list/components/base-task-list-cloud.component.ts +++ b/lib/process-services-cloud/src/lib/task/task-list/components/base-task-list-cloud.component.ts @@ -130,10 +130,10 @@ export abstract class BaseTaskListCloudComponent extends DataTableS private onDestroy$ = new Subject(); constructor(appConfigService: AppConfigService, - private taskCloudService: TaskCloudService, - private userPreferences: UserPreferencesService, - presetKey: string, - private cloudPreferenceService: PreferenceCloudServiceInterface) { + private taskCloudService: TaskCloudService, + private userPreferences: UserPreferencesService, + presetKey: string, + private cloudPreferenceService: PreferenceCloudServiceInterface) { super(appConfigService, presetKey, taskPresetsCloudDefaultModel); this.size = userPreferences.paginationSize; @@ -172,23 +172,29 @@ export abstract class BaseTaskListCloudComponent extends DataTableS const preferencesList = preferences?.list?.entries ?? []; const columnsOrder = preferencesList.find(preference => preference.entry.key === TasksListCloudPreferences.columnOrder); const columnsVisibility = preferencesList.find(preference => preference.entry.key === TasksListCloudPreferences.columnsVisibility); + const columnsWidths = preferencesList.find(preference => preference.entry.key === TasksListCloudPreferences.columnsWidths); return { columnsOrder: columnsOrder ? JSON.parse(columnsOrder.entry.value) : undefined, - columnsVisibility: columnsVisibility ? JSON.parse(columnsVisibility.entry.value) : undefined + columnsVisibility: columnsVisibility ? JSON.parse(columnsVisibility.entry.value) : undefined, + columnsWidths: columnsWidths ? JSON.parse(columnsWidths.entry.value) : undefined }; })) - ).subscribe(({ columnsOrder, columnsVisibility }) => { - if (columnsOrder) { - this.columnsOrder = columnsOrder; - } - - if (columnsVisibility) { - this.columnsVisibility = columnsVisibility; - } - - this.createDatatableSchema(); + ).subscribe(({ columnsOrder, columnsVisibility, columnsWidths }) => { + if (columnsOrder) { + this.columnsOrder = columnsOrder; } + + if (columnsVisibility) { + this.columnsVisibility = columnsVisibility; + } + + if (columnsWidths) { + this.columnsWidths = columnsWidths; + } + + this.createDatatableSchema(); + } ); } @@ -266,7 +272,7 @@ export abstract class BaseTaskListCloudComponent extends DataTableS this.columnsOrder = columnsWithNewOrder.map(column => column.id); if (this.appName) { - this.cloudPreferenceService.updatePreference( + this.cloudPreferenceService.updatePreference( this.appName, TasksListCloudPreferences.columnOrder, this.columnsOrder @@ -296,6 +302,23 @@ export abstract class BaseTaskListCloudComponent extends DataTableS this.reload(); } + onColumnsWidthChanged(columns: DataColumn[]): void { + this.columnsWidths = columns.reduce((widthsColumnsMap, column) => { + if (column.width) { + widthsColumnsMap[column.id] = Math.ceil(column.width); + } + return widthsColumnsMap; + }, {}); + + if (this.appName) { + this.cloudPreferenceService.updatePreference( + this.appName, + TasksListCloudPreferences.columnsWidths, + this.columnsWidths + ); + } + } + setSorting(sortDetail) { const sorting = sortDetail ? { orderBy: sortDetail.key, @@ -317,10 +340,10 @@ export abstract class BaseTaskListCloudComponent extends DataTableS replacePriorityValues(row: DataRow, column: DataColumn) { return column.key.split('.').reduce((source, key) => { - if (key === 'priority' && source && typeof(source[key]) === 'number') { + if (key === 'priority' && source && typeof (source[key]) === 'number') { return source[key] = this.taskCloudService.getPriorityLabel(source[key]); } - return source && typeof(source) === 'object' ? source[key] : undefined; + return source && typeof (source) === 'object' ? source[key] : undefined; }, row.obj); } diff --git a/lib/process-services-cloud/src/lib/task/task-list/models/tasks-cloud-preferences.ts b/lib/process-services-cloud/src/lib/task/task-list/models/tasks-cloud-preferences.ts index 94f34d1cb5..cf23bcf9e9 100644 --- a/lib/process-services-cloud/src/lib/task/task-list/models/tasks-cloud-preferences.ts +++ b/lib/process-services-cloud/src/lib/task/task-list/models/tasks-cloud-preferences.ts @@ -18,5 +18,6 @@ // eslint-disable-next-line no-shadow export enum TasksListCloudPreferences { columnOrder = 'tasks-list-cloud-columns-order', - columnsVisibility = 'tasks-list-cloud-columns-visibility' + columnsVisibility = 'tasks-list-cloud-columns-visibility', + columnsWidths = 'tasks-list-cloud-columns-widths' }