File

projects/davita/bridge-library/announcement/announcement.component.ts

Implements

OnInit AfterViewInit OnDestroy

Metadata

Index

Properties
Methods
Inputs
Outputs

Constructor

constructor(matDialog: MatDialog, breakpointService: BriBreakpointService)
Parameters :
Name Type Optional
matDialog MatDialog No
breakpointService BriBreakpointService No

Inputs

className
Type : string | undefined

Outputs

primaryButtonClick
Type : EventEmitter<SelectData | string>
secondaryButtonClick
Type : EventEmitter<>

Methods

Public addValidators
addValidators()
Returns : void
close
close()
Returns : void
ngAfterViewInit
ngAfterViewInit()
Returns : void
ngOnDestroy
ngOnDestroy()
Returns : void
ngOnInit
ngOnInit()
Returns : void
open
open(data: DialogData)
Parameters :
Name Type Optional
data DialogData No
Returns : void
primaryButtonClicked
primaryButtonClicked()
Returns : void
removeValidators
removeValidators()
Returns : void
secondaryButtonClicked
secondaryButtonClicked()
Returns : void

Properties

currentScreenType
Type : ScreenType
Default value : ScreenType.web
Public data
Type : DialogData | undefined
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>

./announcement.component.scss

@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
Component
Html element with directive

results matching ""

    No results matching ""