File

projects/angular-material-extensions/fab-menu/src/lib/mat-fab-menu.component.ts

Implements

OnInit OnChanges

Metadata

selector mat-fab-menu
styleUrls mat-fab-menu.component.scss
templateUrl mat-fab-menu.component.html

Index

Properties
Methods
Inputs
Outputs

Constructor

constructor()

Inputs

closeAfterSelection
Default value : true
color
Type : ThemePalette
Default value : 'accent'
direction
Type : MatFabMenuDirection
Default value : 'top'
disabled
Type : boolean
fabButtons
Type : MatFabMenu[]
icon
Default value : 'add'
isActive
Type : boolean

Outputs

onFabMenuItemSelected
Type : EventEmitter<string | number>

Methods

adjustLayout
adjustLayout()
Returns : void
ngOnChanges
ngOnChanges(changes: SimpleChanges)
Parameters :
Name Type Optional
changes SimpleChanges No
Returns : void
ngOnInit
ngOnInit()
Returns : void
selectFabMenu
selectFabMenu(fab: MatFabMenu)
Parameters :
Name Type Optional
fab MatFabMenu No
Returns : void
toggle
toggle()
Returns : void

Properties

layout
Type : any
layout2
Type : any
import {Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges} from '@angular/core';
import {speedDialFabAnimations} from './mat-fab-menu.animations';
import { ThemePalette } from '@angular/material/core';
import { TooltipPosition } from '@angular/material/tooltip';

export interface MatFabMenu {
  id: string | number;
  icon?: string; // please use either icon or imgUrl
  iconColor?: ThemePalette;
  imgUrl?: string; // please use either icon or imgUrl
  tooltip?: string;
  tooltipPosition?: TooltipPosition;
  color?: ThemePalette;
}

export type MatFabMenuDirection = 'top' | 'bottom' | 'left' | 'right';

@Component({
  selector: 'mat-fab-menu',
  templateUrl: 'mat-fab-menu.component.html',
  styleUrls: ['mat-fab-menu.component.scss'],
  animations: speedDialFabAnimations
})
export class MatFabMenuComponent implements OnInit, OnChanges {

  @Input()
  fabButtons: MatFabMenu[];

  @Input()
  icon = 'add';

  @Input()
  direction: MatFabMenuDirection = 'top';

  @Input()
  color: ThemePalette = 'accent';

  @Input()
  isActive: boolean;

  @Input()
  disabled: boolean;

  @Input()
  closeAfterSelection = true;

  // tslint:disable-next-line:no-output-on-prefix
  @Output()
  onFabMenuItemSelected: EventEmitter<string | number> = new EventEmitter<string | number>();

  layout: any;
  layout2: any;

  constructor() {
  }

  ngOnInit(): void {
    this.adjustLayout();
  }

  ngOnChanges(changes: SimpleChanges): void {
    if (changes.direction && !changes.direction.firstChange) {
      this.direction = changes.direction.currentValue;
      this.adjustLayout();
    }

    if (changes.color && !changes.color.firstChange) {
      this.color = changes.color.currentValue;
    }

    if (changes.fabButtons && !changes.fabButtons.firstChange) {
      this.fabButtons = changes.fabButtons.currentValue;
    }
  }

  adjustLayout() {
    switch (this.direction) {
      case 'top':
        this.layout = 'column-reverse';
        this.layout2 = 'column-reverse';
        break;

      case 'bottom':
        this.layout = 'column';
        this.layout2 = 'column';
        break;

      case 'left':
        this.layout = 'row-reverse';
        this.layout2 = 'row-reverse';
        break;

      case 'right':
        this.layout = 'row';
        this.layout2 = 'row';
        break;
    }
  }

  toggle() {
    this.isActive = !this.isActive;
  }

  selectFabMenu(fab: MatFabMenu) {
    this.onFabMenuItemSelected.emit(fab.id);
    if (this.closeAfterSelection) {
      this.isActive = false;
    }
  }
}
<div [fxLayout]="layout" class="container" fxLayoutAlign="center center" fxLayoutGap="16px">
  <div fxLayoutAlign="center">
    <button (click)="isActive = !isActive"
            [color]="color" [disabled]="disabled"
            [ngClass]="{
    'mat-fab' : !isActive,
    'mat-mini-fab' : isActive
  }"
            mat-fab>
      <mat-icon [@fabToggler]="{value: isActive}">{{icon}}</mat-icon> <!-- Animation here -->
    </button>
  </div>
  <div *ngIf="isActive" [@fabsStagger]="fabButtons.length"
       [fxLayout]="layout2" fxLayoutAlign="center center" fxLayoutGap="16px">
    <button (click)="selectFabMenu(fab)"
            *ngFor="let fab of fabButtons"
            [color]="fab?.color"
            [matTooltip]="fab?.tooltip"
            [matTooltipPosition]="fab?.tooltipPosition"
            [ngClass]="{'fullSVG' : fab?.imgUrl}"
            mat-fab>
      <mat-icon *ngIf="fab?.icon" [color]="fab?.iconColor">{{fab?.icon}}</mat-icon>
      <img *ngIf="fab?.imgUrl" [src]="fab?.imgUrl" alt="icon">
    </button>
  </div>
</div>

mat-fab-menu.component.scss

:host {
  display: block;
}

.fullSVG {
  img {
    width: 100%;
  }

  ::ng-deep span.mat-button-wrapper {
    padding: 0;
  }
}

.container {
  //position: fixed;
  //bottom: 15px;
  //right: 15px;
  //z-index: 100;

  > div {
    //display: flex;
    //flex-direction: column-reverse;
    //align-items: center;
    margin-bottom: 5px;

    button {
      margin-bottom: 16px;
    }
  }
}
Legend
Html element
Component
Html element with directive

result-matching ""

    No results matching ""