UNPKG

@nakedobjects/gemini

Version:

Single Page Application client for a Naked Objects application.

389 lines 71.9 kB
import { Component, ViewChildren } from '@angular/core'; import * as Ro from '@nakedobjects/restful-objects'; import { ClientErrorCode, ErrorCategory, InteractionMode } from '@nakedobjects/services'; import { copy } from '@nakedobjects/view-models'; import filter from 'lodash-es/filter'; import flatten from 'lodash-es/flatten'; import forEach from 'lodash-es/forEach'; import map from 'lodash-es/map'; import mapValues from 'lodash-es/mapValues'; import some from 'lodash-es/some'; import zipObject from 'lodash-es/zipObject'; import { debounceTime } from 'rxjs/operators'; import { wrapAction } from '../action/action.component'; import { safeUnsubscribe } from '../helpers-components'; import { PropertiesComponent } from '../properties/properties.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "@nakedobjects/services"; import * as i3 from "@nakedobjects/view-models"; import * as i4 from "@angular/forms"; import * as i5 from "@angular/common"; import * as i6 from "@angular/cdk/drag-drop"; import * as i7 from "../action-list/action-list.component"; import * as i8 from "../action-bar/action-bar.component"; import * as i9 from "../properties/properties.component"; import * as i10 from "../collections/collections.component"; import * as i11 from "../dialog/dialog.component"; import * as i12 from "../edit-dialog/edit-dialog.component"; import * as i13 from "../create-new-dialog/create-new-dialog.component"; export class ObjectComponent { activatedRoute; urlManager; context; viewModelFactory; colorService; error; formBuilder; configService; dragAndDrop; constructor(activatedRoute, urlManager, context, viewModelFactory, colorService, error, formBuilder, configService, dragAndDrop) { this.activatedRoute = activatedRoute; this.urlManager = urlManager; this.context = context; this.viewModelFactory = viewModelFactory; this.colorService = colorService; this.error = error; this.formBuilder = formBuilder; this.configService = configService; this.dragAndDrop = dragAndDrop; this.pendingColor = `${configService.config.objectColor}${this.colorService.getConfiguredDefault()}`; } actionButton = { value: 'Actions', doClick: () => this.toggleActionMenu(), show: () => true, disabled: () => this.disableActions(), tempDisabled: () => null, title: () => this.actionsTooltip(), accesskey: 'a', presentationHint: '', showDialog: () => false }; editButton = { value: 'Edit', doClick: () => this.doEdit(), show: () => this.showEdit(), disabled: () => null, tempDisabled: () => null, title: () => '', accesskey: null, presentationHint: '', showDialog: () => false }; reloadButton = { value: 'Reload', doClick: () => this.doReload(), show: () => true, disabled: () => null, tempDisabled: () => null, title: () => '', accesskey: null, presentationHint: '', showDialog: () => false }; saveButton = { value: 'Save', doClick: () => this.onSubmit(true), show: () => true, disabled: () => this.form && !this.form.valid ? true : null, tempDisabled: () => null, title: () => this.tooltip, accesskey: null, presentationHint: '', showDialog: () => false }; saveAndCloseButton = { value: 'Save & Close', doClick: () => this.onSubmit(false), show: () => this.unsaved(), disabled: () => this.form && !this.form.valid ? true : null, tempDisabled: () => null, title: () => this.tooltip, accesskey: null, presentationHint: '', showDialog: () => false }; cancelButton = { value: 'Cancel', doClick: () => this.doEditCancel(), show: () => true, disabled: () => null, tempDisabled: () => null, title: () => '', accesskey: null, presentationHint: '', showDialog: () => false }; actionButtons = null; viewButtons = [this.actionButton, this.editButton, this.reloadButton]; saveButtons = [this.saveButton, this.saveAndCloseButton, this.cancelButton]; lastPaneRouteData; activatedRouteDataSub; paneRouteDataSub; concurrencyErrorSub; formSub; focusSub; ddSub; selectedDialogId; dropZones = []; propComponents; // template API expiredTransient = false; object = null; toCreateClass = ''; mode = null; form = null; get viewMode() { return this.mode == null ? '' : InteractionMode[this.mode]; } // must be properties as object may change - eg be reloaded get friendlyName() { const obj = this.object; return obj ? obj.friendlyName : ''; } // used to smooth transition before object set pendingColor; get classes() { const hint = this.object?.presentationHint ?? ''; return `${this.color} ${hint}`.trim(); } get color() { const obj = this.object; return obj ? obj.color : this.pendingColor; } get properties() { const obj = this.object; return obj ? obj.properties : []; } get collections() { const obj = this.object; return obj ? obj.collections : []; } get tooltip() { const obj = this.object; return obj ? obj.tooltip() : ''; } isEditDialog(selectedDialogId) { if (selectedDialogId && this.object?.domainObject.hasActionMember(selectedDialogId)) { const action = this.object.domainObject.actionMember(selectedDialogId); return !!action.extensions().editProperties(); } return false; } onSubmit(viewObject) { const obj = this.object; if (obj) { // if save OK we will want to null object and form as returned object may differ // and redrawing in current form can fail. If save not OK don't null as // will redraw and display errors. const onSuccess = () => this.clearCurrentObject(); obj.doSave(viewObject, onSuccess); } } copy(event) { const obj = this.object; if (obj) { copy(event, obj, this.dragAndDrop); } } title() { const obj = this.object; return obj ? obj.getTitle(this.mode ?? undefined) : ''; } disableActions = () => { const obj = this.object; return obj && obj.noActions() ? true : null; }; actionsTooltip = () => { const obj = this.object; return obj ? obj.actionsTooltip() : ''; }; unsaved = () => { const obj = this.object; return !!obj && obj.unsaved; }; do(f) { const obj = this.object; if (obj) { f(obj); } } toggleActionMenu = () => { this.do((o) => o.toggleActionMenu()); }; doEdit = () => { this.do((o) => o.doEdit()); }; doEditCancel = () => { this.do((o) => o.doEditCancel()); }; showEdit = () => { const obj = this.object; return !!obj && !obj.hideEdit(); }; doReload = () => { this.do((o) => o.doReload()); }; message = () => { const obj = this.object; return obj ? obj.getMessage() : ''; }; showActions = () => { const obj = this.object; return !!obj && obj.showActions(); }; menuItems = () => { const obj = this.object; return obj ? obj.menuItems : []; }; get actionHolders() { if (this.mode === InteractionMode.View) { return this.viewButtons; } if (this.mode === InteractionMode.Edit || this.mode === InteractionMode.Transient) { return this.saveButtons; } if (this.mode === InteractionMode.Form) { // cache because otherwise we will recreate this array of actionHolders everytime page changes ! if (!this.actionButtons) { const menuItems = this.menuItems(); const actions = flatten(map(menuItems, (mi) => mi.actions)); this.actionButtons = map(actions, a => wrapAction(a)); } return this.actionButtons; } return []; } clearCurrentObject() { this.object = null; this.form = null; this.actionButtons = null; } setup(routeData) { // subscription means may get with no oid if (!routeData.objectId) { this.mode = null; return; } this.expiredTransient = false; const oid = Ro.ObjectIdWrapper.fromObjectId(routeData.objectId, this.configService.config.keySeparator); if (this.object && !this.object.domainObject.getOid().isSame(oid)) { // object has changed - clear existing this.clearCurrentObject(); } const isChanging = !this.object; const modeChanging = this.mode !== routeData.interactionMode; this.mode = routeData.interactionMode ?? null; const wasDirty = this.isDirty(routeData, oid); this.selectedDialogId = routeData.dialogId; if (routeData.interactionMode === InteractionMode.CreateNew) { this.toCreateClass = routeData.toCreate; } if (isChanging || modeChanging || wasDirty) { // set pendingColor at once to smooth transition this.colorService.toColorNumberFromType(oid.domainType).then(c => this.pendingColor = `${this.configService.config.objectColor}${c}`); this.context.getObject(routeData.paneId, oid, routeData.interactionMode) .then((object) => { // only change the object property if the object has changed if (isChanging || wasDirty) { this.object = this.viewModelFactory.domainObjectViewModel(object, routeData, wasDirty); } if (modeChanging || isChanging || wasDirty) { if (this.mode === InteractionMode.Edit || this.mode === InteractionMode.Form || this.mode === InteractionMode.Transient) { this.createForm(this.object); // will never be null } } }) .catch((reject) => { if (reject.category === ErrorCategory.ClientError && reject.clientErrorCode === ClientErrorCode.ExpiredTransient) { this.context.setError(reject); this.expiredTransient = true; } else { this.error.handleError(reject); } }); } } createForm(vm) { safeUnsubscribe(this.formSub); const pps = vm.properties; const props = zipObject(map(pps, p => p.id), map(pps, p => p)); const editableProps = filter(props, p => p.isEditable); const editablePropsMap = zipObject(map(editableProps, p => p.id), map(editableProps, p => p)); // eslint-disable-next-line @typescript-eslint/no-explicit-any const controls = mapValues(editablePropsMap, p => [p.getValueForControl(), (a) => p.validator(a)]); this.form = this.formBuilder.group(controls); // eslint-disable-next-line @typescript-eslint/no-explicit-any this.formSub = this.form.valueChanges.subscribe((data) => { // cache parm values const obj = this.object; if (obj) { forEach(data, (v, k) => editablePropsMap[k].setValueFromControl(v)); obj.setProperties(); } }); } isDirty(paneRouteData, oid) { oid = oid || Ro.ObjectIdWrapper.fromObjectId(paneRouteData.objectId, this.configService.config.keySeparator); return this.context.getIsDirty(oid); } setDropZones(ids) { setTimeout(() => this.dropZones = ids); } ngOnInit() { this.activatedRouteDataSub = this.activatedRoute.data.subscribe(d => { const data = d; const paneId = data.pane; if (!this.paneRouteDataSub) { const paneRouteData = this.urlManager.getPaneRouteDataObservable(paneId); this.paneRouteDataSub = paneRouteData.pipe(debounceTime(10)) .subscribe((prd) => { if (!prd.isEqual(this.lastPaneRouteData) || this.isDirty(prd)) { this.lastPaneRouteData = prd; this.setup(prd); } }); } }); this.concurrencyErrorSub = this.context.concurrencyError$.subscribe(oid => { if (this.object && this.object.domainObject.getOid().isSame(oid)) { this.object.concurrency(); } }); this.ddSub = this.dragAndDrop.dropZoneIds$.subscribe(ids => this.setDropZones(ids || [])); } focus(parms) { if (this.mode == null || this.mode === InteractionMode.View) { return; } if (parms && parms.length > 0) { some(parms.toArray(), p => p.focus()); } } ngAfterViewInit() { this.focusSub = this.propComponents?.changes.subscribe(ql => this.focus(ql)); } ngOnDestroy() { safeUnsubscribe(this.activatedRouteDataSub); safeUnsubscribe(this.paneRouteDataSub); safeUnsubscribe(this.concurrencyErrorSub); safeUnsubscribe(this.formSub); safeUnsubscribe(this.focusSub); safeUnsubscribe(this.ddSub); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ObjectComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.UrlManagerService }, { token: i2.ContextService }, { token: i3.ViewModelFactoryService }, { token: i2.ColorService }, { token: i2.ErrorService }, { token: i4.FormBuilder }, { token: i2.ConfigService }, { token: i3.DragAndDropService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ObjectComponent, selector: "nof-object", viewQueries: [{ propertyName: "propComponents", predicate: PropertiesComponent, descendants: true }], ngImport: i0, template: "<div *ngIf=\"expiredTransient\" class=\"title\">The requested view of unsaved object details has expired.</div>\n\n<!--place holder-->\n<ng-container *ngIf=\"!object && !(viewMode === 'CreateNew')\">\n <div class=\"object view\" [ngClass]=\"color\"></div>\n</ng-container>\n<div *ngIf=\"object && (viewMode === 'View' || viewMode === 'EditByAction')\" class=\"object view\" [ngClass]=\"classes\">\n <header class=\"header\" cdkDropList [cdkDropListConnectedTo]=\"dropZones\">\n <div class=\"title\" cdkDrag [cdkDragData]=\"object\" tabindex=\"0\" (keydown)=\"copy($event)\" (keypress)=\"copy($event)\">\n <span class=\"type\">{{friendlyName}}</span> {{title()}}\n </div>\n <!--<div>{{object.isDirty() ? \"*\" : \"\"}} </div>-->\n <nof-action-bar [actions]=\"actionHolders\"></nof-action-bar>\n <div class=\"messages\">{{message()}}</div>\n </header>\n <nof-action-list *ngIf=\"showActions()\" [menuHolder]=\"object\"></nof-action-list>\n <div class=\"main-column\">\n <ng-container *ngIf=\"!isEditDialog(selectedDialogId)\">\n <nof-dialog [parentVM]=\"object\" [selectedDialogId]=\"selectedDialogId\"></nof-dialog>\n <nof-properties class=\"properties\" *ngIf=\"properties\" [properties]=\"properties\"></nof-properties>\n </ng-container>\n <nof-edit-dialog *ngIf=\"isEditDialog(selectedDialogId)\" [parentObject]=\"object\" [selectedDialogId]=\"selectedDialogId\" [properties]=\"properties\"></nof-edit-dialog>\n </div>\n <nof-collections class=\"collections\" *ngIf=\"collections\" [collections]=\"collections\"></nof-collections>\n</div>\n<div *ngIf=\"object && (viewMode === 'Edit' || viewMode === 'Transient' || viewMode === 'Form')\" class=\"object edit\" [ngClass]=\"classes\">\n <form *ngIf=\"form\" (ngSubmit)=\"onSubmit(false)\" [formGroup]=\"form\" autocomplete=\"off\">\n <header class=\"header\" cdkDropList [cdkDropListConnectedTo]=\"dropZones\">\n <div class=\"title\" cdkDrag [cdkDragData]=\"object\" tabindex=\"0\" (keydown)=\"copy($event)\" (keypress)=\"copy($event)\">\n <span class=\"type\">{{friendlyName}}</span> {{title()}}\n </div>\n <div *ngIf=\"viewMode === 'Edit' || viewMode === 'Transient' || viewMode === 'Form'\" class=\"menus\">\n <nof-action-bar [actions]=\"actionHolders\"></nof-action-bar>\n </div>\n <div class=\"messages\">{{message()}}</div>\n </header>\n <div class=\"main-column\">\n <nof-properties *ngIf=\"properties\" [properties]=\"properties\" [parent]=\"object\" [form]=\"form\"></nof-properties>\n </div>\n </form>\n <nof-collections *ngIf=\"collections\" [collections]=\"collections\"></nof-collections>\n</div>\n<div *ngIf=\"object && viewMode === 'NotPersistent'\" class=\"object view\" [ngClass]=\"classes\">\n <header class=\"header\" cdkDropList [cdkDropListConnectedTo]=\"dropZones\">\n <div class=\"title\" cdkDrag [cdkDragData]=\"object\" tabindex=\"0\" (keydown)=\"copy($event)\" (keypress)=\"copy($event)\">\n <span class=\"type\">{{friendlyName}}</span> {{title()}}\n </div>\n <div class=\"messages\">{{message()}}</div>\n </header>\n <div class=\"main-column\">\n <nof-properties class=\"properties\" *ngIf=\"properties\" [properties]=\"properties\"></nof-properties>\n </div>\n <nof-collections class=\"collections\" *ngIf=\"collections\" [collections]=\"collections\"></nof-collections>\n</div>\n<ng-container *ngIf=\"object && viewMode === 'CreateNew'\">\n <nof-create-new-dialog [parentMenu]=\"object\" [selectedDialogId]=\"selectedDialogId\" [toCreateClass]=\"toCreateClass!\"></nof-create-new-dialog>\n</ng-container>\n", styles: [":host{overflow-y:auto;color:var(--default-text-color);font-size:var(--font-size-2);font-weight:var(--font-weight-1);display:block;height:100%}.object{height:100%;display:block;padding-left:var(--space-5);overflow-y:auto}.header{display:block;margin-bottom:var(--space-5);overflow:hidden;color:var(--contrast-text-color);background-color:var(--header-background-color)}viewTitle{display:inline-block}.title,.type{position:relative;font-weight:var(--font-weight-2);font-size:var(--font-size-4);line-height:38pt;margin-left:var(--space-1);padding-left:var(--space-3);padding-right:var(--space-3);margin-right:var(--space-5);margin-top:var(--space-1);display:inline-block}.type{float:left;margin-right:var(--space-5);display:none}.menus{display:block}.menu,.header .action{display:block;float:left;padding:var(--space-3);margin-top:0;margin-left:var(--space-1);margin-right:var(--space-4);margin-bottom:var(--space-3);font:inherit;font-size:var(--font-size-3);color:var(--default-text-color);background-color:transparent}.menu:disabled{color:var(--disabled-color)}.title:hover,.title:focus{outline-color:var(--contrast-outline-color);outline-width:1px}.actions,.main-column{float:left;margin-bottom:var(--space-5);margin-right:var(--space-5)}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i6.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i7.ActionListComponent, selector: "nof-action-list", inputs: ["menuHolder"] }, { kind: "component", type: i8.ActionBarComponent, selector: "nof-action-bar", inputs: ["actions", "menuHolder"] }, { kind: "component", type: i9.PropertiesComponent, selector: "nof-properties", inputs: ["parent", "form", "properties"] }, { kind: "component", type: i10.CollectionsComponent, selector: "nof-collections", inputs: ["collections"] }, { kind: "component", type: i11.DialogComponent, selector: "nof-dialog", inputs: ["parentVM"] }, { kind: "component", type: i12.EditDialogComponent, selector: "nof-edit-dialog", inputs: ["properties", "parentObject"] }, { kind: "component", type: i13.CreateNewDialogComponent, selector: "nof-create-new-dialog", inputs: ["toCreateClass", "parentMenu"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ObjectComponent, decorators: [{ type: Component, args: [{ selector: 'nof-object', template: "<div *ngIf=\"expiredTransient\" class=\"title\">The requested view of unsaved object details has expired.</div>\n\n<!--place holder-->\n<ng-container *ngIf=\"!object && !(viewMode === 'CreateNew')\">\n <div class=\"object view\" [ngClass]=\"color\"></div>\n</ng-container>\n<div *ngIf=\"object && (viewMode === 'View' || viewMode === 'EditByAction')\" class=\"object view\" [ngClass]=\"classes\">\n <header class=\"header\" cdkDropList [cdkDropListConnectedTo]=\"dropZones\">\n <div class=\"title\" cdkDrag [cdkDragData]=\"object\" tabindex=\"0\" (keydown)=\"copy($event)\" (keypress)=\"copy($event)\">\n <span class=\"type\">{{friendlyName}}</span> {{title()}}\n </div>\n <!--<div>{{object.isDirty() ? \"*\" : \"\"}} </div>-->\n <nof-action-bar [actions]=\"actionHolders\"></nof-action-bar>\n <div class=\"messages\">{{message()}}</div>\n </header>\n <nof-action-list *ngIf=\"showActions()\" [menuHolder]=\"object\"></nof-action-list>\n <div class=\"main-column\">\n <ng-container *ngIf=\"!isEditDialog(selectedDialogId)\">\n <nof-dialog [parentVM]=\"object\" [selectedDialogId]=\"selectedDialogId\"></nof-dialog>\n <nof-properties class=\"properties\" *ngIf=\"properties\" [properties]=\"properties\"></nof-properties>\n </ng-container>\n <nof-edit-dialog *ngIf=\"isEditDialog(selectedDialogId)\" [parentObject]=\"object\" [selectedDialogId]=\"selectedDialogId\" [properties]=\"properties\"></nof-edit-dialog>\n </div>\n <nof-collections class=\"collections\" *ngIf=\"collections\" [collections]=\"collections\"></nof-collections>\n</div>\n<div *ngIf=\"object && (viewMode === 'Edit' || viewMode === 'Transient' || viewMode === 'Form')\" class=\"object edit\" [ngClass]=\"classes\">\n <form *ngIf=\"form\" (ngSubmit)=\"onSubmit(false)\" [formGroup]=\"form\" autocomplete=\"off\">\n <header class=\"header\" cdkDropList [cdkDropListConnectedTo]=\"dropZones\">\n <div class=\"title\" cdkDrag [cdkDragData]=\"object\" tabindex=\"0\" (keydown)=\"copy($event)\" (keypress)=\"copy($event)\">\n <span class=\"type\">{{friendlyName}}</span> {{title()}}\n </div>\n <div *ngIf=\"viewMode === 'Edit' || viewMode === 'Transient' || viewMode === 'Form'\" class=\"menus\">\n <nof-action-bar [actions]=\"actionHolders\"></nof-action-bar>\n </div>\n <div class=\"messages\">{{message()}}</div>\n </header>\n <div class=\"main-column\">\n <nof-properties *ngIf=\"properties\" [properties]=\"properties\" [parent]=\"object\" [form]=\"form\"></nof-properties>\n </div>\n </form>\n <nof-collections *ngIf=\"collections\" [collections]=\"collections\"></nof-collections>\n</div>\n<div *ngIf=\"object && viewMode === 'NotPersistent'\" class=\"object view\" [ngClass]=\"classes\">\n <header class=\"header\" cdkDropList [cdkDropListConnectedTo]=\"dropZones\">\n <div class=\"title\" cdkDrag [cdkDragData]=\"object\" tabindex=\"0\" (keydown)=\"copy($event)\" (keypress)=\"copy($event)\">\n <span class=\"type\">{{friendlyName}}</span> {{title()}}\n </div>\n <div class=\"messages\">{{message()}}</div>\n </header>\n <div class=\"main-column\">\n <nof-properties class=\"properties\" *ngIf=\"properties\" [properties]=\"properties\"></nof-properties>\n </div>\n <nof-collections class=\"collections\" *ngIf=\"collections\" [collections]=\"collections\"></nof-collections>\n</div>\n<ng-container *ngIf=\"object && viewMode === 'CreateNew'\">\n <nof-create-new-dialog [parentMenu]=\"object\" [selectedDialogId]=\"selectedDialogId\" [toCreateClass]=\"toCreateClass!\"></nof-create-new-dialog>\n</ng-container>\n", styles: [":host{overflow-y:auto;color:var(--default-text-color);font-size:var(--font-size-2);font-weight:var(--font-weight-1);display:block;height:100%}.object{height:100%;display:block;padding-left:var(--space-5);overflow-y:auto}.header{display:block;margin-bottom:var(--space-5);overflow:hidden;color:var(--contrast-text-color);background-color:var(--header-background-color)}viewTitle{display:inline-block}.title,.type{position:relative;font-weight:var(--font-weight-2);font-size:var(--font-size-4);line-height:38pt;margin-left:var(--space-1);padding-left:var(--space-3);padding-right:var(--space-3);margin-right:var(--space-5);margin-top:var(--space-1);display:inline-block}.type{float:left;margin-right:var(--space-5);display:none}.menus{display:block}.menu,.header .action{display:block;float:left;padding:var(--space-3);margin-top:0;margin-left:var(--space-1);margin-right:var(--space-4);margin-bottom:var(--space-3);font:inherit;font-size:var(--font-size-3);color:var(--default-text-color);background-color:transparent}.menu:disabled{color:var(--disabled-color)}.title:hover,.title:focus{outline-color:var(--contrast-outline-color);outline-width:1px}.actions,.main-column{float:left;margin-bottom:var(--space-5);margin-right:var(--space-5)}\n"] }] }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.UrlManagerService }, { type: i2.ContextService }, { type: i3.ViewModelFactoryService }, { type: i2.ColorService }, { type: i2.ErrorService }, { type: i4.FormBuilder }, { type: i2.ConfigService }, { type: i3.DragAndDropService }], propDecorators: { propComponents: [{ type: ViewChildren, args: [PropertiesComponent] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2dlbWluaS9zcmMvb2JqZWN0L29iamVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL29iamVjdC9vYmplY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWdDLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUdyRyxPQUFPLEtBQUssRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3BELE9BQU8sRUFDSCxlQUFlLEVBSWYsYUFBYSxFQUliLGVBQWUsRUFHZCxNQUFNLHdCQUF3QixDQUFDO0FBQ3BDLE9BQU8sRUFBdUIsSUFBSSxFQUE0RyxNQUFNLDJCQUEyQixDQUFDO0FBRWhMLE9BQU8sTUFBTSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RDLE9BQU8sT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQ3hDLE9BQU8sT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQ3hDLE9BQU8sR0FBRyxNQUFNLGVBQWUsQ0FBQztBQUNoQyxPQUFPLFNBQVMsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLElBQUksTUFBTSxnQkFBZ0IsQ0FBQztBQUNsQyxPQUFPLFNBQVMsTUFBTSxxQkFBcUIsQ0FBQztBQUU1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFpQixVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQU96RSxNQUFNLE9BQU8sZUFBZTtJQUdIO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQVRyQixZQUNxQixjQUE4QixF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ZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMxQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0IsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO3VHQTlaUSxlQUFlOzJGQUFmLGVBQWUscUZBd0dWLG1CQUFtQixnREM3SXJDLDhzSEF5REE7OzJGRHBCYSxlQUFlO2tCQUwzQixTQUFTOytCQUNJLFlBQVk7bVVBNkd0QixjQUFjO3NCQURiLFlBQVk7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgKiBhcyBSbyBmcm9tICdAbmFrZWRvYmplY3RzL3Jlc3RmdWwtb2JqZWN0cyc7XG5pbXBvcnQge1xuICAgIENsaWVudEVycm9yQ29kZSxcbiAgICBDb2xvclNlcnZpY2UsXG4gICAgQ29uZmlnU2VydmljZSxcbiAgICBDb250ZXh0U2VydmljZSxcbiAgICBFcnJvckNhdGVnb3J5LFxuICAgIEVycm9yU2VydmljZSxcbiAgICBFcnJvcldyYXBwZXIsXG4gICAgSUN1c3RvbUFjdGl2YXRlZFJvdXRlRGF0YSxcbiAgICBJbnRlcmFjdGlvbk1vZGUsXG4gICAgUGFuZVJvdXRlRGF0YSxcbiAgICBVcmxNYW5hZ2VyU2VydmljZVxuICAgIH0gZnJvbSAnQG5ha2Vkb2JqZWN0cy9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uVmlld01vZGVsLCBjb3B5LCBEb21haW5PYmplY3RWaWV3TW9kZWwsIERyYWdBbmREcm9wU2VydmljZSwgTWVudUl0ZW1WaWV3TW9kZWwsIFByb3BlcnR5Vmlld01vZGVsLCBWaWV3TW9kZWxGYWN0b3J5U2VydmljZSB9IGZyb20gJ0BuYWtlZG9iamVjdHMvdmlldy1tb2RlbHMnO1xuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgZmlsdGVyIGZyb20gJ2xvZGFzaC1lcy9maWx0ZXInO1xuaW1wb3J0IGZsYXR0ZW4gZnJvbSAnbG9kYXNoLWVzL2ZsYXR0ZW4nO1xuaW1wb3J0IGZvckVhY2ggZnJvbSAnbG9kYXNoLWVzL2ZvckVhY2gnO1xuaW1wb3J0IG1hcCBmcm9tICdsb2Rhc2gtZXMvbWFwJztcbmltcG9ydCBtYXBWYWx1ZXMgZnJvbSAnbG9kYXNoLWVzL21hcFZhbHVlcyc7XG5pbXBvcnQgc29tZSBmcm9tICdsb2Rhc2gtZXMvc29tZSc7XG5pbXBvcnQgemlwT2JqZWN0IGZyb20gJ2xvZGFzaC1lcy96aXBPYmplY3QnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uTGlrZSBhcyBJU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJQWN0aW9uSG9sZGVyLCB3cmFwQWN0aW9uIH0gZnJvbSAnLi4vYWN0aW9uL2FjdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgc2FmZVVuc3Vic2NyaWJlIH0gZnJvbSAnLi4vaGVscGVycy1jb21wb25lbnRzJztcbmltcG9ydCB7IFByb3BlcnRpZXNDb21wb25lbnQgfSBmcm9tICcuLi9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdub2Ytb2JqZWN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJ29iamVjdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ29iamVjdC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgT2JqZWN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHVybE1hbmFnZXI6IFVybE1hbmFnZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHQ6IENvbnRleHRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdNb2RlbEZhY3Rvcnk6IFZpZXdNb2RlbEZhY3RvcnlTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNvbG9yU2VydmljZTogQ29sb3JTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGVycm9yOiBFcnJvclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZHJhZ0FuZERyb3A6IERyYWdBbmREcm9wU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nQ29sb3IgPSBgJHtjb25maWdTZXJ2aWNlLmNvbmZpZy5vYmplY3RDb2xvcn0ke3RoaXMuY29sb3JTZXJ2aWNlLmdldENvbmZpZ3VyZWREZWZhdWx0KCl9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFjdGlvbkJ1dHRvbjogSUFjdGlvbkhvbGRlciA9IHtcbiAgICAgICAgdmFsdWU6ICdBY3Rpb25zJyxcbiAgICAgICAgZG9DbGljazogKCkgPT4gdGhpcy50b2dnbGVBY3Rpb25NZW51KCksXG4gICAgICAgIHNob3c6ICgpID0+IHRydWUsXG4gICAgICAgIGRpc2FibGVkOiAoKSA9PiB0aGlzLmRpc2FibGVBY3Rpb25zKCksXG4gICAgICAgIHRlbXBEaXNhYmxlZDogKCkgPT4gbnVsbCxcbiAgICAgICAgdGl0bGU6ICgpID0+IHRoaXMuYWN0aW9uc1Rvb2x0aXAoKSxcbiAgICAgICAgYWNjZXNza2V5OiAnYScsXG4gICAgICAgIHByZXNlbnRhdGlvbkhpbnQ6ICcnLFxuICAgICAgICBzaG93RGlhbG9nOiAoKSA9PiBmYWxzZVxuICAgIH07XG5cbiAgICBwcml2YXRlIGVkaXRCdXR0b246IElBY3Rpb25Ib2xkZXIgPSB7XG4gICAgICAgIHZhbHVlOiAnRWRpdCcsXG4gICAgICAgIGRvQ2xpY2s6ICgpID0+IHRoaXMuZG9FZGl0KCksXG4gICAgICAgIHNob3c6ICgpID0+IHRoaXMuc2hvd0VkaXQoKSxcbiAgICAgICAgZGlzYWJsZWQ6ICgpID0+IG51bGwsXG4gICAgICAgIHRlbXBEaXNhY