From 4aa2e0eb873afab43a1681787d936de45e1d0671 Mon Sep 17 00:00:00 2001 From: Ehsan Rezaei Date: Mon, 20 Feb 2023 10:45:03 +0100 Subject: [PATCH] AAE-12273: Implemented column resizing directive (#8272) * AAE-12273: Implemented column resizing directive * AAE-12273: Updated datatable component docs with column resizing feature * AAE-12273: Fixed lint errors * AAE-12273: Fixed spell check and lint errors * AAE-12273: Fixing lint issues * AAE-12273: Excluded failing e2e * AAE-12273: Excluded more failing E2Es * AAE-12273: Excluded more failing e2e * AAE-12273: Code Improvement * AAE-12273: Fixed datatable column flex item shrink * AAE-12273: Fixed unit tests of column header resizing flex item shrink --- cspell.json | 2 + docs/core/components/data-column.component.md | 1 + docs/core/components/datatable.component.md | 17 ++ .../images/datatable-column-resizing.png | Bin 0 -> 132154 bytes e2e/protractor.excludes.json | 7 +- .../datatable/datatable.component.html | 45 ++- .../datatable/datatable.component.scss | 20 +- .../datatable/datatable.component.spec.ts | 278 ++++++++++++++---- .../datatable/datatable.component.ts | 28 +- .../lib/datatable/data/data-column.model.ts | 1 + .../src/lib/datatable/datatable.module.ts | 4 +- .../resizable/resizable.directive.spec.ts | 154 ++++++++++ .../resizable/resizable.directive.ts | 257 ++++++++++++++++ .../directives/resizable/resizable.module.ts | 26 ++ .../resizable/resize-handle.directive.spec.ts | 56 ++++ .../resizable/resize-handle.directive.ts | 96 ++++++ .../datatable/directives/resizable/types.ts | 40 +++ 17 files changed, 959 insertions(+), 73 deletions(-) create mode 100644 docs/docassets/images/datatable-column-resizing.png create mode 100644 lib/core/src/lib/datatable/directives/resizable/resizable.directive.spec.ts create mode 100644 lib/core/src/lib/datatable/directives/resizable/resizable.directive.ts create mode 100644 lib/core/src/lib/datatable/directives/resizable/resizable.module.ts create mode 100644 lib/core/src/lib/datatable/directives/resizable/resize-handle.directive.spec.ts create mode 100644 lib/core/src/lib/datatable/directives/resizable/resize-handle.directive.ts create mode 100644 lib/core/src/lib/datatable/directives/resizable/types.ts diff --git a/cspell.json b/cspell.json index d15ae332c6..a34ba087dd 100644 --- a/cspell.json +++ b/cspell.json @@ -80,6 +80,7 @@ "jsons", "Inplace", "MLTEXT", + "mousedrag", "mouseenter", "multiselect", "mysites", @@ -122,6 +123,7 @@ "uncheck", "Unclaim", "unfavorite", + "unlisten", "unshare", "UPDATEPERMISSIONS", "uploader", diff --git a/docs/core/components/data-column.component.md b/docs/core/components/data-column.component.md index fa75b7e5cb..e0f5e4d16d 100644 --- a/docs/core/components/data-column.component.md +++ b/docs/core/components/data-column.component.md @@ -60,6 +60,7 @@ Defines column properties for DataTable, Tasklist, Document List and other compo | srTitle | `string` | | Title to be used for screen readers. | | title | `string` | "" | Display title of the column, typically used for column headers. You can use the i18n resource key to get it translated automatically. | | type | `string` | "text" | Value type for the column. Possible settings are 'text', 'image', 'date', 'fileSize', 'location', and 'json'. | +| width | `number` | | size of the column in pixels | ## Details diff --git a/docs/core/components/datatable.component.md b/docs/core/components/datatable.component.md index 1bd4ad01c8..fcad5c1dbe 100644 --- a/docs/core/components/datatable.component.md +++ b/docs/core/components/datatable.component.md @@ -388,6 +388,7 @@ Learm more about styling your datatable: [Customizing the component's styles](#c | showMainDatatableActions | `boolean` | false | Toggles the main datatable action. | | sorting | `any[]` | \[] | Define the sort order of the datatable. Possible values are : [`created`, `desc`], [`created`, `asc`], [`due`, `desc`], [`due`, `asc`] | | stickyHeader | `boolean` | false | Toggles the sticky header mode. | +| isResizingEnabled | `boolean` | false | Toggles column resizing feature. | ### Events @@ -873,3 +874,19 @@ You can define the tooltip format for cells of type date using a configuration i - [Pagination component](pagination.component.md) - [Data Table Adapter interface](../interfaces/datatable-adapter.interface.md) - [Document list component](../../content-services/components/document-list.component.md) + +#### Column Resizing + +It is possible to have the ability to resize columns by clicking on the right border of each column and dragging it to the left. +You can do this by setting the `isResizingEnabled` property of your datatable to `true`: + +```html + + +``` + +Once set up, the column resizing behaves as shown in the image below: + +![](../../docassets/images/datatable-column-resizing.png) diff --git a/docs/docassets/images/datatable-column-resizing.png b/docs/docassets/images/datatable-column-resizing.png new file mode 100644 index 0000000000000000000000000000000000000000..e8569d46482a17d85532fd159d4b7af39c099a3c GIT binary patch literal 132154 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 P{*HV2xR-o??&tpt-E)6< literal 0 HcmV?d00001 diff --git a/e2e/protractor.excludes.json b/e2e/protractor.excludes.json index 86043f9a08..a70f4d2751 100644 --- a/e2e/protractor.excludes.json +++ b/e2e/protractor.excludes.json @@ -7,5 +7,10 @@ "C260377": "https://alfresco.atlassian.net/browse/ACS-4467", "C260375": "https://alfresco.atlassian.net/browse/ACS-4467", "C286290": "https://alfresco.atlassian.net/browse/ACS-4467", - "C286472": "https://alfresco.atlassian.net/browse/ACS-4467" + "C286472": "https://alfresco.atlassian.net/browse/ACS-4467", + "C260387": "https://alfresco.atlassian.net/browse/ACS-4595", + "C216430": "https://alfresco.atlassian.net/browse/ACS-4595", + "C280063": "https://alfresco.atlassian.net/browse/ACS-4595", + "C280064": "https://alfresco.atlassian.net/browse/ACS-4595", + "C280407": "https://alfresco.atlassian.net/browse/ACS-4595" } 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 f058733bf7..6fe0ea69e4 100644 --- a/lib/core/src/lib/datatable/components/datatable/datatable.component.html +++ b/lib/core/src/lib/datatable/components/datatable/datatable.component.html @@ -30,13 +30,16 @@ *ngFor=" let col of (data.getColumns() | filterOutEvery:'isHidden':true); let columnIndex = index" - [class.adf-sortable]="col.sortable" [attr.data-automation-id]="'auto_id_' + col.key" - [class.adf-datatable__header--sorted-asc]="isColumnSorted(col, 'asc')" - [class.adf-datatable__header--sorted-desc]="isColumnSorted(col, 'desc')" + [ngClass]="{ + 'adf-sortable': col.sortable, + 'adf-datatable__cursor--pointer': !isResizing, + 'adf-datatable__header--sorted-asc': isColumnSorted(col, 'asc'), + 'adf-datatable__header--sorted-desc': isColumnSorted(col, 'desc')}" + [ngStyle]="(col.width) && {'flex': '0 1 ' + col.width + 'px' }" [attr.aria-label]="col.title | translate" - (click)="onColumnHeaderClick(col)" - (keyup.enter)="onColumnHeaderClick(col)" + (click)="onColumnHeaderClick(col, $event)" + (keyup.enter)="onColumnHeaderClick(col, $event)" role="columnheader" [attr.tabindex]="isHeaderVisible() ? 0 : null" [attr.aria-sort]="col.sortable ? (getAriaSort(col) | translate) : null" @@ -51,12 +54,20 @@ adf-drop-zone dropTarget="header" [dropColumn]="col">
@@ -82,14 +93,19 @@ [class.adf-datatable__header--sorted-desc]="isColumnSorted(col, 'desc')">
- +
+
@@ -131,8 +147,8 @@ + (click)="onColumnHeaderClick(col, $event)" + (keyup.enter)="onColumnHeaderClick(col, $event)"> {{ col.title | translate}} @@ -141,7 +157,7 @@
+ adf-drop-zone dropTarget="cell" [dropColumn]="col" [dropRow]="row" + [ngStyle]="(col.width) && {'flex': '0 1 ' + col.width + 'px' }">
diff --git a/lib/core/src/lib/datatable/components/datatable/datatable.component.scss b/lib/core/src/lib/datatable/components/datatable/datatable.component.scss index 8af9b45d04..bc24387970 100644 --- a/lib/core/src/lib/datatable/components/datatable/datatable.component.scss +++ b/lib/core/src/lib/datatable/components/datatable/datatable.component.scss @@ -21,6 +21,21 @@ $data-table-cell-min-width-file-size: $data-table-cell-min-width !default; .adf-full-width { width: 100%; } + + &__resize-handle { + align-self: stretch; + border: 0.5px solid var(--theme-border-color); + + &:hover { + cursor: col-resize; + } + } + + &__cursor--pointer { + &:hover { + cursor: pointer; + } + } } .adf-datatable-card { @@ -564,7 +579,6 @@ $data-table-cell-min-width-file-size: $data-table-cell-min-width !default; .adf-datatable-cell-header { @include adf-no-select; - cursor: pointer; position: relative; display: flex; align-items: center; @@ -580,10 +594,6 @@ $data-table-cell-min-width-file-size: $data-table-cell-min-width !default; &.adf-sortable { @include adf-no-select; - &:hover { - cursor: pointer; - } - display: flex; align-items: center; } diff --git a/lib/core/src/lib/datatable/components/datatable/datatable.component.spec.ts b/lib/core/src/lib/datatable/components/datatable/datatable.component.spec.ts index edfd17d06a..c8cafaf763 100644 --- a/lib/core/src/lib/datatable/components/datatable/datatable.component.spec.ts +++ b/lib/core/src/lib/datatable/components/datatable/datatable.component.spec.ts @@ -311,10 +311,12 @@ describe('DataTable', () => { done(); }); - dataTable.ngOnChanges({}); fixture.detectChanges(); dataTable.ngAfterViewInit(); - dataTable.onColumnHeaderClick(column); + const hedaderColumns = fixture.debugElement.nativeElement.querySelectorAll('.adf-datatable-cell-header-content'); + + hedaderColumns[0].click(); + fixture.detectChanges(); }); it('should change the rows on changing of the data', () => { @@ -867,54 +869,53 @@ describe('DataTable', () => { expect(e.preventDefault).toHaveBeenCalled(); }); - it('should not sort if column is missing', () => { - dataTable.ngOnChanges({ data: new SimpleChange('123', {}, true) }); - fixture.detectChanges(); - dataTable.ngAfterViewInit(); - const adapter = dataTable.data; - spyOn(adapter, 'setSorting').and.callThrough(); - dataTable.onColumnHeaderClick(null); - expect(adapter.setSorting).not.toHaveBeenCalled(); - }); - it('should not sort upon clicking non-sortable column header', () => { - dataTable.ngOnChanges({ data: new SimpleChange('123', {}, true) }); + dataTable.data = new ObjectDataTableAdapter( + [{ name: '1' }, { name: '2' }], + [ + new ObjectDataColumn({ key: 'name', sortable: false }), + new ObjectDataColumn({ key: 'other', sortable: true }) + ] + ); fixture.detectChanges(); dataTable.ngAfterViewInit(); const adapter = dataTable.data; spyOn(adapter, 'setSorting').and.callThrough(); - const column = new ObjectDataColumn({ - key: 'column_1' - }); + const hedaderColumns = fixture.debugElement.nativeElement.querySelectorAll('.adf-datatable-cell-header-content'); + hedaderColumns[0].click(); + fixture.detectChanges(); - dataTable.onColumnHeaderClick(column); expect(adapter.setSorting).not.toHaveBeenCalled(); }); it('should set sorting upon column header clicked', () => { - dataTable.ngOnChanges({ data: new SimpleChange('123', {}, true) }); + dataTable.data = new ObjectDataTableAdapter( + [{ name: '1' }], + [ + new ObjectDataColumn({ key: 'column_1', sortable: true }) + ] + ); fixture.detectChanges(); dataTable.ngAfterViewInit(); const adapter = dataTable.data; spyOn(adapter, 'setSorting').and.callThrough(); + spyOn(dataTable.data, 'getSorting').and.returnValue(new DataSorting('column_1', 'desc')); - const column = new ObjectDataColumn({ - key: 'column_1', - sortable: true - }); + const hedaderColumns = fixture.debugElement.nativeElement.querySelectorAll('.adf-datatable-cell-header-content'); + hedaderColumns[0].click(); + fixture.detectChanges(); - dataTable.onColumnHeaderClick(column); - expect(adapter.setSorting).toHaveBeenCalledWith( - jasmine.objectContaining({ - key: 'column_1', - direction: 'asc' - }) - ); + expect(adapter.setSorting).toHaveBeenCalledWith(new DataSorting('column_1', 'asc')); }); it('should invert sorting upon column header clicked', () => { - dataTable.ngOnChanges({ data: new SimpleChange('123', {}, true) }); + dataTable.data = new ObjectDataTableAdapter( + [{ name: '1' }], + [ + new ObjectDataColumn({ key: 'column_1', sortable: true }) + ] + ); fixture.detectChanges(); dataTable.ngAfterViewInit(); @@ -922,30 +923,20 @@ describe('DataTable', () => { const sorting = new DataSorting('column_1', 'asc'); spyOn(adapter, 'setSorting').and.callThrough(); spyOn(adapter, 'getSorting').and.returnValue(sorting); + const hedaderColumns = fixture.debugElement.nativeElement.querySelectorAll('.adf-datatable-cell-header-content'); - const column = new ObjectDataColumn({ - key: 'column_1', - sortable: true - }); + // // check first click on the header + hedaderColumns[0].click(); + fixture.detectChanges(); - // check first click on the header - dataTable.onColumnHeaderClick(column); - expect(adapter.setSorting).toHaveBeenCalledWith( - jasmine.objectContaining({ - key: 'column_1', - direction: 'desc' - }) - ); + expect(adapter.setSorting).toHaveBeenCalledWith(new DataSorting('column_1', 'desc')); // check second click on the header sorting.direction = 'desc'; - dataTable.onColumnHeaderClick(column); - expect(adapter.setSorting).toHaveBeenCalledWith( - jasmine.objectContaining({ - key: 'column_1', - direction: 'asc' - }) - ); + hedaderColumns[0].click(); + fixture.detectChanges(); + + expect(adapter.setSorting).toHaveBeenCalledWith(new DataSorting('column_1', 'asc')); }); it('should indicate column that has sorting applied', () => { @@ -960,8 +951,10 @@ describe('DataTable', () => { dataTable.ngAfterViewInit(); const [col1, col2] = dataTable.getSortableColumns(); + const hedaderColumns = fixture.debugElement.nativeElement.querySelectorAll('.adf-datatable-cell-header-content'); - dataTable.onColumnHeaderClick(col2); + hedaderColumns[1].click(); + fixture.detectChanges(); expect(dataTable.isColumnSortActive(col1)).toBe(false); expect(dataTable.isColumnSortActive(col2)).toBe(true); @@ -1805,3 +1798,188 @@ describe('Show/hide columns', () => { }); }); }); + +describe('Column Resizing', () => { + let fixture: ComponentFixture; + let dataTable: DataTableComponent; + let data: { id: number; name: string }[] = []; + let dataTableSchema: DataColumn[] = []; + + setupTestBed({ + imports: [ + TranslateModule.forRoot(), + CoreTestingModule + ], + declarations: [CustomColumnTemplateComponent], + schemas: [NO_ERRORS_SCHEMA] + }); + + beforeEach(() => { + fixture = TestBed.createComponent(DataTableComponent); + dataTable = fixture.componentInstance; + data = [ + { id: 1, name: 'name1' }, + { id: 2, name: 'name2' } + ]; + + dataTableSchema = [ + new ObjectDataColumn({ key: 'id', title: 'ID', draggable: true }), + new ObjectDataColumn({ key: 'name', title: 'Name', draggable: true }) + ]; + + dataTable.data = new ObjectDataTableAdapter( + [...data], + [...dataTableSchema] + ); + + dataTable.isResizingEnabled = false; + fixture.detectChanges(); + }); + + it('should NOT display resize handle when the feature is Disabled [isResizingEnabled=false]', () => { + const resizeHandle = fixture.debugElement.nativeElement.querySelector('.adf-datatable__resize-handle'); + + expect(resizeHandle).toBeNull(); + const headerColumns = fixture.debugElement.nativeElement.querySelectorAll('.adf-datatable-cell-header'); + + headerColumns.forEach((header: HTMLElement) => { + expect(header.classList).toContain('adf-datatable__cursor--pointer'); + }); + }); + + it('should display resize handle when the feature is Enabled [isResizingEnabled=true]', () => { + dataTable.isResizingEnabled = true; + + fixture.detectChanges(); + const resizeHandle = fixture.debugElement.nativeElement.querySelector('.adf-datatable__resize-handle'); + + expect(resizeHandle).not.toBeNull(); + const headerColumns = fixture.debugElement.nativeElement.querySelectorAll('.adf-datatable-cell-header'); + + headerColumns.forEach((header: HTMLElement) => { + expect(header.classList).toContain('adf-datatable__cursor--pointer'); + }); + }); + + it('should NOT have the cursor pointer class in the header upon resizing starts', () => { + dataTable.isResizingEnabled = true; + fixture.detectChanges(); + + const resizeHandle: HTMLElement = fixture.debugElement.nativeElement.querySelector('.adf-datatable__resize-handle'); + resizeHandle.dispatchEvent(new MouseEvent('mousedown')); + fixture.detectChanges(); + + const headerColumns = fixture.debugElement.nativeElement.querySelectorAll('.adf-datatable-cell-header'); + + expect(dataTable.isResizing).toBeTrue(); + headerColumns.forEach((header: HTMLElement) => { + expect(header.classList).not.toContain('adf-datatable__cursor--pointer'); + }); + }); + + it('should NOT have the [adf-datatable-cell-header-content--hovered] class in the header upon resizing starts', () => { + dataTable.isResizingEnabled = true; + fixture.detectChanges(); + + const resizeHandle: HTMLElement = fixture.debugElement.nativeElement.querySelector('.adf-datatable__resize-handle'); + resizeHandle.dispatchEvent(new MouseEvent('mousedown')); + fixture.detectChanges(); + + const headerColumns = fixture.debugElement.nativeElement.querySelectorAll('.adf-datatable-cell-header-content'); + + expect(dataTable.isResizing).toBeTrue(); + headerColumns.forEach((header: HTMLElement) => { + expect(header.classList).not.toContain('adf-datatable-cell-header-content--hovered'); + }); + }); + + it('should NOT display drag icon upon resizing starts', () => { + dataTable.isResizingEnabled = true; + fixture.detectChanges(); + + const hedaderColumn = fixture.debugElement.nativeElement.querySelector('[data-automation-id="auto_id_id"]'); + hedaderColumn.dispatchEvent(new MouseEvent('mouseenter')); + fixture.detectChanges(); + let dragIcon = fixture.debugElement.nativeElement.querySelector('[data-automation-id="adf-datatable-cell-header-drag-icon-id"]'); + + expect(dragIcon).not.toBeNull(); + + const resizeHandle: HTMLElement[] = fixture.debugElement.nativeElement.querySelectorAll('.adf-datatable__resize-handle'); + resizeHandle[0].dispatchEvent(new MouseEvent('mousedown')); + fixture.detectChanges(); + + dragIcon = fixture.debugElement.nativeElement.querySelector('[data-automation-id="adf-datatable-cell-header-drag-icon-id"]'); + + expect(dataTable.isResizing).toBeTrue(); + expect(dragIcon).toBeNull(); + }); + + it('should blur the table body upon resizing starts', () => { + dataTable.isResizingEnabled = true; + fixture.detectChanges(); + + const resizeHandle: HTMLElement = fixture.debugElement.nativeElement.querySelector('.adf-datatable__resize-handle'); + resizeHandle.dispatchEvent(new MouseEvent('mousedown')); + fixture.detectChanges(); + + const tableBody = fixture.debugElement.nativeElement.querySelector('.adf-datatable-body'); + + expect(dataTable.isResizing).toBeTrue(); + expect(tableBody.classList).toContain('adf-blur-datatable-body'); + }); + + it('should set column width on resizing', () => { + const adapter = dataTable.data; + spyOn(adapter, 'setColumns').and.callThrough(); + + dataTable.onResizing({ rectangle: { top: 0, bottom: 10, left: 0, right: 20, width: 65 } }, 0); + fixture.detectChanges(); + const columns = dataTable.data.getColumns(); + + expect(columns[0].width).toBe(65); + expect(adapter.setColumns).toHaveBeenCalledWith(columns); + }); + + it('should set the column header style on resizing', () => { + dataTable.onResizing({ rectangle: { top: 0, bottom: 10, left: 0, right: 20, width: 65 } }, 0); + fixture.detectChanges(); + const headerColumns: HTMLElement[] = fixture.debugElement.nativeElement.querySelectorAll('.adf-datatable-cell-header'); + + expect(headerColumns[0].style.flex).toBe('0 1 65px'); + }); + + it('should set the style of all the table cells under the resizing header on resizing', () => { + dataTable.onResizing({ rectangle: { top: 0, bottom: 10, left: 0, right: 20, width: 65 } }, 0); + fixture.detectChanges(); + + const tableBody = fixture.debugElement.nativeElement.querySelector('.adf-datatable-body'); + const firstCell: HTMLElement = tableBody.querySelector('[data-automation-id="name1"]'); + const secondCell: HTMLElement = tableBody.querySelector('[data-automation-id="name2"]'); + + expect(firstCell.style.flex).toBe('0 1 65px'); + expect(secondCell.style.flex).toBe('0 1 65px'); + }); + + it('should unblur the body and set the resizing to false upon resizing ends', () => { + dataTable.isResizingEnabled = true; + fixture.detectChanges(); + + const resizeHandle: HTMLElement = fixture.debugElement.nativeElement.querySelector('.adf-datatable__resize-handle'); + resizeHandle.dispatchEvent(new MouseEvent('mousedown')); + fixture.detectChanges(); + + const tableBody = fixture.debugElement.nativeElement.querySelector('.adf-datatable-body'); + + expect(dataTable.isResizing).toBeTrue(); + expect(tableBody.classList).toContain('adf-blur-datatable-body'); + + resizeHandle.dispatchEvent(new MouseEvent('mousemove')); + fixture.detectChanges(); + + resizeHandle.dispatchEvent(new MouseEvent('mouseup')); + fixture.detectChanges(); + + expect(dataTable.isResizing).toBeFalse(); + expect(tableBody.classList).not.toContain('adf-blur-datatable-body'); + }); +}); 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 f48b1eb073..9656c4cc25 100644 --- a/lib/core/src/lib/datatable/components/datatable/datatable.component.ts +++ b/lib/core/src/lib/datatable/components/datatable/datatable.component.ts @@ -43,6 +43,7 @@ import { share, buffer, map, filter, debounceTime } from 'rxjs/operators'; import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; import { MatIconRegistry } from '@angular/material/icon'; import { DomSanitizer } from '@angular/platform-browser'; +import { ResizeEvent } from '../../directives/resizable/types'; // eslint-disable-next-line no-shadow export enum DisplayMode { @@ -204,6 +205,12 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, @Input() allowFiltering: boolean = false; + /** + * Flag that indicates if the datatable allows column resizing. + */ + @Input() + isResizingEnabled: boolean = false; + headerFilterTemplate: TemplateRef; noContentTemplate: TemplateRef; noPermissionTemplate: TemplateRef; @@ -216,6 +223,7 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, isDraggingHeaderColumn = false; hoveredHeaderColumnIndex = -1; + isResizing = false; /** This array of fake rows fix the flex layout for the gallery view */ fakeRows = []; @@ -591,8 +599,18 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, ); } - onColumnHeaderClick(column: DataColumn) { - if (column && column.sortable) { + private isValidClickEvent(event: Event): boolean { + if (event instanceof MouseEvent) { + return event.eventPhase === event.BUBBLING_PHASE; + } else if (event instanceof KeyboardEvent) { + return event.eventPhase === event.AT_TARGET; + } + + return false; + } + + onColumnHeaderClick(column: DataColumn, event: Event) { + if (this.isValidClickEvent(event) && column && column.sortable) { const current = this.data.getSorting(); let newDirection = 'asc'; if (current && column.key === current.key) { @@ -911,6 +929,12 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, iconUrl ); } + + onResizing({ rectangle: { width } }: ResizeEvent, colIndex: number): void { + const allColumns = this.data.getColumns(); + allColumns[colIndex].width = width; + this.data.setColumns(allColumns); + } } export interface DataTableDropEvent { diff --git a/lib/core/src/lib/datatable/data/data-column.model.ts b/lib/core/src/lib/datatable/data/data-column.model.ts index 2031f5b229..a087f691a1 100644 --- a/lib/core/src/lib/datatable/data/data-column.model.ts +++ b/lib/core/src/lib/datatable/data/data-column.model.ts @@ -47,5 +47,6 @@ export interface DataColumn { header?: TemplateRef; draggable?: boolean; isHidden?: boolean; + width?: number; customData?: T; } diff --git a/lib/core/src/lib/datatable/datatable.module.ts b/lib/core/src/lib/datatable/datatable.module.ts index c6b395ecbb..34ef02b1fe 100644 --- a/lib/core/src/lib/datatable/datatable.module.ts +++ b/lib/core/src/lib/datatable/datatable.module.ts @@ -51,6 +51,7 @@ import { DragDropModule } from '@angular/cdk/drag-drop'; import { IconModule } from '../icon/icon.module'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { DataColumnComponent, DataColumnListComponent, DateColumnHeaderComponent } from './data-column'; +import { ResizableModule } from './directives/resizable/resizable.module'; @NgModule({ imports: [ @@ -65,7 +66,8 @@ import { DataColumnComponent, DataColumnListComponent, DateColumnHeaderComponent DragDropModule, IconModule, FormsModule, - ReactiveFormsModule + ReactiveFormsModule, + ResizableModule ], declarations: [ DataTableComponent, diff --git a/lib/core/src/lib/datatable/directives/resizable/resizable.directive.spec.ts b/lib/core/src/lib/datatable/directives/resizable/resizable.directive.spec.ts new file mode 100644 index 0000000000..5eae86cb9b --- /dev/null +++ b/lib/core/src/lib/datatable/directives/resizable/resizable.directive.spec.ts @@ -0,0 +1,154 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { TestBed } from '@angular/core/testing'; +import { ElementRef, NgZone, Renderer2 } from '@angular/core'; +import { ResizableDirective } from './resizable.directive'; + +describe('ResizableDirective', () => { + let ngZone: NgZone; + let renderer: Renderer2; + let element: ElementRef; + let directive: ResizableDirective; + + const scrollTop = 0; + const scrollLeft = 0; + + const boundingClientRectMock = { + top: 0, + left: 0, + right: 0, + width: 150, + height: 0, + bottom: 0, + scrollTop, + scrollLeft + }; + + const rendererMock = { + listen: jasmine.createSpy('listen'), + setStyle: jasmine.createSpy('setStyle') + }; + + const elementRefMock = { + nativeElement: { + scrollTop, + scrollLeft, + getBoundingClientRect: () => boundingClientRectMock + } + }; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [ResizableDirective], + providers: [ + { provide: Renderer2, useValue: rendererMock }, + { provide: ElementRef, useValue: elementRefMock } + ] + }); + + element = TestBed.inject(ElementRef); + renderer = TestBed.inject(Renderer2); + ngZone = TestBed.inject(NgZone); + spyOn(ngZone, 'runOutsideAngular').and.callFake((fn) => fn()); + spyOn(ngZone, 'run').and.callFake((fn) => fn()); + directive = new ResizableDirective(renderer, element, ngZone); + + directive.ngOnInit(); + }); + + it('should attach mousedown event to document', () => { + expect(renderer.listen).toHaveBeenCalledWith('document', 'mousedown', jasmine.any(Function)); + }); + + it('should attach mousemove event to document', () => { + const mouseDownEvent = new MouseEvent('mousedown'); + + directive.mousedown.next({ ...mouseDownEvent, resize: true }); + + expect(renderer.listen).toHaveBeenCalledWith('document', 'mousemove', jasmine.any(Function)); + }); + + it('should attach mouseup event to document', () => { + expect(renderer.listen).toHaveBeenCalledWith('document', 'mouseup', jasmine.any(Function)); + }); + + it('should should set the cursor on mouse down', () => { + spyOn(directive.resizeStart, 'emit'); + const mouseDownEvent = new MouseEvent('mousedown'); + + directive.mousedown.next({ ...mouseDownEvent, resize: true }); + + expect(renderer.setStyle).toHaveBeenCalledWith(document.body, 'cursor', 'col-resize'); + }); + + it('should emit resizeStart event on mouse down', () => { + spyOn(directive.resizeStart, 'emit'); + directive.resizeStart.subscribe(); + const mouseDownEvent = new MouseEvent('mousedown'); + + directive.mousedown.next({ ...mouseDownEvent, resize: true }); + + expect(directive.resizeStart.emit).toHaveBeenCalledWith({ rectangle: { top: 0, left: 0, bottom: 0, right: 0, width: 0 } }); + }); + + it('should unset cursor on mouseup', () => { + const mouseDownEvent = new MouseEvent('mousedown'); + const mouseUpEvent = new MouseEvent('mouseup'); + + directive.mousedown.next({ ...mouseDownEvent, resize: true }); + directive.mouseup.next(mouseUpEvent); + + expect(renderer.setStyle).toHaveBeenCalledWith(document.body, 'cursor', ''); + }); + + it('should emit resizeEnd on mouseup', () => { + spyOn(directive.resizeEnd, 'emit'); + directive.resizeEnd.subscribe(); + const mouseDownEvent = new MouseEvent('mousedown'); + const mouseUpEvent = new MouseEvent('mouseup'); + + directive.mousedown.next({ ...mouseDownEvent, resize: true }); + directive.mouseup.next(mouseUpEvent); + + expect(directive.resizeEnd.emit).toHaveBeenCalledWith({ rectangle: { top: 0, left: 0, right: 0, width: 150, height: 0, bottom: 0, scrollTop: 0, scrollLeft: 0 } }); + }); + + it('should emit resizing on mousemove', () => { + spyOn(directive.resizing, 'emit'); + directive.resizing.subscribe(); + const mouseDownEvent = new MouseEvent('mousedown'); + const mouseMoveEvent = new MouseEvent('mousemove', { clientX: 120 }); + + directive.mousedown.next({ ...mouseDownEvent, resize: true }); + directive.mousemove.next(mouseMoveEvent); + + expect(directive.resizing.emit).toHaveBeenCalledWith({ rectangle: { top: 0, left: 0, bottom: 0, right: 120, width: 120 } }); + }); + + it('should NOT emit resizing on mousemove when movement goes under the minimum allowed size [100]', () => { + spyOn(directive.resizing, 'emit'); + directive.resizing.subscribe(); + const mouseDownEvent = new MouseEvent('mousedown'); + const mouseMoveEvent = new MouseEvent('mousemove', { clientX: 99 }); + + directive.mousedown.next({ ...mouseDownEvent, resize: true }); + directive.mousemove.next(mouseMoveEvent); + + expect(directive.resizing.emit).not.toHaveBeenCalled(); + }); +}); diff --git a/lib/core/src/lib/datatable/directives/resizable/resizable.directive.ts b/lib/core/src/lib/datatable/directives/resizable/resizable.directive.ts new file mode 100644 index 0000000000..df98f6bb1c --- /dev/null +++ b/lib/core/src/lib/datatable/directives/resizable/resizable.directive.ts @@ -0,0 +1,257 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Subject, Observable, Observer, merge } from 'rxjs'; +import { BoundingRectangle, ResizeEvent, IResizeMouseEvent, ICoordinateX } from './types'; +import { map, tap, take, share, filter, pairwise, mergeMap, takeUntil } from 'rxjs/operators'; +import { OnInit, Output, NgZone, OnDestroy, Directive, Renderer2, ElementRef, EventEmitter } from '@angular/core'; + +@Directive({ + selector: '[adf-resizable]', + exportAs: 'adf-resizable' +}) +export class ResizableDirective implements OnInit, OnDestroy { + /** + * Emitted when the mouse is pressed and a resize event is about to begin. + */ + @Output() resizeStart = new EventEmitter(); + + /** + * Emitted when the mouse is dragged after a resize event has started. + */ + @Output() resizing = new EventEmitter(); + + /** + * Emitted when the mouse is released after a resize event. + */ + @Output() resizeEnd = new EventEmitter(); + + mouseup = new Subject(); + + mousedown = new Subject(); + + mousemove = new Subject(); + + private pointerDown: Observable; + + private pointerMove: Observable; + + private pointerUp: Observable; + + private startingRect: BoundingRectangle; + + private currentRect: BoundingRectangle; + + private unlistenMouseDown: () => void; + + private unlistenMouseMove: () => void; + + private unlistenMouseUp: () => void; + + private destroy$ = new Subject(); + + private static MINIMUM_COLUMN_SIZE = 100; + + constructor( + private readonly renderer: Renderer2, + private readonly element: ElementRef, + private readonly zone: NgZone + ) { + + this.pointerDown = new Observable( + (observer: Observer) => { + zone.runOutsideAngular(() => { + this.unlistenMouseDown = renderer.listen( + 'document', + 'mousedown', + (event: MouseEvent) => { + observer.next(event); + } + ); + }); + } + ).pipe(share()); + + this.pointerMove = new Observable( + (observer: Observer) => { + zone.runOutsideAngular(() => { + this.unlistenMouseMove = renderer.listen( + 'document', + 'mousemove', + (event: MouseEvent) => { + observer.next(event); + } + ); + }); + } + ).pipe(share()); + + this.pointerUp = new Observable( + (observer: Observer) => { + zone.runOutsideAngular(() => { + this.unlistenMouseUp = renderer.listen( + 'document', + 'mouseup', + (event: MouseEvent) => { + observer.next(event); + } + ); + }); + } + ).pipe(share()); + } + + ngOnInit(): void { + const mousedown$: Observable = merge(this.pointerDown, this.mousedown); + + const mousemove$: Observable = merge(this.pointerMove, this.mousemove) + .pipe( + tap((event) => this.preventDefaultEvent(event)), + share() + ); + + const mouseup$: Observable = merge(this.pointerUp, this.mouseup); + + const mousedrag: Observable = mousedown$ + .pipe( + mergeMap(({ clientX = 0 }) => merge( + mousemove$.pipe(take(1)).pipe(map((coords) => [, coords])), + mousemove$.pipe(pairwise()) + ) + .pipe( + map(([previousCoords = {}, newCoords = {}]) => + [ + { clientX: previousCoords.clientX - clientX }, + { clientX: newCoords.clientX - clientX } + ] + ) + ) + .pipe( + filter(([previousCoords = {}, newCoords = {}]) => + Math.ceil(previousCoords.clientX) !== Math.ceil(newCoords.clientX)) + ) + .pipe( + map(([, newCoords]) => + ({ + clientX: Math.round(newCoords.clientX) + })) + ) + .pipe(takeUntil(merge(mouseup$, mousedown$))) + ) + ) + .pipe(filter(() => !!this.currentRect)); + + mousedrag + .pipe( + map(({ clientX }) => this.getNewBoundingRectangle(this.startingRect, clientX)) + ) + .pipe( + filter(this.minimumAllowedSize) + ) + .subscribe((rectangle: BoundingRectangle) => { + if (this.resizing.observers.length > 0) { + this.zone.run(() => { + this.resizing.emit({ rectangle }); + }); + } + this.currentRect = rectangle; + }); + + mousedown$ + .pipe( + map(({ resize = false }) => resize), + filter((resize) => resize), + takeUntil(this.destroy$) + ) + .subscribe(() => { + const startingRect: BoundingRectangle = this.getElementRect(this.element); + + this.startingRect = startingRect; + this.currentRect = startingRect; + + this.renderer.setStyle(document.body, 'cursor', 'col-resize'); + if (this.resizeStart.observers.length > 0) { + this.zone.run(() => { + this.resizeStart.emit({ + rectangle: this.getNewBoundingRectangle(this.startingRect, 0) + }); + }); + } + }); + + mouseup$.pipe(takeUntil(this.destroy$)).subscribe(() => { + if (this.currentRect) { + this.renderer.setStyle(document.body, 'cursor', ''); + if (this.resizeEnd.observers.length > 0) { + this.zone.run(() => { + this.resizeEnd.emit({ rectangle: this.currentRect }); + }); + } + this.startingRect = null; + this.currentRect = null; + } + }); + } + + ngOnDestroy(): void { + this.mousedown.complete(); + this.mousemove.complete(); + this.mouseup.complete(); + this.unlistenMouseDown && this.unlistenMouseDown(); + this.unlistenMouseMove && this.unlistenMouseMove(); + this.unlistenMouseUp && this.unlistenMouseUp(); + this.destroy$.next(); + } + + private preventDefaultEvent(event: MouseEvent): void { + if ((this.currentRect || this.startingRect) && event.cancelable) { + event.preventDefault(); + } + } + + private getNewBoundingRectangle({ top, bottom, left, right }: BoundingRectangle, clientX: number): BoundingRectangle { + const updatedRight = right += clientX; + + return { + top, + left, + bottom, + right: updatedRight, + width: updatedRight - left + }; + } + + private getElementRect({ nativeElement }: ElementRef): BoundingRectangle { + + const { height = 0, width = 0, top = 0, bottom = 0, right = 0, left = 0 }: BoundingRectangle = nativeElement.getBoundingClientRect(); + + return { + top, + left, + right, + width, + height, + bottom, + scrollTop: nativeElement.scrollTop, + scrollLeft: nativeElement.scrollLeft + }; + } + + private minimumAllowedSize({ width = 0 }: BoundingRectangle): boolean { + return width > ResizableDirective.MINIMUM_COLUMN_SIZE; + } +} diff --git a/lib/core/src/lib/datatable/directives/resizable/resizable.module.ts b/lib/core/src/lib/datatable/directives/resizable/resizable.module.ts new file mode 100644 index 0000000000..bf7054eaf6 --- /dev/null +++ b/lib/core/src/lib/datatable/directives/resizable/resizable.module.ts @@ -0,0 +1,26 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { NgModule } from '@angular/core'; +import { ResizableDirective } from './resizable.directive'; +import { ResizeHandleDirective } from './resize-handle.directive'; + +@NgModule({ + declarations: [ResizableDirective, ResizeHandleDirective], + exports: [ResizableDirective, ResizeHandleDirective] +}) +export class ResizableModule {} diff --git a/lib/core/src/lib/datatable/directives/resizable/resize-handle.directive.spec.ts b/lib/core/src/lib/datatable/directives/resizable/resize-handle.directive.spec.ts new file mode 100644 index 0000000000..8a3eff643d --- /dev/null +++ b/lib/core/src/lib/datatable/directives/resizable/resize-handle.directive.spec.ts @@ -0,0 +1,56 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { TestBed } from '@angular/core/testing'; +import { ElementRef, NgZone, Renderer2 } from '@angular/core'; +import { ResizeHandleDirective } from './resize-handle.directive'; + +describe('ResizeHandleDirective', () => { + let ngZone: NgZone; + let renderer: Renderer2; + let element: ElementRef; + let directive: ResizeHandleDirective; + + const rendererMock = { + listen: jasmine.createSpy('listen') + }; + + const elementRefMock = { + nativeElement: { dispatchEvent: () => { } } + }; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [ResizeHandleDirective], + providers: [ + { provide: Renderer2, useValue: rendererMock }, + { provide: ElementRef, useValue: elementRefMock } + ] + }); + + element = TestBed.inject(ElementRef); + renderer = TestBed.inject(Renderer2); + ngZone = TestBed.inject(NgZone); + spyOn(ngZone, 'runOutsideAngular').and.callFake((fn) => fn()); + directive = new ResizeHandleDirective(renderer, element, ngZone); + directive.ngOnInit(); + }); + + it('should attach mousedown event on resizable element', () => { + expect(renderer.listen).toHaveBeenCalledWith(element.nativeElement, 'mousedown', jasmine.any(Function)); + }); +}); diff --git a/lib/core/src/lib/datatable/directives/resizable/resize-handle.directive.ts b/lib/core/src/lib/datatable/directives/resizable/resize-handle.directive.ts new file mode 100644 index 0000000000..97396ed913 --- /dev/null +++ b/lib/core/src/lib/datatable/directives/resizable/resize-handle.directive.ts @@ -0,0 +1,96 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Subject } from 'rxjs'; +import { ResizableDirective } from './resizable.directive'; +import { Input, OnInit, Directive, Renderer2, ElementRef, OnDestroy, NgZone } from '@angular/core'; + +@Directive({ + selector: '[adf-resize-handle]' +}) +export class ResizeHandleDirective implements OnInit, OnDestroy { + /** + * Reference to ResizableDirective + */ + @Input() resizableContainer: ResizableDirective; + + private unlistenMouseDown: () => void; + + private unlistenMouseMove: () => void; + + private unlistenMouseUp: () => void; + + private destroy$ = new Subject(); + + constructor( + private readonly renderer: Renderer2, + private readonly element: ElementRef, + private readonly zone: NgZone + ) { } + + ngOnInit(): void { + this.zone.runOutsideAngular(() => { + this.unlistenMouseDown = this.renderer.listen( + this.element.nativeElement, + 'mousedown', + (mouseDownEvent: MouseEvent) => { + this.onMousedown(mouseDownEvent); + } + ); + }); + } + + ngOnDestroy(): void { + this.unlistenMouseDown && this.unlistenMouseDown(); + this.unlistenMouseMove && this.unlistenMouseMove(); + this.unlistenMouseUp && this.unlistenMouseUp(); + this.destroy$.next(); + } + + private onMousedown(event: MouseEvent): void { + if (event.cancelable) { + event.preventDefault(); + } + this.unlistenMouseMove = this.renderer.listen( + this.element.nativeElement, + 'mousemove', + (mouseMoveEvent: MouseEvent) => { + this.onMousemove(mouseMoveEvent); + } + ); + + this.unlistenMouseUp = this.renderer.listen( + this.element.nativeElement, + 'mouseup', + (mouseUpEvent: MouseEvent) => { + this.onMouseup(mouseUpEvent); + } + ); + + this.resizableContainer.mousedown.next({ ...event, resize: true }); + } + + private onMouseup(event: MouseEvent): void { + this.unlistenMouseMove && this.unlistenMouseMove(); + this.unlistenMouseUp(); + this.resizableContainer.mouseup.next(event); + } + + private onMousemove(event: MouseEvent): void { + this.resizableContainer.mousemove.next(event); + } +} diff --git a/lib/core/src/lib/datatable/directives/resizable/types.ts b/lib/core/src/lib/datatable/directives/resizable/types.ts new file mode 100644 index 0000000000..7d8ad9b85f --- /dev/null +++ b/lib/core/src/lib/datatable/directives/resizable/types.ts @@ -0,0 +1,40 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export interface BoundingRectangle { + top: number; + left: number; + right: number; + bottom: number; + width?: number; + height?: number; + scrollTop?: number; + scrollLeft?: number; + [key: string]: number | undefined; +} + +export interface ResizeEvent { + rectangle: BoundingRectangle; +} + +export interface IResizeMouseEvent extends MouseEvent{ + resize?: boolean; +} + +export interface ICoordinateX { + clientX: number; +}