File
Implements
Index
Properties
|
|
Methods
|
|
Inputs
|
|
Outputs
|
|
className
|
Type : string | undefined
|
|
Outputs
secondaryButtonClick
|
Type : EventEmitter<>
|
|
Methods
Public
addValidators
|
addValidators()
|
|
|
ngAfterViewInit
|
ngAfterViewInit()
|
|
|
ngOnDestroy
|
ngOnDestroy()
|
|
|
primaryButtonClicked
|
primaryButtonClicked()
|
|
|
removeValidators
|
removeValidators()
|
|
|
secondaryButtonClicked
|
secondaryButtonClicked()
|
|
|
currentScreenType
|
Type : ScreenType
|
Default value : ScreenType.web
|
|
Public
dialog
|
Type : TemplateRef<any>
|
Decorators :
@ViewChild('dialog', {static: false})
|
|
dialogForm
|
Default value : new FormGroup({
fieldControl: new FormControl(),
})
|
|
fieldType
|
Default value : FieldType
|
|
Public
isDarkTheme
|
Type : boolean
|
Default value : false
|
|
Private
ngUnsubscribe
|
Default value : new Subject()
|
|
playerContainer
|
Type : any
|
Default value : null
|
Decorators :
@ViewChildren('playerContainer')
|
|
screenType
|
Default value : ScreenType
|
|
import {
AfterViewInit,
Component,
EventEmitter,
Input,
OnDestroy,
OnInit,
Output,
TemplateRef,
ViewChild,
ViewChildren,
} from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { MatDialog } from '@angular/material/dialog';
import { BriBreakpointService } from '@davita/bridge-library/breakpoint';
import { FieldType, SelectData } from '@davita/bridge-library/fields';
import { DialogData, ScreenType } from '@davita/bridge-library/shared';
import { Subject, takeUntil, tap } from 'rxjs';
@Component({
selector: 'bri-announcement',
templateUrl: './announcement.component.html',
styleUrls: ['./announcement.component.scss'],
})
export class BriAnnouncementComponent implements OnInit, AfterViewInit, OnDestroy {
@ViewChild('dialog', { static: false }) public dialog!: TemplateRef<any>;
@Input() className: string | undefined;
@Output() primaryButtonClick: EventEmitter<SelectData | string> = new EventEmitter<
SelectData | string
>();
@Output() secondaryButtonClick: EventEmitter<null> = new EventEmitter<null>();
@ViewChildren('playerContainer') playerContainer: any = null;
public data: DialogData | undefined;
public isDarkTheme: boolean = false;
currentScreenType: ScreenType = ScreenType.web;
screenType = ScreenType;
fieldType = FieldType;
dialogForm = new FormGroup({
fieldControl: new FormControl(),
});
private ngUnsubscribe = new Subject();
constructor(
private matDialog: MatDialog,
private breakpointService: BriBreakpointService
) {}
ngOnInit(): void {
this.breakpointService.screenType$
.pipe(
tap((screenType) => {
if (screenType) {
this.currentScreenType = screenType;
}
}),
takeUntil(this.ngUnsubscribe)
)
.subscribe();
}
ngAfterViewInit() {}
ngOnDestroy(): void {
this.ngUnsubscribe.next(undefined);
this.ngUnsubscribe.complete();
}
open(data: DialogData) {
this.data = data;
const classes = ['dialog-overlay'];
if (this.className) {
classes.push(this.className);
}
// add device name
if (this.currentScreenType) {
classes.push(this.currentScreenType);
}
this.matDialog.open(this.dialog, {
panelClass: classes, // goes to cdk-overlay
id: 'dialog-container', // goes to mat-dialog-container
autoFocus: false,
disableClose: data.disableClose || false,
});
}
close() {
this.removeValidators();
this.matDialog.closeAll();
}
primaryButtonClicked() {
this.addValidators();
let formValue = this.dialogForm.value.fieldControl || '';
this.primaryButtonClick.emit(formValue);
}
public addValidators() {
if (this.data?.fieldType) {
this.dialogForm.controls['fieldControl'].addValidators([Validators.required]);
this.dialogForm.controls['fieldControl'].updateValueAndValidity();
}
}
removeValidators() {
if (this.data?.fieldType) {
this.dialogForm.controls['fieldControl'].removeValidators([Validators.required]);
this.dialogForm.reset();
}
}
secondaryButtonClicked() {
this.secondaryButtonClick.emit();
}
}
<ng-template #dialog>
<section
*ngIf="data"
[ngClass]="
currentScreenType === screenType.handheld || currentScreenType === screenType.tabletPortrait
? 'announcement_container mobile'
: 'announcement_container'
"
>
<div class="announcement_container_main">
<div class="announcement_container_image" *ngIf="data?.imageUrl">
<img [src]="data.imageUrl" tabindex="0" />
</div>
<div *ngIf="data?.videoLink">
<video [src]="data.videoLink" controls class="announcement_container_video"></video>
</div>
<div class="announcement_container_content">
<div class="announcement_container_content_header mat-headline-4">
{{ data.header }}
</div>
<div class="announcement_container_content_description mat-body-2">
{{ data.description }}
</div>
<a
*ngIf="data?.linkURL && data?.linkLabel"
[href]="data.linkURL"
class="announcement_container_content_link"
target="_blank"
>{{ data.linkLabel }}</a
>
<ng-container [ngSwitch]="data.fieldType">
<form [formGroup]="dialogForm" *ngIf="data?.fieldType">
<ng-container *ngSwitchCase="fieldType.text" [ngTemplateOutlet]="text"> </ng-container>
<ng-container *ngSwitchCase="fieldType.select" [ngTemplateOutlet]="select">
</ng-container>
<ng-container *ngSwitchCase="fieldType.innerHtml" [ngTemplateOutlet]="innerHtml">
</ng-container>
<ng-container *ngSwitchDefault></ng-container>
</form>
</ng-container>
</div>
</div>
<div
[class]="
data.hidePrimaryButton || data.hideSecondaryButton ? 'no-primary actions' : 'actions'
"
>
<bri-buttons
*ngIf="!data.hideSecondaryButton"
briBasic
[btnText]="data.secondaryButtonLabel || 'Label2'"
(buttonClicked)="secondaryButtonClicked()"
></bri-buttons>
<bri-buttons
*ngIf="!data.hidePrimaryButton"
briFlat
[btnText]="data.primaryButtonLabel || 'Label1'"
(buttonClicked)="primaryButtonClicked()"
></bri-buttons>
</div>
</section>
</ng-template>
<ng-template #select>
<bri-fields
id="formField"
[fieldType]="fieldType.select"
[label]="data?.fieldLabel ?? 'Label'"
[requiredFieldErrorText]="data?.fieldErrorText ?? 'Error'"
[selectData]="data?.selectionData ?? []"
[selectFormControl]="dialogForm.controls.fieldControl"
[requiredFieldErrorText]="data?.requiredFieldError"
[placeHolder]="data?.placeHolder ?? 'Placeholder'"
></bri-fields>
</ng-template>
<ng-template #text>
<bri-fields
id="formField"
[fieldType]="fieldType.text"
[label]="data?.fieldLabel ?? 'Label'"
[requiredFieldErrorText]="data?.fieldErrorText"
[textFormControl]="dialogForm.controls.fieldControl"
[requiredFieldErrorText]="data?.requiredFieldError"
[placeHolder]="data?.placeHolder ?? 'Placeholder'"
[maxLength]="data?.maxLength ?? 100"
></bri-fields>
</ng-template>
<ng-template #innerHtml>
<div [innerHTML]="data?.innerHtml"></div>
</ng-template>
@import '../scss/style/colors';
.announcement {
&_container {
width: 560px;
background-color: $light-color-ui-background;
display: flex;
flex-direction: column;
justify-content: space-between;
max-height: 90vh;
.actions {
display: flex;
justify-content: flex-end;
align-items: flex-end;
padding: 9px 24px;
box-shadow: 3px 2px 6px 0px rgba(0, 0, 0, 0.25);
-moz-box-shadow: 3px 2px 6px 0px rgba(0, 0, 0, 0.25);
-webkit-box-shadow: 3px 2px 6px 0px rgba(0, 0, 0, 0.25);
&.no-primary {
::ng-deep bri-buttons {
&:first-child {
margin-right: 0;
}
}
}
::ng-deep bri-buttons {
&:first-child {
margin-right: 16px;
}
}
}
&.mobile {
height: 100%;
max-height: 100%;
width: 100vw;
overflow: auto;
.announcement_container_main {
max-height: none;
overflow-y: unset;
}
.announcement_container_image {
display: block;
position: relative;
padding-top: 56.25%;
height: auto;
img {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
}
}
.actions {
flex-direction: column-reverse;
justify-content: flex-start;
padding: 9px 16px;
align-items: center;
height: auto;
bri-buttons {
width: 100%;
}
::ng-deep bri-buttons {
.mat-typography button {
width: 100%;
margin-right: 0;
}
}
}
}
&_main {
max-height: 100vh;
overflow-y: auto;
overflow-x: hidden;
}
&_image {
max-height: 315px;
height: 315px;
img {
height: 315px;
width: 100%;
border-radius: 4px 4px 0px 0px;
-moz-border-radius: 4px 4px 0px 0px;
-webkit-border-radius: 4px 4px 0px 0px;
}
}
&_content {
padding: 6px 16px 16px;
&_header {
margin: 0;
color: $light-color-navy;
}
&_description {
margin-bottom: 16px;
color: $light-color-text-75;
}
&_link {
color: $light-color-blue;
margin-bottom: 16px;
text-decoration: none;
display: inline-block;
}
}
form {
display: block;
width: 100%;
}
.announcement_container_video {
height: 100%;
width: 100%;
}
}
}
.text-note {
font-feature-settings:
'clig' off,
'liga' off;
font-family: 'lato';
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 22px;
letter-spacing: 0.25px;
color: $light-color-text-75;
}
@media (prefers-color-scheme: dark) {
.announcement_container {
background-color: $dark-color-ui-background;
}
.announcement_container_content_header {
color: $dark-color-text-100;
}
.announcement_container_content_description {
color: $dark-color-text-75;
}
.announcement_container_content_link {
color: $dark-color-blue;
}
.text-note {
color: $dark-color-text-75 !important;
}
}
Legend
Html element with directive