From 4e7c5bfdbff5fdd84efa523f3c9318eafe576bd6 Mon Sep 17 00:00:00 2001 From: Maurizio Vitale Date: Mon, 19 Jun 2017 13:16:54 +0100 Subject: [PATCH] [ADF-833] DataTable - improve the single and double click event (#1979) * Improve the single and double click event * Fix unit test --- .../datatable/datatable.component.html | 70 ++++++++---------- .../datatable/datatable.component.spec.ts | 67 +++++++++++++++-- .../datatable/datatable.component.ts | 73 +++++++++++++------ 3 files changed, 142 insertions(+), 68 deletions(-) diff --git a/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.html b/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.html index d25ceb4e73..e819ad879f 100644 --- a/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.html +++ b/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.html @@ -7,7 +7,6 @@ Actions - @@ -29,7 +28,6 @@ - - - - - -
- -
- {{asIconValue(row, - col)}} - {{ iconAltTextKey(data.getValue(row, col)) | translate }} -
-
- {{ iconAltTextKey(data.getValue(row, col)) | translate }} -
-
- -
-
- -
+ + + + +
+ +
+ {{asIconValue(row, col)}} + {{ iconAltTextKey(data.getValue(row, col)) | translate }} +
+
+ {{ iconAltTextKey(data.getValue(row, col)) | translate }} +
+
+ +
+
+ +
@@ -129,8 +125,6 @@ -
- diff --git a/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.spec.ts b/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.spec.ts index 9c6d2bfe78..2337c9b81f 100644 --- a/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.spec.ts +++ b/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.spec.ts @@ -101,6 +101,7 @@ describe('DataTable', () => { ); const rows = dataTable.data.getRows(); + dataTable.ngOnChanges({}); dataTable.onRowClick(rows[0], null); expect(rows[0].isSelected).toBeTruthy(); expect(rows[1].isSelected).toBeFalsy(); @@ -121,6 +122,7 @@ describe('DataTable', () => { ); const rows = dataTable.data.getRows(); + dataTable.ngOnChanges({}); dataTable.onRowClick(rows[0], null); expect(rows[0].isSelected).toBeTruthy(); expect(rows[1].isSelected).toBeFalsy(); @@ -145,6 +147,7 @@ describe('DataTable', () => { metaKey: true }); + dataTable.ngOnChanges({}); dataTable.onRowClick(rows[0], event); dataTable.onRowClick(rows[1], event); @@ -212,18 +215,65 @@ describe('DataTable', () => { done(); }); + dataTable.ngOnChanges({}); dataTable.onRowClick(row, null); }); - it('should emit row double-click event', done => { - let row = {}; + it('should emit double click if there are two single click in 250ms', (done) => { - dataTable.rowDblClick.subscribe(e => { - expect(e.value).toBe(row); + let row = {}; + dataTable.ngOnChanges({}); + + dataTable.rowDblClick.subscribe( () => { done(); }); - dataTable.onRowDblClick(row, null); + dataTable.onRowClick(row, null); + setTimeout(() => { + dataTable.onRowClick(row, null); + } + , 240); + + }); + + it('should emit double click if there are more than two single click in 250ms', (done) => { + + let row = {}; + dataTable.ngOnChanges({}); + + dataTable.rowDblClick.subscribe( () => { + done(); + }); + + dataTable.onRowClick(row, null); + setTimeout(() => { + + dataTable.onRowClick(row, null); + dataTable.onRowClick(row, null); + } + , 240); + + }); + + it('should emit single click if there are two single click in more than 250ms', (done) => { + + let row = {}; + let clickCount = 0; + + dataTable.ngOnChanges({}); + + dataTable.rowClick.subscribe( () => { + clickCount += 1; + if (clickCount === 2) { + done(); + } + }); + + dataTable.onRowClick(row, null); + setTimeout(() => { + dataTable.onRowClick(row, null); + } + , 260); }); it('should emit row-click dom event', (done) => { @@ -234,6 +284,7 @@ describe('DataTable', () => { done(); }); + dataTable.ngOnChanges({}); dataTable.onRowClick(row, null); }); @@ -244,8 +295,9 @@ describe('DataTable', () => { expect(e.detail.value).toBe(row); done(); }); - - dataTable.onRowDblClick(row, null); + dataTable.ngOnChanges({}); + dataTable.onRowClick(row, null); + dataTable.onRowClick(row, null); }); it('should prevent default behaviour on row click event', () => { @@ -257,6 +309,7 @@ describe('DataTable', () => { it('should prevent default behaviour on row double-click event', () => { let e = jasmine.createSpyObj('event', ['preventDefault']); + dataTable.ngOnChanges({}); dataTable.ngAfterContentInit(); dataTable.onRowDblClick(null, e); expect(e.preventDefault).toHaveBeenCalled(); diff --git a/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.ts b/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.ts index 19b9de8911..9347092f82 100644 --- a/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.ts +++ b/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.ts @@ -21,6 +21,7 @@ import { DataCellEvent } from './data-cell.event'; import { DataRowActionEvent } from './data-row-action.event'; import { DataColumnListComponent } from 'ng2-alfresco-core'; import { MdCheckboxChange } from '@angular/material'; +import { Observable, Observer } from 'rxjs/Rx'; declare var componentHandler; @@ -89,7 +90,11 @@ export class DataTableComponent implements AfterContentInit, OnChanges { isSelectAllChecked: boolean = false; + private clickObserver: Observer; + private click$: Observable; + constructor(@Optional() private el: ElementRef) { + this.click$ = new Observable(observer => this.clickObserver = observer).share(); } ngAfterContentInit() { @@ -111,6 +116,7 @@ export class DataTableComponent implements AfterContentInit, OnChanges { } ngOnChanges(changes: SimpleChanges) { + this.initAndSubscribeClickStream(); if (this.isPropertyChanged(changes['data'])) { if (this.isTableEmpty()) { this.initTable(); @@ -140,6 +146,46 @@ export class DataTableComponent implements AfterContentInit, OnChanges { return rows.map(row => new ObjectDataRow(row)); } + private initAndSubscribeClickStream() { + let singleClickStream = this.click$ + .buffer(this.click$.debounceTime(250)) + .map(list => list) + .filter(x => x.length === 1); + + singleClickStream.subscribe((obj: DataRowEvent[]) => { + let event: DataRowEvent = obj[0]; + let el = obj[0].sender.el; + this.rowClick.emit(event); + if (!event.defaultPrevented && el.nativeElement) { + el.nativeElement.dispatchEvent( + new CustomEvent('row-click', { + detail: event, + bubbles: true + }) + ); + } + }); + + let multiClickStream = this.click$ + .buffer(this.click$.debounceTime(250)) + .map(list => list) + .filter(x => x.length >= 2); + + multiClickStream.subscribe((obj: DataRowEvent[]) => { + let event: DataRowEvent = obj[0]; + let el = obj[0].sender.el; + this.rowDblClick.emit(event); + if (!event.defaultPrevented && el.nativeElement) { + el.nativeElement.dispatchEvent( + new CustomEvent('row-dblclick', { + detail: event, + bubbles: true + }) + ); + } + }); + } + private initTable() { this.data = new ObjectDataTableAdapter(this.rows, []); } @@ -190,17 +236,8 @@ export class DataTableComponent implements AfterContentInit, OnChanges { } } - let event = new DataRowEvent(row, e, this); - this.rowClick.emit(event); - - if (!event.defaultPrevented && this.el.nativeElement) { - this.el.nativeElement.dispatchEvent( - new CustomEvent('row-click', { - detail: event, - bubbles: true - }) - ); - } + let dataRowEvent = new DataRowEvent(row, e, this); + this.clickObserver.next(dataRowEvent); } } @@ -217,18 +254,8 @@ export class DataTableComponent implements AfterContentInit, OnChanges { if (e) { e.preventDefault(); } - - let event = new DataRowEvent(row, e, this); - this.rowDblClick.emit(event); - - if (!event.defaultPrevented && this.el.nativeElement) { - this.el.nativeElement.dispatchEvent( - new CustomEvent('row-dblclick', { - detail: event, - bubbles: true - }) - ); - } + let dataRowEvent = new DataRowEvent(row, e, this); + this.clickObserver.next(dataRowEvent); } onColumnHeaderClick(column: DataColumn) {