Skip to content
Snippets Groups Projects
button-toolbar-detail.presentational.ts 4.59 KiB
Newer Older
import {
  ChangeDetectionStrategy,
  Component,
  Input,
  OnInit,
  Output,
} from "@angular/core";
import {SharedAbstractPresentational} from "@shared/components/presentationals/shared-abstract/shared-abstract.presentational";
import {ExtraButtonToolbar} from "@shared/models/extra-button-toolbar.model";
import {
  BehaviorSubject,
  Observable,
} from "rxjs";
import {
  BaseResource,
  isNullOrUndefined,
  ObservableUtil,
  RoutesEnum,
  TRANSLATE,
} from "solidify-frontend";

@Component({
  selector: "dlcm-button-toolbar-detail",
  templateUrl: "./button-toolbar-detail.presentational.html",
  styleUrls: ["./button-toolbar-detail.presentational.scss"],
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ButtonToolbarDetailPresentational<TResourceModel extends BaseResource> extends SharedAbstractPresentational implements OnInit {
  @Input()
  readonly keyEditButtonToTranslate: string = TRANSLATE("app.navigation.button.edit");
  @Input()
  readonly keyDeleteButtonToTranslate: string = TRANSLATE("app.navigation.button.delete");
  @Input()
  readonly keyBackButtonToTranslate: string = TRANSLATE("app.navigation.button.backToList");
  @Input()
  readonly keyBackToDetailButtonToTranslate: string = TRANSLATE("app.navigation.button.backToDetail");

  @Input()
  isEdit: boolean;

  @Input()
  editAvailable: boolean = true;

  @Input()
  deleteAvailable: boolean = true;

  @Input()
  detail: boolean;

  @Input()
  currentModel: TResourceModel;

  @Input()
  listOriginalButton?: ExtraButtonToolbar<TResourceModel>[];

  @Input()
  listExtraButtons?: ExtraButtonToolbar<TResourceModel>[];

  private readonly _editBS: BehaviorSubject<void> = new BehaviorSubject<void>(undefined);
  @Output("editChange")
  readonly editObs: Observable<void> = ObservableUtil.asObservable(this._editBS);

  private readonly _deleteBS: BehaviorSubject<void> = new BehaviorSubject<void>(undefined);
  @Output("deleteChange")
  readonly deleteObs: Observable<void> = ObservableUtil.asObservable(this._deleteBS);

  private readonly _backToListBS: BehaviorSubject<void> = new BehaviorSubject<void>(undefined);
  @Output("backToListChange")
  readonly backToListObs: Observable<void> = ObservableUtil.asObservable(this._backToListBS);

  private readonly _backToDetailBS: BehaviorSubject<void> = new BehaviorSubject<void>(undefined);
  @Output("backToDetailChange")
  readonly backToDetailObs: Observable<void> = ObservableUtil.asObservable(this._backToDetailBS);

  private readonly _navigateBS: BehaviorSubject<RoutesEnum> = new BehaviorSubject<RoutesEnum>(undefined);
  @Output("navigateChange")
  readonly navigateObs: Observable<RoutesEnum> = ObservableUtil.asObservable(this._navigateBS);

  ngOnInit(): void {
    super.ngOnInit();

    this.listOriginalButton = [
      {
        color: "accent",
        icon: "navigate_before",
        labelToTranslate: this.keyBackToDetailButtonToTranslate,
        order: 10,
        callback: () => this.backToDetail(),
        displayCondition: (resource) => this.isEdit,
      },
      {
        color: "accent",
        icon: "navigate_before",
        labelToTranslate: this.keyBackButtonToTranslate,
        order: 20,
        callback: () => this.backToList(),
        displayCondition: (resource) => !this.isEdit,
      },
      {
        color: "primary",
        icon: "edit",
        labelToTranslate: this.keyEditButtonToTranslate,
        order: 30,
        callback: () => this.edit(),
        displayCondition: (resource) => !this.isEdit && this.editAvailable,
      },
      {
        color: "accent",
        icon: "delete",
        labelToTranslate: this.keyDeleteButtonToTranslate,
        order: 40,
        callback: () => this.delete(),
        displayCondition: (resource) => !this.isEdit && this.deleteAvailable,
        disableCondition: (resource) => !resource,
      },
    ];

    if (!isNullOrUndefined(this.listExtraButtons) && !isEmptyArray(this.listExtraButtons)) {
      this.listOriginalButton = [...this.listOriginalButton, ...this.listExtraButtons];
    }
    this.listOriginalButton.sort((a, b) => {
      if (a.order === b.order) {
        return 0;
      } else if (a.order < b.order) {
        return -1;
      }
      return 1;
    });
  }

  edit(): void {
    if (this.editAvailable) {
      this._editBS.next();
    }
  }

  delete(): void {
    if (this.deleteAvailable && !isNullOrUndefined(this.currentModel)) {
      this._deleteBS.next();
    }
  }

  backToList(): void {
    this._backToListBS.next();
  }

  backToDetail(): void {
    this._backToDetailBS.next();
  }

  navigate(route: RoutesEnum): void {
    this._navigateBS.next(route);
  }