ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
348 lines • 72 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, ElementRef, EventEmitter, Injector, ViewChild, ViewContainerRef, ViewEncapsulation, forwardRef } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { BooleanInputConverter } from '../../../decorators/input-converter';
import { DialogService } from '../../../services/dialog.service';
import { NavigationService } from '../../../services/navigation.service';
import { SnackBarService } from '../../../services/snackbar.service';
import { Codes } from '../../../util/codes';
import { PermissionsUtils } from '../../../util/permissions';
import { Util } from '../../../util/util';
import { OFormBase } from '../o-form-base.class';
import { OFormToolbarBase } from './o-form-toolbar-base.class';
import * as i0 from "@angular/core";
import * as i1 from "../o-form-base.class";
import * as i2 from "@angular/common";
import * as i3 from "@angular/flex-layout/flex";
import * as i4 from "@angular/material/button";
import * as i5 from "@angular/material/icon";
import * as i6 from "@angular/material/toolbar";
import * as i7 from "../navigation/o-form-navigation.component";
import * as i8 from "../../../pipes/o-translate.pipe";
export const DEFAULT_INPUTS_O_FORM_TOOLBAR = [
'labelHeader: label-header',
'labelHeaderAlign: label-header-align',
'headeractions: header-actions',
'showHeaderActionsText: show-header-actions-text',
'showHeaderNavigation:show-header-navigation'
];
export const DEFAULT_OUTPUTS_O_FORM_TOOLBAR = [
'onCancel'
];
export class OFormToolbarComponent {
get changesToSave() {
return this._changesToSave;
}
set changesToSave(val) {
this._changesToSave = val;
const attr = this._form.isEditableDetail() ? PermissionsUtils.ACTION_UPDATE : PermissionsUtils.ACTION_INSERT;
const permissions = (this.actionsPermissions || []).find(p => p.attr === attr);
if (Util.isDefined(permissions) && permissions.enabled === false) {
return;
}
this._existsChangesToSaveSubject.next(val);
}
get editBtnEnabled() {
return this._editBtnEnabled;
}
set editBtnEnabled(value) {
this._editBtnEnabled = value;
this._isEditBtnEnabledSubject.next(this._editBtnEnabled);
}
get saveBtnEnabled() {
return this._saveBtnEnabled;
}
set saveBtnEnabled(value) {
this._saveBtnEnabled = value;
this._isSaveBtnEnabledSubject.next(this._saveBtnEnabled);
}
constructor(_form, element, injector) {
this._form = _form;
this.element = element;
this.injector = injector;
this.labelHeader = '';
this.headeractions = '';
this.labelHeaderAlign = 'center';
this.showHeaderActionsText = true;
this.showHeaderNavigation = true;
this.isDetail = true;
this.editMode = false;
this.insertMode = false;
this.initialMode = true;
this.refreshBtnEnabled = false;
this.insertBtnEnabled = false;
this.deleteBtnEnabled = false;
this.onCancel = new EventEmitter();
this._changesToSave = false;
this._editBtnEnabled = false;
this._saveBtnEnabled = false;
this.mutationObservers = [];
this._isSaveBtnEnabledSubject = new BehaviorSubject(false);
this._isEditBtnEnabledSubject = new BehaviorSubject(false);
this._existsChangesToSaveSubject = new BehaviorSubject(false);
this.isSaveBtnEnabled = this._isSaveBtnEnabledSubject.asObservable();
this.isEditBtnEnabled = this._isEditBtnEnabledSubject.asObservable();
this.existsChangesToSave = this._existsChangesToSaveSubject.asObservable();
this._form.registerToolbar(this);
this._dialogService = this.injector.get(DialogService);
this._navigationService = this.injector.get(NavigationService);
this.snackBarService = this.injector.get(SnackBarService);
}
ngOnInit() {
this.formActions = Util.parseArray(this.headeractions);
if (this.formActions && this.formActions.length > 0) {
this.refreshBtnEnabled = this.formActions.indexOf('R') !== -1;
this.insertBtnEnabled = this.formActions.indexOf('I') !== -1;
this.editBtnEnabled = this.formActions.indexOf('U') !== -1;
this.deleteBtnEnabled = !this.insertMode && this.formActions.indexOf('D') !== -1;
}
if (this._navigationService) {
const self = this;
this._navigationService.onTitleChange(title => {
self.labelHeader = title;
});
}
this.includeBreadcrumb = this._form.includeBreadcrumb && this._form.formContainer.breadcrumb;
if (this.includeBreadcrumb) {
this._form.formContainer.breadcrumb = false;
}
}
ngOnDestroy() {
if (this.formCacheSubscription) {
this.formCacheSubscription.unsubscribe();
}
if (this.mutationObservers) {
this.mutationObservers.forEach((m) => {
m.disconnect();
});
}
}
ngAfterViewInit() {
this.parsePermissions();
if (this.includeBreadcrumb) {
this._form.formContainer.createBreadcrumb(this.breadContainer);
}
}
setInitialMode() {
this.manageEditableDetail();
this.initialMode = true;
this.insertMode = false;
this.editMode = false;
}
setInsertMode() {
this.initialMode = false;
this.insertMode = true;
this.editMode = false;
}
setEditMode() {
this.initialMode = false;
this.insertMode = false;
this.editMode = true;
}
onCloseDetail(options) {
this._form.executeToolbarAction(Codes.CLOSE_DETAIL_ACTION, Object.assign(options || {}, {
changeToolbarMode: true
}));
}
onBack(options) {
this._form.executeToolbarAction(Codes.BACK_ACTION, options);
}
onReload() {
if (!this.checkEnabledPermission(PermissionsUtils.ACTION_REFRESH)) {
return;
}
this._form.showConfirmDiscardChanges().then(val => {
if (val) {
this._form.executeToolbarAction(Codes.RELOAD_ACTION, { exitWithoutConfirmation: true });
}
});
}
onInsert() {
if (!this.checkEnabledPermission(PermissionsUtils.ACTION_INSERT)) {
return;
}
this._form.executeToolbarAction(Codes.GO_INSERT_ACTION, {
changeToolbarMode: true
});
}
onEdit() {
if (!this.checkEnabledPermission(PermissionsUtils.ACTION_UPDATE)) {
return;
}
this._form.executeToolbarAction(Codes.GO_EDIT_ACTION, {
changeToolbarMode: true
});
}
onDelete() {
if (!this.checkEnabledPermission(PermissionsUtils.ACTION_DELETE)) {
return;
}
this.showConfirmDelete();
}
onSave() {
if (!this.checkEnabledPermission(PermissionsUtils.ACTION_UPDATE)) {
return;
}
this.handleAcceptEditOperation();
}
cancelOperation() {
this._form.showConfirmDiscardChanges().then(val => {
if (val) {
this.editMode = false;
this.onCancel.emit();
const closeOptions = { exitWithoutConfirmation: true };
if (this.isDetail) {
this.onCloseDetail(closeOptions);
}
else if (this.insertMode) {
this.onBack(closeOptions);
}
else {
this.onReload();
this._form.setInitialMode();
}
}
});
}
acceptOperation() {
if (this.editMode) {
if (!this.checkEnabledPermission(PermissionsUtils.ACTION_UPDATE)) {
return;
}
this.handleAcceptEditOperation();
}
else if (this.insertMode) {
if (!this.checkEnabledPermission(PermissionsUtils.ACTION_INSERT)) {
return;
}
this.handleAcceptInsertOperation();
}
}
handleAcceptInsertOperation() {
this._form.executeToolbarAction(Codes.INSERT_ACTION);
}
handleAcceptEditOperation() {
this._form.executeToolbarAction(Codes.EDIT_ACTION);
}
showConfirmDelete() {
this._dialogService.confirm(this._form.messageService.getDeleteConfirmationDialogTitle(), this._form.messageService.getDeleteConfirmationMessage()).then(res => {
if (res) {
this._form.executeToolbarAction(Codes.DELETE_ACTION).subscribe(resp => {
this._form.onDelete.emit(resp);
this.onCloseDetail({ exitWithoutConfirmation: true });
}, err => {
console.error('OFormToolbar.delete error', err);
});
}
});
}
get showNavigation() {
return this.showHeaderNavigation && !(this._form.getFormManager() && this._form.getFormManager().isTabMode());
}
getLabelHeaderAlign() {
return this.labelHeaderAlign;
}
get showUndoButton() {
return this._form.undoButton && (!this.initialMode || this._form.isEditableDetail());
}
get isChangesStackEmpty() {
return this._form.isCacheStackEmpty;
}
onUndoLastChange() {
this._form.executeToolbarAction(Codes.UNDO_LAST_CHANGE_ACTION);
}
get isRefreshBtnEnabled() {
return this.refreshBtnEnabled;
}
get isInsertBtnEnabled() {
return this.insertBtnEnabled;
}
get isDeleteBtnEnabled() {
return this.deleteBtnEnabled;
}
hasEnabledPermission(permission) {
return permission ? permission.enabled : true;
}
get includeBreadcrumb() {
return this._includeBreadcrumb;
}
set includeBreadcrumb(arg) {
this._includeBreadcrumb = arg;
}
manageEditableDetail() {
const isEditableDetail = this._form.isEditableDetail();
const updatePermissions = (this.actionsPermissions || []).find(p => p.attr === PermissionsUtils.ACTION_UPDATE);
if (this.hasEnabledPermission(updatePermissions)) {
this.saveBtnEnabled = isEditableDetail;
}
this.refreshBtnEnabled = this.refreshBtnEnabled && isEditableDetail;
this.insertBtnEnabled = this.insertBtnEnabled && isEditableDetail;
this.editBtnEnabled = this.editBtnEnabled && !isEditableDetail;
this.formCacheSubscription = this._form.getFormCache().onCacheStateChanges.subscribe((value) => {
if (this._form.isEditableDetail()) {
this.changesToSave = this._form.isInitialStateChanged();
}
});
}
parsePermissions() {
if (this._form.getAttribute()) {
this.actionsPermissions = this._form.getActionsPermissions();
if (!Util.isDefined(this.actionsPermissions)) {
return;
}
const self = this;
this.actionsPermissions.forEach((permission) => {
self.permissionManagement(permission);
if (PermissionsUtils.STANDARD_ACTIONS.indexOf(permission.attr) > -1) {
if (permission.attr === PermissionsUtils.ACTION_UPDATE) {
self.permissionManagement(permission, 'edit');
}
}
});
}
}
permissionManagement(permission, attr) {
const attrAction = Util.isDefined(attr) ? attr : permission.attr;
const elementByAction = this.element.nativeElement.querySelector('[attr="' + attrAction + '"]');
if (Util.isDefined(elementByAction)) {
if (!permission.visible) {
elementByAction.remove();
}
else {
if (!permission.enabled) {
elementByAction.disabled = true;
const mutationObserver = PermissionsUtils.registerDisabledChangesInDom(elementByAction);
this.mutationObservers.push(mutationObserver);
}
}
}
}
checkEnabledPermission(attr) {
const permissions = (this.actionsPermissions || []).find(p => p.attr === attr);
const enabledPermision = PermissionsUtils.checkEnabledPermission(permissions);
if (!enabledPermision) {
this.snackBarService.open(this._form.messageService.getActionPermissionNotEnabledMessage());
}
return enabledPermision;
}
}
OFormToolbarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OFormToolbarComponent, deps: [{ token: i1.OFormBase }, { token: i0.ElementRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
OFormToolbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OFormToolbarComponent, selector: "o-form-toolbar", inputs: { labelHeader: ["label-header", "labelHeader"], labelHeaderAlign: ["label-header-align", "labelHeaderAlign"], headeractions: ["header-actions", "headeractions"], showHeaderActionsText: ["show-header-actions-text", "showHeaderActionsText"], showHeaderNavigation: ["show-header-navigation", "showHeaderNavigation"] }, outputs: { onCancel: "onCancel" }, host: { properties: { "class.o-form-toolbar": "true" } }, providers: [{ provide: OFormToolbarBase, useExisting: forwardRef(() => OFormToolbarComponent) }], viewQueries: [{ propertyName: "breadContainer", first: true, predicate: ["breadcrumb"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<mat-toolbar class=\"o-form-toolbar-header\" [class.breadcrumb]=\"includeBreadcrumb\" fxLayout=\"column\" fxLayoutAlign=\"center center\">\n\n <ng-template *ngIf=\"includeBreadcrumb\" #breadcrumb></ng-template>\n\n <div class=\"mat-toolbar-tools\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\">\n <button type=\"button\" mat-icon-button (click)=\"onBack()\" *ngIf=\"isDetail\" class=\"o-form-toolbar-button o-form-toolbar-back\">\n <mat-icon svgIcon=\"ontimize:arrow_back\"></mat-icon>\n </button>\n\n <o-form-navigation #formNavigation *ngIf=\"showNavigation\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\">\n </o-form-navigation>\n\n <span *ngIf=\"getLabelHeaderAlign() === 'center' || getLabelHeaderAlign() === 'end'\" class=\"fill-remaining\"></span>\n <div *ngIf=\"labelHeader!=''\" fxLayout=\"row\" fxLayoutAlign=\"center center\">\n <span>{{ labelHeader | oTranslate }}</span>\n </div>\n <span *ngIf=\"getLabelHeaderAlign() === 'start' || getLabelHeaderAlign() === 'center'\" class=\"fill-remaining\"></span>\n\n <ng-content select=\"[o-custom-form-toolbar-buttons-wrapper]\"></ng-content>\n\n <ng-template [ngIf]=\"showHeaderActionsText\" [ngIfElse]=\"undoBtnWithoutText\">\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-undo\" mat-stroked-button (click)=\"onUndoLastChange()\"\n [disabled]=\"isChangesStackEmpty\" *ngIf=\"showUndoButton\">\n <mat-icon svgIcon=\"ontimize:undo\"></mat-icon>\n <span>{{ 'UNDO' | oTranslate }}</span>\n </button>\n </ng-template>\n <ng-template #undoBtnWithoutText>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-undo\" mat-icon-button (click)=\"onUndoLastChange()\"\n [disabled]=\"isChangesStackEmpty\" *ngIf=\"showUndoButton\">\n <mat-icon svgIcon=\"ontimize:undo\"></mat-icon>\n </button>\n </ng-template>\n\n <ng-container *ngIf=\"initialMode\">\n <ng-template [ngIf]=\"showHeaderActionsText\" [ngIfElse]=\"buttonsWithouText\">\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-refresh\" mat-stroked-button (click)=\"onReload()\"\n *ngIf=\"isRefreshBtnEnabled\" attr=\"refresh\">\n <mat-icon svgIcon=\"ontimize:autorenew\"></mat-icon>\n <span>{{ 'REFRESH' | oTranslate }}</span>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-insert\" mat-stroked-button (click)=\"onInsert()\"\n *ngIf=\"isInsertBtnEnabled\" attr=\"insert\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n <span>{{ 'ADD' | oTranslate }}</span>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-edit\" mat-stroked-button (click)=\"onEdit()\"\n *ngIf=\"isEditBtnEnabled | async\" attr=\"edit\">\n <mat-icon svgIcon=\"ontimize:edit\"></mat-icon>\n <span>{{ 'EDIT' | oTranslate }}</span>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-delete\" mat-stroked-button (click)=\"onDelete()\"\n *ngIf=\"isDeleteBtnEnabled\" attr=\"delete\">\n <mat-icon svgIcon=\"ontimize:delete\"></mat-icon>\n <span>{{ 'DELETE' | oTranslate }}</span>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-save\" mat-stroked-button (click)=\"onSave()\"\n [disabled]=\"!(existsChangesToSave | async)\" *ngIf=\"isSaveBtnEnabled | async\" attr=\"update\">\n <mat-icon svgIcon=\"ontimize:save\"></mat-icon>\n <span>{{ 'SAVE' | oTranslate }}</span>\n </button>\n </ng-template>\n <ng-template #buttonsWithouText>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-refresh\" mat-icon-button (click)=\"onReload()\"\n *ngIf=\"isRefreshBtnEnabled\" attr=\"refresh\">\n <mat-icon svgIcon=\"ontimize:autorenew\"></mat-icon>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-insert\" mat-icon-button (click)=\"onInsert()\"\n *ngIf=\"isInsertBtnEnabled\" attr=\"insert\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button-o-form-toolbar-button-edit\" mat-icon-button (click)=\"onEdit()\"\n *ngIf=\"isEditBtnEnabled | async\" attr=\"edit\">\n <mat-icon svgIcon=\"ontimize:edit\"></mat-icon>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-delete\" mat-icon-button (click)=\"onDelete()\"\n *ngIf=\"isDeleteBtnEnabled\" attr=\"delete\">\n <mat-icon svgIcon=\"ontimize:delete\"></mat-icon>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-save\" mat-icon-button (click)=\"onSave()\"\n [disabled]=\"!existsChangesToSave\" *ngIf=\"isSaveBtnEnabled | async\" attr=\"update\">\n <mat-icon svgIcon=\"ontimize:save\"></mat-icon>\n </button>\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"editMode || insertMode\">\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-cancel\" mat-stroked-button (click)=\"cancelOperation()\">\n <mat-icon svgIcon=\"ontimize:clear\"></mat-icon>\n <span *ngIf=\"showHeaderActionsText\">{{ 'CANCEL' | oTranslate }}</span>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-insert\" mat-stroked-button color=\"primary\" (click)=\"acceptOperation()\">\n <mat-icon svgIcon=\"ontimize:done\"></mat-icon>\n <span *ngIf=\"showHeaderActionsText\">{{ 'INSERT' | oTranslate }}</span>\n </button>\n </ng-container>\n </div>\n\n</mat-toolbar>\n", styles: [".o-form-toolbar{flex:none;display:block}.o-form-toolbar .o-form-toolbar-header{min-height:50px;max-height:50px;padding:0 16px 0 4px}.o-form-toolbar .o-form-toolbar-header.breadcrumb{padding:16px;min-height:84px;max-height:84px}.o-form-toolbar .o-form-toolbar-header .mat-toolbar-tools{width:100%}.o-form-toolbar .o-form-toolbar-header .mat-toolbar-tools button.o-form-toolbar-button.mat-mdc-icon-button.mat-mdc-button-base{padding:0;margin:0;background:transparent}.o-form-toolbar .o-form-toolbar-header .o-breadcrumb{width:100%;height:32px;min-height:initial}.o-form-toolbar .o-form-toolbar-header .o-breadcrumb .mat-toolbar{padding:0;min-height:initial;max-height:initial;height:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i7.OFormNavigationComponent, selector: "o-form-navigation" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.OTranslatePipe, name: "oTranslate" }], encapsulation: i0.ViewEncapsulation.None });
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], OFormToolbarComponent.prototype, "showHeaderActionsText", void 0);
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], OFormToolbarComponent.prototype, "showHeaderNavigation", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OFormToolbarComponent, decorators: [{
type: Component,
args: [{ selector: 'o-form-toolbar', inputs: DEFAULT_INPUTS_O_FORM_TOOLBAR, outputs: DEFAULT_OUTPUTS_O_FORM_TOOLBAR, encapsulation: ViewEncapsulation.None, host: {
'[class.o-form-toolbar]': 'true'
}, providers: [{ provide: OFormToolbarBase, useExisting: forwardRef(() => OFormToolbarComponent) }], template: "<mat-toolbar class=\"o-form-toolbar-header\" [class.breadcrumb]=\"includeBreadcrumb\" fxLayout=\"column\" fxLayoutAlign=\"center center\">\n\n <ng-template *ngIf=\"includeBreadcrumb\" #breadcrumb></ng-template>\n\n <div class=\"mat-toolbar-tools\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\">\n <button type=\"button\" mat-icon-button (click)=\"onBack()\" *ngIf=\"isDetail\" class=\"o-form-toolbar-button o-form-toolbar-back\">\n <mat-icon svgIcon=\"ontimize:arrow_back\"></mat-icon>\n </button>\n\n <o-form-navigation #formNavigation *ngIf=\"showNavigation\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\">\n </o-form-navigation>\n\n <span *ngIf=\"getLabelHeaderAlign() === 'center' || getLabelHeaderAlign() === 'end'\" class=\"fill-remaining\"></span>\n <div *ngIf=\"labelHeader!=''\" fxLayout=\"row\" fxLayoutAlign=\"center center\">\n <span>{{ labelHeader | oTranslate }}</span>\n </div>\n <span *ngIf=\"getLabelHeaderAlign() === 'start' || getLabelHeaderAlign() === 'center'\" class=\"fill-remaining\"></span>\n\n <ng-content select=\"[o-custom-form-toolbar-buttons-wrapper]\"></ng-content>\n\n <ng-template [ngIf]=\"showHeaderActionsText\" [ngIfElse]=\"undoBtnWithoutText\">\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-undo\" mat-stroked-button (click)=\"onUndoLastChange()\"\n [disabled]=\"isChangesStackEmpty\" *ngIf=\"showUndoButton\">\n <mat-icon svgIcon=\"ontimize:undo\"></mat-icon>\n <span>{{ 'UNDO' | oTranslate }}</span>\n </button>\n </ng-template>\n <ng-template #undoBtnWithoutText>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-undo\" mat-icon-button (click)=\"onUndoLastChange()\"\n [disabled]=\"isChangesStackEmpty\" *ngIf=\"showUndoButton\">\n <mat-icon svgIcon=\"ontimize:undo\"></mat-icon>\n </button>\n </ng-template>\n\n <ng-container *ngIf=\"initialMode\">\n <ng-template [ngIf]=\"showHeaderActionsText\" [ngIfElse]=\"buttonsWithouText\">\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-refresh\" mat-stroked-button (click)=\"onReload()\"\n *ngIf=\"isRefreshBtnEnabled\" attr=\"refresh\">\n <mat-icon svgIcon=\"ontimize:autorenew\"></mat-icon>\n <span>{{ 'REFRESH' | oTranslate }}</span>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-insert\" mat-stroked-button (click)=\"onInsert()\"\n *ngIf=\"isInsertBtnEnabled\" attr=\"insert\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n <span>{{ 'ADD' | oTranslate }}</span>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-edit\" mat-stroked-button (click)=\"onEdit()\"\n *ngIf=\"isEditBtnEnabled | async\" attr=\"edit\">\n <mat-icon svgIcon=\"ontimize:edit\"></mat-icon>\n <span>{{ 'EDIT' | oTranslate }}</span>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-delete\" mat-stroked-button (click)=\"onDelete()\"\n *ngIf=\"isDeleteBtnEnabled\" attr=\"delete\">\n <mat-icon svgIcon=\"ontimize:delete\"></mat-icon>\n <span>{{ 'DELETE' | oTranslate }}</span>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-save\" mat-stroked-button (click)=\"onSave()\"\n [disabled]=\"!(existsChangesToSave | async)\" *ngIf=\"isSaveBtnEnabled | async\" attr=\"update\">\n <mat-icon svgIcon=\"ontimize:save\"></mat-icon>\n <span>{{ 'SAVE' | oTranslate }}</span>\n </button>\n </ng-template>\n <ng-template #buttonsWithouText>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-refresh\" mat-icon-button (click)=\"onReload()\"\n *ngIf=\"isRefreshBtnEnabled\" attr=\"refresh\">\n <mat-icon svgIcon=\"ontimize:autorenew\"></mat-icon>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-insert\" mat-icon-button (click)=\"onInsert()\"\n *ngIf=\"isInsertBtnEnabled\" attr=\"insert\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button-o-form-toolbar-button-edit\" mat-icon-button (click)=\"onEdit()\"\n *ngIf=\"isEditBtnEnabled | async\" attr=\"edit\">\n <mat-icon svgIcon=\"ontimize:edit\"></mat-icon>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-delete\" mat-icon-button (click)=\"onDelete()\"\n *ngIf=\"isDeleteBtnEnabled\" attr=\"delete\">\n <mat-icon svgIcon=\"ontimize:delete\"></mat-icon>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-save\" mat-icon-button (click)=\"onSave()\"\n [disabled]=\"!existsChangesToSave\" *ngIf=\"isSaveBtnEnabled | async\" attr=\"update\">\n <mat-icon svgIcon=\"ontimize:save\"></mat-icon>\n </button>\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"editMode || insertMode\">\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-cancel\" mat-stroked-button (click)=\"cancelOperation()\">\n <mat-icon svgIcon=\"ontimize:clear\"></mat-icon>\n <span *ngIf=\"showHeaderActionsText\">{{ 'CANCEL' | oTranslate }}</span>\n </button>\n <button type=\"button\" class=\"o-form-toolbar-button o-form-toolbar-button-insert\" mat-stroked-button color=\"primary\" (click)=\"acceptOperation()\">\n <mat-icon svgIcon=\"ontimize:done\"></mat-icon>\n <span *ngIf=\"showHeaderActionsText\">{{ 'INSERT' | oTranslate }}</span>\n </button>\n </ng-container>\n </div>\n\n</mat-toolbar>\n", styles: [".o-form-toolbar{flex:none;display:block}.o-form-toolbar .o-form-toolbar-header{min-height:50px;max-height:50px;padding:0 16px 0 4px}.o-form-toolbar .o-form-toolbar-header.breadcrumb{padding:16px;min-height:84px;max-height:84px}.o-form-toolbar .o-form-toolbar-header .mat-toolbar-tools{width:100%}.o-form-toolbar .o-form-toolbar-header .mat-toolbar-tools button.o-form-toolbar-button.mat-mdc-icon-button.mat-mdc-button-base{padding:0;margin:0;background:transparent}.o-form-toolbar .o-form-toolbar-header .o-breadcrumb{width:100%;height:32px;min-height:initial}.o-form-toolbar .o-form-toolbar-header .o-breadcrumb .mat-toolbar{padding:0;min-height:initial;max-height:initial;height:100%}\n"] }]
}], ctorParameters: function () { return [{ type: i1.OFormBase }, { type: i0.ElementRef }, { type: i0.Injector }]; }, propDecorators: { showHeaderActionsText: [], showHeaderNavigation: [], breadContainer: [{
type: ViewChild,
args: ['breadcrumb', { read: ViewContainerRef }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1mb3JtLXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS90b29sYmFyL28tZm9ybS10b29sYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vdG9vbGJhci9vLWZvcm0tdG9vbGJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQXFCLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUssT0FBTyxFQUFFLGVBQWUsRUFBNEIsTUFBTSxNQUFNLENBQUM7QUFFakUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7Ozs7OztBQUUvRCxNQUFNLENBQUMsTUFBTSw2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RSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDckIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsb0NBQW9DLEVBQUUsQ0FBQyxDQUFDO1NBQzdGO1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDOzttSEF2WFUscUJBQXFCO3VHQUFyQixxQkFBcUIsMGNBRnJCLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsbUhBd0IvRCxnQkFBZ0IsNkJDN0RuRCwyekxBbUdBO0FEckRFO0lBQUMscUJBQXFCLEVBQUU7O29FQUNxQjtBQUM3QztJQUFDLHFCQUFxQixFQUFFOzttRUFDb0I7NEZBVmpDLHFCQUFxQjtrQkFaakMsU0FBUzsrQkFDRSxnQkFBZ0IsVUFHbEIsNkJBQTZCLFdBQzVCLDhCQUE4QixpQkFDeEIsaUJBQWlCLENBQUMsSUFBSSxRQUMvQjt3QkFDSix3QkFBd0IsRUFBRSxNQUFNO3FCQUNqQyxhQUNVLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxDQUFDO2dKQVV6RixxQkFBcUIsTUFFckIsb0JBQW9CLE1BYXBCLGNBQWM7c0JBRHBCLFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBWaWV3RW5jYXBzdWxhdGlvbiwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQm9vbGVhbklucHV0Q29udmVydGVyIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy9pbnB1dC1jb252ZXJ0ZXInO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFNuYWNrQmFyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3NuYWNrYmFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgT1Blcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvby1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IENvZGVzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9jb2Rlcyc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uc1V0aWxzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9wZXJtaXNzaW9ucyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IE9Gb3JtQmFzZSB9IGZyb20gJy4uL28tZm9ybS1iYXNlLmNsYXNzJztcbmltcG9ydCB7IE9Gb3JtVG9vbGJhckJhc2UgfSBmcm9tICcuL28tZm9ybS10b29sYmFyLWJhc2UuY2xhc3MnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9JTlBVVFNfT19GT1JNX1RPT0xCQVIgPSBbXG4gICdsYWJlbEhlYWRlcjogbGFiZWwtaGVhZGVyJyxcbiAgJ2xhYmVsSGVhZGVyQWxpZ246IGxhYmVsLWhlYWRlci1hbGlnbicsXG4gICdoZWFkZXJhY3Rpb25zOiBoZWFkZXItYWN0aW9ucycsXG4gICdzaG93SGVhZGVyQWN0aW9uc1RleHQ6IHNob3ctaGVhZGVyLWFjdGlvbnMtdGV4dCcsXG4gIC8vIHNob3ctaGVhZGVyLW5hdmlnYXRpb24gW3N0cmluZ11beWVzfG5vfHRydWV8ZmFsc2VdOiBJbmNsdWRlIG5hdmlnYXRpb25zIGJ1dHRvbnMgaW4gZm9ybS10b29sYmFyLiBEZWZhdWx0OiB0cnVlO1xuICAnc2hvd0hlYWRlck5hdmlnYXRpb246c2hvdy1oZWFkZXItbmF2aWdhdGlvbidcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09VVFBVVFNfT19GT1JNX1RPT0xCQVIgPSBbXG4gICdvbkNhbmNlbCdcbl07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ28tZm9ybS10b29sYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL28tZm9ybS10b29sYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vby1mb3JtLXRvb2xiYXIuY29tcG9uZW50LnNjc3MnXSxcbiAgaW5wdXRzOiBERUZBVUxUX0lOUFVUU19PX0ZPUk1fVE9PTEJBUixcbiAgb3V0cHV0czogREVGQVVMVF9PVVRQVVRTX09fRk9STV9UT09MQkFSLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5vLWZvcm0tdG9vbGJhcl0nOiAndHJ1ZSdcbiAgfSxcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBPRm9ybVRvb2xiYXJCYXNlLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPRm9ybVRvb2xiYXJDb21wb25lbnQpIH1dLFxufSlcbmV4cG9ydCBjbGFzcyBPRm9ybVRvb2xiYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgLyogQmluZGluZ3MgKi9cbiAgcHVibGljIGxhYmVsSGVhZGVyOiBzdHJpbmcgPSAnJztcbiAgcHVibGljIGhlYWRlcmFjdGlvbnM6IHN0cmluZyA9ICcnO1xuICBwdWJsaWMgbGFiZWxIZWFkZXJBbGlnbjogc3RyaW5nID0gJ2NlbnRlcic7XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHB1YmxpYyBzaG93SGVhZGVyQWN0aW9uc1RleHQ6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHVibGljIHNob3dIZWFkZXJOYXZpZ2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICBwdWJsaWMgZm9ybUFjdGlvbnM6IHN0cmluZ1tdO1xuICBwdWJsaWMgaXNEZXRhaWw6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHB1YmxpYyBlZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaW5zZXJ0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaW5pdGlhbE1vZGU6IGJvb2xlYW4gPSB0cnVlO1xuICBwdWJsaWMgcmVmcmVzaEJ0bkVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGluc2VydEJ0bkVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGRlbGV0ZUJ0bkVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdicmVhZGNydW1iJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIHB1YmxpYyBicmVhZENvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcblxuICBwdWJsaWMgb25DYW5jZWw6IEV2ZW50RW1pdHRlcjxudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgaXNTYXZlQnRuRW5hYmxlZDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgcHVibGljIGlzRWRpdEJ0bkVuYWJsZWQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHB1YmxpYyBleGlzdHNDaGFuZ2VzVG9TYXZlOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIGdldCBjaGFuZ2VzVG9TYXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VzVG9TYXZlO1xuICB9XG5cbiAgc2V0IGNoYW5nZXNUb1NhdmUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5fY2hhbmdlc1RvU2F2ZSA9IHZhbDtcbiAgICBjb25zdCBhdHRyID0gdGhpcy5fZm9ybS5pc0VkaXRhYmxlRGV0YWlsKCkgPyBQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9VUERBVEUgOiBQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9JTlNFUlQ7XG4gICAgY29uc3QgcGVybWlzc2lvbnM6IE9QZXJtaXNzaW9ucyA9ICh0aGlzLmFjdGlvbnNQZXJtaXNzaW9ucyB