@nakedobjects/gemini
Version:
Single Page Application client for a Naked Objects application.
389 lines • 71.9 kB
JavaScript
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