UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

598 lines 86.1 kB
import { __decorate, __metadata } from "tslib"; import { Component, Inject, Injector, Input, IterableDiffers, Optional, ViewChild } from '@angular/core'; import { FormArray, FormGroup } from '@angular/forms'; import { Router } from '@angular/router'; import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators'; import { Yield } from '@microsoft/windows-admin-center-sdk/core/base/decorators/yield.decorator'; import { Net } from '@microsoft/windows-admin-center-sdk/core/data/net'; import { EnvironmentModule } from '@microsoft/windows-admin-center-sdk/core/manifest/environment-modules'; import { RpcOverlayCloseClient } from '@microsoft/windows-admin-center-sdk/core/rpc/overlay/rpc-overlay-close-client'; import { RpcType } from '@microsoft/windows-admin-center-sdk/core/rpc/rpc-base'; import { EMPTY, from } from 'rxjs'; import { AppContextService } from '../../../service/app-context.service'; import { RpcShellService } from '../../../service/rpc-shell.service'; import { CoreBaseComponent } from '../../common/base.component'; import { SME_LAYOUT_PROVIDER } from '../../common/layout'; import { SearchFormFieldComponent } from '../../form'; import { SettingsFormService } from '../settings-form.service'; import { SettingsComponent } from '../settings.component'; import { SettingsResponsiveWindowManager } from './settings-responsive-window-manager'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "../settings-form.service"; import * as i3 from "../../../service/app-context.service"; import * as i4 from "../../../service/rpc-shell.service"; import * as i5 from "../../../directives/router/router-link.directive"; import * as i6 from "@angular/common"; import * as i7 from "../../tooltip/tooltip.directive"; import * as i8 from "@angular/forms"; import * as i9 from "../../form/form-field/search/search-form-field.component"; import * as i10 from "../../form/form-field/form-field-accessor.directive"; import * as i11 from "../../form/form-field/form-field-validator.directive"; import * as i12 from "../settings.component"; import * as i13 from "../settings-footer.component"; import * as i14 from "../settings-header.component"; import * as i15 from "../settings-content.component"; import * as i16 from "../settings-navigation.component"; const _c0 = ["searchTextBox"]; function CommonSettingsComponent_header_2_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "header", 12)(1, "h2", 13); i0.ɵɵtext(2); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵattribute("aria-label", ctx_r0.settingsTitle); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(ctx_r0.settingsTitle); } } function CommonSettingsComponent_li_10_div_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 17); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r9 = i0.ɵɵnextContext(); const j_r6 = ctx_r9.index; const group_r5 = ctx_r9.$implicit; const ctx_r7 = i0.ɵɵnextContext(); i0.ɵɵproperty("id", ctx_r7.idBag.group + "-" + j_r6)("title", group_r5.group); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(group_r5.group); } } function CommonSettingsComponent_li_10_a_2_div_2_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "div", 24); } if (rf & 2) { const setting_r10 = i0.ɵɵnextContext().$implicit; const ctx_r12 = i0.ɵɵnextContext(2); i0.ɵɵproperty("ngClass", ctx_r12.getSmeIconClass(setting_r10)); } } function CommonSettingsComponent_li_10_a_2_div_3_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "div", 25); } if (rf & 2) { const setting_r10 = i0.ɵɵnextContext().$implicit; i0.ɵɵstyleProp("background-image", setting_r10.urlIcon); } } function CommonSettingsComponent_li_10_a_2_div_4_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "div", 25); } if (rf & 2) { const ctx_r14 = i0.ɵɵnextContext(3); i0.ɵɵstyleProp("background-image", ctx_r14.defaultIcon); } } function CommonSettingsComponent_li_10_a_2_Template(rf, ctx) { if (rf & 1) { const _r18 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "a", 18); i0.ɵɵlistener("smeRouterLinkActivated", function CommonSettingsComponent_li_10_a_2_Template_a_smeRouterLinkActivated_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r18); const setting_r10 = restoredCtx.$implicit; const ctx_r17 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r17.onSmeRouterLinkActivated(setting_r10)); }); i0.ɵɵelementStart(1, "div", 19); i0.ɵɵtemplate(2, CommonSettingsComponent_li_10_a_2_div_2_Template, 1, 1, "div", 20); i0.ɵɵtemplate(3, CommonSettingsComponent_li_10_a_2_div_3_Template, 1, 2, "div", 21); i0.ɵɵtemplate(4, CommonSettingsComponent_li_10_a_2_div_4_Template, 1, 2, "div", 21); i0.ɵɵelementEnd(); i0.ɵɵelementStart(5, "div", 22)(6, "span", 23); i0.ɵɵtext(7); i0.ɵɵelementEnd()()(); } if (rf & 2) { const setting_r10 = ctx.$implicit; const i_r11 = ctx.index; const j_r6 = i0.ɵɵnextContext().index; const ctx_r8 = i0.ɵɵnextContext(); i0.ɵɵattributeInterpolate5("aria-labelledby", "", ctx_r8.idBag.option, "-", j_r6, "-", i_r11, " ", ctx_r8.idBag.group, "-", j_r6, ""); i0.ɵɵproperty("routerLink", setting_r10.routeParams.commands)("preserveFragment", setting_r10.routeParams.extras && setting_r10.routeParams.extras.preserveFragment)("skipLocationChange", setting_r10.routeParams.extras && setting_r10.routeParams.extras.skipLocationChange)("replaceUrl", setting_r10.routeParams.extras && setting_r10.routeParams.extras.replaceUrl)("queryParams", setting_r10.routeParams.extras && setting_r10.routeParams.extras.queryParams)("title", setting_r10.label); i0.ɵɵattribute("aria-selected", ctx_r8.selectedSetting === setting_r10); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", setting_r10.smeIconClassName); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", setting_r10.urlIcon); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", !setting_r10.urlIcon && !setting_r10.smeIconClassName); i0.ɵɵadvance(2); i0.ɵɵclassProp("sme-dirty", !!(setting_r10.form && setting_r10.form.dirty))("sme-pristine", !(setting_r10.form && setting_r10.form.dirty)); i0.ɵɵproperty("id", ctx_r8.idBag.option + "-" + j_r6 + "-" + i_r11); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(setting_r10.label); } } function CommonSettingsComponent_li_10_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "li", 14); i0.ɵɵtemplate(1, CommonSettingsComponent_li_10_div_1_Template, 2, 3, "div", 15); i0.ɵɵtemplate(2, CommonSettingsComponent_li_10_a_2_Template, 8, 21, "a", 16); i0.ɵɵelementEnd(); } if (rf & 2) { const group_r5 = ctx.$implicit; const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", group_r5.group !== ctx_r2.defaultGroup); i0.ɵɵadvance(1); i0.ɵɵproperty("ngForOf", group_r5.options); } } function CommonSettingsComponent_div_11_div_1_Template(rf, ctx) { if (rf & 1) { const _r23 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "div", 27); i0.ɵɵlistener("click", function CommonSettingsComponent_div_11_div_1_Template_div_click_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r23); const layer_r21 = restoredCtx.$implicit; const ctx_r22 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r22.onOverlayClick(layer_r21)); }); i0.ɵɵelementEnd(); } } function CommonSettingsComponent_div_11_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div"); i0.ɵɵtemplate(1, CommonSettingsComponent_div_11_div_1_Template, 1, 0, "div", 26); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r3 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵproperty("ngForOf", ctx_r3.layers); } } function CommonSettingsComponent_sme_settings_header_12_h3_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "h3", 29); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r24 = i0.ɵɵnextContext(2); i0.ɵɵattribute("aria-label", ctx_r24.selectedSetting.label); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", ctx_r24.selectedSetting.label, ""); } } function CommonSettingsComponent_sme_settings_header_12_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "sme-settings-header"); i0.ɵɵtemplate(1, CommonSettingsComponent_sme_settings_header_12_h3_1_Template, 2, 2, "h3", 28); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", !!ctx_r4.selectedSetting); } } const _c1 = ["*"]; /** * Container around settings component, handles common settings behavior. */ export class CommonSettingsComponent extends CoreBaseComponent { constructor(injector, router, settingsForms, iterableDiffers, appContext, rpcShellService, layout) { super(injector); this.router = router; this.settingsForms = settingsForms; this.iterableDiffers = iterableDiffers; this.appContext = appContext; this.rpcShellService = rpcShellService; /** * If no header is being used internally, the control will depend on external header being customized * For instance, a breadcrumb header can be used. And in this case, no extra scroll bar can be rendered on phone down. */ this.externalHeader = false; this.defaultGroup = 'default'; this.layers = []; /** * Search box filter. */ this.filter = ''; this.filteredSettings = []; this.showHeader = true; this.hackShowOverlay = false; this.hackToolHeader = false; /** * If connection settings page, the contents are all iframe, special logic to get rid of the extra scroll bar for iframe. */ this.connectionSettings = false; /** * Controls whether the tab list showing the Settings items is scrollable or not * Default to true. Allowing separate scroll bar for the navbar and the selected Settings. * Set to false for backward compatibility and use previous behavior where there is * only 1 single scroll bar for both navbar and content of the selected Settings item. */ this.scrollableSecondaryNav = true; this.autofocus = true; this.combinedForm = new FormGroup({}); this.searchBoxPlaceholder = this.strings.MsftSmeShell.Angular.searchPlaceHolder; if (layout) { this.settingsResponsiveWindowManager = new SettingsResponsiveWindowManager(layout); // on parent layout changes, re-emit the layout change to our event this.subscriptions.push(layout.layoutChanged.subscribe((() => this.onLayoutChanged()))); // on window break point changes, emit the event about critical classes and styling updates signal. this.subscriptions.push(layout.windowBreakpointChanged.subscribe(() => this.onWindowBreakpointChanged())); this.deferredOnLayoutChanged(); } } /** * The source name to use for logging */ get logSourceName() { return 'CommonSettingsComponent'; } ngOnInit() { super.ngOnInit(); this.subscriptions.push(this.settingsForms.formAdded().subscribe((formAddedData) => { // to avoid duplicates we first remove the form if it exists this.latestForm = formAddedData.formGroup; this.latestPristineFormValue = this.getRawValueRecursive(formAddedData.formGroup); this.latestFormUpdateValueInComponent = formAddedData.updateValueInComponent; this.recalculateActivePanel(); })); this.settingsDiffer = this.iterableDiffers.find(this.settings).create(null); this.recalculateActivePanel(); if (this.hackShowOverlay) { this.subscriptions.push(this.rpcShellService.overlayOpenSubject.subscribe((deferredData) => { // overlay tools with one more layer or remove one from top if (deferredData.data.overlay) { this.layers.push(deferredData.data); } else if (this.layers.length > 0) { this.layers.pop(); } else { throw new Error('Rpc OverlayClose: close request is called while layer is no longer available'); } deferredData.deferred.resolve(); })); } if (!this.showHeader && !this.hackToolHeader) { this.externalHeader = true; } this.defaultIcon = EnvironmentModule.getFormattedIconRefUrl('/assets/icons/default.svg?v=1'); } ngOnChanges(changes) { super.ngOnChanges(changes); if (changes.settings) { this.settingsDiffer = this.iterableDiffers.find(this.settings).create(null); } this.createMenu(); this.recalculateActivePanel(); } /** * The deferred layout changed handler. */ deferredOnLayoutChanged() { this.onLayoutChanged(); } onLayoutChanged() { this.settingsResponsiveWindowManager.setIframeHeight(this.connectionSettings, this.hostElement); } onWindowBreakpointChanged() { if (!this.hostElement || !this.hostElement.nativeElement) { return; } this.settingsResponsiveWindowManager.onWindowSizeChangedCommonSettings(this.connectionSettings, this.hostElement); } ngDoCheck() { super.ngDoCheck(); if (this.settingsDiffer) { const changes = this.settingsDiffer.diff(this.settings); if (changes) { this.createMenu(); } } } ngAfterViewChecked() { if (this.autofocus) { const focusElements = this.hostElement.nativeElement.querySelectorAll('[role="tab"]'); if (focusElements && focusElements.length) { focusElements[0].focus(); this.autofocus = false; } } // Setting Title header is managed by child component this.settingsComponent, // after current view and child view has been rendered, pass along the selectedSetting // string if it exists so child view will render the title if (this.selectedSetting) { this.onSmeRouterLinkActivated(this.selectedSetting); } } createMenu() { // Before creating the Settings menu, filter the Settings menu to only display // items that matches the filter this.filteredSettings = this.filterSetting(); const groupTools = []; groupTools['default'] = { group: 'default', options: [] }; this.filteredSettings.forEach((setting) => { if (!!!setting.group) { groupTools['default'].options.push(setting); } else { if (!!!groupTools[setting.group]) { groupTools[setting.group] = { group: setting.group, title: setting.groupTitle, options: [] }; } groupTools[setting.group].options.push(setting); } }); this.groupTools = []; for (const prop in groupTools) { if (prop) { this.groupTools.push(groupTools[prop]); } } } recalculateActivePanel() { const setting = this.selectedSetting; if (MsftSme.isNullOrUndefined(setting)) { return; } if (setting.form && setting.form.dirty) { const formValue = this.getRawValueRecursive(setting.form); if (setting.updateValueInComponent) { this.settingsForms.newFormValue(setting.form, formValue); } else { this.latestForm.setValue(formValue); } this.latestForm.markAsDirty(); } this.settingsForms.removeForm(setting.form); setting.form = this.latestForm; if (setting.form) { if (this.combinedForm.controls[setting.label]) { this.combinedForm.setControl(setting.label, setting.form); } else { this.combinedForm.addControl(setting.label, setting.form); } } setting.updateValueInComponent = this.latestFormUpdateValueInComponent; } discardAllChildForms() { // For the current active setting, we need to reset the form to its // original pristine form when discarding changes const activeSetting = this.selectedSetting; const settingWithForm = activeSetting; if (settingWithForm.form) { settingWithForm.form.reset(this.latestPristineFormValue); } this.settings.forEach((otherSetting) => { if (otherSetting !== activeSetting) { const othersettingWithForm = otherSetting; this.settingsForms.removeForm(othersettingWithForm.form); othersettingWithForm.form = null; if (this.combinedForm.controls[othersettingWithForm.label]) { this.combinedForm.removeControl(othersettingWithForm.label); } } }); } acceptAllChildFormsValue() { const activeSetting = this.selectedSetting; this.settings.forEach((setting) => { const settingWithForm = setting; if (settingWithForm.form) { settingWithForm.form.reset(this.getRawValueRecursive(settingWithForm.form)); if (activeSetting === settingWithForm) { this.latestPristineFormValue = this.getRawValueRecursive(settingWithForm.form); } } }); } getSmeIconClass(setting) { const ngClassParameter = {}; if (setting.smeIconClassName) { ngClassParameter[setting.smeIconClassName] = true; } return ngClassParameter; } canDeactivate(component, route, state) { if (this.settingsComponent) { return this.settingsComponent.canDeactivate(component, route, state); } return true; } /** * Gets the initial host classes to be applied to this element */ getInitialHostClasses() { return super.getInitialHostClasses().concat([ 'sme-common-settings' ]); } /** * Creates the idBag used by this component to store unique element ids. * id values will be assigned be the @see BaseComponent super class. */ createIdBag() { return { group: '', option: '' }; } onOverlayClick(layer) { const layerRpc = this.appContext.rpc.rpcManager.rpcChannel.getRpc(layer.sourceName, layer.sourceSubName, RpcType.Outbound); from(RpcOverlayCloseClient.overlayClose(this.appContext.rpc, { overlay: false, dialogId: layer.dialogId }, layerRpc)) .subscribe({ next: result => { if (!result.overlayClosed && this.layers.length > 0) { this.layers.pop(); } }, error: error => { const notification = this.appContext.notification.create(null); notification.showError(this.strings.MsftSmeShell.Angular.Overlay.closeErrorTitle, Net.getErrorMessage(error)); if (this.layers.length > 0) { this.layers.pop(); } return EMPTY; } }); } /** * Returns the value of the current control and all its children recursivelly, * including disabled controls. * * Workaround for missing functionality added in later versions of angular * Currently getRawValue only returns the value of hte current control disabled * children but only enabled controls of other descendants: * https://github.com/angular/angular/commit/1ece7366c8b67f387fbe13f8d128c19f4c50dd19 * * Once we upgrade angular version we can remove this code. * * @param formControl The form control to get the value from */ getRawValueRecursive(formControl) { if (formControl instanceof FormGroup) { const value = {}; Object.keys(formControl.controls).forEach(key => { value[key] = this.getRawValueRecursive(formControl.controls[key]); }); return value; } else if (formControl instanceof FormArray) { return formControl.controls.map((control) => { return this.getRawValueRecursive(control); }); } return formControl.value; } /** * Update this.selectedSetting to the newly selected Settings item when user navigate to a new Settings item * Also call the child component this.settingsComponent to update the settingsTitle to reflect the title * of the newly selected Settings item * * @param newSetting The newly selected Settings item */ onSmeRouterLinkActivated(newSetting) { this.selectedSetting = newSetting; if (this.settingsComponent) { this.settingsComponent.updateSelectedSettingTitle(newSetting.label); } this.settingsResponsiveWindowManager.setIframeHeight(this.connectionSettings, this.hostElement); } /** * Callback function for the search field */ onSearch() { this.searchTextBox.searching = true; setTimeout(() => { this.createMenu(); this.searchTextBox.searching = false; }); } /** * Filter out the settings Item based on this.filter string and match the title of Settings Items */ filterSetting() { const settings = this.settings; if (!this.filter) { return settings; } const localFilter = this.filter.toLocaleLowerCase(); return settings.filter(setting => { if (setting.label.toLocaleLowerCase().indexOf(localFilter) > -1) { return true; } // if not match the exact title, need to match with keywords if (setting.keywords) { const matches = setting.keywords.filter(keyword => keyword.indexOf(localFilter) > -1); if (matches.length > 0) { return true; } } return false; }); } } /** @nocollapse */ CommonSettingsComponent.ɵfac = function CommonSettingsComponent_Factory(t) { return new (t || CommonSettingsComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i2.SettingsFormService), i0.ɵɵdirectiveInject(i0.IterableDiffers), i0.ɵɵdirectiveInject(i3.AppContextService), i0.ɵɵdirectiveInject(i4.RpcShellService), i0.ɵɵdirectiveInject(SME_LAYOUT_PROVIDER, 8)); }; /** @nocollapse */ CommonSettingsComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: CommonSettingsComponent, selectors: [["sme-common-settings"]], viewQuery: function CommonSettingsComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 5); i0.ɵɵviewQuery(SettingsComponent, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.searchTextBox = _t.first); i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.settingsComponent = _t.first); } }, inputs: { searchBoxPlaceholder: "searchBoxPlaceholder", settingsTitle: "settingsTitle", settings: "settings", showHeader: "showHeader", hackShowOverlay: "hackShowOverlay", hackToolHeader: "hackToolHeader", connectionSettings: "connectionSettings", backRoute: "backRoute", scrollableSecondaryNav: "scrollableSecondaryNav" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c1, decls: 17, vars: 13, consts: [[3, "settingsTitle"], [1, "sme-position-stretch-v-phone-up", "sme-position-stretch-h", 2, "min-width", "160px"], ["class", "sme-layout-tool-header", 4, "ngIf"], ["role", "region", 1, "sme-position-stretch", "sme-arrange-stack-v"], [1, "sme-position-flex-none", "sme-focus-zone"], [1, "sme-margin-squish-v-sm"], ["type", "search", "name", "toolsListSearch", 3, "ngModel", "placeholder", "autofocus", "count", "ngModelChange", "search"], ["searchTextBox", ""], ["role", "tablist", 1, "sme-arrange-stack-v", "sme-focus-zone", 3, "ngClass"], ["role", "presentation", 1, "sme-position-flex-auto", "sme-arrange-stack-v", "sme-arrange-overflow-hide-x", "sme-arrange-overflow-auto-y"], ["class", "sme-margin-inset-none", "role", "presentation", 4, "ngFor", "ngForOf"], [4, "ngIf"], [1, "sme-layout-tool-header"], [1, "sme-position-flex-none", "sme-font-h3"], ["role", "presentation", 1, "sme-margin-inset-none"], ["class", "sme-font-h4 sme-font-h4-settings", 3, "id", "title", 4, "ngIf"], ["class", "sme-padding-squish-v-sm sme-arrange-stack-h sme-arrange-stack-centered-v sme-scheme-nav-item", "role", "tab", "href", "setting.routeParams.extras && setting.routeParams.extras.replaceUrl", "routerLinkActive", "sme-active", 3, "routerLink", "preserveFragment", "skipLocationChange", "replaceUrl", "queryParams", "title", "smeRouterLinkActivated", 4, "ngFor", "ngForOf"], [1, "sme-font-h4", "sme-font-h4-settings", 3, "id", "title"], ["role", "tab", "href", "setting.routeParams.extras && setting.routeParams.extras.replaceUrl", "routerLinkActive", "sme-active", 1, "sme-padding-squish-v-sm", "sme-arrange-stack-h", "sme-arrange-stack-centered-v", "sme-scheme-nav-item", 3, "routerLink", "preserveFragment", "skipLocationChange", "replaceUrl", "queryParams", "title", "smeRouterLinkActivated"], [1, "sme-margin-right-xs", "sme-layout-flex", "sme-position-flex-align-center"], ["class", "sme-icon", 3, "ngClass", 4, "ngIf"], ["class", "sme-url-icon", 3, "background-image", 4, "ngIf"], [1, "sme-position-flex-auto"], [1, "sme-font-label", "sme-layout-flex", "sme-position-flex-align-center", 3, "id"], [1, "sme-icon", 3, "ngClass"], [1, "sme-url-icon"], ["class", "sme-layout-absolute sme-position-inset-none sme-layer-above sme-scheme-backdrop-opaque", 3, "click", 4, "ngFor", "ngForOf"], [1, "sme-layout-absolute", "sme-position-inset-none", "sme-layer-above", "sme-scheme-backdrop-opaque", 3, "click"], ["id", "sme-shell-setting-selectedTitle", 4, "ngIf"], ["id", "sme-shell-setting-selectedTitle"]], template: function CommonSettingsComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵprojectionDef(); i0.ɵɵelementStart(0, "sme-settings", 0)(1, "sme-settings-navigation", 1); i0.ɵɵtemplate(2, CommonSettingsComponent_header_2_Template, 3, 2, "header", 2); i0.ɵɵelementStart(3, "div", 3)(4, "div", 4)(5, "form", 5)(6, "sme-form-field", 6, 7); i0.ɵɵlistener("ngModelChange", function CommonSettingsComponent_Template_sme_form_field_ngModelChange_6_listener($event) { return ctx.filter = $event; })("search", function CommonSettingsComponent_Template_sme_form_field_search_6_listener() { return ctx.onSearch(); }); i0.ɵɵelementEnd()()(); i0.ɵɵelementStart(8, "nav", 8)(9, "ul", 9); i0.ɵɵtemplate(10, CommonSettingsComponent_li_10_Template, 3, 2, "li", 10); i0.ɵɵelementEnd()()(); i0.ɵɵtemplate(11, CommonSettingsComponent_div_11_Template, 2, 1, "div", 11); i0.ɵɵelementEnd(); i0.ɵɵtemplate(12, CommonSettingsComponent_sme_settings_header_12_Template, 2, 1, "sme-settings-header", 11); i0.ɵɵelementStart(13, "sme-settings-content"); i0.ɵɵelement(14, "router-outlet"); i0.ɵɵelementEnd(); i0.ɵɵelementStart(15, "sme-settings-footer"); i0.ɵɵprojection(16); i0.ɵɵelementEnd()(); } if (rf & 2) { i0.ɵɵclassProp("sme-settings-external-header", ctx.externalHeader); i0.ɵɵproperty("settingsTitle", ctx.hackToolHeader ? "" : ctx.settingsTitle); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", ctx.hackToolHeader); i0.ɵɵadvance(1); i0.ɵɵattribute("aria-label", ctx.settingsTitle); i0.ɵɵadvance(3); i0.ɵɵproperty("ngModel", ctx.filter)("placeholder", ctx.searchBoxPlaceholder)("autofocus", true)("count", ctx.filteredSettings ? ctx.filteredSettings.length : 0); i0.ɵɵadvance(2); i0.ɵɵproperty("ngClass", ctx.scrollableSecondaryNav ? "sme-position-flex-auto sme-arrange-overflow-auto-y" : ""); i0.ɵɵadvance(2); i0.ɵɵproperty("ngForOf", ctx.groupTools); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.hackShowOverlay); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", !!ctx.showHeader); } }, dependencies: [i5.SmeRouterLinkDirective, i1.RouterOutlet, i1.RouterLink, i1.RouterLinkActive, i6.NgClass, i6.NgForOf, i6.NgIf, i7.TooltipDirective, i8.ɵNgNoValidate, i8.NgControlStatus, i8.NgControlStatusGroup, i8.NgModel, i8.NgForm, i9.SearchFormFieldComponent, i10.FormFieldAccessorDirective, i11.FormFieldValidatorDirective, i12.SettingsComponent, i13.SettingsFooterComponent, i14.SettingsHeaderComponent, i15.SettingsContentComponent, i16.SettingsNavigationComponent], encapsulation: 2 }); __decorate([ Debounce(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], CommonSettingsComponent.prototype, "deferredOnLayoutChanged", null); __decorate([ Yield(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], CommonSettingsComponent.prototype, "onLayoutChanged", null); __decorate([ Yield(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], CommonSettingsComponent.prototype, "onWindowBreakpointChanged", null); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CommonSettingsComponent, [{ type: Component, args: [{ selector: 'sme-common-settings', template: "<sme-settings [settingsTitle]=\"hackToolHeader ? '' : settingsTitle\" [class.sme-settings-external-header]=\"externalHeader\">\r\n <sme-settings-navigation class=\"sme-position-stretch-v-phone-up sme-position-stretch-h\" style=\"min-width: 160px\">\r\n <header class=\"sme-layout-tool-header\" *ngIf=\"hackToolHeader\">\r\n <h2 class=\"sme-position-flex-none sme-font-h3\" [attr.aria-label]=\"settingsTitle\">{{settingsTitle}}</h2>\r\n </header>\r\n <div role=\"region\" [attr.aria-label]=\"settingsTitle\" class=\"sme-position-stretch sme-arrange-stack-v\">\r\n <div class=\"sme-position-flex-none sme-focus-zone\">\r\n <form class=\"sme-margin-squish-v-sm\">\r\n <sme-form-field #searchTextBox type=\"search\" name=\"toolsListSearch\" [(ngModel)]=\"filter\" [placeholder]=\"searchBoxPlaceholder\"\r\n [autofocus]=\"true\" [count]=\"filteredSettings ? filteredSettings.length : 0\"\r\n (search)=\"onSearch()\"></sme-form-field>\r\n </form>\r\n </div>\r\n <nav role=\"tablist\" class=\"sme-arrange-stack-v sme-focus-zone\"\r\n [ngClass]=\"scrollableSecondaryNav ? 'sme-position-flex-auto sme-arrange-overflow-auto-y' : ''\">\r\n <ul class=\"sme-position-flex-auto sme-arrange-stack-v sme-arrange-overflow-hide-x sme-arrange-overflow-auto-y\"\r\n role=\"presentation\">\r\n <li *ngFor=\"let group of groupTools; let j = index\" class=\"sme-margin-inset-none\" role=\"presentation\">\r\n <div [id]=\"idBag.group + '-' + j\" class=\"sme-font-h4 sme-font-h4-settings\" *ngIf=\"group.group!==defaultGroup\"\r\n [title]=\"group.group\">{{ group.group }}</div>\r\n <a *ngFor=\"let setting of group.options; let i = index\"\r\n class=\"sme-padding-squish-v-sm sme-arrange-stack-h sme-arrange-stack-centered-v sme-scheme-nav-item\" role=\"tab\"\r\n href=\"setting.routeParams.extras && setting.routeParams.extras.replaceUrl\"\r\n [attr.aria-selected]=\"selectedSetting === setting\"\r\n [routerLink]=\"setting.routeParams.commands\" routerLinkActive=\"sme-active\"\r\n (smeRouterLinkActivated)=\"onSmeRouterLinkActivated(setting)\"\r\n [preserveFragment]=\"setting.routeParams.extras && setting.routeParams.extras.preserveFragment\"\r\n [skipLocationChange]=\"setting.routeParams.extras && setting.routeParams.extras.skipLocationChange\"\r\n [replaceUrl]=\"setting.routeParams.extras && setting.routeParams.extras.replaceUrl\"\r\n [queryParams]=\"setting.routeParams.extras && setting.routeParams.extras.queryParams\"\r\n [title]=\"setting.label\" attr.aria-labelledby=\"{{idBag.option}}-{{j}}-{{i}} {{idBag.group}}-{{j}}\">\r\n <div class=\"sme-margin-right-xs sme-layout-flex sme-position-flex-align-center\">\r\n <div *ngIf=\"setting.smeIconClassName\" class=\"sme-icon\" [ngClass]=\"getSmeIconClass(setting)\"></div>\r\n <div *ngIf=\"setting.urlIcon\" class=\"sme-url-icon\" [style.background-image]=\"setting.urlIcon\"></div>\r\n <div *ngIf=\"!setting.urlIcon && !setting.smeIconClassName\" class=\"sme-url-icon\" [style.background-image]=\"defaultIcon\"></div>\r\n </div>\r\n <div class=\"sme-position-flex-auto\">\r\n <span [id]=\"idBag.option + '-' + j + '-' + i\" [class.sme-dirty]=\"!!(setting.form && setting.form.dirty)\"\r\n [class.sme-pristine]=\"!(setting.form && setting.form.dirty)\" class=\"sme-font-label sme-layout-flex sme-position-flex-align-center\">{{ setting.label }}</span>\r\n </div>\r\n </a>\r\n </li>\r\n </ul>\r\n </nav>\r\n </div>\r\n <div *ngIf=\"hackShowOverlay\">\r\n <div *ngFor=\"let layer of layers\"\r\n class=\"sme-layout-absolute sme-position-inset-none sme-layer-above sme-scheme-backdrop-opaque\"\r\n (click)=\"onOverlayClick(layer)\"></div>\r\n </div>\r\n </sme-settings-navigation>\r\n <sme-settings-header *ngIf=\"!!showHeader\">\r\n <h3 id=\"sme-shell-setting-selectedTitle\" [attr.aria-label]=\"selectedSetting.label\" *ngIf=\"!!selectedSetting\">\r\n {{ selectedSetting.label }}</h3>\r\n </sme-settings-header>\r\n <sme-settings-content>\r\n <router-outlet></router-outlet>\r\n </sme-settings-content>\r\n <sme-settings-footer>\r\n <ng-content></ng-content>\r\n </sme-settings-footer>\r\n</sme-settings>\r\n" }] }], function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i2.SettingsFormService }, { type: i0.IterableDiffers }, { type: i3.AppContextService }, { type: i4.RpcShellService }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [SME_LAYOUT_PROVIDER] }] }]; }, { searchBoxPlaceholder: [{ type: Input }], searchTextBox: [{ type: ViewChild, args: ['searchTextBox'] }], settingsTitle: [{ type: Input }], settings: [{ type: Input }], showHeader: [{ type: Input }], hackShowOverlay: [{ type: Input }], hackToolHeader: [{ type: Input }], connectionSettings: [{ type: Input }], backRoute: [{ type: Input }], scrollableSecondaryNav: [{ type: Input }], settingsComponent: [{ type: ViewChild, args: [SettingsComponent] }], deferredOnLayoutChanged: [], onLayoutChanged: [], onWindowBreakpointChanged: [] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL3NldHRpbmdzL2NvbW1vbi1zZXR0aW5ncy9jb21tb24tc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvc2V0dGluZ3MvY29tbW9uLXNldHRpbmdzL2NvbW1vbi1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVILFNBQVMsRUFFVCxNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFFTCxlQUFlLEVBSWYsUUFBUSxFQUNSLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQW1CLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RSxPQUFPLEVBR0gsTUFBTSxFQUVULE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhFQUE4RSxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwwRUFBMEUsQ0FBQztBQUNqRyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUVBQXVFLENBQUM7QUFDMUcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0VBQStFLENBQUM7QUFHdEgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBRWhGLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxv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