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 <ehsan.rezaei@hyland.com>
This commit is contained in:
tomasz hanaj
2023-02-20 16:11:16 +01:00
committed by GitHub
parent b876102098
commit 477d49eaee
11 changed files with 128 additions and 28 deletions

View File

@@ -58,7 +58,7 @@
#resizableElement="adf-resizable" #resizableElement="adf-resizable"
(resizing)="onResizing($event, columnIndex)" (resizing)="onResizing($event, columnIndex)"
(resizeStart)="isResizing = true" (resizeStart)="isResizing = true"
(resizeEnd)="isResizing = false" (resizeEnd)="onResizingEnd()"
[attr.data-automation-id]="'auto_header_content_id_' + col.key" [attr.data-automation-id]="'auto_header_content_id_' + col.key"
class="adf-datatable-cell-header-content" class="adf-datatable-cell-header-content"
[ngClass]="{ 'adf-datatable-cell-header-content--hovered': [ngClass]="{ 'adf-datatable-cell-header-content--hovered':

View File

@@ -1982,4 +1982,28 @@ describe('Column Resizing', () => {
expect(dataTable.isResizing).toBeFalse(); expect(dataTable.isResizing).toBeFalse();
expect(tableBody.classList).not.toContain('adf-blur-datatable-body'); 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();
});
}); });

View File

@@ -175,6 +175,9 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges,
@Output() @Output()
columnOrderChanged = new EventEmitter<DataColumn[]>(); columnOrderChanged = new EventEmitter<DataColumn[]>();
@Output()
columnsWidthChanged = new EventEmitter<DataColumn[]>();
/** Flag that indicates if the datatable is in loading state and needs to show the /** 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). * 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; allColumns[colIndex].width = width;
this.data.setColumns(allColumns); this.data.setColumns(allColumns);
} }
onResizingEnd(): void {
this.isResizing = false;
const allColumns = this.data.getColumns();
this.columnsWidthChanged.emit(allColumns);
}
} }
export interface DataTableDropEvent { export interface DataTableDropEvent {

View File

@@ -39,6 +39,7 @@ export abstract class DataTableSchema<T = unknown> {
protected columnsOrderedByKey: string = 'id'; protected columnsOrderedByKey: string = 'id';
protected columnsVisibility: { [columnId: string]: boolean } | undefined; protected columnsVisibility: { [columnId: string]: boolean } | undefined;
protected columnsWidths: { [columnId: string]: number} | undefined;
private layoutPresets = {}; private layoutPresets = {};
@@ -62,7 +63,8 @@ export abstract class DataTableSchema<T = unknown> {
public createColumns(): void { public createColumns(): void {
const allColumns = this.mergeJsonAndHtmlSchema(); const allColumns = this.mergeJsonAndHtmlSchema();
const columns = this.setHiddenColumns(allColumns); const allColumnsWithWidth = this.setColumnsWidth(allColumns);
const columns = this.setHiddenColumns(allColumnsWithWidth);
this.columns = this.sortColumnsByKey(columns); this.columns = this.sortColumnsByKey(columns);
} }
@@ -144,4 +146,14 @@ export abstract class DataTableSchema<T = unknown> {
return columns; 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;
}
} }

View File

@@ -36,6 +36,7 @@ export class ObjectDataColumn<T = unknown> implements DataColumn<T> {
draggable: boolean; draggable: boolean;
isHidden: boolean; isHidden: boolean;
customData?: T; customData?: T;
width?: number;
constructor(input: any) { constructor(input: any) {
this.id = input.id ?? ''; this.id = input.id ?? '';
@@ -54,5 +55,6 @@ export class ObjectDataColumn<T = unknown> implements DataColumn<T> {
this.draggable = input.draggable ?? false; this.draggable = input.draggable ?? false;
this.isHidden = input.isHidden ?? false; this.isHidden = input.isHidden ?? false;
this.customData = input.customData; this.customData = input.customData;
this.width = input.width;
} }
} }

View File

@@ -20,7 +20,9 @@
(row-unselect)="onRowUnselect($any($event))" (row-unselect)="onRowUnselect($any($event))"
(row-keyup)="onRowKeyUp($any($event))" (row-keyup)="onRowKeyUp($any($event))"
(sorting-changed)="onSortingChanged($any($event))" (sorting-changed)="onSortingChanged($any($event))"
(columnOrderChanged)="onColumnOrderChanged($event)"> (columnOrderChanged)="onColumnOrderChanged($event)"
(columnsWidthChanged)="onColumnsWidthChanged($event)"
>
<adf-loading-content-template> <adf-loading-content-template>
<ng-template> <ng-template>
<mat-progress-spinner <mat-progress-spinner

View File

@@ -238,14 +238,16 @@ export class ProcessListCloudComponent extends DataTableSchema<ProcessListDataCo
const preferencesList = preferences?.list?.entries ?? []; const preferencesList = preferences?.list?.entries ?? [];
const columnsOrder = preferencesList.find(preference => preference.entry.key === ProcessListCloudPreferences.columnOrder); const columnsOrder = preferencesList.find(preference => preference.entry.key === ProcessListCloudPreferences.columnOrder);
const columnsVisibility = preferencesList.find(preference => preference.entry.key === ProcessListCloudPreferences.columnsVisibility); const columnsVisibility = preferencesList.find(preference => preference.entry.key === ProcessListCloudPreferences.columnsVisibility);
const columnsWidths = preferencesList.find(preference => preference.entry.key === ProcessListCloudPreferences.columnsWidths);
return { return {
columnsOrder: columnsOrder ? JSON.parse(columnsOrder.entry.value) : undefined, 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) { if (columnsVisibility) {
this.columnsVisibility = columnsVisibility; this.columnsVisibility = columnsVisibility;
} }
@@ -254,6 +256,11 @@ export class ProcessListCloudComponent extends DataTableSchema<ProcessListDataCo
this.columnsOrder = columnsOrder; this.columnsOrder = columnsOrder;
} }
if (columnsWidths) {
this.columnsWidths = columnsWidths;
}
this.createDatatableSchema(); this.createDatatableSchema();
}); });
} }
@@ -385,6 +392,23 @@ export class ProcessListCloudComponent extends DataTableSchema<ProcessListDataCo
} }
} }
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,
ProcessListCloudPreferences.columnsWidths,
this.columnsWidths
);
}
}
onRowClick(item: DataRowEvent) { onRowClick(item: DataRowEvent) {
this.currentInstanceId = item.value.getValue('id'); this.currentInstanceId = item.value.getValue('id');
this.rowClick.emit(this.currentInstanceId); this.rowClick.emit(this.currentInstanceId);

View File

@@ -18,5 +18,6 @@
// eslint-disable-next-line no-shadow // eslint-disable-next-line no-shadow
export enum ProcessListCloudPreferences { export enum ProcessListCloudPreferences {
columnOrder = 'processes-cloud-list-columns-order', columnOrder = 'processes-cloud-list-columns-order',
columnsVisibility = 'processes-cloud-columns-visibility' columnsVisibility = 'processes-cloud-columns-visibility',
columnsWidths = 'processes-cloud-columns-widths'
} }

View File

@@ -23,7 +23,9 @@
(rowClick)="onRowClick($any($event))" (rowClick)="onRowClick($any($event))"
(row-keyup)="onRowKeyUp($any($event))" (row-keyup)="onRowKeyUp($any($event))"
(sorting-changed)="onSortingChanged($any($event))" (sorting-changed)="onSortingChanged($any($event))"
(columnOrderChanged)="onColumnOrderChanged($event)"> (columnOrderChanged)="onColumnOrderChanged($event)"
(columnsWidthChanged)="onColumnsWidthChanged($event)"
>
<adf-loading-content-template> <adf-loading-content-template>
<ng-template> <ng-template>
<!-- Add your custom loading template here --> <!-- Add your custom loading template here -->

View File

@@ -172,13 +172,15 @@ export abstract class BaseTaskListCloudComponent<T = unknown> extends DataTableS
const preferencesList = preferences?.list?.entries ?? []; const preferencesList = preferences?.list?.entries ?? [];
const columnsOrder = preferencesList.find(preference => preference.entry.key === TasksListCloudPreferences.columnOrder); const columnsOrder = preferencesList.find(preference => preference.entry.key === TasksListCloudPreferences.columnOrder);
const columnsVisibility = preferencesList.find(preference => preference.entry.key === TasksListCloudPreferences.columnsVisibility); const columnsVisibility = preferencesList.find(preference => preference.entry.key === TasksListCloudPreferences.columnsVisibility);
const columnsWidths = preferencesList.find(preference => preference.entry.key === TasksListCloudPreferences.columnsWidths);
return { return {
columnsOrder: columnsOrder ? JSON.parse(columnsOrder.entry.value) : undefined, 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 }) => { ).subscribe(({ columnsOrder, columnsVisibility, columnsWidths }) => {
if (columnsOrder) { if (columnsOrder) {
this.columnsOrder = columnsOrder; this.columnsOrder = columnsOrder;
} }
@@ -187,6 +189,10 @@ export abstract class BaseTaskListCloudComponent<T = unknown> extends DataTableS
this.columnsVisibility = columnsVisibility; this.columnsVisibility = columnsVisibility;
} }
if (columnsWidths) {
this.columnsWidths = columnsWidths;
}
this.createDatatableSchema(); this.createDatatableSchema();
} }
); );
@@ -296,6 +302,23 @@ export abstract class BaseTaskListCloudComponent<T = unknown> extends DataTableS
this.reload(); 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) { setSorting(sortDetail) {
const sorting = sortDetail ? { const sorting = sortDetail ? {
orderBy: sortDetail.key, orderBy: sortDetail.key,
@@ -317,10 +340,10 @@ export abstract class BaseTaskListCloudComponent<T = unknown> extends DataTableS
replacePriorityValues(row: DataRow, column: DataColumn) { replacePriorityValues(row: DataRow, column: DataColumn) {
return column.key.split('.').reduce((source, key) => { 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[key] = this.taskCloudService.getPriorityLabel(source[key]);
} }
return source && typeof(source) === 'object' ? source[key] : undefined; return source && typeof (source) === 'object' ? source[key] : undefined;
}, row.obj); }, row.obj);
} }

View File

@@ -18,5 +18,6 @@
// eslint-disable-next-line no-shadow // eslint-disable-next-line no-shadow
export enum TasksListCloudPreferences { export enum TasksListCloudPreferences {
columnOrder = 'tasks-list-cloud-columns-order', columnOrder = 'tasks-list-cloud-columns-order',
columnsVisibility = 'tasks-list-cloud-columns-visibility' columnsVisibility = 'tasks-list-cloud-columns-visibility',
columnsWidths = 'tasks-list-cloud-columns-widths'
} }