aboutsummaryrefslogtreecommitdiff
path: root/Timeline/ClientApp/src/app/utilities
diff options
context:
space:
mode:
author杨宇千 <crupest@outlook.com>2019-03-11 19:52:29 +0800
committerGitHub <noreply@github.com>2019-03-11 19:52:29 +0800
commit8caef17dd3e455de27f44d13751c27ee4dfe2e1e (patch)
tree5b485ad438c9be9c180d425453588ff1c575a42d /Timeline/ClientApp/src/app/utilities
parent17d90077b289c6b2203a34de727dd77c1985f146 (diff)
parentb26342764046d188d223aa494c3bbbf76deb4927 (diff)
downloadtimeline-8caef17dd3e455de27f44d13751c27ee4dfe2e1e.tar.gz
timeline-8caef17dd3e455de27f44d13751c27ee4dfe2e1e.tar.bz2
timeline-8caef17dd3e455de27f44d13751c27ee4dfe2e1e.zip
Merge pull request #11 from crupest/7-user-route
Use named route in user dialog.
Diffstat (limited to 'Timeline/ClientApp/src/app/utilities')
-rw-r--r--Timeline/ClientApp/src/app/utilities/debounce-click.directive.spec.ts124
-rw-r--r--Timeline/ClientApp/src/app/utilities/debounce-click.directive.ts39
-rw-r--r--Timeline/ClientApp/src/app/utilities/utility.module.ts11
3 files changed, 174 insertions, 0 deletions
diff --git a/Timeline/ClientApp/src/app/utilities/debounce-click.directive.spec.ts b/Timeline/ClientApp/src/app/utilities/debounce-click.directive.spec.ts
new file mode 100644
index 00000000..75710d0c
--- /dev/null
+++ b/Timeline/ClientApp/src/app/utilities/debounce-click.directive.spec.ts
@@ -0,0 +1,124 @@
+import { Component, ViewChild } from '@angular/core';
+import { async, TestBed, ComponentFixture, fakeAsync, tick } from '@angular/core/testing';
+import { By } from '@angular/platform-browser';
+
+import { DebounceClickDirective } from './debounce-click.directive';
+
+interface TestComponent {
+ clickHandler: () => void;
+}
+
+@Component({
+ selector: 'app-default-test',
+ template: '<button (appDebounceClick)="clickHandler()"></button>'
+})
+class DefaultDebounceTimeTestComponent {
+ @ViewChild(DebounceClickDirective)
+ directive: DebounceClickDirective;
+
+ clickHandler: () => void = () => { };
+}
+
+@Component({
+ selector: 'app-default-test',
+ template: '<button (appDebounceClick)="clickHandler()" [appDebounceClickTime]="debounceTime"></button>'
+})
+class CustomDebounceTimeTestComponent {
+ debounceTime: number;
+
+ @ViewChild(DebounceClickDirective)
+ directive: DebounceClickDirective;
+
+ clickHandler: () => void = () => { };
+}
+
+
+describe('DebounceClickDirective', () => {
+ let counter: number;
+
+ function initComponent(component: TestComponent) {
+ component.clickHandler = () => counter++;
+ }
+
+ beforeEach(() => {
+ counter = 0;
+ });
+
+ describe('default debounce time', () => {
+ let component: DefaultDebounceTimeTestComponent;
+ let componentFixture: ComponentFixture<DefaultDebounceTimeTestComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [DebounceClickDirective, DefaultDebounceTimeTestComponent]
+ }).compileComponents();
+ }));
+
+ beforeEach(() => {
+ componentFixture = TestBed.createComponent(DefaultDebounceTimeTestComponent);
+ component = componentFixture.componentInstance;
+ initComponent(component);
+ });
+
+ it('should create an instance', () => {
+ componentFixture.detectChanges();
+ expect(component.directive).toBeTruthy();
+ });
+
+ it('should work well', fakeAsync(() => {
+ function click() {
+ (<HTMLButtonElement>componentFixture.debugElement.query(By.css('button')).nativeElement).dispatchEvent(new MouseEvent('click'));
+ }
+ componentFixture.detectChanges();
+ expect(counter).toBe(0);
+ click();
+ tick(300);
+ expect(counter).toBe(0);
+ click();
+ tick();
+ expect(counter).toBe(0);
+ tick(500);
+ expect(counter).toBe(1);
+ }));
+ });
+
+
+ describe('custom debounce time', () => {
+ let component: CustomDebounceTimeTestComponent;
+ let componentFixture: ComponentFixture<CustomDebounceTimeTestComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [DebounceClickDirective, CustomDebounceTimeTestComponent]
+ }).compileComponents();
+ }));
+
+ beforeEach(() => {
+ componentFixture = TestBed.createComponent(CustomDebounceTimeTestComponent);
+ component = componentFixture.componentInstance;
+ initComponent(component);
+ component.debounceTime = 600;
+ });
+
+ it('should create an instance', () => {
+ componentFixture.detectChanges();
+ expect(component.directive).toBeTruthy();
+ });
+
+ it('should work well', fakeAsync(() => {
+ function click() {
+ (<HTMLButtonElement>componentFixture.debugElement.query(By.css('button')).nativeElement).dispatchEvent(new MouseEvent('click'));
+ }
+ componentFixture.detectChanges();
+ expect(counter).toBe(0);
+ click();
+ tick(300);
+ expect(counter).toBe(0);
+ click();
+ tick();
+ expect(counter).toBe(0);
+ tick(600);
+ expect(counter).toBe(1);
+ }));
+ });
+});
diff --git a/Timeline/ClientApp/src/app/utilities/debounce-click.directive.ts b/Timeline/ClientApp/src/app/utilities/debounce-click.directive.ts
new file mode 100644
index 00000000..feb0404e
--- /dev/null
+++ b/Timeline/ClientApp/src/app/utilities/debounce-click.directive.ts
@@ -0,0 +1,39 @@
+import { Directive, Output, Input, EventEmitter, ElementRef, OnInit, OnDestroy } from '@angular/core';
+import { fromEvent, Subscription } from 'rxjs';
+import { debounceTime } from 'rxjs/operators';
+
+@Directive({
+ selector: '[appDebounceClick]'
+})
+export class DebounceClickDirective implements OnInit, OnDestroy {
+
+ private subscription: Subscription;
+
+ @Output('appDebounceClick') clickEvent = new EventEmitter<any>();
+
+ // tslint:disable-next-line:no-input-rename
+ @Input('appDebounceClickTime')
+ set debounceTime(value: number) {
+ if (this.subscription) {
+ this.subscription.unsubscribe();
+ }
+ this.subscription = fromEvent(<HTMLElement>this.element.nativeElement, 'click').pipe(
+ debounceTime(value)
+ ).subscribe(o => this.clickEvent.emit(o));
+ }
+
+ constructor(private element: ElementRef) {
+ }
+
+ ngOnInit() {
+ if (!this.subscription) {
+ this.subscription = fromEvent(<HTMLElement>this.element.nativeElement, 'click').pipe(
+ debounceTime(500)
+ ).subscribe(o => this.clickEvent.emit(o));
+ }
+ }
+
+ ngOnDestroy() {
+ this.subscription.unsubscribe();
+ }
+}
diff --git a/Timeline/ClientApp/src/app/utilities/utility.module.ts b/Timeline/ClientApp/src/app/utilities/utility.module.ts
new file mode 100644
index 00000000..dd686bf7
--- /dev/null
+++ b/Timeline/ClientApp/src/app/utilities/utility.module.ts
@@ -0,0 +1,11 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+
+import { DebounceClickDirective } from './debounce-click.directive';
+
+@NgModule({
+ declarations: [DebounceClickDirective],
+ imports: [CommonModule],
+ exports: [DebounceClickDirective]
+})
+export class UtilityModule { }