From b1f93b920279ffbd877532bef90653583d07d7c9 Mon Sep 17 00:00:00 2001 From: natlex-to-me <75669064+natlex-to-me@users.noreply.github.com> Date: Mon, 25 Jan 2021 10:06:34 +0300 Subject: [PATCH] #31 Add about modal window (#47) --- src/src/app/about/about.component.css | 3 ++ src/src/app/about/about.component.html | 44 ++++++++++++++++++ src/src/app/about/about.component.ts | 9 ++++ src/src/app/about/index.ts | 1 + src/src/app/app.module.ts | 2 + .../header-panel/header-panel.component.html | 2 +- .../header-panel/header-panel.component.ts | 10 ++++- src/src/app/main/main.lazy-loaded.module.ts | 3 +- src/src/app/main/maps.module.ts | 1 + src/src/app/modal/index.ts | 4 ++ src/src/app/modal/modal.module.ts | 27 +++++++++++ src/src/app/modal/modal.service.ts | 26 +++++++++++ src/src/app/modal/modal/modal.component.css | 21 +++++++++ src/src/app/modal/modal/modal.component.html | 11 +++++ src/src/app/modal/modal/modal.component.ts | 45 +++++++++++++++++++ src/src/app/modal/models/modal-data.ts | 6 +++ src/src/styles.css | 12 ++++- src/src/styles/colors.css | 3 ++ 18 files changed, 226 insertions(+), 4 deletions(-) create mode 100644 src/src/app/about/about.component.css create mode 100644 src/src/app/about/about.component.html create mode 100644 src/src/app/about/about.component.ts create mode 100644 src/src/app/about/index.ts create mode 100644 src/src/app/modal/index.ts create mode 100644 src/src/app/modal/modal.module.ts create mode 100644 src/src/app/modal/modal.service.ts create mode 100644 src/src/app/modal/modal/modal.component.css create mode 100644 src/src/app/modal/modal/modal.component.html create mode 100644 src/src/app/modal/modal/modal.component.ts create mode 100644 src/src/app/modal/models/modal-data.ts create mode 100644 src/src/styles/colors.css diff --git a/src/src/app/about/about.component.css b/src/src/app/about/about.component.css new file mode 100644 index 0000000..92d692c --- /dev/null +++ b/src/src/app/about/about.component.css @@ -0,0 +1,3 @@ +:host { + display: contents; +} diff --git a/src/src/app/about/about.component.html b/src/src/app/about/about.component.html new file mode 100644 index 0000000..b25b539 --- /dev/null +++ b/src/src/app/about/about.component.html @@ -0,0 +1,44 @@ +

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. + Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at + nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec + tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget + nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per + inceptos himenaeos. +

+ +

+ Curabitur sodales ligula in libero. Sed dignissim lacinia nunc. Curabitur + tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas + mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas + porttitor. Morbi lectus risus, iaculis vel, suscipit quis, luctus non, massa. + Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. +

+ +

+ Nulla metus metus, ullamcorper vel, tincidunt sed, euismod in, nibh. Quisque + volutpat condimentum velit. Class aptent taciti sociosqu ad litora torquent + per conubia nostra, per inceptos himenaeos. Nam nec ante. Sed lacinia, urna + non tincidunt mattis, tortor neque adipiscing diam, a cursus ipsum ante quis + turpis. Nulla facilisi. Ut fringilla. Suspendisse potenti. Nunc feugiat mi a + tellus consequat imperdiet. Vestibulum sapien. Proin quam. Etiam ultrices. + Suspendisse in justo eu magna luctus suscipit. Sed lectus. +

+ +

+ Integer euismod lacus luctus magna. Quisque cursus, metus vitae pharetra + auctor, sem massa mattis sem, at interdum magna augue eget diam. Vestibulum + ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + Morbi lacinia molestie dui. Praesent blandit dolor. Sed non quam. In vel mi + sit amet augue congue elementum. Morbi in ipsum sit amet pede facilisis + laoreet. Donec lacus nunc, viverra nec, blandit vel, egestas et, augue. + Vestibulum tincidunt malesuada tellus. Ut ultrices ultrices enim. Curabitur + sit amet mauris. +

+ +

+ Morbi in dui quis est pulvinar ullamcorper. Nulla facilisi. Integer lacinia + sollicitudin massa. Cras metus. Sed aliquet risus a tortor. Integer id quam. + Morbi mi. Quisque nisl felis, venenatis tristique, dignissim in, ultrices sit + amet, augue. Proin sodales libero eget ante. Nulla quam. Aenean laoreet. +

diff --git a/src/src/app/about/about.component.ts b/src/src/app/about/about.component.ts new file mode 100644 index 0000000..154ab0c --- /dev/null +++ b/src/src/app/about/about.component.ts @@ -0,0 +1,9 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +@Component({ + selector: 'app-about', + changeDetection: ChangeDetectionStrategy.OnPush, + templateUrl: './about.component.html', + styleUrls: ['./about.component.css'], +}) +export class AboutComponent {} diff --git a/src/src/app/about/index.ts b/src/src/app/about/index.ts new file mode 100644 index 0000000..b7cb92a --- /dev/null +++ b/src/src/app/about/index.ts @@ -0,0 +1 @@ +export * from './about.component'; diff --git a/src/src/app/app.module.ts b/src/src/app/app.module.ts index c3781de..f9a6e28 100644 --- a/src/src/app/app.module.ts +++ b/src/src/app/app.module.ts @@ -6,6 +6,7 @@ import { HeaderPanelComponent } from './header-panel/header-panel.component' import { FooterComponent } from './footer/footer.component' import { RightSidebarComponent } from './right-sidebar/right-sidebar.component' import { BrowserAnimationsModule } from '@angular/platform-browser/animations' +import { ModalModule } from 'src/app/modal'; import { MapsModule } from './main/maps.module'; import { MatButtonModule } from '@angular/material/button'; @@ -33,6 +34,7 @@ import { GoogleMapsConfigModule } from 'src/app/google-maps'; MatFormFieldModule, MatInputModule, MatMenuModule, + ModalModule, GoogleMapsConfigModule.forRoot(environment.googleMapApiKey), ], providers: [], diff --git a/src/src/app/header-panel/header-panel.component.html b/src/src/app/header-panel/header-panel.component.html index fa09c02..a1e92dd 100644 --- a/src/src/app/header-panel/header-panel.component.html +++ b/src/src/app/header-panel/header-panel.component.html @@ -3,7 +3,7 @@ logo
- diff --git a/src/src/app/header-panel/header-panel.component.ts b/src/src/app/header-panel/header-panel.component.ts index 1ccebd5..8a4951b 100644 --- a/src/src/app/header-panel/header-panel.component.ts +++ b/src/src/app/header-panel/header-panel.component.ts @@ -1,4 +1,6 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { AboutComponent } from 'src/app/about'; +import { ModalService } from 'src/app/modal'; @Component({ selector: 'app-header-panel', @@ -6,4 +8,10 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; styleUrls: ['./header-panel.component.css'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class HeaderPanelComponent {} +export class HeaderPanelComponent { + constructor(private readonly _modal: ModalService) {} + + openAboutModal() { + this._modal.openModal(AboutComponent, 'О проекте'); + } +} diff --git a/src/src/app/main/main.lazy-loaded.module.ts b/src/src/app/main/main.lazy-loaded.module.ts index 8ea70f5..03e40b4 100644 --- a/src/src/app/main/main.lazy-loaded.module.ts +++ b/src/src/app/main/main.lazy-loaded.module.ts @@ -2,6 +2,7 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { GoogleMapsModule } from '@angular/google-maps'; import { RouterModule } from '@angular/router'; +import { AboutComponent } from 'src/app/about'; import { DateSliderModule } from 'src/app/date-slider'; import { GoogleMapComponent } from './components/google-map/google-map.component'; @@ -10,7 +11,7 @@ import { routes } from './main.routes'; import { MapsModule } from './maps.module'; @NgModule({ - declarations: [MainComponent, GoogleMapComponent], + declarations: [AboutComponent, MainComponent, GoogleMapComponent], imports: [ CommonModule, GoogleMapsModule, diff --git a/src/src/app/main/maps.module.ts b/src/src/app/main/maps.module.ts index 813c553..cb18144 100644 --- a/src/src/app/main/maps.module.ts +++ b/src/src/app/main/maps.module.ts @@ -1,5 +1,6 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; + import { GoogleMapViewConfig } from './models/google-map-view-config'; import { GoogleMapViewConfigService } from './services/google-map-view-config.service'; diff --git a/src/src/app/modal/index.ts b/src/src/app/modal/index.ts new file mode 100644 index 0000000..ed0f6b7 --- /dev/null +++ b/src/src/app/modal/index.ts @@ -0,0 +1,4 @@ +export * from './modal.module'; +export * from './modal.service'; +export * from './modal/modal.component'; +export * from './models/modal-data'; diff --git a/src/src/app/modal/modal.module.ts b/src/src/app/modal/modal.module.ts new file mode 100644 index 0000000..9d524aa --- /dev/null +++ b/src/src/app/modal/modal.module.ts @@ -0,0 +1,27 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { + MatDialogConfig, + MatDialogModule, + MAT_DIALOG_DEFAULT_OPTIONS, +} from '@angular/material/dialog'; +import { MatIconModule } from '@angular/material/icon'; + +import { ModalComponent } from './modal/modal.component'; + +@NgModule({ + declarations: [ModalComponent], + imports: [CommonModule, MatButtonModule, MatDialogModule, MatIconModule], + providers: [ + { + provide: MAT_DIALOG_DEFAULT_OPTIONS, + useValue: { + autoFocus: true, + hasBackdrop: true, + panelClass: 'app-modal', + }, + }, + ], +}) +export class ModalModule {} diff --git a/src/src/app/modal/modal.service.ts b/src/src/app/modal/modal.service.ts new file mode 100644 index 0000000..14504a2 --- /dev/null +++ b/src/src/app/modal/modal.service.ts @@ -0,0 +1,26 @@ +import { ComponentType } from '@angular/cdk/overlay'; +import { Injectable } from '@angular/core'; +import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { Observable } from 'rxjs'; + +import { ModalComponent } from './modal/modal.component'; +import { ModalData } from './models/modal-data'; + +@Injectable({ providedIn: 'root' }) +export class ModalService { + constructor(private readonly _modal: MatDialog) {} + + openModal( + component: ComponentType, + title?: string + ): Observable { + const dialogRef = this._modal.open(ModalComponent, { + data: >{ + component, + title, + }, + }); + + return dialogRef.afterClosed(); + } +} diff --git a/src/src/app/modal/modal/modal.component.css b/src/src/app/modal/modal/modal.component.css new file mode 100644 index 0000000..7f8b6a6 --- /dev/null +++ b/src/src/app/modal/modal/modal.component.css @@ -0,0 +1,21 @@ +:host { + display: contents; +} + +.close-button { + position: absolute; + top: 0; + right: 0; + transform: translate(50%, -50%); + + color: var(--close-icon-color); +} + +.close-icon { + --close-button-icon-size: 35px; + + font-size: var(--close-button-icon-size); + line-height: var(--close-button-icon-size); + width: var(--close-button-icon-size); + height: var(--close-button-icon-size); +} diff --git a/src/src/app/modal/modal/modal.component.html b/src/src/app/modal/modal/modal.component.html new file mode 100644 index 0000000..8d68c47 --- /dev/null +++ b/src/src/app/modal/modal/modal.component.html @@ -0,0 +1,11 @@ + + + +

{{ title }}

+
+ + + + diff --git a/src/src/app/modal/modal/modal.component.ts b/src/src/app/modal/modal/modal.component.ts new file mode 100644 index 0000000..96cca01 --- /dev/null +++ b/src/src/app/modal/modal/modal.component.ts @@ -0,0 +1,45 @@ +import { + AfterViewInit, + ChangeDetectionStrategy, + Component, + ComponentFactoryResolver, + Inject, + ViewChild, + ViewContainerRef, +} from '@angular/core'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; + +import { ModalData } from '../models/modal-data'; + +@Component({ + selector: 'app-modal', + changeDetection: ChangeDetectionStrategy.OnPush, + templateUrl: './modal.component.html', + styleUrls: ['./modal.component.css'], +}) +export class ModalComponent implements AfterViewInit { + title?: string; + + get hasTitle() { + return Boolean(this.title); + } + + @ViewChild('content', { static: true, read: ViewContainerRef }) + private readonly _containerRef!: ViewContainerRef; + + constructor( + @Inject(MAT_DIALOG_DATA) + private readonly _data: ModalData, + private readonly _resolver: ComponentFactoryResolver + ) { + this.title = this._data.title; + } + + ngAfterViewInit() { + const factory = this._resolver.resolveComponentFactory( + this._data.component + ); + + this._containerRef.createComponent(factory); + } +} diff --git a/src/src/app/modal/models/modal-data.ts b/src/src/app/modal/models/modal-data.ts new file mode 100644 index 0000000..5737e7f --- /dev/null +++ b/src/src/app/modal/models/modal-data.ts @@ -0,0 +1,6 @@ +import { ComponentType } from '@angular/cdk/portal'; + +export interface ModalData { + component: ComponentType; + title?: string; +} diff --git a/src/src/styles.css b/src/src/styles.css index 62a7a4d..f32d13c 100644 --- a/src/src/styles.css +++ b/src/src/styles.css @@ -1,2 +1,12 @@ +@import 'styles/colors.css'; + html, body { height: 100%; } -body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } \ No newline at end of file + +body { + margin: 0; + font-family: Roboto, 'Helvetica Neue', sans-serif; +} + +.app-modal { + position: absolute !important; +} diff --git a/src/src/styles/colors.css b/src/src/styles/colors.css new file mode 100644 index 0000000..8eec9ce --- /dev/null +++ b/src/src/styles/colors.css @@ -0,0 +1,3 @@ +:root { + --close-icon-color: #796363; +}