From ca924ac9ddc0a86ca5640accc01814f51a1bdc32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Mitri=C4=87?= Date: Mon, 13 Feb 2023 14:42:03 +0100 Subject: [PATCH] Add fullscreen-trigger-for directive --- .../fullscreen-trigger-for.directive.spec.ts | 39 ++++++ .../fullscreen-trigger-for.directive.ts | 46 +++++++ .../fullscreen-trigger-for.module.ts | 18 +++ .../fullscreen-trigger-for.stories.ts | 129 ++++++++++++++++++ 4 files changed, 232 insertions(+) create mode 100644 libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.directive.spec.ts create mode 100644 libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.directive.ts create mode 100644 libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.module.ts create mode 100644 libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.stories.ts diff --git a/libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.directive.spec.ts b/libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.directive.spec.ts new file mode 100644 index 00000000..a5cf691e --- /dev/null +++ b/libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.directive.spec.ts @@ -0,0 +1,39 @@ +import { FullscreenTriggerForDirective } from "./fullscreen-trigger-for.directive"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { DOCUMENT } from "@angular/common"; +import { Component } from "@angular/core"; + +@Component({ + selector: 'inf-component-with-fullscreen-button', + template: ` + +
This elemennt to put to fullscreen
+ `, +}) +class FullscreenTriggerForHostComponent {} + +describe('FullscreenTriggerForDirective', () => { + let directive: FullscreenTriggerForDirective; + let document: Document; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [ + FullscreenTriggerForHostComponent, + FullscreenTriggerForDirective + ] + }).compileComponents(); + document = TestBed.inject(DOCUMENT); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(FullscreenTriggerForHostComponent); + fixture.detectChanges(); + }); + + it('should create an instance', () => { + directive = new FullscreenTriggerForDirective(document); + expect(directive).toBeTruthy(); + }); +}); diff --git a/libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.directive.ts b/libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.directive.ts new file mode 100644 index 00000000..962c1ca0 --- /dev/null +++ b/libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.directive.ts @@ -0,0 +1,46 @@ +import { + Directive, + HostListener, + Inject, + Input, + OnDestroy, +} from "@angular/core"; +import { DOCUMENT } from "@angular/common"; + +@Directive({ + selector: '[infFullscreenTriggerFor]', + exportAs: 'infFullscreen' +}) +export class FullscreenTriggerForDirective implements OnDestroy { + + @Input() public infFullscreenTriggerFor!: HTMLElement; + + public isFullscreen = false; + + @HostListener('click', ['$event']) + public onClick(): void { + if (this.document.fullscreenElement && this.document.exitFullscreen) { + this.document.exitFullscreen(); + return; + } + + this.infFullscreenTriggerFor.requestFullscreen(); + } + + constructor(@Inject(DOCUMENT) private readonly document: Document) {} + + @HostListener('document:fullscreenchange', ['$event']) + @HostListener('document:webkitfullscreenchange', ['$event']) + @HostListener('document:mozfullscreenchange', ['$event']) + @HostListener('document:MSFullscreenChange', ['$event']) + public onFullscreenChange(): void { + this.isFullscreen = Boolean(this.document.fullscreenElement); + } + + public ngOnDestroy() { + if (this.document.fullscreenElement) { + this.document.exitFullscreen(); + } + } + +} diff --git a/libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.module.ts b/libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.module.ts new file mode 100644 index 00000000..1214640e --- /dev/null +++ b/libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FullscreenTriggerForDirective } from './fullscreen-trigger-for.directive'; + + + +@NgModule({ + declarations: [ + FullscreenTriggerForDirective + ], + imports: [ + CommonModule + ], + exports: [ + FullscreenTriggerForDirective + ], +}) +export class FullscreenTriggerForModule { } diff --git a/libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.stories.ts b/libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.stories.ts new file mode 100644 index 00000000..eae0eea8 --- /dev/null +++ b/libs/ngx-nuts-and-bolts/src/lib/directives/fullscreen-trigger-for/fullscreen-trigger-for.stories.ts @@ -0,0 +1,129 @@ +import { Component } from '@angular/core'; +import { moduleMetadata, Story } from '@storybook/angular'; +import { FullscreenTriggerForModule } from './fullscreen-trigger-for.module'; + +@Component({ + template: ` +
+
+ +

Element to show in fullscreen

+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+

Another element

+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+ `, + styles: [ + ` + :host { + width: 100%; + display: flex; + gap: 10px; + height: 100%; + overflow: auto; + } + .container { + display: flex; + flex-direction: column; + gap: 10px; + height: 100%; + width: 100%; + } + .fullscreen-element { + display: grid; + place-items: center; + color: #fff; + width: 100%; + height: clamp(200px, 25vh, 400px); + background: teal; + } + + .fullscreen-element:-webkit-full-screen { + background: #25c2a0; + color: #000066; + } + + .fullscreen-element:-webkit-full-screen #fsbtn { + display: none; + } + + .fullscreen-element:-moz-full-screen { + background: #25c2a0; + color: #000066; + } + `, + ], +}) +class FullscreenTriggerForStoryComponent { + constructor() { + console.log('test'); + } +} + +export default { + title: 'FullscreenTriggerFor', + component: FullscreenTriggerForStoryComponent, + decorators: [ + moduleMetadata({ + declarations: [FullscreenTriggerForStoryComponent], + imports: [FullscreenTriggerForModule], + }), + ], +}; + +const Template: Story = (args: FullscreenTriggerForStoryComponent) => ({ + component: FullscreenTriggerForStoryComponent, + props: args, +}); + +export const Default = Template.bind({}); +Default.args = {};