@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
603 lines • 92.5 kB
JavaScript
import { Component, QueryList, ViewChildren } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { map } from 'rxjs/operators';
import { AppContextService } from '../../service/app-context.service';
import { DialogService } from '../dialog/dialog.service';
import { ObjectPropertySchemaFieldLoaderComponent, SchemaFieldHostComponent } from './schema-field-host.component';
import { SchemaPrimitiveType } from './schema-models';
import { SchemaDataTypeStore } from './schema-store';
import { SchemaUtilities } from './schema-utilities';
import * as i0 from "@angular/core";
import * as i1 from "../../service/app-context.service";
import * as i2 from "@angular/router";
import * as i3 from "../dialog/dialog.service";
import * as i4 from "@angular/common";
import * as i5 from "../../directives/disabled/disabled.directive";
import * as i6 from "../tooltip/tooltip.directive";
import * as i7 from "./schema-field-host.component";
const _c0 = ["navLink"];
function TabbedFormLoaderComponent_header_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "header", 10)(1, "h3", 11);
i0.ɵɵtext(2);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(ctx_r0.localize(ctx_r0.propertySchema.label));
} }
function TabbedFormLoaderComponent_li_7_h5_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "h5", 13);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const group_r3 = i0.ɵɵnextContext().$implicit;
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵproperty("title", ctx_r4.localize(group_r3.displayName));
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r4.localize(group_r3.displayName));
} }
function TabbedFormLoaderComponent_li_7_div_3_a_1_span_6_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span");
i0.ɵɵtext(1, "*");
i0.ɵɵelementEnd();
} }
function TabbedFormLoaderComponent_li_7_div_3_a_1_Template(rf, ctx) { if (rf & 1) {
const _r14 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "a", 16, 17);
i0.ɵɵlistener("click", function TabbedFormLoaderComponent_li_7_div_3_a_1_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r14); const form_r7 = i0.ɵɵnextContext().$implicit; const ctx_r12 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r12.switchForm(form_r7.name)); });
i0.ɵɵelement(2, "div");
i0.ɵɵelementStart(3, "span", 18);
i0.ɵɵtext(4);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(5, "div", 19);
i0.ɵɵtemplate(6, TabbedFormLoaderComponent_li_7_div_3_a_1_span_6_Template, 2, 0, "span", 20);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const form_r7 = i0.ɵɵnextContext().$implicit;
const ctx_r8 = i0.ɵɵnextContext(2);
i0.ɵɵclassProp("sme-active", form_r7.name === ctx_r8.activeFormName);
i0.ɵɵproperty("title", ctx_r8.localize(form_r7.displayName))("routerLink", ctx_r8.baseUrl + "/form/" + form_r7.name);
i0.ɵɵadvance(2);
i0.ɵɵclassMapInterpolate1("sme-icon sme-margin-right-xs ", form_r7.icon, "");
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate1(" ", ctx_r8.localize(form_r7.displayName), " ");
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx_r8.isFormDirty(form_r7.name));
} }
function TabbedFormLoaderComponent_li_7_div_3_a_2_span_6_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span");
i0.ɵɵtext(1, "*");
i0.ɵɵelementEnd();
} }
function TabbedFormLoaderComponent_li_7_div_3_a_2_Template(rf, ctx) { if (rf & 1) {
const _r20 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "a", 21, 17);
i0.ɵɵlistener("click", function TabbedFormLoaderComponent_li_7_div_3_a_2_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r20); const form_r7 = i0.ɵɵnextContext().$implicit; const ctx_r18 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r18.switchForm(form_r7.name)); });
i0.ɵɵelement(2, "div");
i0.ɵɵelementStart(3, "span", 18);
i0.ɵɵtext(4);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(5, "div", 19);
i0.ɵɵtemplate(6, TabbedFormLoaderComponent_li_7_div_3_a_2_span_6_Template, 2, 0, "span", 20);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const form_r7 = i0.ɵɵnextContext().$implicit;
const ctx_r9 = i0.ɵɵnextContext(2);
i0.ɵɵclassProp("sme-active", form_r7.name === ctx_r9.activeFormName);
i0.ɵɵproperty("title", ctx_r9.localize(form_r7.displayName));
i0.ɵɵadvance(2);
i0.ɵɵclassMapInterpolate1("sme-icon sme-margin-right-xs ", form_r7.icon, "");
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate1(" ", ctx_r9.localize(form_r7.displayName), " ");
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx_r9.isFormDirty(form_r7.name));
} }
function TabbedFormLoaderComponent_li_7_div_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div");
i0.ɵɵtemplate(1, TabbedFormLoaderComponent_li_7_div_3_a_1_Template, 7, 9, "a", 14);
i0.ɵɵtemplate(2, TabbedFormLoaderComponent_li_7_div_3_a_2_Template, 7, 8, "a", 15);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r5 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !ctx_r5.context.isEditorMode && ctx_r5.propertySchema.options.supportRoute);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !(!ctx_r5.context.isEditorMode && ctx_r5.propertySchema.options.supportRoute));
} }
function TabbedFormLoaderComponent_li_7_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "li")(1, "nav");
i0.ɵɵtemplate(2, TabbedFormLoaderComponent_li_7_h5_2_Template, 2, 2, "h5", 12);
i0.ɵɵtemplate(3, TabbedFormLoaderComponent_li_7_div_3_Template, 3, 2, "div", 7);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const group_r3 = ctx.$implicit;
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", group_r3.displayName);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngForOf", group_r3.forms);
} }
function TabbedFormLoaderComponent_form_10_div_4_Template(rf, ctx) { if (rf & 1) {
const _r28 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "div", 26)(1, "button", 27);
i0.ɵɵlistener("click", function TabbedFormLoaderComponent_form_10_div_4_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r28); const property_r22 = i0.ɵɵnextContext().$implicit; const ctx_r26 = i0.ɵɵnextContext(); ctx_r26.onSaveClick(property_r22.name); return i0.ɵɵresetView($event.preventDefault()); });
i0.ɵɵtext(2);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(3, "button", 28);
i0.ɵɵlistener("click", function TabbedFormLoaderComponent_form_10_div_4_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r28); const property_r22 = i0.ɵɵnextContext().$implicit; const ctx_r29 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r29.onDiscardClick(property_r22.name)); });
i0.ɵɵtext(4);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(5, "button", 29);
i0.ɵɵlistener("click", function TabbedFormLoaderComponent_form_10_div_4_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r28); const ctx_r31 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r31.onCloseClick()); });
i0.ɵɵtext(6);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const property_r22 = i0.ɵɵnextContext().$implicit;
const ctx_r25 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵproperty("smeDisabled", !(ctx_r25.isFormDirty(property_r22.name) && ctx_r25.isFormValid(property_r22.name) && !ctx_r25.isFormBusy(property_r22.name)));
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r25.getFooterButtonText(property_r22.name, "save"));
i0.ɵɵadvance(1);
i0.ɵɵproperty("smeDisabled", !(ctx_r25.isFormDirty(property_r22.name) && !ctx_r25.isFormBusy(property_r22.name)));
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r25.getFooterButtonText(property_r22.name, "discard"));
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(ctx_r25.getFooterButtonText(property_r22.name, "close"));
} }
function TabbedFormLoaderComponent_form_10_Template(rf, ctx) { if (rf & 1) {
const _r34 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "form")(1, "div", 22)(2, "sme-schema-field-host", 23, 24);
i0.ɵɵlistener("dataChange", function TabbedFormLoaderComponent_form_10_Template_sme_schema_field_host_dataChange_2_listener($event) { const restoredCtx = i0.ɵɵrestoreView(_r34); const property_r22 = restoredCtx.$implicit; const ctx_r33 = i0.ɵɵnextContext(); return i0.ɵɵresetView((ctx_r33.data[property_r22.name] = $event)); });
i0.ɵɵelementEnd();
i0.ɵɵtemplate(4, TabbedFormLoaderComponent_form_10_div_4_Template, 7, 5, "div", 25);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const property_r22 = ctx.$implicit;
const ctx_r2 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵclassProp("sme-layout-none", ctx_r2.activeFormName !== property_r22.name);
i0.ɵɵadvance(1);
i0.ɵɵproperty("propertySchema", property_r22)("data", ctx_r2.data[property_r22.name])("context", ctx_r2.context);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", !ctx_r2.getFooterButtonHideOption(property_r22.name));
} }
export class TabbedFormLoaderComponent extends ObjectPropertySchemaFieldLoaderComponent {
constructor(appContextService, activatedRoute, router, dialogService) {
super();
this.appContextService = appContextService;
this.activatedRoute = activatedRoute;
this.router = router;
this.dialogService = dialogService;
this.cancelNextRouteGuard = false;
this.subscriptions = [];
}
static registerDataType() {
SchemaDataTypeStore.registerDataType({
type: SchemaPrimitiveType.Object,
format: 'tabbed-form',
description: 'It\'s a special form field control that recursively renders all the properties as fields. '
+ 'This is like a container of other schema items.',
loaderComponent: TabbedFormLoaderComponent,
optionProperties: [
{
type: SchemaPrimitiveType.Boolean,
format: 'checkbox',
name: 'supportRoute',
label: 'actual_string:Support Route',
required: false,
options: {}
},
{
type: SchemaPrimitiveType.Array,
format: 'simple-list',
name: 'groups',
label: 'actual_string:Groups',
required: false,
options: {},
item: {
type: SchemaPrimitiveType.Object,
format: 'default',
required: false,
options: {
columnCount: 1,
hideHeader: false,
collapsible: {
yes: false,
state: 'collapsed'
}
},
properties: [
{
type: SchemaPrimitiveType.String,
format: 'resource-string-picker',
name: 'displayName',
label: 'actual_string:Display Name',
options: {}
},
{
type: SchemaPrimitiveType.Array,
format: 'simple-list',
name: 'forms',
label: 'actual_string:Forms',
required: false,
options: {},
item: {
type: SchemaPrimitiveType.Object,
format: 'default',
required: false,
options: {
columnCount: 1,
hideHeader: false,
collapsible: {
yes: false,
state: 'collapsed'
}
},
properties: [
{
type: SchemaPrimitiveType.String,
format: 'textbox',
name: 'name',
label: 'actual_string:Name',
required: false,
options: {
multipleline: false
}
},
{
type: SchemaPrimitiveType.String,
format: 'resource-string-picker',
name: 'displayName',
label: 'actual_string:Display Name',
required: false,
options: {}
},
{
type: SchemaPrimitiveType.String,
format: 'textbox',
name: 'icon',
label: 'actual_string:Icon',
required: false,
options: {
multipleline: false
}
},
{
type: SchemaPrimitiveType.String,
format: 'resource-string-picker',
name: 'saveButtonText',
label: 'actual_string:Save button text',
required: false,
defaultValue: 'resources:strings:MsftSmeShell.Angular.Common.save',
options: {
multipleline: false
}
},
{
type: SchemaPrimitiveType.String,
format: 'resource-string-picker',
name: 'discardButtonText',
label: 'actual_string:Discard Button Text',
required: false,
defaultValue: 'resources:strings:MsftSmeShell.Angular.Common.discard',
options: {
multipleline: false
}
},
{
type: SchemaPrimitiveType.String,
format: 'resource-string-picker',
name: 'closeButtonText',
label: 'actual_string:Cancel Button Text',
required: false,
defaultValue: 'resources:strings:MsftSmeShell.Angular.Common.close',
options: {
multipleline: false
}
},
{
type: SchemaPrimitiveType.Boolean,
format: 'toggle-switch',
name: 'hideFooterActionButton',
label: 'actual_string:Hide action buttons in footer'
}
],
emptyByDefault: false
}
}
],
emptyByDefault: false
}
}
],
predefinedObjectProperties: [
{
type: SchemaPrimitiveType.Object,
format: 'default',
name: '<form 1>',
properties: []
},
{
type: SchemaPrimitiveType.Object,
format: 'default',
name: '<form 2>',
properties: []
},
{
type: SchemaPrimitiveType.Object,
format: 'default',
name: '<form 3>',
properties: []
}
],
tags: ['form-container']
});
}
ngOnInit() {
this.baseUrl = this.getBaseUrl();
if (this.baseUrl.indexOf('?') !== -1) {
this.baseUrl = this.baseUrl.split('?')[0];
}
this.subscriptions.push(this.activatedRoute.params.subscribe(params => {
this.activeFormName = params.name;
if (this.activeFormName) {
this.executeFormAction('switch form', this.activeFormName);
}
}));
this.originalData = SchemaUtilities.deepCopy(this.data);
for (const formName in this.data) {
if (this.data.hasOwnProperty(formName)) {
((currentFormName) => {
this.executeFormAction('initialize form', {
formName: currentFormName,
onSucceeded: (formData) => {
this.data[currentFormName] = formData;
this.originalData[currentFormName] = SchemaUtilities.deepCopy(formData);
if (this.fieldHostComponents) {
const fieldHostComponents = this.fieldHostComponents.toArray();
const fieldHostComponent = fieldHostComponents.find(item => item.propertySchema.name === currentFormName);
if (fieldHostComponent) {
fieldHostComponent.markAsPristine();
}
}
}
});
})(formName);
}
}
setTimeout(() => {
if (!this.activeFormName) {
this.navLinkElements.first.nativeElement.click();
}
});
}
ngOnDestroy() {
this.subscriptions.forEach(sub => sub.unsubscribe());
}
setupSchema(schema) {
for (let i = 0; i < schema.properties.length; i++) {
schema.properties[i].disabledCondition = 'formController.controller.' + schema.properties[i].name + '.isDisabled';
schema.properties[i].options.busyCondition = 'formController.controller.' + schema.properties[i].name + '.isBusy';
}
}
switchForm(formName) {
this.activeFormName = formName;
this.executeFormAction('switch form', this.activeFormName);
this.cancelNextRouteGuard = true;
}
setFormOriginalData(formName, data) {
this.originalData[formName] = SchemaUtilities.deepCopy(data);
}
isFormBusy(formName) {
let result = false;
const currentFormSchema = SchemaUtilities.getPropertySchemaByName(this.propertySchema, this.activeFormName);
if (currentFormSchema && currentFormSchema.options && currentFormSchema.options.busyCondition) {
result = this.evalExpression(currentFormSchema.options.busyCondition);
}
if (!result) {
result = this.evalExpression(currentFormSchema.disabledCondition);
}
return result;
}
isFormDirty(formName) {
let result = false;
if (this.fieldHostComponents) {
const fieldHostComponents = this.fieldHostComponents.toArray();
const fieldHostComponent = fieldHostComponents.find(item => item.propertySchema.name === formName);
if (fieldHostComponent) {
result = fieldHostComponent.isDirty();
}
}
return result;
}
getFooterButtonHideOption(formName) {
let result = false;
for (let i = 0; i < this.propertySchema.options.groups.length; i++) {
for (let j = 0; j < this.propertySchema.options.groups[i].forms.length; j++) {
if (this.propertySchema.options.groups[i].forms[j].name === formName) {
result = this.propertySchema.options.groups[i].forms[j].hideFooterActionButton;
}
}
}
return result;
}
getFooterButtonText(formName, button) {
let result = '';
for (let i = 0; i < this.propertySchema.options.groups.length; i++) {
for (let j = 0; j < this.propertySchema.options.groups[i].forms.length; j++) {
if (this.propertySchema.options.groups[i].forms[j].name === formName) {
switch (button) {
case 'save':
result = this.localize(this.propertySchema.options.groups[i].forms[j].saveButtonText);
break;
case 'discard':
result = this.localize(this.propertySchema.options.groups[i].forms[j].discardButtonText);
break;
case 'close':
result = this.localize(this.propertySchema.options.groups[i].forms[j].closeButtonText);
break;
}
}
}
}
return result;
}
isFormValid(formName) {
let result = false;
if (this.fieldHostComponents) {
const fieldHostComponents = this.fieldHostComponents.toArray();
const fieldHostComponent = fieldHostComponents.find(item => item.propertySchema.name === formName);
if (fieldHostComponent) {
result = fieldHostComponent.isValid();
}
}
return result;
}
onSaveClick(formName) {
this.executeFormAction('submit', {
formName: formName,
onSucceeded: () => {
if (this.fieldHostComponents) {
const fieldHostComponents = this.fieldHostComponents.toArray();
const fieldHostComponent = fieldHostComponents.find(item => item.propertySchema.name === formName);
if (fieldHostComponent) {
fieldHostComponent.markAsPristine();
}
}
}
});
}
onDiscardClick(formName) {
let formDataOverriding = null;
this.executeFormAction('reset form', {
formName: formName,
onSucceeded: (formData) => {
formDataOverriding = formData;
}
});
this.data[formName] = formDataOverriding || SchemaUtilities.deepCopy(this.originalData[formName]);
if (this.fieldHostComponents) {
const fieldHostComponents = this.fieldHostComponents.toArray();
const fieldHostComponent = fieldHostComponents.find(item => item.propertySchema.name === formName);
if (fieldHostComponent) {
fieldHostComponent.markAsPristine();
}
}
}
canDeactivate(route, state, confirmationDialogOptions) {
let continueNavigation = true;
if (!this.cancelNextRouteGuard) {
let isFormDirty = false;
for (const formName in this.data) {
if (this.data.hasOwnProperty(formName)) {
if (this.isFormDirty(formName)) {
isFormDirty = true;
break;
}
}
}
if (isFormDirty) {
continueNavigation = this.dialogService
.showConfirmation(confirmationDialogOptions)
.pipe(map((result) => {
// The default is to continue editing
const discardChanges = !result.confirmed;
return discardChanges;
}));
return continueNavigation;
}
}
this.cancelNextRouteGuard = false;
return continueNavigation;
}
onCloseClick() {
this.executeFormAction('close');
}
getBaseUrl() {
let result = this.router.url;
for (let i = 0; i < this.propertySchema.properties.length; i++) {
result = result.replace('/form/' + this.propertySchema.properties[i].name, '');
}
return decodeURI(result);
}
}
/** @nocollapse */ TabbedFormLoaderComponent.ɵfac = function TabbedFormLoaderComponent_Factory(t) { return new (t || TabbedFormLoaderComponent)(i0.ɵɵdirectiveInject(i1.AppContextService), i0.ɵɵdirectiveInject(i2.ActivatedRoute), i0.ɵɵdirectiveInject(i2.Router), i0.ɵɵdirectiveInject(i3.DialogService)); };
/** @nocollapse */ TabbedFormLoaderComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: TabbedFormLoaderComponent, selectors: [["ng-component"]], viewQuery: function TabbedFormLoaderComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(SchemaFieldHostComponent, 5);
i0.ɵɵviewQuery(_c0, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.fieldHostComponents = _t);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.navLinkElements = _t);
} }, features: [i0.ɵɵInheritDefinitionFeature], decls: 11, vars: 3, consts: [[1, "sme-settings", "sme-layout-absolute-phone-up", "sme-position-inset-none", "sme-arrange-stack-v", "sme-padding-bottom-lg"], ["class", "sme-position-flex-none sme-layout-tool-header", 4, "ngIf"], [1, "sme-position-flex-auto", "sme-arrange-stack-h", "sme-layout-relative"], [1, "sme-layout-absolute", "sme-position-inset-none", "sme-arrange-stack-h"], [1, "sme-settings-navigation", "sme-position-flex-none"], ["role", "tablist", 1, "sme-padding-horizontal-lg", "sme-arrange-stack-v"], [1, "sme-position-flex-auto", "sme-arrange-stack-v", "sme-arrange-overflow-hide-x", "sme-arrange-overflow-auto-y"], [4, "ngFor", "ngForOf"], [1, "sme-position-flex-auto", "sme-layout-relative"], [1, "sme-layout-absolute", "sme-position-inset-none", "sme-arrange-overflow-auto"], [1, "sme-position-flex-none", "sme-layout-tool-header"], [1, "sme-position-flex-none"], ["class", "sme-margin-top-xs sme-margin-bottom-xs", 3, "title", 4, "ngIf"], [1, "sme-margin-top-xs", "sme-margin-bottom-xs", 3, "title"], ["class", "sme-padding-squish-v-sm sme-arrange-stack-h sme-scheme-nav-item", "role", "tab", 3, "title", "routerLink", "sme-active", "click", 4, "ngIf"], ["class", "sme-padding-squish-v-sm sme-arrange-stack-h sme-scheme-nav-item", "role", "tab", 3, "title", "sme-active", "click", 4, "ngIf"], ["role", "tab", 1, "sme-padding-squish-v-sm", "sme-arrange-stack-h", "sme-scheme-nav-item", 3, "title", "routerLink", "click"], ["navLink", ""], [1, "ellipsis", "sme-position-flex-auto"], [1, "sme-width-sm", "sme-position-center-h-inline"], [4, "ngIf"], ["role", "tab", 1, "sme-padding-squish-v-sm", "sme-arrange-stack-h", "sme-scheme-nav-item", 3, "title", "click"], [1, "sme-layout-absolute-phone-up", "sme-position-inset-none", "sme-arrange-stack-v"], [1, "sme-position-flex-auto", 3, "propertySchema", "data", "context", "dataChange"], ["fieldHost", ""], ["class", "sme-position-flex-none sme-focus-zone", 4, "ngIf"], [1, "sme-position-flex-none", "sme-focus-zone"], ["type", "submit", 1, "sme-button-primary", 3, "smeDisabled", "click"], ["type", "button", 3, "smeDisabled", "click"], ["type", "button", 3, "click"]], template: function TabbedFormLoaderComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 0);
i0.ɵɵtemplate(1, TabbedFormLoaderComponent_header_1_Template, 3, 1, "header", 1);
i0.ɵɵelementStart(2, "div", 2)(3, "div", 3)(4, "div", 4)(5, "nav", 5)(6, "ul", 6);
i0.ɵɵtemplate(7, TabbedFormLoaderComponent_li_7_Template, 4, 2, "li", 7);
i0.ɵɵelementEnd()()();
i0.ɵɵelementStart(8, "div", 8)(9, "div", 9);
i0.ɵɵtemplate(10, TabbedFormLoaderComponent_form_10_Template, 5, 6, "form", 7);
i0.ɵɵelementEnd()()()()();
} if (rf & 2) {
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.propertySchema.label);
i0.ɵɵadvance(6);
i0.ɵɵproperty("ngForOf", ctx.propertySchema.options.groups);
i0.ɵɵadvance(3);
i0.ɵɵproperty("ngForOf", ctx.propertySchema.properties);
} }, dependencies: [i4.NgForOf, i4.NgIf, i2.RouterLink, i5.DisabledDirective, i6.TooltipDirective, i7.SchemaFieldHostComponent], encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TabbedFormLoaderComponent, [{
type: Component,
args: [{ template: "<div class=\"sme-settings sme-layout-absolute-phone-up sme-position-inset-none sme-arrange-stack-v sme-padding-bottom-lg\">\r\n <header *ngIf=\"propertySchema.label\" class=\"sme-position-flex-none sme-layout-tool-header\">\r\n <h3 class=\"sme-position-flex-none\">{{localize(propertySchema.label)}}</h3>\r\n </header>\r\n <div class=\"sme-position-flex-auto sme-arrange-stack-h sme-layout-relative\">\r\n <div class=\"sme-layout-absolute sme-position-inset-none sme-arrange-stack-h\">\r\n <div class=\"sme-settings-navigation sme-position-flex-none\">\r\n <nav role=\"tablist\" class=\"sme-padding-horizontal-lg sme-arrange-stack-v\">\r\n <ul\r\n class=\"sme-position-flex-auto sme-arrange-stack-v sme-arrange-overflow-hide-x sme-arrange-overflow-auto-y\">\r\n <li *ngFor=\"let group of propertySchema.options.groups\">\r\n <nav>\r\n <h5 class=\"sme-margin-top-xs sme-margin-bottom-xs\" *ngIf=\"group.displayName\"\r\n [title]=\"localize(group.displayName)\">{{localize(group.displayName)}}</h5>\r\n <div *ngFor=\"let form of group.forms\">\r\n <a *ngIf=\"!context.isEditorMode && propertySchema.options.supportRoute\" #navLink\r\n class=\"sme-padding-squish-v-sm sme-arrange-stack-h sme-scheme-nav-item\"\r\n role=\"tab\" [title]=\"localize(form.displayName)\"\r\n [routerLink]=\"baseUrl+'/form/'+form.name\"\r\n [class.sme-active]=\"form.name===activeFormName\" (click)=\"switchForm(form.name)\">\r\n <div class=\"sme-icon sme-margin-right-xs {{form.icon}}\"></div>\r\n <span class=\"ellipsis sme-position-flex-auto\">\r\n {{localize(form.displayName)}}\r\n </span>\r\n <div class=\"sme-width-sm sme-position-center-h-inline\"><span\r\n *ngIf=\"isFormDirty(form.name)\">*</span></div>\r\n </a>\r\n <a *ngIf=\"!(!context.isEditorMode && propertySchema.options.supportRoute)\" #navLink\r\n class=\"sme-padding-squish-v-sm sme-arrange-stack-h sme-scheme-nav-item\"\r\n [title]=\"localize(form.displayName)\" role=\"tab\" (click)=\"switchForm(form.name)\"\r\n [class.sme-active]=\"form.name===activeFormName\">\r\n <div class=\"sme-icon sme-margin-right-xs {{form.icon}}\"></div>\r\n <span class=\"ellipsis sme-position-flex-auto\">\r\n {{localize(form.displayName)}}\r\n </span>\r\n <div class=\"sme-width-sm sme-position-center-h-inline\"><span\r\n *ngIf=\"isFormDirty(form.name)\">*</span></div>\r\n </a>\r\n </div>\r\n </nav>\r\n </li>\r\n </ul>\r\n </nav>\r\n </div>\r\n <div class=\"sme-position-flex-auto sme-layout-relative\">\r\n <div class=\"sme-layout-absolute sme-position-inset-none sme-arrange-overflow-auto\">\r\n <form *ngFor=\"let property of propertySchema.properties; let i = index\">\r\n <div [class.sme-layout-none]=\"activeFormName!==property.name\"\r\n class=\"sme-layout-absolute-phone-up sme-position-inset-none sme-arrange-stack-v\">\r\n <!-- <sme-schema-field-host #fieldHost [propertySchema]=\"property\" [(data)]=\"data[property.name]\"\r\n [context]=\"context\" (dataMarkedAsDirty)=\"markDataAsDirty(property.name)\" class=\"sme-position-flex-auto\">\r\n </sme-schema-field-host> -->\r\n <sme-schema-field-host #fieldHost [propertySchema]=\"property\" [(data)]=\"data[property.name]\"\r\n [context]=\"context\" class=\"sme-position-flex-auto\">\r\n </sme-schema-field-host>\r\n <div *ngIf=\"!getFooterButtonHideOption(property.name)\" class=\"sme-position-flex-none sme-focus-zone\">\r\n <button type=\"submit\" class=\"sme-button-primary\"\r\n (click)=\"onSaveClick(property.name);$event.preventDefault()\"\r\n [smeDisabled]=\"!(isFormDirty(property.name) && isFormValid(property.name) && !isFormBusy(property.name))\">{{getFooterButtonText(property.name,'save')}}</button>\r\n <button type=\"button\" (click)=\"onDiscardClick(property.name)\"\r\n [smeDisabled]=\"!(isFormDirty(property.name) && !isFormBusy(property.name))\">{{getFooterButtonText(property.name,'discard')}}</button>\r\n <button type=\"button\"\r\n (click)=\"onCloseClick()\">{{getFooterButtonText(property.name,'close')}}</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
}], function () { return [{ type: i1.AppContextService }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i3.DialogService }]; }, { fieldHostComponents: [{
type: ViewChildren,
args: [SchemaFieldHostComponent]
}], navLinkElements: [{
type: ViewChildren,
args: ['navLink']
}] }); })();
export class TabbedFormController {
constructor() {
this.controller = {};
}
}
export class TabbedFormItemController {
constructor() {
this.isBusyInternal = true;
this.isDisabledInternal = false;
}
isBusy() {
return this.isBusyInternal;
}
isDisabled() {
return this.isDisabledInternal;
}
initialize() {
return new Promise((resolve, reject) => {
this.loadData().then(result => {
const viewModel = this.convertDataModelToViewModel(result);
this.isBusyInternal = false;
resolve(viewModel);
});
});
}
saveData(viewModel) {
this.onSaving(viewModel);
this.isDisabledInternal = true;
return new Promise((resolve, reject) => {
this.loadData().then(result => {
const newDataModel = this.mergeViewModelToDataModel(viewModel, result);
this.submitData(newDataModel).then(() => {
this.isDisabledInternal = false;
this.onSaveSuccess(viewModel);
resolve();
}, reason => {
this.isDisabledInternal = false;
this.onSaveError(reason);
reject(reason);
});
});
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiYmVkLWZvcm0tbG9hZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL3NjaGVtYS90YWJiZWQtZm9ybS1sb2FkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvc2NoZW1hL3RhYmJlZC1mb3JtLWxvYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFpQyxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxjQUFjLEVBQTBCLE1BQU0sRUFBdUIsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFdEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25ILE9BQU8sRUFBeUQsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7O0lDVG5ELGtDQUEyRixhQUFBO0lBQ3RELFlBQWtDO0lBQUEsaUJBQUssRUFBQTs7O0lBQXZDLGVBQWtDO0lBQWxDLGtFQUFrQzs7O0lBVXpELDhCQUN3QztJQUFBLFlBQStCO0lBQUEsaUJBQUs7Ozs7SUFBMUUsNkRBQXFDO0lBQUMsZUFBK0I7SUFBL0IsMkRBQStCOzs7SUFXWiw0QkFDcEI7SUFBQSxpQkFB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