share link: add time debouncing (#5587)

* add time debouncing

* fix tests
This commit is contained in:
Denys Vuika
2020-04-02 13:01:18 +01:00
committed by GitHub
parent e2d58e7a44
commit 179bdb2790
2 changed files with 22 additions and 15 deletions

View File

@@ -16,7 +16,7 @@
*/ */
import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { TestBed, fakeAsync, ComponentFixture } from '@angular/core/testing'; import { TestBed, fakeAsync, ComponentFixture, tick } from '@angular/core/testing';
import { MatDialogRef, MAT_DIALOG_DATA, MatDialog } from '@angular/material'; import { MatDialogRef, MAT_DIALOG_DATA, MatDialog } from '@angular/material';
import { of, empty } from 'rxjs'; import { of, empty } from 'rxjs';
import { import {
@@ -65,12 +65,14 @@ describe('ShareDialogComponent', () => {
beforeEach(() => { beforeEach(() => {
fixture = TestBed.createComponent(ShareDialogComponent); fixture = TestBed.createComponent(ShareDialogComponent);
component = fixture.componentInstance;
component.maxDebounceTime = 0;
matDialog = TestBed.get(MatDialog); matDialog = TestBed.get(MatDialog);
sharedLinksApiService = TestBed.get(SharedLinksApiService); sharedLinksApiService = TestBed.get(SharedLinksApiService);
renditionService = TestBed.get(RenditionsService); renditionService = TestBed.get(RenditionsService);
nodesApiService = TestBed.get(NodesApiService); nodesApiService = TestBed.get(NodesApiService);
appConfigService = TestBed.get(AppConfigService); appConfigService = TestBed.get(AppConfigService);
component = fixture.componentInstance;
node = { node = {
entry: { entry: {
@@ -239,7 +241,7 @@ describe('ShareDialogComponent', () => {
expect(fixture.nativeElement.querySelector('mat-datetimepicker-toggle button').disabled).toBe(true); expect(fixture.nativeElement.querySelector('mat-datetimepicker-toggle button').disabled).toBe(true);
}); });
it('should reset expiration date when toggle is unchecked', () => { it('should reset expiration date when toggle is unchecked', async () => {
node.entry.properties['qshare:sharedId'] = 'sharedId'; node.entry.properties['qshare:sharedId'] = 'sharedId';
node.entry.properties['qshare:sharedId'] = '2017-04-15T18:31:37+00:00'; node.entry.properties['qshare:sharedId'] = '2017-04-15T18:31:37+00:00';
node.entry.allowableOperations = ['update']; node.entry.allowableOperations = ['update'];
@@ -255,13 +257,13 @@ describe('ShareDialogComponent', () => {
fixture.detectChanges(); fixture.detectChanges();
fixture.nativeElement fixture.nativeElement
.querySelector( .querySelector('.mat-slide-toggle[data-automation-id="adf-expire-toggle"] label')
'.mat-slide-toggle[data-automation-id="adf-expire-toggle"] label'
)
.dispatchEvent(new MouseEvent('click')); .dispatchEvent(new MouseEvent('click'));
fixture.detectChanges(); fixture.detectChanges();
await fixture.whenStable();
expect(nodesApiService.updateNode).toHaveBeenCalledWith('nodeId', { expect(nodesApiService.updateNode).toHaveBeenCalledWith('nodeId', {
properties: { 'qshare:expiryDate': null } properties: { 'qshare:expiryDate': null }
}); });
@@ -287,7 +289,7 @@ describe('ShareDialogComponent', () => {
.classList).toContain('mat-disabled'); .classList).toContain('mat-disabled');
}); });
it('should update node expiration date with selected date', () => { it('should update node expiration date with selected date', fakeAsync(() => {
const date = moment(); const date = moment();
node.entry.allowableOperations = ['update']; node.entry.allowableOperations = ['update'];
node.entry.properties['qshare:sharedId'] = 'sharedId'; node.entry.properties['qshare:sharedId'] = 'sharedId';
@@ -309,10 +311,12 @@ describe('ShareDialogComponent', () => {
fixture.componentInstance.form.controls['time'].setValue(date); fixture.componentInstance.form.controls['time'].setValue(date);
fixture.detectChanges(); fixture.detectChanges();
tick(100);
expect(nodesApiService.updateNode).toHaveBeenCalledWith('nodeId', { expect(nodesApiService.updateNode).toHaveBeenCalledWith('nodeId', {
properties: { 'qshare:expiryDate': date.utc().format() } properties: { 'qshare:expiryDate': date.utc().format() }
}); });
}); }));
describe('datetimepicker type', () => { describe('datetimepicker type', () => {
beforeEach(() => { beforeEach(() => {
@@ -324,7 +328,7 @@ describe('ShareDialogComponent', () => {
}; };
}); });
it('it should update node with input date and end of day time when type is `date`', () => { it('it should update node with input date and end of day time when type is `date`', fakeAsync(() => {
const dateTimePickerType = 'date'; const dateTimePickerType = 'date';
const date = moment('2525-01-01 13:00:00'); const date = moment('2525-01-01 13:00:00');
spyOn(appConfigService, 'get').and.callFake(() => dateTimePickerType); spyOn(appConfigService, 'get').and.callFake(() => dateTimePickerType);
@@ -335,13 +339,14 @@ describe('ShareDialogComponent', () => {
fixture.componentInstance.time.setValue(date); fixture.componentInstance.time.setValue(date);
fixture.detectChanges(); fixture.detectChanges();
tick(500);
expect(nodesApiService.updateNode).toHaveBeenCalledWith('nodeId', { expect(nodesApiService.updateNode).toHaveBeenCalledWith('nodeId', {
properties: { 'qshare:expiryDate': date.endOf('day').utc().format() } properties: { 'qshare:expiryDate': date.endOf('day').utc().format() }
}); });
}); }));
it('it should update node with input date and time when type is `datetime`', () => { it('it should update node with input date and time when type is `datetime`', fakeAsync(() => {
const dateTimePickerType = 'datetime'; const dateTimePickerType = 'datetime';
const date = moment('2525-01-01 13:00:00'); const date = moment('2525-01-01 13:00:00');
spyOn(appConfigService, 'get').and.returnValue(dateTimePickerType); spyOn(appConfigService, 'get').and.returnValue(dateTimePickerType);
@@ -352,10 +357,11 @@ describe('ShareDialogComponent', () => {
fixture.componentInstance.time.setValue(date); fixture.componentInstance.time.setValue(date);
fixture.detectChanges(); fixture.detectChanges();
tick(100);
expect(nodesApiService.updateNode).toHaveBeenCalledWith('nodeId', { expect(nodesApiService.updateNode).toHaveBeenCalledWith('nodeId', {
properties: { 'qshare:expiryDate': date.utc().format() } properties: { 'qshare:expiryDate': date.utc().format() }
}); });
}); }));
}); });
}); });

View File

@@ -37,7 +37,7 @@ import { SharedLinkEntry, Node } from '@alfresco/js-api';
import { ConfirmDialogComponent } from '../dialogs/confirm.dialog'; import { ConfirmDialogComponent } from '../dialogs/confirm.dialog';
import moment from 'moment-es6'; import moment from 'moment-es6';
import { ContentNodeShareSettings } from './content-node-share.settings'; import { ContentNodeShareSettings } from './content-node-share.settings';
import { distinctUntilChanged, takeUntil } from 'rxjs/operators'; import { takeUntil, debounceTime } from 'rxjs/operators';
type DatePickerType = 'date' | 'time' | 'month' | 'datetime'; type DatePickerType = 'date' | 'time' | 'month' | 'datetime';
@@ -61,6 +61,7 @@ export class ShareDialogComponent implements OnInit, OnDestroy {
time: new FormControl({ value: '', disabled: true }) time: new FormControl({ value: '', disabled: true })
}); });
type: DatePickerType = 'datetime'; type: DatePickerType = 'datetime';
maxDebounceTime = 500;
@ViewChild('slideToggleExpirationDate') @ViewChild('slideToggleExpirationDate')
slideToggleExpirationDate; slideToggleExpirationDate;
@@ -101,7 +102,7 @@ export class ShareDialogComponent implements OnInit, OnDestroy {
this.time.valueChanges this.time.valueChanges
.pipe( .pipe(
distinctUntilChanged(), debounceTime(this.maxDebounceTime),
takeUntil(this.onDestroy$) takeUntil(this.onDestroy$)
) )
.subscribe(value => this.onTimeChanged(value)); .subscribe(value => this.onTimeChanged(value));