@WidgetComponent

nm-drawer-container

File

src/app/shared/widgets/container/drawer-container.component.ts

Implements

OnInit OnDestroy

Metadata

selector nm-drawer-container
styleUrls drawer-container.component.scss
templateUrl drawer-container.component.html

Index

Widget inputs
Widget outputs
Properties
Methods
Inputs
HostBindings

Constructor

constructor(appContext: AppContext, translateService: TranslateService, localStorageService: LocalStorageService, appService: AppService)
Parameters :
Name Type Optional
appContext AppContext no
translateService TranslateService no
localStorageService LocalStorageService no
appService AppService no

Inputs

configuration

Type: WidgetConfig

elementClass

Default value: null

id

Type: string

parent

Type: string

HostBindings

class
class:
Default value : null

Methods

mouseleaveDrawer
mouseleaveDrawer()
Returns : void
mouseoverDrawer
mouseoverDrawer()
Returns : void
ngAfterViewInit
ngAfterViewInit()
Returns : void
ngOnDestroy
ngOnDestroy()
Returns : void
ngOnInit
ngOnInit()
Returns : void

Properties

Private _mouseEnterStream
_mouseEnterStream:
Default value : new Subject<any>()
Private _mouseLeaveStream
_mouseLeaveStream:
Default value : new Subject<any>()
Public dockMode
dockMode:
Default value : new BehaviorSubject<boolean>(true)
Public dockModeStorage
dockModeStorage: LocalStorageEntry
Type : LocalStorageEntry
Public drawer
drawer: MatDrawer
Type : MatDrawer
Decorators : ViewChild
Public drawerOpened
drawerOpened: boolean
Type : boolean
Public drawerTitle
drawerTitle: string
Type : string
Public drawerTitleDynamic
drawerTitleDynamic: string
Type : string
Private unsubscribe
unsubscribe:
Default value : NgUnsubscribe.create()
Private widgetData
widgetData: WidgetData
Type : WidgetData
Private widgetId
widgetId: string
Type : string
import {
  Component,
  HostBinding,
  Input,
  OnDestroy,
  OnInit,
  Optional,
  ViewChild,
} from "@angular/core";

import { AppService, WidgetData } from "../configuration/app.service";
import { WidgetConfig } from "../widget.configuration";
import { UtilService } from "../../components/util";
import { MatDrawer } from "@angular/material/sidenav";
import { AppContext } from "../../components/app-context";
import { delay, flatMap, map, takeUntil } from "rxjs/operators";
import { BehaviorSubject, of, Subject } from "rxjs";
import { NgUnsubscribe } from "../../ng-unsubscribe";
import { TranslateService } from "@ngx-translate/core";
import {
  LocalStorageEntry,
  LocalStorageService,
} from "../../components/local-storage/local-storage.service";
import {
  DeletionMode,
  Scope,
} from "../../components/local-storage/local-storage-constants";
import {
  animate,
  keyframes,
  style,
  transition,
  trigger,
} from "@angular/animations";

@Component({
  selector: "nm-drawer-container",
  templateUrl: "drawer-container.component.html",
  styleUrls: ["drawer-container.component.scss"],
  animations: [
    trigger("fadeTrigger", [
      transition(":enter", [
        style({ opacity: 0 }),
        animate(
          "200ms ease-out",
          keyframes([
            style({ opacity: 1, transform: "translate3d(0, -15%, 0)" }),
            style({ opacity: 1, transform: "translate3d(0, 0, 0)" }),
          ])
        ),
      ]),
      transition(":leave", [
        style({ opacity: 1 }),
        animate(
          "200ms ease-out",
          keyframes([
            style({ opacity: 1, transform: "translate3d(0, 0, 0)" }),
            style({ opacity: 0, transform: "translate3d(0, -15%, 0)" }),
          ])
        ),
      ]),
    ]),
  ],
})
export class NmDrawerContainerComponent implements OnInit, OnDestroy {
  @HostBinding("class") hostClass = null;

  @Input()
  public elementClass = null;

  @Input()
  public configuration: WidgetConfig;
  @Input()
  public id: string;
  public dockMode = new BehaviorSubject<boolean>(true);
  public drawerTitle: string;
  public drawerTitleDynamic: string;
  public dockModeStorage: LocalStorageEntry;
  public drawerOpened: boolean;
  @ViewChild("drawer", { static: false }) public drawer: MatDrawer;
  @Input()
  private parent: string;
  private widgetId: string;
  private widgetData: WidgetData;
  private unsubscribe = NgUnsubscribe.create();
  private _mouseEnterStream = new Subject<any>();
  private _mouseLeaveStream = new Subject<any>();

  constructor(
    private appContext: AppContext,
    private translateService: TranslateService,
    private localStorageService: LocalStorageService,
    @Optional() private appService: AppService
  ) {}

  ngOnInit() {
    this.elementClass = UtilService.buildCssClass(
      this.configuration.elementClass,
      this.configuration.elementClassModifiers
    );

    this.hostClass = UtilService.buildCssClass(
      this.configuration.hostClass,
      this.configuration.hostClassModifiers
    );

    let searchWidgetConfig = this.appService.toWidgetConfig(
      this.configuration.configuration.components[0]
    );

    if (searchWidgetConfig) {
      this.drawerTitle = this.translateService.instant(
        searchWidgetConfig.configuration.title
      );

      this.dockModeStorage = this.localStorageService.getLocalStorageEntry(
        "dockMode-" + searchWidgetConfig.configuration.title,
        Scope.USER_AND_CLIENT,
        DeletionMode.NEVER
      );

      if (this.dockModeStorage.exists()) {
        this.drawerOpened = JSON.parse(this.dockModeStorage.value);

        this.dockMode.next(this.drawerOpened);
      } else {
        this.drawerOpened = true;
      }
    }
    this.appContext.browserContext.replace(
      {
        target: ["widget-frame-header"],
        action: "pinWidget",
      },
      {
        type: "action",
        icon: "pin",
        name: "pinWidget",
        conditions: [
          (config, context) => {
            const configuration = this.appService.toWidgetConfig(
              this.configuration.configuration.components[0]
            );
            return (
              context.widgetId ===
                this.configuration.configuration.components[0] &&
              context.configuration.configuration.title ===
                configuration.configuration.title
            );
          },
        ],
        onClick: () => {
          this.dockMode.next(!this.dockMode.getValue());
          this.dockModeStorage.value = JSON.stringify(this.dockMode.getValue());
        },
        onInit: () => {
          return this.dockMode.pipe(
            map((sideMode) => (sideMode ? "pin-off" : "pin")),
            map((icon) => {
              return {
                icon: icon,
                description: icon === "pin-off" ? "label.pin-off" : "label.pin",
              };
            })
          );
        },
      }
    );

    this.appContext.browserContext
      .subscribe({ target: ["toolbox-collapsed-drawer-content"] })
      .pipe(takeUntil(this.unsubscribe))
      .subscribe((content) => {
        if (content && content.length > 0) {
          this.drawerTitle = this.translateService.instant(this.drawerTitle);
          this.drawerTitleDynamic = content[0].content;
        }
      });

    this._mouseLeaveStream
      .pipe(
        flatMap((result) => {
          return of(result).pipe(delay(300), takeUntil(this._mouseEnterStream));
        })
      )
      .subscribe((e) => {
        // TODO: Find better way to check if a overlay is open
        let overlayBackdrop = document.getElementsByClassName(
          "cdk-overlay-backdrop-showing"
        );
        if (!this.dockMode.getValue() && overlayBackdrop.length == 0) {
          this.drawer.close();
        }
      });
  }

  ngAfterViewInit() {
    this.mouseleaveDrawer();
  }

  ngOnDestroy() {}

  mouseleaveDrawer() {
    this._mouseLeaveStream.next();
  }

  mouseoverDrawer() {
    this._mouseEnterStream.next();
  }
}
<ng-container *ngIf="drawerOpened !== null">
  <mat-card
    *ngIf="!(dockMode | async)"
    class="nm-drawerContainer__collapsedCard {{
      drawer.opened ? '--drawerOpened' : ''
    }}"
    (click)="drawer.toggle()"
  >
    <mat-card-content>
      <button
        color="primary"
        class="nm-drawerContainer__expandButton"
        mat-icon-button
      >
        <mat-icon
          *ngIf="!drawer.opened"
          svgIcon="chevron-double-right"
        ></mat-icon>
        <mat-icon
          *ngIf="drawer.opened"
          svgIcon="chevron-double-left"
        ></mat-icon>
      </button>

      <div
        *ngIf="!drawer.opened"
        [@fadeTrigger]
        class="nm-drawerContainer__title"
      >
        {{ drawerTitle }}
        &nbsp;
        {{ drawerTitleDynamic }}
      </div>
    </mat-card-content>
  </mat-card>
  <mat-drawer-container [hasBackdrop]="false">
    <mat-drawer
      #drawer
      opened="drawerOpened"
      [mode]="(dockMode | async) ? 'side' : 'over'"
      (mouseleave)="mouseleaveDrawer()"
      (mouseover)="mouseoverDrawer()"
      [disableClose]="true"
    >
      <nm-container
        [configuration]="
          configuration.configuration.components[0] | widgetFor: configuration
        "
        [parent]="id"
        [class]="elementClass"
        [id]="configuration.configuration.components[0]"
      >
      </nm-container>
    </mat-drawer>
    <mat-drawer-content>
      <nm-container
        [configuration]="
          configuration.configuration.components[1] | widgetFor: configuration
        "
        [parent]="id"
        [class]="elementClass"
        [id]="configuration.configuration.components[1]"
      >
      </nm-container>
    </mat-drawer-content>
  </mat-drawer-container>
</ng-container>
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""