@microsoft/windows-admin-center-sdk 2.128.0 → 2.165.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/angular/assets/strings/cs-CZ/strings.json +1 -1
- package/angular/assets/strings/de-DE/strings.json +1 -1
- package/angular/assets/strings/es-ES/strings.json +1 -1
- package/angular/assets/strings/fr-FR/strings.json +1 -1
- package/angular/assets/strings/hu-HU/strings.json +1 -1
- package/angular/assets/strings/it-IT/strings.json +1 -1
- package/angular/assets/strings/ja-JP/strings.json +1 -1
- package/angular/assets/strings/ko-KR/strings.json +1 -1
- package/angular/assets/strings/nl-NL/strings.json +1 -1
- package/angular/assets/strings/pl-PL/strings.json +1 -1
- package/angular/assets/strings/pt-BR/strings.json +1 -1
- package/angular/assets/strings/pt-PT/strings.json +1 -1
- package/angular/assets/strings/ru-RU/strings.json +1 -1
- package/angular/assets/strings/sv-SE/strings.json +1 -1
- package/angular/assets/strings/tr-TR/strings.json +1 -1
- package/angular/assets/strings/zh-CN/strings.json +1 -1
- package/angular/assets/strings/zh-TW/strings.json +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js +706 -507
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js.map +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js.map +1 -1
- package/angular/esm2015/src/controls/accordion/index.js +5 -0
- package/angular/esm2015/src/controls/data-table/data-table.component.js +135 -129
- package/angular/esm2015/src/controls/dialog/dialog.component.js +11 -5
- package/angular/esm2015/src/controls/dialog/dialog.service.js +6 -13
- package/angular/esm2015/src/controls/dropdown/dropdown.service.js +3 -2
- package/angular/esm2015/src/controls/form/form-field/array/array-form-field.component.js +29 -22
- package/angular/esm2015/src/controls/form/form-field/datetime-range/datetime-range-form-field.component.js +4 -3
- package/angular/esm2015/src/controls/form/form-field/list/list-form-field.component.js +1 -1
- package/angular/esm2015/src/controls/form/validation-alert/validation-alert.component.js +3 -2
- package/angular/esm2015/src/controls/index.js +2 -1
- package/angular/esm2015/src/controls/pivot/pivot.component.js +21 -9
- package/angular/esm2015/src/controls/settings/common-settings/common-settings.component.js +38 -34
- package/angular/esm2015/src/controls/settings/settings-content.component.js +3 -2
- package/angular/esm2015/src/controls/settings/settings.component.js +45 -13
- package/angular/esm2015/src/controls/settings/settings.module.js +5 -1
- package/angular/esm2015/src/controls/tooltip/tooltip-zone.directive.js +2 -2
- package/angular/esm2015/src/controls/wizard/models/index.js +1 -1
- package/angular/esm2015/src/controls/wizard/models/wizard-builder-interface.js +2 -0
- package/angular/esm2015/src/controls/wizard/models/wizard-navigation-interface.js +2 -0
- package/angular/esm2015/src/controls/wizard/wizard-builder.js +70 -1
- package/angular/esm2015/src/controls/wizard/wizard-navigation-information.js +56 -2
- package/angular/esm2015/src/controls/wizard/wizard.component.js +8 -2
- package/angular/esm2015/src/service/connectivity-enforcer.js +5 -2
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js +656 -462
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js.map +1 -1
- package/angular/src/controls/accordion/index.d.ts +4 -0
- package/angular/src/controls/form/form-field/array/array-form-field.component.d.ts +2 -1
- package/angular/src/controls/index.d.ts +1 -0
- package/angular/src/controls/pivot/pivot.component.d.ts +2 -2
- package/angular/src/controls/settings/settings.component.d.ts +3 -0
- package/angular/src/controls/settings/settings.module.d.ts +3 -2
- package/angular/src/controls/wizard/models/index.d.ts +2 -0
- package/angular/src/controls/wizard/models/wizard-builder-interface.d.ts +8 -0
- package/angular/src/controls/wizard/models/wizard-navigation-interface.d.ts +4 -0
- package/angular/src/controls/wizard/wizard-builder.d.ts +36 -1
- package/angular/src/controls/wizard/wizard-navigation-information.d.ts +48 -5
- package/angular/src/controls/wizard/wizard.component.d.ts +2 -1
- package/core/azure/azure-constants.d.ts +8 -0
- package/core/azure/azure-constants.js +8 -0
- package/core/azure/azure-constants.js.map +1 -1
- package/core/azure/azure-manager.d.ts +1 -0
- package/core/azure/azure-manager.js +7 -1
- package/core/azure/azure-manager.js.map +1 -1
- package/core/base/environment.d.ts +3 -0
- package/core/base/environment.js.map +1 -1
- package/core/base/msft-sme.mock.js +3 -0
- package/core/base/msft-sme.mock.js.map +1 -1
- package/core/base/utilities.d.ts +0 -3
- package/core/base/utilities.js +0 -34
- package/core/base/utilities.js.map +1 -1
- package/core/data/resource-cache.d.ts +1 -1
- package/core/data/resource-cache.js +1 -1
- package/core/data/resource-cache.js.map +1 -1
- package/core/data/settings-manager.d.ts +3 -0
- package/core/data/settings-manager.js +14 -1
- package/core/data/settings-manager.js.map +1 -1
- package/core/dom/dom.d.ts +5 -0
- package/core/dom/dom.js +20 -0
- package/core/dom/dom.js.map +1 -1
- package/core/manifest/environment-modules.js +3 -0
- package/core/manifest/environment-modules.js.map +1 -1
- package/core/notification/client-notification-instance.d.ts +5 -2
- package/core/notification/client-notification-instance.js +9 -5
- package/core/notification/client-notification-instance.js.map +1 -1
- package/core/notification/client-notification.d.ts +4 -0
- package/core/notification/client-notification.js.map +1 -1
- package/core/notification/notification.d.ts +6 -1
- package/core/notification/notification.js +3 -1
- package/core/notification/notification.js.map +1 -1
- package/core/rpc/credssp/rpc-credssp-model.d.ts +4 -0
- package/core/rpc/credssp/rpc-credssp-model.js.map +1 -1
- package/core/rpc/dialog/rpc-dialog-client.js +11 -5
- package/core/rpc/dialog/rpc-dialog-client.js.map +1 -1
- package/core/rpc/rpc.d.ts +6 -6
- package/core/rpc/rpc.js +7 -7
- package/core/rpc/rpc.js.map +1 -1
- package/core/security/authorization-manager.js +1 -1
- package/core/security/authorization-manager.js.map +1 -1
- package/core/security/credssp-manager.d.ts +13 -6
- package/core/security/credssp-manager.js +37 -21
- package/core/security/credssp-manager.js.map +1 -1
- package/core/shared/cluster-inventory/cluster-inventory-cache.js +2 -1
- package/core/shared/cluster-inventory/cluster-inventory-cache.js.map +1 -1
- package/e2e/assets/strings/cs-CZ/strings.json +1 -1
- package/e2e/assets/strings/de-DE/strings.json +1 -1
- package/e2e/assets/strings/es-ES/strings.json +1 -1
- package/e2e/assets/strings/fr-FR/strings.json +1 -1
- package/e2e/assets/strings/hu-HU/strings.json +1 -1
- package/e2e/assets/strings/it-IT/strings.json +1 -1
- package/e2e/assets/strings/ja-JP/strings.json +1 -1
- package/e2e/assets/strings/ko-KR/strings.json +1 -1
- package/e2e/assets/strings/nl-NL/strings.json +1 -1
- package/e2e/assets/strings/pl-PL/strings.json +1 -1
- package/e2e/assets/strings/pt-BR/strings.json +1 -1
- package/e2e/assets/strings/pt-PT/strings.json +1 -1
- package/e2e/assets/strings/ru-RU/strings.json +1 -1
- package/e2e/assets/strings/strings.json +1 -1
- package/e2e/assets/strings/sv-SE/strings.json +1 -1
- package/e2e/assets/strings/tr-TR/strings.json +1 -1
- package/e2e/assets/strings/zh-CN/strings.json +1 -1
- package/e2e/assets/strings/zh-TW/strings.json +1 -1
- package/package.json +11 -4
- package/styles/css/main.css +1 -1
- package/tools/gulp-ps-cim/index.js +1 -1
- package/tools/gulp-ps-cim/index.js.map +1 -1
- package/angular/assets/strings/en-US/strings.json +0 -1
- package/core/assets/strings/en-US/strings.json +0 -1
- package/e2e/assets/strings/en-US/strings.json +0 -1
|
@@ -34,7 +34,7 @@ export declare class ResourceCache {
|
|
|
34
34
|
*/
|
|
35
35
|
find<T>(type: string, id: string): T;
|
|
36
36
|
/**
|
|
37
|
-
* @deprecated - Use MsftSme.
|
|
37
|
+
* @deprecated - Use MsftSme.getStrings<T>() instead.
|
|
38
38
|
*
|
|
39
39
|
* Gets the localized strings initialized by localization manager. The LocalizationManager should have
|
|
40
40
|
* been used to get the localized strings. This can also be achieved by calling SmeEnvironment.initEnvironment().
|
|
@@ -40,7 +40,7 @@ export class ResourceCache {
|
|
|
40
40
|
return resource.find(id);
|
|
41
41
|
}
|
|
42
42
|
/**
|
|
43
|
-
* @deprecated - Use MsftSme.
|
|
43
|
+
* @deprecated - Use MsftSme.getStrings<T>() instead.
|
|
44
44
|
*
|
|
45
45
|
* Gets the localized strings initialized by localization manager. The LocalizationManager should have
|
|
46
46
|
* been used to get the localized strings. This can also be achieved by calling SmeEnvironment.initEnvironment().
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/core/data/resource-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAgBjD;;GAEG;AACH,MAAM,OAAO,aAAa;IAOtB;;;;;OAKG;IACI,QAAQ,CAAC,IAAY,EAAE,QAAgC;QAC1D,MAAM,gBAAgB,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,gBAAgB,EAAE;YAClB,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;YACtE,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC;SACnD;aAAM;YACH,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;SAC7C;IACL,CAAC;IAED;;;;;;OAMG;IACI,IAAI,CAAI,IAAY,EAAE,EAAU;QACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE;YACX,OAAO,CAAC,GAAG,CAAY;gBACnB,MAAM,EAAE,eAAe;gBACvB,KAAK,EAAE,QAAQ,CAAC,OAAO;gBACvB,OAAO,EAAE,OAAO,CAAC,UAAU,EAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;aAC9G,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;SACf;QAED,OAAU,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACI,UAAU;QACb,MAAM,MAAM,GAA2B,MAAM,CAAC;QAC9C,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,IAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;IAC3E,CAAC;;AArDa,qBAAO,GAAG,KAAK,CAAC;AAChB,2BAAa,GAAG,WAAW,CAAC;AAC5B,qBAAO,GAAG,SAAS,CAAC;AAEnB,wBAAU,GAA+C,EAAE,CAAC","file":"resource-cache.js","sourcesContent":["import { LogLevel } from '../diagnostics/log-level';\r\nimport { LogRecord } from '../diagnostics/log-record';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { Strings } from '../generated/strings';\r\n\r\n/**\r\n * The interface of resource query.\r\n */\r\nexport interface ResourceCacheFind<T> {\r\n /**\r\n * Find a resource by id.\r\n *\r\n * @param id the identification.\r\n * @return T the found object if any.\r\n */\r\n find: (id: string) => T;\r\n}\r\n\r\n/**\r\n * Resource service to find a resource data by type and id.\r\n */\r\nexport class ResourceCache {\r\n public static svgType = 'svg';\r\n public static svgInlineType = 'svgInline';\r\n public static strings = 'strings';\r\n\r\n private static collection: { [type: string]: ResourceCacheFind<any> } = {};\r\n\r\n /**\r\n * Register resource service to a specific type.\r\n *\r\n * @param type the type name of resource.\r\n * @param resource the resource data with find() interface.\r\n */\r\n public register(type: string, resource: ResourceCacheFind<any>): void {\r\n const existingResource = ResourceCache.collection[type];\r\n if (existingResource) {\r\n const mergedResource = MsftSme.deepAssign(existingResource, resource);\r\n ResourceCache.collection[type] = mergedResource;\r\n } else {\r\n ResourceCache.collection[type] = resource;\r\n }\r\n }\r\n\r\n /**\r\n * Find a resource for the type and id.\r\n *\r\n * @param type the type name of resource.\r\n * @param id the identification.\r\n * @return T the found object id any.\r\n */\r\n public find<T>(type: string, id: string): T {\r\n const resource = ResourceCache.collection[type];\r\n if (!resource) {\r\n Logging.log(<LogRecord>{\r\n source: 'ResourceCache',\r\n level: LogLevel.Warning,\r\n message: MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.ResourceCacheUnableFind.message.format(type)\r\n });\r\n return null;\r\n }\r\n\r\n return <T>resource.find(id);\r\n }\r\n\r\n /**\r\n * @deprecated - Use MsftSme.
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/data/resource-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAgBjD;;GAEG;AACH,MAAM,OAAO,aAAa;IAOtB;;;;;OAKG;IACI,QAAQ,CAAC,IAAY,EAAE,QAAgC;QAC1D,MAAM,gBAAgB,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,gBAAgB,EAAE;YAClB,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;YACtE,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC;SACnD;aAAM;YACH,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;SAC7C;IACL,CAAC;IAED;;;;;;OAMG;IACI,IAAI,CAAI,IAAY,EAAE,EAAU;QACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE;YACX,OAAO,CAAC,GAAG,CAAY;gBACnB,MAAM,EAAE,eAAe;gBACvB,KAAK,EAAE,QAAQ,CAAC,OAAO;gBACvB,OAAO,EAAE,OAAO,CAAC,UAAU,EAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;aAC9G,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;SACf;QAED,OAAU,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACI,UAAU;QACb,MAAM,MAAM,GAA2B,MAAM,CAAC;QAC9C,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,IAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;IAC3E,CAAC;;AArDa,qBAAO,GAAG,KAAK,CAAC;AAChB,2BAAa,GAAG,WAAW,CAAC;AAC5B,qBAAO,GAAG,SAAS,CAAC;AAEnB,wBAAU,GAA+C,EAAE,CAAC","file":"resource-cache.js","sourcesContent":["import { LogLevel } from '../diagnostics/log-level';\r\nimport { LogRecord } from '../diagnostics/log-record';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { Strings } from '../generated/strings';\r\n\r\n/**\r\n * The interface of resource query.\r\n */\r\nexport interface ResourceCacheFind<T> {\r\n /**\r\n * Find a resource by id.\r\n *\r\n * @param id the identification.\r\n * @return T the found object if any.\r\n */\r\n find: (id: string) => T;\r\n}\r\n\r\n/**\r\n * Resource service to find a resource data by type and id.\r\n */\r\nexport class ResourceCache {\r\n public static svgType = 'svg';\r\n public static svgInlineType = 'svgInline';\r\n public static strings = 'strings';\r\n\r\n private static collection: { [type: string]: ResourceCacheFind<any> } = {};\r\n\r\n /**\r\n * Register resource service to a specific type.\r\n *\r\n * @param type the type name of resource.\r\n * @param resource the resource data with find() interface.\r\n */\r\n public register(type: string, resource: ResourceCacheFind<any>): void {\r\n const existingResource = ResourceCache.collection[type];\r\n if (existingResource) {\r\n const mergedResource = MsftSme.deepAssign(existingResource, resource);\r\n ResourceCache.collection[type] = mergedResource;\r\n } else {\r\n ResourceCache.collection[type] = resource;\r\n }\r\n }\r\n\r\n /**\r\n * Find a resource for the type and id.\r\n *\r\n * @param type the type name of resource.\r\n * @param id the identification.\r\n * @return T the found object id any.\r\n */\r\n public find<T>(type: string, id: string): T {\r\n const resource = ResourceCache.collection[type];\r\n if (!resource) {\r\n Logging.log(<LogRecord>{\r\n source: 'ResourceCache',\r\n level: LogLevel.Warning,\r\n message: MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.ResourceCacheUnableFind.message.format(type)\r\n });\r\n return null;\r\n }\r\n\r\n return <T>resource.find(id);\r\n }\r\n\r\n /**\r\n * @deprecated - Use MsftSme.getStrings<T>() instead.\r\n *\r\n * Gets the localized strings initialized by localization manager. The LocalizationManager should have\r\n * been used to get the localized strings. This can also be achieved by calling SmeEnvironment.initEnvironment().\r\n * @returns an object containing all the localized strings, or null if noe localized strings have been fetched yet\r\n */\r\n public getStrings<T>(): T {\r\n const global: MsftSme.SMEWindow = <any>window;\r\n return global.MsftSme.Resources && <T>global.MsftSme.Resources.strings;\r\n }\r\n}\r\n"]}
|
|
@@ -91,6 +91,9 @@ export declare class CommonAdminSettings extends VersionedObject {
|
|
|
91
91
|
get scheduledUpdateTime(): string;
|
|
92
92
|
set scheduledUpdateTime(value: string);
|
|
93
93
|
get updateRescheduled(): boolean;
|
|
94
|
+
private sessionsExpirationMinutesCache;
|
|
95
|
+
get sessionsExpirationMinutes(): number;
|
|
96
|
+
set sessionsExpirationMinutes(value: number);
|
|
94
97
|
set updateRescheduled(value: boolean);
|
|
95
98
|
constructor(objectWrapper: PlainVersionedObject, handlers: VersionedObjectHandlers, gatewayService: GatewayConnection);
|
|
96
99
|
/**
|
|
@@ -139,6 +139,18 @@ export class CommonAdminSettings extends VersionedObject {
|
|
|
139
139
|
get updateRescheduled() {
|
|
140
140
|
return this.getProperty(CommonAdminSettings.propertyNames.updateRescheduled);
|
|
141
141
|
}
|
|
142
|
+
get sessionsExpirationMinutes() {
|
|
143
|
+
if (MsftSme.isNullOrUndefined(this.sessionsExpirationMinutesCache)) {
|
|
144
|
+
this.sessionsExpirationMinutesCache = this.getProperty(CommonAdminSettings.propertyNames.sessionsExpirationMinutes);
|
|
145
|
+
}
|
|
146
|
+
MsftSme.self().Init.sessionExpiration = this.sessionsExpirationMinutesCache;
|
|
147
|
+
return this.sessionsExpirationMinutesCache;
|
|
148
|
+
}
|
|
149
|
+
set sessionsExpirationMinutes(value) {
|
|
150
|
+
this.setProperty(CommonAdminSettings.propertyNames.sessionsExpirationMinutes, value);
|
|
151
|
+
this.sessionsExpirationMinutesCache = undefined;
|
|
152
|
+
MsftSme.self().Init.sessionExpiration = undefined;
|
|
153
|
+
}
|
|
142
154
|
set updateRescheduled(value) {
|
|
143
155
|
this.setProperty(CommonAdminSettings.propertyNames.updateRescheduled, value);
|
|
144
156
|
}
|
|
@@ -175,7 +187,8 @@ CommonAdminSettings.propertyNames = {
|
|
|
175
187
|
autoGatewayUpdate: 'autoGatewayUpdate',
|
|
176
188
|
autoExtensionsUpdate: 'autoExtensionsUpdate',
|
|
177
189
|
scheduledUpdateTime: 'scheduledUpdateTime',
|
|
178
|
-
updateRescheduled: 'updateRescheduled'
|
|
190
|
+
updateRescheduled: 'updateRescheduled',
|
|
191
|
+
sessionsExpirationMinutes: 'sessionsExpirationMinutes'
|
|
179
192
|
};
|
|
180
193
|
/**
|
|
181
194
|
* Manager for the settings. Provides an api for managing user and application settings.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/core/data/settings-manager.ts"],"names":[],"mappings":"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","file":"settings-manager.js","sourcesContent":["import { from, Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { JsonObject } from '../base/json';\r\nimport { PlainVersionedObject, VersionedObject, VersionedObjectConstructor, VersionedObjectHandlers } from '../base/versioned-object';\r\nimport { Rpc } from '../rpc/rpc';\r\nimport { RpcSettingsClient } from '../rpc/settings/rpc-settings-client';\r\nimport { RpcSettings, RpcSettingsOperationType, RpcSettingsProviderType, RpcSettingsScope } from '../rpc/settings/rpc-settings-model';\r\nimport { GatewayConnection } from './gateway-connection';\r\n\r\nexport const enum BannerHideType {\r\n /**\r\n * Indicates banner is not hidden (unusual)\r\n */\r\n None,\r\n /**\r\n * Indicates banner is hidden for the current session\r\n */\r\n Session,\r\n /**\r\n * Indicates banner is hidden permanently\r\n */\r\n Permanent\r\n}\r\n\r\n/**\r\n * Defines banner settings for the current user shared across the application\r\n */\r\nexport interface BannerUserSettings extends JsonObject {\r\n id: string;\r\n hideType: BannerHideType;\r\n}\r\n\r\n/**\r\n * The Versioned representation of the Shell User Settings\r\n * This object is used for settings that specific to the current user and to shell\r\n */\r\nexport class CommonUserSettings extends VersionedObject {\r\n\r\n private static propertyNames = {\r\n banners: 'banners'\r\n };\r\n\r\n /**\r\n * Getter for the latest version of the common user settings\r\n */\r\n public get latestVersion(): number {\r\n return 1;\r\n }\r\n\r\n /**\r\n * Getter for the users preference on banner settings\r\n */\r\n public get banners(): BannerUserSettings[] {\r\n return <BannerUserSettings[]>this.getProperty(CommonUserSettings.propertyNames.banners);\r\n }\r\n\r\n /**\r\n * Setter for the users preference on banner settings\r\n */\r\n public set banners(value: BannerUserSettings[]) {\r\n this.setProperty(CommonUserSettings.propertyNames.banners, value);\r\n }\r\n\r\n constructor(objectWrapper: PlainVersionedObject, handlers: VersionedObjectHandlers) {\r\n super(objectWrapper, handlers);\r\n }\r\n\r\n /**\r\n * Attempts to upgrade the current version of the object at least one version toward the latest version.\r\n * if this.currentVersion is null or undefined, then the upgrade should initialize to the latest version\r\n * this is called iteratively until the current version is equal to the latest version\r\n */\r\n protected upgrade() {\r\n // For now, we dont need to do anything but initialize to the latest version.\r\n // NOTE: When latestVersion is updated, then we need to add logic here to upgrade old user profile objects.\r\n // In this case, we ALWAYS must maintain backwards and forwards compatibility. This object is shared back and forth be\r\n if (MsftSme.isNullOrUndefined(this.currentVersion)) {\r\n this.clear();\r\n this.banners = [];\r\n this.currentVersion = this.latestVersion;\r\n return;\r\n } else if (this.currentVersion < this.latestVersion) {\r\n this.currentVersion = this.latestVersion;\r\n } else {\r\n // current version is newer than the version we know about. TODO: there may need to be handling here in the future.\r\n }\r\n }\r\n\r\n}\r\n\r\n/**\r\n * Defines the common application settings object that is shared through the whole application.\r\n */\r\nexport class CommonApplicationSettings extends VersionedObject {\r\n private static propertyNames = {\r\n // TODO: add properties when needed\r\n };\r\n\r\n /**\r\n * Getter for the latest version of the common application settings\r\n */\r\n public get latestVersion(): number {\r\n return 1;\r\n }\r\n\r\n constructor(objectWrapper: PlainVersionedObject, handlers: VersionedObjectHandlers) {\r\n super(objectWrapper, handlers);\r\n }\r\n\r\n /**\r\n * Attempts to upgrade the current version of the object at least one version toward the latest version.\r\n * if this.currentVersion is null or undefined, then the upgrade should initialize to the latest version\r\n * this is called iteratively until the current version is equal to the latest version\r\n */\r\n protected upgrade() {\r\n // For now, we dont need to do anything but initialize to the latest version.\r\n // NOTE: When latestVersion is updated, then we need to add logic here to upgrade old application settings objects.\r\n // In this case, we ALWAYS must maintain backwards and forwards compatibility. This object is shared back and forth be\r\n if (MsftSme.isNullOrUndefined(this.currentVersion)) {\r\n this.clear();\r\n this.currentVersion = this.latestVersion;\r\n return;\r\n } else if (this.currentVersion < this.latestVersion) {\r\n this.currentVersion = this.latestVersion;\r\n } else {\r\n // current version is newer than the version we know about. TODO: there may need to be handling here in the future.\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Defines the common admin settings object that is shared through the whole application.\r\n */\r\nexport class CommonAdminSettings extends VersionedObject {\r\n private static propertyNames = {\r\n connectivityLevel: 'connectivityLevel',\r\n autoGatewayUpdate: 'autoGatewayUpdate',\r\n autoExtensionsUpdate: 'autoExtensionsUpdate',\r\n scheduledUpdateTime: 'scheduledUpdateTime',\r\n updateRescheduled: 'updateRescheduled'\r\n };\r\n /**\r\n * Getter for the latest version of the common admin settings\r\n */\r\n public get latestVersion(): number {\r\n return 1;\r\n }\r\n\r\n /**\r\n * Getter for the admin's preference on the connectivity level\r\n */\r\n public get connectivityLevel(): string {\r\n return <string>this.getProperty(CommonAdminSettings.propertyNames.connectivityLevel);\r\n }\r\n\r\n /**\r\n * Setter for the admin's preference on the connectivity level\r\n */\r\n public set connectivityLevel(value: string) {\r\n this.setProperty(CommonAdminSettings.propertyNames.connectivityLevel, value);\r\n }\r\n\r\n public get autoGatewayUpdate(): boolean {\r\n return <boolean>this.getProperty(CommonAdminSettings.propertyNames.autoGatewayUpdate);\r\n }\r\n\r\n public set autoGatewayUpdate(value: boolean) {\r\n this.setProperty(CommonAdminSettings.propertyNames.autoGatewayUpdate, value);\r\n }\r\n\r\n public get autoExtensionsUpdate(): boolean {\r\n return <boolean>this.getProperty(CommonAdminSettings.propertyNames.autoExtensionsUpdate);\r\n }\r\n\r\n public set autoExtensionsUpdate(value: boolean) {\r\n this.setProperty(CommonAdminSettings.propertyNames.autoExtensionsUpdate, value);\r\n }\r\n\r\n public get scheduledUpdateTime(): string {\r\n return <string>this.getProperty(CommonAdminSettings.propertyNames.scheduledUpdateTime);\r\n }\r\n\r\n public set scheduledUpdateTime(value: string) {\r\n this.setProperty(CommonAdminSettings.propertyNames.scheduledUpdateTime, value);\r\n }\r\n\r\n public get updateRescheduled(): boolean {\r\n return <boolean>this.getProperty(CommonAdminSettings.propertyNames.updateRescheduled);\r\n }\r\n\r\n public set updateRescheduled(value: boolean) {\r\n this.setProperty(CommonAdminSettings.propertyNames.updateRescheduled, value);\r\n }\r\n\r\n constructor(objectWrapper: PlainVersionedObject, handlers: VersionedObjectHandlers, gatewayService: GatewayConnection) {\r\n super(objectWrapper, handlers, gatewayService);\r\n }\r\n /**\r\n * Attempts to upgrade the current version of the object at least one version toward the latest version.\r\n * if this.currentVersion is null or undefined, then the upgrade should initialize to the latest version\r\n * this is called iteratively until the current version is equal to the latest version\r\n */\r\n protected upgrade() {\r\n // For now, we dont need to do anything but initialize to the latest version.\r\n // NOTE: When latestVersion is updated, then we need to add logic here to upgrade old admin settings objects.\r\n // In this case, we ALWAYS must maintain backwards and forwards compatibility. This object is shared back and forth be\r\n\r\n if (MsftSme.isNullOrUndefined(this.currentVersion)) {\r\n this.clear();\r\n this.currentVersion = this.latestVersion;\r\n this.connectivityLevel = '';\r\n this.scheduledUpdateTime = null;\r\n this.updateRescheduled = false;\r\n this.autoExtensionsUpdate = true;\r\n\r\n this.autoGatewayUpdate = false;\r\n this.gatewayService.get('gateway/autoupdate').subscribe((result: any) => this.autoGatewayUpdate = result.autoUpdate);\r\n\r\n return;\r\n } else if (this.currentVersion < this.latestVersion) {\r\n this.currentVersion = this.latestVersion;\r\n } else {\r\n // current version is newer than the version we know about. TODO: there may need to be handling here in the future.\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Defines the interface for the settings manager.\r\n */\r\nexport interface SettingsQuery {\r\n getCommonUserSettings(): Observable<CommonUserSettings>;\r\n getCommonApplicationSettings(): Observable<CommonApplicationSettings>;\r\n getCommonAdminSettings(): Observable<CommonAdminSettings>;\r\n getExtensionUserSettings<T extends VersionedObject>(type: VersionedObjectConstructor<T>): Observable<T>;\r\n getExtensionApplicationSettings<T extends VersionedObject>(type: VersionedObjectConstructor<T>): Observable<T>;\r\n getExtensionAdminSettings<T extends VersionedObject>(type: VersionedObjectConstructor<T>): Observable<T>;\r\n}\r\n\r\n/**\r\n * Manager for the settings. Provides an api for managing user and application settings.\r\n */\r\nexport class SettingsManager implements SettingsQuery {\r\n\r\n /**\r\n * Initializes a new instance of the SettingsManager class.\r\n *\r\n * @param rpc the RPC class instance.\r\n */\r\n constructor(private rpc: Rpc, private gatewayService: GatewayConnection) { }\r\n\r\n /**\r\n * Get common user settings. This is currently read-only\r\n */\r\n public getCommonUserSettings(): Observable<CommonUserSettings> {\r\n return from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Get,\r\n scope: RpcSettingsScope.User,\r\n provider: RpcSettingsProviderType.Common\r\n })\r\n )\r\n .pipe(map(response => {\r\n // If the extension settings are not versioned (or not defined), then start with an empty settings.\r\n const settings = VersionedObject.ensureIsVersionedObject(response.data);\r\n return new CommonUserSettings(settings, {\r\n save: (object) => {\r\n return <Observable<any>>from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Set,\r\n scope: RpcSettingsScope.User,\r\n provider: RpcSettingsProviderType.Common,\r\n value: object\r\n }));\r\n }\r\n });\r\n }));\r\n }\r\n\r\n /**\r\n * Get common application settings. This is currently read-only\r\n */\r\n public getCommonApplicationSettings(): Observable<CommonApplicationSettings> {\r\n return from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Get,\r\n scope: RpcSettingsScope.Application,\r\n provider: RpcSettingsProviderType.Common\r\n })\r\n )\r\n .pipe(map(response => {\r\n // If the extension settings are not versioned (or not defined), then start with an empty settings.\r\n const settings = VersionedObject.ensureIsVersionedObject(response.data);\r\n return new CommonApplicationSettings(settings, {\r\n save: (object) => {\r\n return <Observable<any>>from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Set,\r\n scope: RpcSettingsScope.Application,\r\n provider: RpcSettingsProviderType.Common,\r\n value: object\r\n }));\r\n }\r\n });\r\n }));\r\n }\r\n\r\n /**\r\n * Get common admin settings. This is currently read-only\r\n */\r\n public getCommonAdminSettings(): Observable<CommonAdminSettings> {\r\n return from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Get,\r\n scope: RpcSettingsScope.Admin,\r\n provider: RpcSettingsProviderType.Common\r\n })\r\n )\r\n .pipe(map(response => {\r\n // If the extension settings are not versioned (or not defined), then start with an empty settings.\r\n const settings = VersionedObject.ensureIsVersionedObject(response.data);\r\n return new CommonAdminSettings(\r\n settings,\r\n {\r\n save: (object) => {\r\n return <Observable<any>>from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Set,\r\n scope: RpcSettingsScope.Admin,\r\n provider: RpcSettingsProviderType.Common,\r\n value: object\r\n }));\r\n }\r\n },\r\n this.gatewayService);\r\n }));\r\n }\r\n\r\n /**\r\n * Get extension user settings\r\n * Extension settings objects must be an object that extends VersionedObject or implements the VersionedObjectConstructor\r\n * example: if TestObject extends VersionedObject, then getExtensionUserSettings(TestObject) will return an Observable<TestObject>\r\n * you should only create 1 versioned object for your extensions user settings.\r\n */\r\n public getExtensionUserSettings<T extends VersionedObject>(type: VersionedObjectConstructor<T>): Observable<T> {\r\n return from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Get,\r\n scope: RpcSettingsScope.User,\r\n provider: RpcSettingsProviderType.Extension\r\n })\r\n )\r\n .pipe(map(response => {\r\n // If the extension settings are not versioned (or not defined), then start with an empty settings.\r\n const settings = VersionedObject.ensureIsVersionedObject(response.data);\r\n return new type(settings, {\r\n save: (object) => {\r\n return <Observable<any>>from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Set,\r\n scope: RpcSettingsScope.User,\r\n provider: RpcSettingsProviderType.Extension,\r\n value: object\r\n }));\r\n }\r\n });\r\n }));\r\n }\r\n\r\n /**\r\n * Get extension application settings\r\n * Extension settings objects must be an object that extends VersionedObject or implements the VersionedObjectConstructor\r\n * example: if TestObject extends VersionedObject, then getExtensionApplicationSettings(TestObject) will return an\r\n * Observable<TestObject>. You should only create 1 versioned object for your extensions application settings.\r\n */\r\n public getExtensionApplicationSettings<T extends VersionedObject>(type: VersionedObjectConstructor<T>): Observable<T> {\r\n return from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Get,\r\n scope: RpcSettingsScope.Application,\r\n provider: RpcSettingsProviderType.Extension\r\n })\r\n )\r\n .pipe(map(response => {\r\n // If the extension settings are not versioned (or not defined), then start with an empty settings.\r\n const settings = VersionedObject.ensureIsVersionedObject(response.data);\r\n return new type(settings, {\r\n save: (object) => {\r\n return <Observable<any>>from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Set,\r\n scope: RpcSettingsScope.Application,\r\n provider: RpcSettingsProviderType.Extension,\r\n value: object\r\n }));\r\n }\r\n });\r\n }));\r\n }\r\n\r\n /**\r\n * Get extension admin settings\r\n * Extension settings objects must be an object that extends VersionedObject or implements the VersionedObjectConstructor\r\n * example: if TestObject extends VersionedObject, then getExtensionAdminSettings(TestObject) will return an\r\n * Observable<TestObject>. You should only create 1 versioned object for your extensions admin settings.\r\n */\r\n public getExtensionAdminSettings<T extends VersionedObject>(type: VersionedObjectConstructor<T>): Observable<T> {\r\n return from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Get,\r\n scope: RpcSettingsScope.Admin,\r\n provider: RpcSettingsProviderType.Extension\r\n })\r\n )\r\n .pipe(map(response => {\r\n // If the extension settings are not versioned (or not defined), then start with an empty settings.\r\n const settings = VersionedObject.ensureIsVersionedObject(response.data);\r\n return new type(settings, {\r\n save: (object) => {\r\n return <Observable<any>>from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Set,\r\n scope: RpcSettingsScope.Admin,\r\n provider: RpcSettingsProviderType.Extension,\r\n value: object\r\n }));\r\n }\r\n });\r\n }));\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/data/settings-manager.ts"],"names":[],"mappings":"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","file":"settings-manager.js","sourcesContent":["import { from, Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { JsonObject } from '../base/json';\r\nimport { PlainVersionedObject, VersionedObject, VersionedObjectConstructor, VersionedObjectHandlers } from '../base/versioned-object';\r\nimport { Rpc } from '../rpc/rpc';\r\nimport { RpcSettingsClient } from '../rpc/settings/rpc-settings-client';\r\nimport { RpcSettings, RpcSettingsOperationType, RpcSettingsProviderType, RpcSettingsScope } from '../rpc/settings/rpc-settings-model';\r\nimport { GatewayConnection } from './gateway-connection';\r\n\r\nexport const enum BannerHideType {\r\n /**\r\n * Indicates banner is not hidden (unusual)\r\n */\r\n None,\r\n /**\r\n * Indicates banner is hidden for the current session\r\n */\r\n Session,\r\n /**\r\n * Indicates banner is hidden permanently\r\n */\r\n Permanent\r\n}\r\n\r\n/**\r\n * Defines banner settings for the current user shared across the application\r\n */\r\nexport interface BannerUserSettings extends JsonObject {\r\n id: string;\r\n hideType: BannerHideType;\r\n}\r\n\r\n/**\r\n * The Versioned representation of the Shell User Settings\r\n * This object is used for settings that specific to the current user and to shell\r\n */\r\nexport class CommonUserSettings extends VersionedObject {\r\n\r\n private static propertyNames = {\r\n banners: 'banners'\r\n };\r\n\r\n /**\r\n * Getter for the latest version of the common user settings\r\n */\r\n public get latestVersion(): number {\r\n return 1;\r\n }\r\n\r\n /**\r\n * Getter for the users preference on banner settings\r\n */\r\n public get banners(): BannerUserSettings[] {\r\n return <BannerUserSettings[]>this.getProperty(CommonUserSettings.propertyNames.banners);\r\n }\r\n\r\n /**\r\n * Setter for the users preference on banner settings\r\n */\r\n public set banners(value: BannerUserSettings[]) {\r\n this.setProperty(CommonUserSettings.propertyNames.banners, value);\r\n }\r\n\r\n constructor(objectWrapper: PlainVersionedObject, handlers: VersionedObjectHandlers) {\r\n super(objectWrapper, handlers);\r\n }\r\n\r\n /**\r\n * Attempts to upgrade the current version of the object at least one version toward the latest version.\r\n * if this.currentVersion is null or undefined, then the upgrade should initialize to the latest version\r\n * this is called iteratively until the current version is equal to the latest version\r\n */\r\n protected upgrade() {\r\n // For now, we dont need to do anything but initialize to the latest version.\r\n // NOTE: When latestVersion is updated, then we need to add logic here to upgrade old user profile objects.\r\n // In this case, we ALWAYS must maintain backwards and forwards compatibility. This object is shared back and forth be\r\n if (MsftSme.isNullOrUndefined(this.currentVersion)) {\r\n this.clear();\r\n this.banners = [];\r\n this.currentVersion = this.latestVersion;\r\n return;\r\n } else if (this.currentVersion < this.latestVersion) {\r\n this.currentVersion = this.latestVersion;\r\n } else {\r\n // current version is newer than the version we know about. TODO: there may need to be handling here in the future.\r\n }\r\n }\r\n\r\n}\r\n\r\n/**\r\n * Defines the common application settings object that is shared through the whole application.\r\n */\r\nexport class CommonApplicationSettings extends VersionedObject {\r\n private static propertyNames = {\r\n // TODO: add properties when needed\r\n };\r\n\r\n /**\r\n * Getter for the latest version of the common application settings\r\n */\r\n public get latestVersion(): number {\r\n return 1;\r\n }\r\n\r\n constructor(objectWrapper: PlainVersionedObject, handlers: VersionedObjectHandlers) {\r\n super(objectWrapper, handlers);\r\n }\r\n\r\n /**\r\n * Attempts to upgrade the current version of the object at least one version toward the latest version.\r\n * if this.currentVersion is null or undefined, then the upgrade should initialize to the latest version\r\n * this is called iteratively until the current version is equal to the latest version\r\n */\r\n protected upgrade() {\r\n // For now, we dont need to do anything but initialize to the latest version.\r\n // NOTE: When latestVersion is updated, then we need to add logic here to upgrade old application settings objects.\r\n // In this case, we ALWAYS must maintain backwards and forwards compatibility. This object is shared back and forth be\r\n if (MsftSme.isNullOrUndefined(this.currentVersion)) {\r\n this.clear();\r\n this.currentVersion = this.latestVersion;\r\n return;\r\n } else if (this.currentVersion < this.latestVersion) {\r\n this.currentVersion = this.latestVersion;\r\n } else {\r\n // current version is newer than the version we know about. TODO: there may need to be handling here in the future.\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Defines the common admin settings object that is shared through the whole application.\r\n */\r\nexport class CommonAdminSettings extends VersionedObject {\r\n private static propertyNames = {\r\n connectivityLevel: 'connectivityLevel',\r\n autoGatewayUpdate: 'autoGatewayUpdate',\r\n autoExtensionsUpdate: 'autoExtensionsUpdate',\r\n scheduledUpdateTime: 'scheduledUpdateTime',\r\n updateRescheduled: 'updateRescheduled',\r\n sessionsExpirationMinutes: 'sessionsExpirationMinutes'\r\n };\r\n /**\r\n * Getter for the latest version of the common admin settings\r\n */\r\n public get latestVersion(): number {\r\n return 1;\r\n }\r\n\r\n /**\r\n * Getter for the admin's preference on the connectivity level\r\n */\r\n public get connectivityLevel(): string {\r\n return <string>this.getProperty(CommonAdminSettings.propertyNames.connectivityLevel);\r\n }\r\n\r\n /**\r\n * Setter for the admin's preference on the connectivity level\r\n */\r\n public set connectivityLevel(value: string) {\r\n this.setProperty(CommonAdminSettings.propertyNames.connectivityLevel, value);\r\n }\r\n\r\n public get autoGatewayUpdate(): boolean {\r\n return <boolean>this.getProperty(CommonAdminSettings.propertyNames.autoGatewayUpdate);\r\n }\r\n\r\n public set autoGatewayUpdate(value: boolean) {\r\n this.setProperty(CommonAdminSettings.propertyNames.autoGatewayUpdate, value);\r\n }\r\n\r\n public get autoExtensionsUpdate(): boolean {\r\n return <boolean>this.getProperty(CommonAdminSettings.propertyNames.autoExtensionsUpdate);\r\n }\r\n\r\n public set autoExtensionsUpdate(value: boolean) {\r\n this.setProperty(CommonAdminSettings.propertyNames.autoExtensionsUpdate, value);\r\n }\r\n\r\n public get scheduledUpdateTime(): string {\r\n return <string>this.getProperty(CommonAdminSettings.propertyNames.scheduledUpdateTime);\r\n }\r\n\r\n public set scheduledUpdateTime(value: string) {\r\n this.setProperty(CommonAdminSettings.propertyNames.scheduledUpdateTime, value);\r\n }\r\n\r\n public get updateRescheduled(): boolean {\r\n return <boolean>this.getProperty(CommonAdminSettings.propertyNames.updateRescheduled);\r\n }\r\n\r\n private sessionsExpirationMinutesCache: number;\r\n\r\n public get sessionsExpirationMinutes(): number {\r\n if (MsftSme.isNullOrUndefined(this.sessionsExpirationMinutesCache)) {\r\n this.sessionsExpirationMinutesCache = <number>this.getProperty(CommonAdminSettings.propertyNames.sessionsExpirationMinutes);\r\n }\r\n MsftSme.self().Init.sessionExpiration = this.sessionsExpirationMinutesCache;\r\n return this.sessionsExpirationMinutesCache;\r\n }\r\n\r\n public set sessionsExpirationMinutes(value: number) {\r\n this.setProperty(CommonAdminSettings.propertyNames.sessionsExpirationMinutes, value);\r\n this.sessionsExpirationMinutesCache = undefined;\r\n MsftSme.self().Init.sessionExpiration = undefined;\r\n }\r\n\r\n public set updateRescheduled(value: boolean) {\r\n this.setProperty(CommonAdminSettings.propertyNames.updateRescheduled, value);\r\n }\r\n\r\n constructor(objectWrapper: PlainVersionedObject, handlers: VersionedObjectHandlers, gatewayService: GatewayConnection) {\r\n super(objectWrapper, handlers, gatewayService);\r\n }\r\n /**\r\n * Attempts to upgrade the current version of the object at least one version toward the latest version.\r\n * if this.currentVersion is null or undefined, then the upgrade should initialize to the latest version\r\n * this is called iteratively until the current version is equal to the latest version\r\n */\r\n protected upgrade() {\r\n // For now, we dont need to do anything but initialize to the latest version.\r\n // NOTE: When latestVersion is updated, then we need to add logic here to upgrade old admin settings objects.\r\n // In this case, we ALWAYS must maintain backwards and forwards compatibility. This object is shared back and forth be\r\n\r\n if (MsftSme.isNullOrUndefined(this.currentVersion)) {\r\n this.clear();\r\n this.currentVersion = this.latestVersion;\r\n this.connectivityLevel = '';\r\n this.scheduledUpdateTime = null;\r\n this.updateRescheduled = false;\r\n this.autoExtensionsUpdate = true;\r\n\r\n this.autoGatewayUpdate = false;\r\n this.gatewayService.get('gateway/autoupdate').subscribe((result: any) => this.autoGatewayUpdate = result.autoUpdate);\r\n\r\n return;\r\n } else if (this.currentVersion < this.latestVersion) {\r\n this.currentVersion = this.latestVersion;\r\n } else {\r\n // current version is newer than the version we know about. TODO: there may need to be handling here in the future.\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Defines the interface for the settings manager.\r\n */\r\nexport interface SettingsQuery {\r\n getCommonUserSettings(): Observable<CommonUserSettings>;\r\n getCommonApplicationSettings(): Observable<CommonApplicationSettings>;\r\n getCommonAdminSettings(): Observable<CommonAdminSettings>;\r\n getExtensionUserSettings<T extends VersionedObject>(type: VersionedObjectConstructor<T>): Observable<T>;\r\n getExtensionApplicationSettings<T extends VersionedObject>(type: VersionedObjectConstructor<T>): Observable<T>;\r\n getExtensionAdminSettings<T extends VersionedObject>(type: VersionedObjectConstructor<T>): Observable<T>;\r\n}\r\n\r\n/**\r\n * Manager for the settings. Provides an api for managing user and application settings.\r\n */\r\nexport class SettingsManager implements SettingsQuery {\r\n\r\n /**\r\n * Initializes a new instance of the SettingsManager class.\r\n *\r\n * @param rpc the RPC class instance.\r\n */\r\n constructor(private rpc: Rpc, private gatewayService: GatewayConnection) { }\r\n\r\n /**\r\n * Get common user settings. This is currently read-only\r\n */\r\n public getCommonUserSettings(): Observable<CommonUserSettings> {\r\n return from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Get,\r\n scope: RpcSettingsScope.User,\r\n provider: RpcSettingsProviderType.Common\r\n })\r\n )\r\n .pipe(map(response => {\r\n // If the extension settings are not versioned (or not defined), then start with an empty settings.\r\n const settings = VersionedObject.ensureIsVersionedObject(response.data);\r\n return new CommonUserSettings(settings, {\r\n save: (object) => {\r\n return <Observable<any>>from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Set,\r\n scope: RpcSettingsScope.User,\r\n provider: RpcSettingsProviderType.Common,\r\n value: object\r\n }));\r\n }\r\n });\r\n }));\r\n }\r\n\r\n /**\r\n * Get common application settings. This is currently read-only\r\n */\r\n public getCommonApplicationSettings(): Observable<CommonApplicationSettings> {\r\n return from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Get,\r\n scope: RpcSettingsScope.Application,\r\n provider: RpcSettingsProviderType.Common\r\n })\r\n )\r\n .pipe(map(response => {\r\n // If the extension settings are not versioned (or not defined), then start with an empty settings.\r\n const settings = VersionedObject.ensureIsVersionedObject(response.data);\r\n return new CommonApplicationSettings(settings, {\r\n save: (object) => {\r\n return <Observable<any>>from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Set,\r\n scope: RpcSettingsScope.Application,\r\n provider: RpcSettingsProviderType.Common,\r\n value: object\r\n }));\r\n }\r\n });\r\n }));\r\n }\r\n\r\n /**\r\n * Get common admin settings. This is currently read-only\r\n */\r\n public getCommonAdminSettings(): Observable<CommonAdminSettings> {\r\n return from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Get,\r\n scope: RpcSettingsScope.Admin,\r\n provider: RpcSettingsProviderType.Common\r\n })\r\n )\r\n .pipe(map(response => {\r\n // If the extension settings are not versioned (or not defined), then start with an empty settings.\r\n const settings = VersionedObject.ensureIsVersionedObject(response.data);\r\n return new CommonAdminSettings(\r\n settings,\r\n {\r\n save: (object) => {\r\n return <Observable<any>>from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Set,\r\n scope: RpcSettingsScope.Admin,\r\n provider: RpcSettingsProviderType.Common,\r\n value: object\r\n }));\r\n }\r\n },\r\n this.gatewayService);\r\n }));\r\n }\r\n\r\n /**\r\n * Get extension user settings\r\n * Extension settings objects must be an object that extends VersionedObject or implements the VersionedObjectConstructor\r\n * example: if TestObject extends VersionedObject, then getExtensionUserSettings(TestObject) will return an Observable<TestObject>\r\n * you should only create 1 versioned object for your extensions user settings.\r\n */\r\n public getExtensionUserSettings<T extends VersionedObject>(type: VersionedObjectConstructor<T>): Observable<T> {\r\n return from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Get,\r\n scope: RpcSettingsScope.User,\r\n provider: RpcSettingsProviderType.Extension\r\n })\r\n )\r\n .pipe(map(response => {\r\n // If the extension settings are not versioned (or not defined), then start with an empty settings.\r\n const settings = VersionedObject.ensureIsVersionedObject(response.data);\r\n return new type(settings, {\r\n save: (object) => {\r\n return <Observable<any>>from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Set,\r\n scope: RpcSettingsScope.User,\r\n provider: RpcSettingsProviderType.Extension,\r\n value: object\r\n }));\r\n }\r\n });\r\n }));\r\n }\r\n\r\n /**\r\n * Get extension application settings\r\n * Extension settings objects must be an object that extends VersionedObject or implements the VersionedObjectConstructor\r\n * example: if TestObject extends VersionedObject, then getExtensionApplicationSettings(TestObject) will return an\r\n * Observable<TestObject>. You should only create 1 versioned object for your extensions application settings.\r\n */\r\n public getExtensionApplicationSettings<T extends VersionedObject>(type: VersionedObjectConstructor<T>): Observable<T> {\r\n return from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Get,\r\n scope: RpcSettingsScope.Application,\r\n provider: RpcSettingsProviderType.Extension\r\n })\r\n )\r\n .pipe(map(response => {\r\n // If the extension settings are not versioned (or not defined), then start with an empty settings.\r\n const settings = VersionedObject.ensureIsVersionedObject(response.data);\r\n return new type(settings, {\r\n save: (object) => {\r\n return <Observable<any>>from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Set,\r\n scope: RpcSettingsScope.Application,\r\n provider: RpcSettingsProviderType.Extension,\r\n value: object\r\n }));\r\n }\r\n });\r\n }));\r\n }\r\n\r\n /**\r\n * Get extension admin settings\r\n * Extension settings objects must be an object that extends VersionedObject or implements the VersionedObjectConstructor\r\n * example: if TestObject extends VersionedObject, then getExtensionAdminSettings(TestObject) will return an\r\n * Observable<TestObject>. You should only create 1 versioned object for your extensions admin settings.\r\n */\r\n public getExtensionAdminSettings<T extends VersionedObject>(type: VersionedObjectConstructor<T>): Observable<T> {\r\n return from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Get,\r\n scope: RpcSettingsScope.Admin,\r\n provider: RpcSettingsProviderType.Extension\r\n })\r\n )\r\n .pipe(map(response => {\r\n // If the extension settings are not versioned (or not defined), then start with an empty settings.\r\n const settings = VersionedObject.ensureIsVersionedObject(response.data);\r\n return new type(settings, {\r\n save: (object) => {\r\n return <Observable<any>>from(RpcSettingsClient.settings(\r\n this.rpc,\r\n <RpcSettings>{\r\n operation: RpcSettingsOperationType.Set,\r\n scope: RpcSettingsScope.Admin,\r\n provider: RpcSettingsProviderType.Extension,\r\n value: object\r\n }));\r\n }\r\n });\r\n }));\r\n }\r\n}\r\n"]}
|
package/core/dom/dom.d.ts
CHANGED
|
@@ -435,6 +435,11 @@ export declare class Dom {
|
|
|
435
435
|
* @param isActive The HTML element is active or inactive.
|
|
436
436
|
*/
|
|
437
437
|
static updateAriaSelect(currentElement: HTMLElement, isActive: boolean): void;
|
|
438
|
+
/**
|
|
439
|
+
* @param element Element whose focus origin we are trying to determine
|
|
440
|
+
* @returns The element to focus on
|
|
441
|
+
*/
|
|
442
|
+
static getFocusOrigin(element: HTMLElement): HTMLElement;
|
|
438
443
|
}
|
|
439
444
|
/**
|
|
440
445
|
* describes the position of the desired element in a list of elements
|
package/core/dom/dom.js
CHANGED
|
@@ -890,6 +890,26 @@ export class Dom {
|
|
|
890
890
|
Dom.updateAriaSelect(childElement, isActive);
|
|
891
891
|
}
|
|
892
892
|
}
|
|
893
|
+
/**
|
|
894
|
+
* @param element Element whose focus origin we are trying to determine
|
|
895
|
+
* @returns The element to focus on
|
|
896
|
+
*/
|
|
897
|
+
static getFocusOrigin(element) {
|
|
898
|
+
if (!element) {
|
|
899
|
+
return;
|
|
900
|
+
}
|
|
901
|
+
if (Dom.isFocusable(element)) {
|
|
902
|
+
return element;
|
|
903
|
+
}
|
|
904
|
+
// return previous focusable element in zone if it exist
|
|
905
|
+
return Dom.getPreviousFocusableElement(element) ||
|
|
906
|
+
// return next focusable element in zone if it exists and there is no previous element
|
|
907
|
+
Dom.getNextFocusableElement(element) ||
|
|
908
|
+
// return the first focusable element in the previous zone if it exists and there is not a next zone
|
|
909
|
+
Dom.getPreviousZoneElement(element) ||
|
|
910
|
+
// return the first focusable element in the next zone if it exists
|
|
911
|
+
Dom.getNextZoneElement(element);
|
|
912
|
+
}
|
|
893
913
|
}
|
|
894
914
|
/**
|
|
895
915
|
* describes the position of the desired element in a list of elements
|
package/core/dom/dom.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/core/dom/dom.ts"],"names":[],"mappings":"AAcA;;;GAGG;AACH,MAAM,OAAO,GAAG;IACL,MAAM,CAAC,oBAAoB,CAAC,OAAoB,EAAE,UAAiC;QAEtF,IAAI,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE;YACvC,UAAU,GAAG;gBACT,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC3B,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC3B,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC3B,UAAU,EAAE,KAAK;gBACjB,oBAAoB,EAAE,KAAK;gBAC3B,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,IAAI;aACpB,CAAC;SACL;QAED,IAAI,OAAO,KAAK,IAAI,EAAE;YAClB,OAAO,UAAU,CAAC;SACrB;QAED,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YAC/C,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC;YAC7B,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC;YACjC,IAAI,UAAU,CAAC,UAAU,EAAE;gBACvB,UAAU,CAAC,oBAAoB,GAAG,IAAI,CAAC;aAC1C;SACJ;QAED,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YAC/C,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC;YAC7B,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC;SACpC;QAED,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YACrE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC;YAC7B,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC;SACpC;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;YAC9C,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC;YAC5B,CAAC;gBACD,OAAO,CAAC,aAAa,CAAC;QAE1B,OAAO,GAAG,CAAC,oBAAoB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAC/D,CAAC;IAEM,MAAM,CAAC,gCAAgC,CAAC,UAAgC;QAC3E,OAAO,CAAC,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,oBAAoB,CAAC;IACrE,CAAC;IAEM,MAAM,CAAC,kCAAkC,CAAC,OAAoB,EAAE,UAAgC;QACnG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC;eAC9D,CAAC,CAAC,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,WAAW;QACrB,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;QAClC,OAAO,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,QAAQ,CAAC,OAAoB,EAAE,QAAgB;QACzD,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QAED,uDAAuD;QACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE;YACpC,OAAO,KAAK,CAAC;SAChB;QAED,mCAAmC;QACnC,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,UAAU,CAAC,OAAoB;QACzC,IAAI,OAAO,EAAE;YACT,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE;gBACtC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aAC7B;SACJ;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,UAAU,CAAC,OAAoB;QACzC,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,cAAc,CAAC,OAAoB;QAC7C,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,MAAM,CAAC;IACvD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,QAAQ,CAAC,OAAoB;QACvC,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjF,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACI,MAAM,CAAC,WAAW,CAAC,OAAoB,EAAE,0BAAmC,KAAK;QACpF,OAAO,GAAG,CAAC,wBAAwB,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAC1E,CAAC;IAED;;;;;;;;;;;;;OAaG;IACI,MAAM,CAAC,eAAe,CAAC,OAAoB,EAAE,0BAAmC,KAAK;QACxF,OAAO,GAAG,CAAC,wBAAwB,CAAC,OAAO,EAAE,uBAAuB,EAAE,IAAI,CAAC,CAAC;IAChF,CAAC;IAEO,MAAM,CAAC,wBAAwB,CACnC,OAAoB,EACpB,uBAAgC,EAChC,mCAA4C,KAAK;QACjD,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QAED,4FAA4F;QAC5F,IAAI,CAAC,gCAAgC,IAAI,GAAG,CAAC,uCAAuC,CAAC,OAAO,CAAC,EAAE;YAC3F,OAAO,KAAK,CAAC;SAChB;QAED,yDAAyD;QACzD,sCAAsC;QACtC,gFAAgF;QAChF,IAAI,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAClF,OAAO,OAAO,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;SAChH;QAED,0CAA0C;QAC1C,IAAI,OAAO,CAAC,OAAO,KAAK,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;YACzD,OAAO,IAAI,CAAC;SACf;QAED,gEAAgE;QAChE,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1E,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,oBAAoB,CAAC,OAAoB;QACnD,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QACD,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAChG,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,8BAA8B,CAAC,OAAoB,EAAE,SAA4C,EAC3G,QAAyB;QACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAkB,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC3E,OAAO,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,8BAA8B,CAAC,OAAoB,EAAE,SAA4C,EAC3G,QAAyB;QACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAkB,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC3E,OAAO,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,sBAAsB,CAAC,OAAoB,EAAE,SAA4C,EACnG,QAAyB;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;QAClC,MAAM,WAAW,GAAkB,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACvE,OAAO,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,mBAAmB,CAAC,OAAoB,EAAE,SAA4C,EAChG,QAAyB;QACzB,MAAM,WAAW,GAAkB,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC1E,OAAO,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,UAAU,CAAC,QAAuB,EAAE,cAA2B,EAAE,QAAyB;QACpG,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,QAAQ,QAAQ,EAAE;gBACd,KAAK,eAAe,CAAC,IAAI;oBACrB,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;oBACrE,OAAO,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;gBAC5F,KAAK,eAAe,CAAC,QAAQ;oBACzB,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;oBACrE,OAAO,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;gBAC/E,KAAK,eAAe,CAAC,KAAK;oBACtB,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC5B,KAAK,eAAe,CAAC,IAAI;oBACrB,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC3B;oBACI,OAAO,cAAc,CAAC;aAC7B;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,cAAc,CAAC,OAAoB,EAAE,SAA4C;QAC3F,OAAO,GAAG,CAAC,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,eAAe,CAAC,WAAwB,EAClD,SAA4C,EAC5C,oBAAwD,EACxD,kBAAkB,GAAG,IAAI;QACzB,MAAM,aAAa,GAAG,GAAG,CAAC,iBAAiB,CAAC,WAAW,EAAE,SAAS,EAAE,oBAAoB,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;QACpH,uBAAuB;QACvB,OAAO,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;OAMG;IACK,MAAM,CAAC,iBAAiB,CAC5B,WAAwB,EACxB,SAA4C,EAC5C,oBAAwD,EACxD,iBAAiB,GAAG,KAAK,EACzB,kBAAkB,GAAG,IAAI;QACzB,IAAI,CAAC,WAAW,EAAE;YACd,OAAO,IAAI,CAAC;SACf;QAED,kDAAkD;QAClD,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,MAAM,mBAAmB,GAAG,EAAE,CAAC;QAC/B,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9B,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YACzC,IAAI,cAAc,CAAC,OAAO,KAAK,KAAK,IAAI,cAAc,CAAC,OAAO,KAAK,KAAK,EAAE;gBACtE,IAAI,SAAS,CAAC,cAAc,CAAC,EAAE;oBAE3B,kEAAkE;oBAClE,IAAI,CAAC,cAAc,KAAK,WAAW,IAAI,kBAAkB,CAAC,IAAI,cAAc,KAAK,WAAW,EAAE;wBAC1F,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;wBAEzC,IAAI,iBAAiB,EAAE;4BACnB,OAAO,mBAAmB,CAAC;yBAC9B;qBACJ;iBACJ;gBAED,IAAI,cAAc,KAAK,WAAW,IAAI,CAAC,oBAAoB,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,EAAE;oBAClG,KAAK,IAAI,CAAC,GAAG,cAAc,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;wBAC5D,MAAM,KAAK,GAAgB,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAC3D,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;qBAC3B;iBACJ;gBACD,0EAA0E;gBAC1E,IAAI;oBACA,IAAI,cAAc,CAAC,eAAe,IAAI,cAAc,CAAC,eAAe,CAAC,IAAI,EAAE;wBACvE,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;qBACzD;iBACJ;gBAAC,OAAO,KAAK,EAAE;oBACZ,8FAA8F;oBAC9F,mFAAmF;oBACnF,kGAAkG;oBAElG,2DAA2D;iBAC9D;aACJ;SACJ;QAED,qEAAqE;QACrE,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,cAAc;QACxB,8HAA8H;QAC9H,IAAI;YACA,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;gBACxE,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;aACtC;SACJ;QAAC,OAAO,KAAK,EAAE;YACZ,sGAAsG;YACtG,mFAAmF;YACnF,kGAAkG;YAElG,2DAA2D;SAC9D;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC;IACzB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,WAAW,CAAC,OAAoB;QAC1C,OAAO,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IACjH,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,kBAAkB,CAAC,OAAoB;QACjD,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QAED,gCAAgC;QAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;YAC9B,OAAO,IAAI,CAAC;SACf;QAED,MAAM,qBAAqB,GAAG,GAAG,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QACxE,OAAO,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC5F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,OAAoB;QAC9C,OAAO,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1G,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,sBAAsB,CAAC,OAAoB,EAAE,eAA6B;QACpF,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QAED,oEAAoE;QACpE,IAAI,CAAC,eAAe,EAAE;YAClB,OAAO,GAAG,CAAC,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;SACvD;QAED,sCAAsC;QACtC,MAAM,YAAY,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;YAClC,OAAO,IAAI,CAAC;SACf;QAED,MAAM,qBAAqB,GAAG,GAAG,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC;QAC5E,OAAO,qBAAqB,IAAI,qBAAqB,KAAK,eAAe,CAAC,CAAC;YACvE,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAC1F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,WAAW,CAAC,OAAoB,EAAE,SAA8C;QAC1F,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QAED,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE;YACpB,OAAO,OAAO,CAAC;SAClB;QAED,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,EAAE;YAC5B,MAAM,aAAa,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;SAC3E;QAED,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IAEO,MAAM,CAAC,eAAe,CAAC,OAAoB;QAC/C,MAAM,gBAAgB,GAAG,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAC3E,IAAI,CAAC,gBAAgB,EAAE;YACnB,OAAO,IAAI,CAAC;SACf;QACD,8HAA8H;QAC9H,IAAI;YACA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;gBACnD,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEtE,IAAI,aAAa,CAAC;YAClB,IAAI,OAAO,IAAI,gBAAgB,EAAE;gBAC7B,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,gBAAgB,CAAC,CAAC;aACzE;YACD,OAAO,aAAa,IAAI,IAAI,CAAC;SAChC;QAAC,OAAO,KAAK,EAAE;YACZ,wHAAwH;YACxH,mFAAmF;YACnF,kGAAkG;YAClG,OAAO,IAAI,CAAC;SACf;IACL,CAAC;IAGD;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,OAAoB,EAAE,SAA8C;QAC9F,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO,EAAE,CAAC;SAAE;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,QAAQ,EAAE;YAAE,OAAO,EAAE,CAAC;SAAE;QAC7B,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;IACrF,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,OAAoB;QAC9C,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,OAAoB;QAC9C,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,OAAoB;QAC9C,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,uCAAuC,CAAC,OAAoB;QACtE,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACxG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,mBAAmB,CAAC,OAAoB;QAClD,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,gBAAgB,CAAC,OAAoB;QAC/C,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IAChE,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,iBAAiB,CAAC,OAAoB;QAChD,yEAAyE;QACzE,OAAO,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/G,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,2BAA2B,CAAC,OAAoB;QAC1D,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QACD,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7B,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,2BAA2B,CAAC,GAAG,CAAC,mBAAmB,CAC7D,OAAO,EACP,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,MAAM,EAC7B,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,oBAAoB,CAAC,OAAoB;QACnD,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,qBAAqB,CAAC,OAAoB;QACpD,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,uBAAuB,CAAC,OAAoB;QACtD,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,2BAA2B,CAAC,OAAoB;QAC1D,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,mBAAmB,CAAC,OAAoB;QAClD,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QAED,OAAO,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;YAC7F,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAc,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7E,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,mBAAmB,CAAC,OAAoB,EAAE,SAA4C;QAChG,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QAED,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACpG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,6BAA6B,CAAC,OAAoB;QAC5D,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,iCAAiC,CAAC,OAAoB;QAChE,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,MAAM,CAAC,OAAoB;QACrC,OAAO,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC;IACtC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,MAAM,CAAC,OAAoB;QACrC,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QAED,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC;eACxB,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC;eAC3B,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;eACvB,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC;eAC7B,CAAC,GAAG,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IACrF,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,kBAAkB,CAAC,OAAoB;QACjD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,kBAAkB,CAAC,OAAoB;QACjD,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAClD,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACnG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,WAAW,CAAC,OAAoB;QAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;QAClF,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;IACzD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,cAAc,CAAC,OAAoB;QAC7C,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,UAAU,CAAC,OAAoB;QACzC,2DAA2D;QAC3D,uFAAuF;QACvF,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;QAC5B,MAAM,QAAQ,GAAG,CAAC,uBAAuB,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;QACjF,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,SAAS,CAAC,OAAoB;QACxC,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,IAAI,KAAK,SAAS,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,kBAAkB,CAAC,OAAwB;QACrD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM,CAAC;QACtE,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC/C,OAAO,YAAY,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAClG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,kCAAkC,CAAC,OAAoB;QACjE,OAAO,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,kBAAkB,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAC3F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,gBAAgB,CAAC,OAAoB;QAC/C,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,oCAAoC,CAAC,IAAI,OAAO,CAAC,iBAAiB,GAAG,CAAC,CAAC;IAC7G,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,sBAAsB,CAAC,OAAoB;QACrD,OAAO,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,kBAAkB,CAAC,OAAoB;QACjD,OAAO,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,KAAK,IAAI,CAAC;IACpF,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,kBAAkB,CAAC,OAAoB;QACjD,OAAO,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,KAAK,IAAI,CAAC;IACpF,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,MAAM,CAAC,OAAoB;QACrC,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC5C,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACzG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,MAAM,CAAC,OAAoB;QACrC,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QAED,OAAO,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,2BAA2B,CAAC,OAAoB,EAAE,YAAqB;QACjF,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE;YAC1B,MAAM,YAAY,GAAG,OAAc,CAAC;YACpC,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,CAAC,YAAY,IAAI,YAAY,CAAC,cAAc,KAAK,IAAI,IAAI,YAAY,CAAC,cAAc,GAAG,CAAC,CAAC;mBAC1F,CAAC,YAAY,IAAI,YAAY,CAAC,YAAY,KAAK,IAAI,IAAI,YAAY,CAAC,YAAY,GAAG,eAAe,CAAC,CAAC;SAC9G;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,WAAW,CAAC,OAAoB;QAC1C,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,MAAM,YAAY,GAAG,OAA2B,CAAC;QACjD,OAAO,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,YAAY,IAAI,YAAY,CAAC,IAAI,KAAK,QAAQ,CAAC;IACzF,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,mBAAmB,CAAC,OAAoB;QAClD,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE;YAC7C,OAAO,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC,CAAC;IACR,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,iBAAiB,CAAC,OAAoB;QAChD,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC7F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,qBAAqB,CAAC,OAAoB;QACpD,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IACjG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,UAAU,CAAC,OAAoB;QACzC,OAAO,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;IACpC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,WAAW,CAAC,OAAoB;QAC1C,OAAO,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;IACpC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,aAAa,CAAC,OAAoB;QAC5C,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QAED,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACtF,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,iBAAiB,CAAC,OAAoB;QAChD,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,gBAAgB,CAAC,OAAoB;QAC/C,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,YAAY,CAAC,OAAoB,EAAE,QAAyB;QACtE,MAAM,SAAS,GAAG,GAAG,CAAC,sBAAsB,CACxC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,EAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,EAC3F,QAAQ,CACX,CAAC;QAEF,OAAO,GAAG,CAAC,2BAA2B,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,aAAa,CAAC,OAAoB;QAC5C,OAAO,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACjH,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,WAAW,CAAC,OAAoB;QAC1C,OAAO,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,SAAS;eACvF,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,OAAO,KAAK,gBAAgB,CAAC;IACnH,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,uBAAuB,CAAC,OAAoB;QACtD,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,MAAM,YAAY,GAAG,OAA2B,CAAC;QACjD,iDAAiD;QACjD,MAAM,mBAAmB,GAAG,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,YAAY,IAAI,YAAY,CAAC,IAAI,KAAK,MAAM,CAAC;QACxG,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,gBAAgB,CAAC,CAAC;QAEtF,OAAO,mBAAmB,IAAI,aAAa,CAAC;IAChD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,cAAc;QACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;QACjE,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACxC,4EAA4E;YAC5E,IAAI,OAAO,CAAC,aAAa,CAAC,OAAO,KAAK,WAAW,EAAE;gBAC/C,GAAG,CAAC,gBAAgB,CAAC,OAAsB,EAAE,KAAK,CAAC,CAAC;aACvD;SACJ;IACL,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,gBAAgB,CAAC,cAA2B,EAAE,QAAiB;QACzE,IAAI,CAAC,cAAc,EAAE;YACjB,OAAO;SACV;QACD,IAAI,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;YAChG,QAAQ,GAAG,IAAI,CAAC;SACnB;QACD,IAAI,cAAc,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC3D,cAAc,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;SACzD;QACD,IAAI,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,QAAQ,EAAE;YAC3D,cAAc,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;SACxD;QACD,KAAK,MAAM,YAAY,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE;YAC5D,GAAG,CAAC,gBAAgB,CAAC,YAA2B,EAAE,QAAQ,CAAC,CAAC;SAC/D;IACL,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,eAKX;AALD,WAAY,eAAe;IACvB,uDAAS,CAAA;IACT,6DAAY,CAAA;IACZ,qDAAQ,CAAA;IACR,qDAAQ,CAAA;AACZ,CAAC,EALW,eAAe,KAAf,eAAe,QAK1B","file":"dom.js","sourcesContent":["\r\nexport interface DomElementProperties {\r\n isForm: boolean;\r\n withinForm: boolean;\r\n isTrap: boolean;\r\n withinTrap: boolean;\r\n isZone: boolean;\r\n withinZone: boolean;\r\n withinZoneWithinForm: boolean;\r\n currentZone: HTMLElement;\r\n currentTrap: HTMLElement;\r\n currentForm: HTMLElement;\r\n}\r\n\r\n/**\r\n * DOM class\r\n * @dynamic\r\n */\r\nexport class Dom {\r\n public static getElementProperties(element: HTMLElement, properties?: DomElementProperties): DomElementProperties {\r\n\r\n if (MsftSme.isNullOrUndefined(properties)) {\r\n properties = {\r\n isForm: Dom.isForm(element),\r\n withinForm: false,\r\n isTrap: Dom.isTrap(element),\r\n withinTrap: false,\r\n isZone: Dom.isZone(element),\r\n withinZone: false,\r\n withinZoneWithinForm: false,\r\n currentZone: null,\r\n currentTrap: null,\r\n currentForm: null\r\n };\r\n }\r\n\r\n if (element === null) {\r\n return properties;\r\n }\r\n\r\n if (!properties.withinForm && Dom.isForm(element)) {\r\n properties.withinForm = true;\r\n properties.currentForm = element;\r\n if (properties.withinZone) {\r\n properties.withinZoneWithinForm = true;\r\n }\r\n }\r\n\r\n if (!properties.withinTrap && Dom.isTrap(element)) {\r\n properties.withinTrap = true;\r\n properties.currentTrap = element;\r\n }\r\n\r\n if (!properties.withinZone && !properties.isZone && Dom.isZone(element)) {\r\n properties.withinZone = true;\r\n properties.currentZone = element;\r\n }\r\n\r\n const parentElement = element.tagName === 'HTML' ?\r\n Dom.getParentIframe(element)\r\n :\r\n element.parentElement;\r\n\r\n return Dom.getElementProperties(parentElement, properties);\r\n }\r\n\r\n public static allowCustomArrowKeyFunctionality(properties: DomElementProperties) {\r\n return !properties.withinForm || properties.withinZoneWithinForm;\r\n }\r\n\r\n public static allowCustomHomeEndKeyFunctionality(element: HTMLElement, properties: DomElementProperties) {\r\n return !Dom.isSearchBox(element) && !Dom.isTextBoxInComboBox(element)\r\n && (!properties.withinForm || properties.withinZoneWithinForm);\r\n }\r\n\r\n /**\r\n * gets all body elements on the page\r\n */\r\n public static getAllBodys(): HTMLElement[] {\r\n const root = Dom.getRootElement();\r\n return Dom.getAllElements(root, Dom.isBody);\r\n }\r\n\r\n /**\r\n * Gets a CSS property value\r\n * @param element The Element\r\n * @param property - The CSS property name\r\n * @returns The value of the CSS property (type depends on property retrieved)\r\n */\r\n public static getStyle(element: HTMLElement, property: string): any {\r\n if (!element) {\r\n return null;\r\n }\r\n\r\n // first try to get the value directly from the element\r\n const value = element.style[property];\r\n if (!MsftSme.isNullOrWhiteSpace(value)) {\r\n return value;\r\n }\r\n\r\n // otherwise get the computed style\r\n return getComputedStyle(element)[property];\r\n }\r\n\r\n /**\r\n * Gets the classes applied to an element\r\n * @param element The Element\r\n * @returns The classes currently applied to the element\r\n */\r\n public static getClasses(element: HTMLElement): any {\r\n if (element) {\r\n const classes = element.className.trim();\r\n if (!MsftSme.isNullOrWhiteSpace(classes)) {\r\n return classes.split(' ');\r\n }\r\n }\r\n return [];\r\n }\r\n\r\n /**\r\n * Determines is an element is disabled via the 'disabled' attribute\r\n * @param element The element to start from.\r\n */\r\n public static isDisabled(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n return !!element['disabled'];\r\n }\r\n\r\n /**\r\n * Determines is an element is hidden via css with \"display: none\"\r\n * @param element The element to start from.\r\n */\r\n public static isNotDisplayed(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n return Dom.getStyle(element, 'display') === 'none';\r\n }\r\n\r\n /**\r\n * Determines is an element is hidden via css with \"visibility: hidden\"\r\n * @param element The element to start from.\r\n */\r\n public static isHidden(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n return Dom.getStyle(element, 'visibility') === 'hidden' || element['hidden'];\r\n }\r\n\r\n /**\r\n * Returns the first element in the current elements ancestory that is focusable.\r\n *\r\n * 'Focusable' is defined as the following:\r\n * - input, select, textarea, button, object\r\n * - anchor with href\r\n * - have a non-negative tab index\r\n *\r\n * An element is not focusable if any of the following is true (even if it meets a condition above)\r\n * - negative tab index\r\n * - disabled\r\n * - display: none\r\n * - visibility: hidden\r\n *\r\n * @param element The element to start from.\r\n * @return true if focus possible\r\n */\r\n public static isFocusable(element: HTMLElement, includeNegativeTabIndex: boolean = false): boolean {\r\n return Dom.checkFocusableConditions(element, includeNegativeTabIndex);\r\n }\r\n\r\n /**\r\n * Returns true if the element could be focusable.\r\n *\r\n * An element that can be focused is the following:\r\n * - input, select, textarea, button, object\r\n * - anchor with href\r\n * - have a non-negative tab index\r\n *\r\n * This method will determine if the element has one of these conditions even if the the element\r\n * is not displayed, visible, enabled, or having a positive z-index.\r\n *\r\n * @param element The element to start from.\r\n * @return true if focus possible.\r\n */\r\n public static isFocusPossible(element: HTMLElement, includeNegativeTabIndex: boolean = false): boolean {\r\n return Dom.checkFocusableConditions(element, includeNegativeTabIndex, true);\r\n }\r\n\r\n private static checkFocusableConditions(\r\n element: HTMLElement,\r\n includeNegativeTabIndex: boolean,\r\n skipDisabledHiddenOrNotDisplayed: boolean = false): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n // if the element or its ancestor is disabled or 'not displayed'/hidden, it is not focusable\r\n if (!skipDisabledHiddenOrNotDisplayed && Dom.getDisabledHiddenOrNotDisplayedAncestor(element)) {\r\n return false;\r\n }\r\n\r\n // if the tab index is set, let it determine focusability\r\n // have to check has attribute because\r\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/4365703/\r\n if (element.hasAttribute('tabindex') && !MsftSme.isNullOrUndefined(element.tabIndex)) {\r\n return element.tabIndex >= 0 || (includeNegativeTabIndex && !element.classList.contains('sme-hidden-focus'));\r\n }\r\n\r\n // anchors with an href are also focusable\r\n if (element.tagName === 'A' && element.hasAttribute('href')) {\r\n return true;\r\n }\r\n\r\n // Otherwise only naturally focusable elements can receive focus\r\n const focusableTags = ['INPUT', 'SELECT', 'TEXTAREA', 'BUTTON', 'OBJECT'];\r\n return focusableTags.some(tag => tag === element.tagName);\r\n }\r\n\r\n /**\r\n * Returns the first element in the current elements ancestry that is focusable.\r\n * Will return the element itself if it is focusable\r\n * @param element The element to start from.\r\n * @return the first focusable ancestor of the element\r\n */\r\n public static getFocusableAncestor(element: HTMLElement): HTMLElement {\r\n if (!element) {\r\n return null;\r\n }\r\n return Dom.isFocusable(element) ? element : Dom.getFocusableAncestor(element.parentElement);\r\n }\r\n\r\n /**\r\n * find an element in a particular position with a specific condition relative to input element\r\n * Does a DFS for this element relative the ancestor zone of input element\r\n * @param element The current element\r\n * @param condition The function to check the kind of element we are looking for\r\n * @param position The ElementPosition of the desired element relative to input element\r\n */\r\n public static findElementFromAncestorZoneDFS(element: HTMLElement, condition: (element: HTMLElement) => boolean,\r\n position: ElementPosition): HTMLElement {\r\n const ancestor = Dom.getAncestorZone(element);\r\n const allElements: HTMLElement[] = Dom.getAllElements(ancestor, condition);\r\n return Dom.getElement(allElements, element, position);\r\n }\r\n\r\n /**\r\n * find an element in a particular position with a specific condition relative to input element\r\n * Does a DFS for this element relative the ancestor trap of input element\r\n * @param element The current element\r\n * @param condition The function to check the kind of element we are looking for\r\n * @param position The ElementPosition of the desired element relative to input element\r\n */\r\n public static findElementFromAncestorTrapDFS(element: HTMLElement, condition: (element: HTMLElement) => boolean,\r\n position: ElementPosition): HTMLElement {\r\n const ancestor = Dom.getAncestorTrap(element);\r\n const allElements: HTMLElement[] = Dom.getAllElements(ancestor, condition);\r\n return Dom.getElement(allElements, element, position);\r\n }\r\n\r\n /**\r\n * find an element in a particular position with a specific condition relative to input element\r\n * Does a DFS for this element relative the root of the graph\r\n * @param element The current element\r\n * @param condition The function to check the kind of element we are looking for\r\n * @param position The ElementPosition of the desired element relative to input element\r\n */\r\n public static findElementFromRootDFS(element: HTMLElement, condition: (element: HTMLElement) => boolean,\r\n position: ElementPosition): HTMLElement {\r\n const root = Dom.getRootElement();\r\n const allElements: HTMLElement[] = Dom.getAllElements(root, condition);\r\n return Dom.getElement(allElements, element, position);\r\n }\r\n\r\n /**\r\n * find an element in a particular position with a specific condition relative to input element\r\n * Does a DFS for this element relative the input element\r\n * @param element The current element\r\n * @param condition The function to check the kind of element we are looking for\r\n * @param position The ElementPosition of the desired element relative to input element\r\n */\r\n public static findChildElementDFS(element: HTMLElement, condition: (element: HTMLElement) => boolean,\r\n position: ElementPosition): HTMLElement {\r\n const allElements: HTMLElement[] = Dom.getAllElements(element, condition);\r\n return Dom.getElement(allElements, element, position);\r\n }\r\n\r\n /**\r\n * gets a element from a list of elements in the position relative to the current element\r\n * @param elements the list of elements\r\n * @param currentElement the current element\r\n * @param position the ElementPosition we want relative to the current element\r\n */\r\n public static getElement(elements: HTMLElement[], currentElement: HTMLElement, position: ElementPosition): HTMLElement {\r\n if (elements && elements.length > 0) {\r\n let currentIndex = 0;\r\n switch (position) {\r\n case ElementPosition.Next:\r\n currentIndex = elements.findIndex(x => x.isSameNode(currentElement));\r\n return currentIndex + 1 < elements.length ? elements[currentIndex + 1] : currentElement;\r\n case ElementPosition.Previous:\r\n currentIndex = elements.findIndex(x => x.isSameNode(currentElement));\r\n return currentIndex - 1 >= 0 ? elements[currentIndex - 1] : currentElement;\r\n case ElementPosition.First:\r\n return elements.first();\r\n case ElementPosition.Last:\r\n return elements.last();\r\n default:\r\n return currentElement;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public static getAllElements(element: HTMLElement, condition: (element: HTMLElement) => boolean) {\r\n return Dom.searchAllElements(element, condition);\r\n }\r\n\r\n /**\r\n * gets the first element that meets a condition\r\n * @param rootElement the element we start with\r\n * @param condition the condition we want to find an element meeting\r\n * @param stopLookingCondition a condition used to stop looking down a certain path\r\n * (ie stop looking down a particular path once we hit a zone)\r\n * @param includeRootElement a condition to include the root element in the search\r\n */\r\n public static getFirstElement(rootElement: HTMLElement,\r\n condition: (element: HTMLElement) => boolean,\r\n stopLookingCondition?: (element: HTMLElement) => boolean,\r\n includeRootElement = true): HTMLElement {\r\n const firstElements = Dom.searchAllElements(rootElement, condition, stopLookingCondition, true, includeRootElement);\r\n // return first element\r\n return MsftSme.first(firstElements);\r\n }\r\n\r\n /**\r\n * finds all elements starting at the input element that meet the given condition\r\n * @param rootElement the element from which to start the depth first search\r\n * @param condition the function that determines whether the desired condition has been met\r\n * @param stopLookingCondition a condition used to stop looking down a certain path\r\n * @param includeRootElement a condition to include the root element in the search\r\n */\r\n private static searchAllElements(\r\n rootElement: HTMLElement,\r\n condition: (element: HTMLElement) => boolean,\r\n stopLookingCondition?: (element: HTMLElement) => boolean,\r\n stopAtFirstResult = false,\r\n includeRootElement = true): HTMLElement[] {\r\n if (!rootElement) {\r\n return null;\r\n }\r\n\r\n // depth first search starting at the root element\r\n const allElements = [];\r\n const conditionalElements = [];\r\n allElements.push(rootElement);\r\n while (allElements.length > 0) {\r\n const currentElement = allElements.pop();\r\n if (currentElement.tagName !== 'SVG' && currentElement.tagName !== 'svg') {\r\n if (condition(currentElement)) {\r\n\r\n // If root element meets the condition, add to conditionalElements\r\n if ((currentElement === rootElement && includeRootElement) || currentElement !== rootElement) {\r\n conditionalElements.push(currentElement);\r\n\r\n if (stopAtFirstResult) {\r\n return conditionalElements;\r\n }\r\n }\r\n }\r\n\r\n if (currentElement === rootElement || !stopLookingCondition || !stopLookingCondition(currentElement)) {\r\n for (let i = currentElement.childElementCount - 1; i >= 0; i--) {\r\n const child = <HTMLElement>currentElement.children.item(i);\r\n allElements.push(child);\r\n }\r\n }\r\n // if the current element is an iframe, start traversing the iframe's body\r\n try {\r\n if (currentElement.contentDocument && currentElement.contentDocument.body) {\r\n allElements.push(currentElement.contentDocument.body);\r\n }\r\n } catch (error) {\r\n // if we can't grab the content document, then we are very likely sideloading a tool in chrome\r\n // you can disable same origin security policy to test accessibility or try in edge\r\n // if this happens, we want to just get as much information as we can about the available elements\r\n\r\n // TODO: log this when this code is moved to different file\r\n }\r\n }\r\n }\r\n\r\n // we need to reverse to get the actual order of elements on the page\r\n return conditionalElements;\r\n }\r\n\r\n /**\r\n * returns the root of the DOM graph\r\n */\r\n public static getRootElement(): HTMLElement {\r\n // we want to try to grab the document body from the window because document.body gives us the body of the current iframe only\r\n try {\r\n if (window.parent && window.parent.document && window.parent.document.body) {\r\n return window.parent.document.body;\r\n }\r\n } catch (error) {\r\n // if we can't grab the document from the window, then we are very likely sideloading a tool in chrome\r\n // you can disable same origin security policy to test accessibility or try in edge\r\n // if this happens, we want to just get as much information as we can about the available elements\r\n\r\n // TODO: log this when this code is moved to different file\r\n }\r\n\r\n return document.body;\r\n }\r\n\r\n /**\r\n * Finds the next zone\r\n * @param element the current zone or an element in the current zone\r\n */\r\n public static getNextZone(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromRootDFS(Dom.getAncestorZone(element) || element, Dom.isZone, ElementPosition.Next);\r\n }\r\n\r\n /**\r\n * gets the first focusable element in the next zone\r\n * if a zone has no focusable elements, it is skipped\r\n * @param element the current element\r\n */\r\n public static getNextZoneElement(element: HTMLElement): HTMLElement {\r\n if (!element) {\r\n return null;\r\n }\r\n\r\n // we are at the end of the page\r\n const nextZone = Dom.getNextZone(element);\r\n if (element.isSameNode(nextZone)) {\r\n return null;\r\n }\r\n\r\n const firstFocusableElement = Dom.getFirstFocusableDescendent(nextZone);\r\n return firstFocusableElement ? firstFocusableElement : Dom.getNextZoneElement(nextZone);\r\n }\r\n\r\n /**\r\n * Finds the previous zone\r\n * @param element the current zone or an element in the current zone\r\n */\r\n public static getPreviousZone(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromRootDFS(Dom.getAncestorZone(element), Dom.isZone, ElementPosition.Previous);\r\n }\r\n\r\n /**\r\n * gets the first focusable element in the previous zone\r\n * if a zone has no focusable elements, it is skipped\r\n * @param element the current element\r\n * @param originalElement the element from which we begin the search. Set automatically if unset by user\r\n */\r\n public static getPreviousZoneElement(element: HTMLElement, originalElement?: HTMLElement): HTMLElement {\r\n if (!element) {\r\n return null;\r\n }\r\n\r\n // save the first element we see so we can skip empty zones later on\r\n if (!originalElement) {\r\n return Dom.getPreviousZoneElement(element, element);\r\n }\r\n\r\n // we are at the beginning of the page\r\n const previousZone = Dom.getPreviousZone(element);\r\n if (element.isSameNode(previousZone)) {\r\n return null;\r\n }\r\n\r\n const firstFocusableElement = Dom.getFirstFocusableDescendent(previousZone);\r\n return firstFocusableElement && firstFocusableElement !== originalElement ?\r\n firstFocusableElement : Dom.getPreviousZoneElement(previousZone, originalElement);\r\n }\r\n\r\n /**\r\n * gets the first ancestor that is disabled\r\n * @param element the element\r\n */\r\n public static getAncestor(element: HTMLElement, condition: MsftSme.Func1<HTMLElement, boolean>): HTMLElement {\r\n if (!element) {\r\n return null;\r\n }\r\n\r\n if (condition(element)) {\r\n return element;\r\n }\r\n\r\n if (element.tagName === 'HTML') {\r\n const iFrameElement = Dom.getParentIframe(element);\r\n return iFrameElement ? Dom.getAncestor(iFrameElement, condition) : null;\r\n }\r\n\r\n return Dom.getAncestor(element.parentElement, condition);\r\n }\r\n\r\n private static getParentIframe(element: HTMLElement): HTMLHtmlElement | null {\r\n const elementFrameName = element && element.getAttribute('sme-frame-name');\r\n if (!elementFrameName) {\r\n return null;\r\n }\r\n // we want to try to grab the document body from the window because document.body gives us the body of the current iframe only\r\n try {\r\n const iFrames = MsftSme.isShell() ?\r\n Array.from(document.getElementsByTagName('iframe'))\r\n :\r\n Array.from(window.parent.document.getElementsByTagName('iframe'));\r\n\r\n let iFrameElement;\r\n if (iFrames && elementFrameName) {\r\n iFrameElement = iFrames.first(frame => frame.id === elementFrameName);\r\n }\r\n return iFrameElement || null;\r\n } catch (error) {\r\n // if we can't grab the document from the window, then we are very likely side-loading a tool in chrome or chromium edge\r\n // you can disable same origin security policy to test accessibility or try in edge\r\n // if this happens, we want to just get as much information as we can about the available elements\r\n return null;\r\n }\r\n }\r\n\r\n\r\n /**\r\n * gets all ancestors that match a given condition\r\n * @param element the element\r\n */\r\n public static getAllAncestors(element: HTMLElement, condition: MsftSme.Func1<HTMLElement, boolean>): HTMLElement[] {\r\n if (!element) { return []; }\r\n const ancestor = Dom.getAncestor(element, condition);\r\n if (!ancestor) { return []; }\r\n return [ancestor].concat(Dom.getAllAncestors(ancestor.parentElement, condition));\r\n }\r\n\r\n /**\r\n * gets the zone that the current element is in\r\n * @param element the element\r\n */\r\n public static getAncestorZone(element: HTMLElement): HTMLElement {\r\n return Dom.getAncestor(element, e => Dom.isZone(e));\r\n }\r\n\r\n /**\r\n * determine if an element is in a trap, if so return the trap element\r\n * @param element HTML element to check\r\n */\r\n public static getAncestorTrap(element: HTMLElement): HTMLElement {\r\n return Dom.getAncestor(element, e => Dom.isTrap(e));\r\n }\r\n\r\n /**\r\n * gets the ancestor form of an element\r\n * @param element the element\r\n */\r\n public static getAncestorForm(element: HTMLElement): HTMLElement {\r\n return Dom.getAncestor(element, e => Dom.isForm(e));\r\n }\r\n\r\n /**\r\n * Find ancestors that are disabled, hidden, or not displayed\r\n * @param element the element\r\n */\r\n public static getDisabledHiddenOrNotDisplayedAncestor(element: HTMLElement): HTMLElement {\r\n return Dom.getAncestor(element, x => Dom.isDisabled(x) || Dom.isNotDisplayed(x) || Dom.isHidden(x));\r\n }\r\n\r\n /**\r\n * gets the first ancestor that is disabled\r\n * @param element the element\r\n */\r\n public static getDisabledAncestor(element: HTMLElement): HTMLElement {\r\n return Dom.getAncestor(element, e => Dom.isDisabled(e));\r\n }\r\n\r\n /**\r\n * returns ancestor table of current element\r\n * @param element the current element\r\n */\r\n public static getAncestorTable(element: HTMLElement): HTMLElement {\r\n return Dom.getAncestor(element, e => e.tagName === 'TABLE');\r\n }\r\n\r\n /**\r\n * gets the next child zone of the current zone\r\n * @param element the current zone or an element in the current zone\r\n */\r\n public static getDescendentZone(element: HTMLElement): HTMLElement {\r\n // if there is no parent zone, just look from the current element forward\r\n return Dom.findChildElementDFS(Dom.getAncestorZone(element) || element, Dom.isZone, ElementPosition.First);\r\n }\r\n\r\n /**\r\n * gets the first focusable descendent of the current element\r\n * @param element the current element\r\n */\r\n public static getFirstFocusableDescendent(element: HTMLElement): HTMLElement {\r\n if (!element) {\r\n return null;\r\n }\r\n return Dom.isFocusable(element) ?\r\n element : Dom.getFirstFocusableDescendent(Dom.findChildElementDFS(\r\n element,\r\n Dom.isFocusable || Dom.isZone,\r\n ElementPosition.First));\r\n }\r\n\r\n /**\r\n * gets the last element in a zone\r\n * @param element the element\r\n */\r\n public static getLastElementInZone(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorZoneDFS(element, Dom.isFocusable, ElementPosition.Last);\r\n }\r\n\r\n /**\r\n * gets the first element in a zone\r\n * @param element the element\r\n */\r\n public static getFirstElementInZone(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorZoneDFS(element, Dom.isFocusable, ElementPosition.First);\r\n }\r\n\r\n /**\r\n * gets the next focusable element in the current zone\r\n * @param element the current element\r\n */\r\n public static getNextFocusableElement(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorZoneDFS(element, Dom.isFocusable, ElementPosition.Next);\r\n }\r\n\r\n /**\r\n * gets the previous focusable element in the current zone\r\n * @param element the current element\r\n */\r\n public static getPreviousFocusableElement(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorZoneDFS(element, Dom.isFocusable, ElementPosition.Previous);\r\n }\r\n\r\n /**\r\n * gets the ancestor of an element that has overflow\r\n * @param element the current element\r\n */\r\n public static getOverflowAncestor(element: HTMLElement): HTMLElement {\r\n if (!element) {\r\n return null;\r\n }\r\n\r\n return element.clientHeight < element.scrollHeight || element.clientWidth < element.scrollWidth ?\r\n element : Dom.getOverflowAncestor(<HTMLElement>element.offsetParent);\r\n }\r\n\r\n /**\r\n * gets the ancestor of an element that meets the specified condition\r\n * @param element the current element\r\n * @param condition the function that will check if element meets the desired condition\r\n */\r\n public static getSpecificAncestor(element: HTMLElement, condition: (element: HTMLElement) => boolean): HTMLElement {\r\n if (!element) {\r\n return null;\r\n }\r\n\r\n return condition(element) ? element : Dom.getSpecificAncestor(element.parentElement, condition);\r\n }\r\n\r\n /**\r\n * gets the next focusable element in the current trap\r\n * @param element the current element\r\n */\r\n public static getNextFocusableElementInTrap(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorTrapDFS(element, Dom.isFocusable, ElementPosition.Next);\r\n }\r\n\r\n /**\r\n * gets the previous focusable element in the current trap\r\n * @param element the current element\r\n */\r\n public static getPreviousFocusableElementInTrap(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorTrapDFS(element, Dom.isFocusable, ElementPosition.Previous);\r\n }\r\n\r\n /**\r\n * true if given element is a body element\r\n * @param element the element\r\n */\r\n public static isBody(element: HTMLElement): boolean {\r\n return element.tagName === 'BODY';\r\n }\r\n\r\n /**\r\n * true if the given element is a zone\r\n * @param element the element\r\n */\r\n public static isZone(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n return Dom.hasZoneRole(element)\r\n || Dom.isSmeFocusZone(element)\r\n || Dom.hasZoneTag(element)\r\n || Dom.isGrowlWithChild(element)\r\n || (Dom.isFocusableFormElement(element) && !Dom.isInZoneWithinForm(element));\r\n }\r\n\r\n /**\r\n * true if the element is a focusable element that is not a zone\r\n * @param element the element\r\n */\r\n public static isFocusableNonZone(element: HTMLElement): boolean {\r\n return !Dom.isZone(element) && Dom.isFocusable(element);\r\n }\r\n\r\n /**\r\n * true if the element is an input, select, or textarea without a form parent\r\n * @param element the element\r\n */\r\n public static isInputWithoutForm(element: HTMLElement): boolean {\r\n const inputTags = ['INPUT', 'SELECT', 'TEXTAREA'];\r\n return inputTags.some(tag => tag === element.tagName) && Dom.getAncestorForm(element) === null;\r\n }\r\n\r\n /**\r\n * true if the element has a role that qualifies as a zone\r\n * @param element the element\r\n */\r\n public static hasZoneRole(element: HTMLElement): boolean {\r\n const role = element.getAttribute('role');\r\n const zoneRoles = ['grid', 'tablist', 'table', 'menubar', 'navigation', 'dialog'];\r\n return zoneRoles.some(zoneRole => zoneRole === role);\r\n }\r\n\r\n /**\r\n * true if the element has class=\"sme-focus-zone\"\r\n * @param element the element\r\n */\r\n public static isSmeFocusZone(element: HTMLElement): boolean {\r\n return element.classList.contains('sme-focus-zone');\r\n }\r\n\r\n /**\r\n * true if the element has a tag that is a zone\r\n * @param element the element\r\n */\r\n public static hasZoneTag(element: HTMLElement): boolean {\r\n // TODO: utilities should not know about specific sme tags.\r\n // These tags should instead use the appropriate roles to identify them as focus zones.\r\n const tag = element.tagName;\r\n const zoneTags = ['SME-BREADCRUMB-HEADER', 'SME-DETAILS', 'SME-SETTINGS-FOOTER'];\r\n return zoneTags.some(zoneTag => zoneTag === tag);\r\n }\r\n\r\n /**\r\n * true if element has role 'tablist'\r\n * @param element the html element\r\n */\r\n public static isTablist(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n const role = element.getAttribute('role');\r\n return role === 'tablist';\r\n }\r\n\r\n /**\r\n * Returns true if element is active\r\n * An element is active if it aria-selected attribute is set as true or has active or sme-active classes\r\n * @param element the html element\r\n */\r\n public static isActiveOrSelected(element: HTMLHtmlElement): boolean {\r\n const ariaSelected = element.getAttribute('aria-selected') === 'true';\r\n const activeClasses = ['active', 'sme-active'];\r\n return ariaSelected || activeClasses.some(className => element.classList.contains(className));\r\n }\r\n\r\n /**\r\n * Returns first active or selected descendant or null if none is found\r\n * @param element the html element\r\n */\r\n public static getFirstActiveOrSelectedDescendant(element: HTMLElement): HTMLElement | null {\r\n return Dom.findChildElementDFS(element, Dom.isActiveOrSelected, ElementPosition.First);\r\n }\r\n\r\n /**\r\n * true if the element is a growl with a child\r\n * @param element the element\r\n */\r\n public static isGrowlWithChild(element: HTMLElement): boolean {\r\n return element.classList.contains('sme-layout-notification-popup-list') && element.childElementCount > 0;\r\n }\r\n\r\n /**\r\n * true if element is focusable element within a form\r\n * @param element the element\r\n */\r\n public static isFocusableFormElement(element: HTMLElement): boolean {\r\n return !!Dom.getAncestorForm(element) && Dom.isFocusable(element);\r\n }\r\n\r\n /**\r\n * true is element is within a zone that is within a form\r\n * @param element the element\r\n */\r\n public static isInZoneWithinForm(element: HTMLElement) {\r\n return Dom.getAncestorForm(Dom.getAncestorZone(element.parentElement)) !== null;\r\n }\r\n\r\n /**\r\n * true is element is within a trap that is within a form\r\n * @param element the element\r\n */\r\n public static isInTrapWithinForm(element: HTMLElement) {\r\n return Dom.getAncestorForm(Dom.getAncestorTrap(element.parentElement)) !== null;\r\n }\r\n\r\n /**\r\n * true if the given element is a trap\r\n * @param element the element\r\n */\r\n public static isTrap(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n const role = element.getAttribute('role');\r\n const trapRoles = ['dialog', 'alertdialog'];\r\n return trapRoles.some(trapRole => trapRole === role) || element.classList.contains('sme-focus-trap');\r\n }\r\n\r\n /**\r\n * return true if element is a form\r\n * @param element the element\r\n */\r\n public static isForm(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n return element.tagName === 'FORM';\r\n }\r\n\r\n /**\r\n * return true if we are inside a search box that has its own arrow key controls\r\n * @param element the element\r\n * @param isRightArrow the right arrow was clicked\r\n */\r\n public static useArrowKeysWithinSearchbox(element: HTMLElement, isRightArrow: boolean): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n if (Dom.isSearchBox(element)) {\r\n const inputElement = element as any;\r\n const innerTextLength = inputElement.value ? inputElement.value.length : 0;\r\n return (!isRightArrow && inputElement.selectionStart !== null && inputElement.selectionStart > 0)\r\n || (isRightArrow && inputElement.selectionEnd !== null && inputElement.selectionEnd < innerTextLength);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * true if given element is a search box\r\n * @param element the element\r\n */\r\n public static isSearchBox(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n const inputElement = element as HTMLInputElement;\r\n return element.tagName === 'INPUT' && inputElement && inputElement.type === 'search';\r\n }\r\n\r\n /**\r\n * true if given element is a textbox in a combobox\r\n * @param element the element\r\n */\r\n public static isTextBoxInComboBox(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n return !!(Dom.getAncestor(element, htmlElement => {\r\n return htmlElement.classList.contains('sme-combobox-header');\r\n }));\r\n }\r\n\r\n /**\r\n * returns the next row in the current table\r\n * @param element the current element\r\n */\r\n public static getNextRowInTable(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorZoneDFS(element, Dom.isTableRow, ElementPosition.Next);\r\n }\r\n\r\n /**\r\n * returns the previous row in the current table\r\n * @param element the current element\r\n */\r\n public static getPreviousRowInTable(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorZoneDFS(element, Dom.isTableRow, ElementPosition.Previous);\r\n }\r\n\r\n /**\r\n * returns true if the current element is a table row\r\n * @param element the current element\r\n */\r\n public static isTableRow(element: HTMLElement): boolean {\r\n return element.tagName === 'TR';\r\n }\r\n\r\n /**\r\n * returns true if the current element is a table cell\r\n * @param element the current element\r\n */\r\n public static isTableCell(element: HTMLElement): boolean {\r\n return element.tagName === 'TD';\r\n }\r\n\r\n /**\r\n * returns true if the current element is inside a table cell\r\n * @param element the current element\r\n */\r\n public static isInTableCell(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n return Dom.isTableCell(element) ? true : Dom.isInTableCell(element.parentElement);\r\n }\r\n\r\n /**\r\n * Gets the first action bar on the screen.\r\n * @param element The HTML element.\r\n * @returns The first action bar on the screen.\r\n */\r\n public static getFirstActionBar(element: HTMLElement): HTMLElement {\r\n return this.getActionBar(element, ElementPosition.First);\r\n }\r\n\r\n /**\r\n * Gets the next action bar on the screen.\r\n * @param element The HTML element.\r\n * @returns The first action bar on the screen.\r\n */\r\n public static getNextActionBar(element: HTMLElement): HTMLElement {\r\n return this.getActionBar(element, ElementPosition.Next);\r\n }\r\n\r\n /**\r\n * Gets a specified action bar.\r\n * @param element The HTML element.\r\n * @param position The position of the desired action bar.\r\n * @returns The specified action bar, if possible.\r\n */\r\n public static getActionBar(element: HTMLElement, position: ElementPosition): HTMLElement {\r\n const actionBar = Dom.findElementFromRootDFS(\r\n Dom.getAncestorZone(element),\r\n (x) => Dom.isActionBar(x) && !MsftSme.isNullOrUndefined(Dom.getFirstFocusableDescendent(x)),\r\n position\r\n );\r\n\r\n return Dom.getFirstFocusableDescendent(actionBar);\r\n }\r\n\r\n /**\r\n * Determines if the HTML element is inside of an action bar.\r\n * @param element The HTML element.\r\n * @returns True if the HTML element is in an action bar and false if not.\r\n */\r\n public static isInActionBar(element: HTMLElement): boolean {\r\n return MsftSme.isNullOrUndefined(Dom.getSpecificAncestor(element, (x) => Dom.isActionBar(x))) ? false : true;\r\n }\r\n\r\n /**\r\n * Determines if the HTML element is an action bar.\r\n * @param element The HTML element.\r\n * @returns True if the element is an action bar and false if not.\r\n */\r\n public static isActionBar(element: HTMLElement): boolean {\r\n return MsftSme.isNullOrUndefined(element) ? false : element.getAttribute('role') === 'menubar'\r\n && !MsftSme.isNullOrUndefined(element.parentElement) && element.parentElement.tagName === 'SME-ACTION-BAR';\r\n }\r\n\r\n /**\r\n * Determines if we should treat enter as click for a certain element\r\n * @param element The HTML element to check\r\n */\r\n public static shouldTreatEnterAsClick(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n const inputElement = element as HTMLInputElement;\r\n // TODO: More types of elements may be added here\r\n const isFileUploadControl = element.tagName === 'INPUT' && inputElement && inputElement.type === 'file';\r\n const isInDataTable = !!Dom.getAncestor(element, e => e.tagName === 'SME-DATA-TABLE');\r\n\r\n return isFileUploadControl || isInDataTable;\r\n }\r\n\r\n /**\r\n * Check tab list aria-selected with active status\r\n */\r\n public static checkActiveTab(): void {\r\n const tablists = document.querySelectorAll('[role=\\'tablist\\']');\r\n for (const tablist of Array.from(tablists)) {\r\n // As all controls should, the <sme-pivot> handles accessibility internally.\r\n if (tablist.parentElement.tagName !== 'SME-PIVOT') {\r\n Dom.updateAriaSelect(tablist as HTMLElement, false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update tab aria-selected status\r\n * @param element The HTML element.\r\n * @param isActive The HTML element is active or inactive.\r\n */\r\n public static updateAriaSelect(currentElement: HTMLElement, isActive: boolean): void {\r\n if (!currentElement) {\r\n return;\r\n }\r\n if (currentElement.classList.contains('active') || currentElement.classList.contains('sme-active')) {\r\n isActive = true;\r\n }\r\n if (currentElement.getAttribute('aria-selected') && !isActive) {\r\n currentElement.setAttribute('aria-selected', 'false');\r\n }\r\n if (currentElement.getAttribute('role') === 'tab' && isActive) {\r\n currentElement.setAttribute('aria-selected', 'true');\r\n }\r\n for (const childElement of Array.from(currentElement.children)) {\r\n Dom.updateAriaSelect(childElement as HTMLElement, isActive);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * describes the position of the desired element in a list of elements\r\n */\r\nexport enum ElementPosition {\r\n First = 0,\r\n Previous = 1,\r\n Next = 2,\r\n Last = 3\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/dom/dom.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,MAAM,OAAO,GAAG;IACL,MAAM,CAAC,oBAAoB,CAAC,OAAoB,EAAE,UAAiC;QAEtF,IAAI,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE;YACvC,UAAU,GAAG;gBACT,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC3B,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC3B,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC3B,UAAU,EAAE,KAAK;gBACjB,oBAAoB,EAAE,KAAK;gBAC3B,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,IAAI;aACpB,CAAC;SACL;QAED,IAAI,OAAO,KAAK,IAAI,EAAE;YAClB,OAAO,UAAU,CAAC;SACrB;QAED,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YAC/C,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC;YAC7B,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC;YACjC,IAAI,UAAU,CAAC,UAAU,EAAE;gBACvB,UAAU,CAAC,oBAAoB,GAAG,IAAI,CAAC;aAC1C;SACJ;QAED,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YAC/C,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC;YAC7B,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC;SACpC;QAED,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YACrE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC;YAC7B,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC;SACpC;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;YAC9C,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC;YAC5B,CAAC;gBACD,OAAO,CAAC,aAAa,CAAC;QAE1B,OAAO,GAAG,CAAC,oBAAoB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAC/D,CAAC;IAEM,MAAM,CAAC,gCAAgC,CAAC,UAAgC;QAC3E,OAAO,CAAC,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,oBAAoB,CAAC;IACrE,CAAC;IAEM,MAAM,CAAC,kCAAkC,CAAC,OAAoB,EAAE,UAAgC;QACnG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC;eAC9D,CAAC,CAAC,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,WAAW;QACrB,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;QAClC,OAAO,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,QAAQ,CAAC,OAAoB,EAAE,QAAgB;QACzD,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QAED,uDAAuD;QACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE;YACpC,OAAO,KAAK,CAAC;SAChB;QAED,mCAAmC;QACnC,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,UAAU,CAAC,OAAoB;QACzC,IAAI,OAAO,EAAE;YACT,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE;gBACtC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aAC7B;SACJ;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,UAAU,CAAC,OAAoB;QACzC,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,cAAc,CAAC,OAAoB;QAC7C,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,MAAM,CAAC;IACvD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,QAAQ,CAAC,OAAoB;QACvC,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjF,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACI,MAAM,CAAC,WAAW,CAAC,OAAoB,EAAE,0BAAmC,KAAK;QACpF,OAAO,GAAG,CAAC,wBAAwB,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAC1E,CAAC;IAED;;;;;;;;;;;;;OAaG;IACI,MAAM,CAAC,eAAe,CAAC,OAAoB,EAAE,0BAAmC,KAAK;QACxF,OAAO,GAAG,CAAC,wBAAwB,CAAC,OAAO,EAAE,uBAAuB,EAAE,IAAI,CAAC,CAAC;IAChF,CAAC;IAEO,MAAM,CAAC,wBAAwB,CACnC,OAAoB,EACpB,uBAAgC,EAChC,mCAA4C,KAAK;QACjD,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QAED,4FAA4F;QAC5F,IAAI,CAAC,gCAAgC,IAAI,GAAG,CAAC,uCAAuC,CAAC,OAAO,CAAC,EAAE;YAC3F,OAAO,KAAK,CAAC;SAChB;QAED,yDAAyD;QACzD,sCAAsC;QACtC,gFAAgF;QAChF,IAAI,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAClF,OAAO,OAAO,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;SAChH;QAED,0CAA0C;QAC1C,IAAI,OAAO,CAAC,OAAO,KAAK,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;YACzD,OAAO,IAAI,CAAC;SACf;QAED,gEAAgE;QAChE,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1E,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,oBAAoB,CAAC,OAAoB;QACnD,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QACD,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAChG,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,8BAA8B,CAAC,OAAoB,EAAE,SAA4C,EAC3G,QAAyB;QACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAkB,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC3E,OAAO,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,8BAA8B,CAAC,OAAoB,EAAE,SAA4C,EAC3G,QAAyB;QACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAkB,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC3E,OAAO,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,sBAAsB,CAAC,OAAoB,EAAE,SAA4C,EACnG,QAAyB;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;QAClC,MAAM,WAAW,GAAkB,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACvE,OAAO,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,mBAAmB,CAAC,OAAoB,EAAE,SAA4C,EAChG,QAAyB;QACzB,MAAM,WAAW,GAAkB,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC1E,OAAO,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,UAAU,CAAC,QAAuB,EAAE,cAA2B,EAAE,QAAyB;QACpG,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,QAAQ,QAAQ,EAAE;gBACd,KAAK,eAAe,CAAC,IAAI;oBACrB,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;oBACrE,OAAO,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;gBAC5F,KAAK,eAAe,CAAC,QAAQ;oBACzB,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;oBACrE,OAAO,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;gBAC/E,KAAK,eAAe,CAAC,KAAK;oBACtB,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC5B,KAAK,eAAe,CAAC,IAAI;oBACrB,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC3B;oBACI,OAAO,cAAc,CAAC;aAC7B;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,cAAc,CAAC,OAAoB,EAAE,SAA4C;QAC3F,OAAO,GAAG,CAAC,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,eAAe,CAAC,WAAwB,EAClD,SAA4C,EAC5C,oBAAwD,EACxD,kBAAkB,GAAG,IAAI;QACzB,MAAM,aAAa,GAAG,GAAG,CAAC,iBAAiB,CAAC,WAAW,EAAE,SAAS,EAAE,oBAAoB,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;QACpH,uBAAuB;QACvB,OAAO,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;OAMG;IACK,MAAM,CAAC,iBAAiB,CAC5B,WAAwB,EACxB,SAA4C,EAC5C,oBAAwD,EACxD,iBAAiB,GAAG,KAAK,EACzB,kBAAkB,GAAG,IAAI;QACzB,IAAI,CAAC,WAAW,EAAE;YACd,OAAO,IAAI,CAAC;SACf;QAED,kDAAkD;QAClD,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,MAAM,mBAAmB,GAAG,EAAE,CAAC;QAC/B,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9B,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YACzC,IAAI,cAAc,CAAC,OAAO,KAAK,KAAK,IAAI,cAAc,CAAC,OAAO,KAAK,KAAK,EAAE;gBACtE,IAAI,SAAS,CAAC,cAAc,CAAC,EAAE;oBAE3B,kEAAkE;oBAClE,IAAI,CAAC,cAAc,KAAK,WAAW,IAAI,kBAAkB,CAAC,IAAI,cAAc,KAAK,WAAW,EAAE;wBAC1F,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;wBAEzC,IAAI,iBAAiB,EAAE;4BACnB,OAAO,mBAAmB,CAAC;yBAC9B;qBACJ;iBACJ;gBAED,IAAI,cAAc,KAAK,WAAW,IAAI,CAAC,oBAAoB,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,EAAE;oBAClG,KAAK,IAAI,CAAC,GAAG,cAAc,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;wBAC5D,MAAM,KAAK,GAAgB,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAC3D,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;qBAC3B;iBACJ;gBACD,0EAA0E;gBAC1E,IAAI;oBACA,IAAI,cAAc,CAAC,eAAe,IAAI,cAAc,CAAC,eAAe,CAAC,IAAI,EAAE;wBACvE,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;qBACzD;iBACJ;gBAAC,OAAO,KAAK,EAAE;oBACZ,8FAA8F;oBAC9F,mFAAmF;oBACnF,kGAAkG;oBAElG,2DAA2D;iBAC9D;aACJ;SACJ;QAED,qEAAqE;QACrE,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,cAAc;QACxB,8HAA8H;QAC9H,IAAI;YACA,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;gBACxE,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;aACtC;SACJ;QAAC,OAAO,KAAK,EAAE;YACZ,sGAAsG;YACtG,mFAAmF;YACnF,kGAAkG;YAElG,2DAA2D;SAC9D;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC;IACzB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,WAAW,CAAC,OAAoB;QAC1C,OAAO,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IACjH,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,kBAAkB,CAAC,OAAoB;QACjD,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QAED,gCAAgC;QAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;YAC9B,OAAO,IAAI,CAAC;SACf;QAED,MAAM,qBAAqB,GAAG,GAAG,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QACxE,OAAO,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC5F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,OAAoB;QAC9C,OAAO,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1G,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,sBAAsB,CAAC,OAAoB,EAAE,eAA6B;QACpF,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QAED,oEAAoE;QACpE,IAAI,CAAC,eAAe,EAAE;YAClB,OAAO,GAAG,CAAC,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;SACvD;QAED,sCAAsC;QACtC,MAAM,YAAY,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;YAClC,OAAO,IAAI,CAAC;SACf;QAED,MAAM,qBAAqB,GAAG,GAAG,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC;QAC5E,OAAO,qBAAqB,IAAI,qBAAqB,KAAK,eAAe,CAAC,CAAC;YACvE,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAC1F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,WAAW,CAAC,OAAoB,EAAE,SAA8C;QAC1F,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QAED,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE;YACpB,OAAO,OAAO,CAAC;SAClB;QAED,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,EAAE;YAC5B,MAAM,aAAa,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;SAC3E;QAED,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IAEO,MAAM,CAAC,eAAe,CAAC,OAAoB;QAC/C,MAAM,gBAAgB,GAAG,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAC3E,IAAI,CAAC,gBAAgB,EAAE;YACnB,OAAO,IAAI,CAAC;SACf;QACD,8HAA8H;QAC9H,IAAI;YACA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;gBACnD,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEtE,IAAI,aAAa,CAAC;YAClB,IAAI,OAAO,IAAI,gBAAgB,EAAE;gBAC7B,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,gBAAgB,CAAC,CAAC;aACzE;YACD,OAAO,aAAa,IAAI,IAAI,CAAC;SAChC;QAAC,OAAO,KAAK,EAAE;YACZ,wHAAwH;YACxH,mFAAmF;YACnF,kGAAkG;YAClG,OAAO,IAAI,CAAC;SACf;IACL,CAAC;IAGD;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,OAAoB,EAAE,SAA8C;QAC9F,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO,EAAE,CAAC;SAAE;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,QAAQ,EAAE;YAAE,OAAO,EAAE,CAAC;SAAE;QAC7B,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;IACrF,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,OAAoB;QAC9C,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,OAAoB;QAC9C,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,OAAoB;QAC9C,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,uCAAuC,CAAC,OAAoB;QACtE,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACxG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,mBAAmB,CAAC,OAAoB;QAClD,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,gBAAgB,CAAC,OAAoB;QAC/C,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IAChE,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,iBAAiB,CAAC,OAAoB;QAChD,yEAAyE;QACzE,OAAO,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/G,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,2BAA2B,CAAC,OAAoB;QAC1D,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QACD,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7B,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,2BAA2B,CAAC,GAAG,CAAC,mBAAmB,CAC7D,OAAO,EACP,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,MAAM,EAC7B,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,oBAAoB,CAAC,OAAoB;QACnD,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,qBAAqB,CAAC,OAAoB;QACpD,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,uBAAuB,CAAC,OAAoB;QACtD,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,2BAA2B,CAAC,OAAoB;QAC1D,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,mBAAmB,CAAC,OAAoB;QAClD,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QAED,OAAO,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;YAC7F,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAc,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7E,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,mBAAmB,CAAC,OAAoB,EAAE,SAA4C;QAChG,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QAED,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACpG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,6BAA6B,CAAC,OAAoB;QAC5D,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,iCAAiC,CAAC,OAAoB;QAChE,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,MAAM,CAAC,OAAoB;QACrC,OAAO,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC;IACtC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,MAAM,CAAC,OAAoB;QACrC,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QAED,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC;eACxB,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC;eAC3B,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;eACvB,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC;eAC7B,CAAC,GAAG,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IACrF,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,kBAAkB,CAAC,OAAoB;QACjD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,kBAAkB,CAAC,OAAoB;QACjD,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAClD,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACnG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,WAAW,CAAC,OAAoB;QAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;QAClF,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;IACzD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,cAAc,CAAC,OAAoB;QAC7C,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,UAAU,CAAC,OAAoB;QACzC,2DAA2D;QAC3D,uFAAuF;QACvF,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;QAC5B,MAAM,QAAQ,GAAG,CAAC,uBAAuB,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;QACjF,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,SAAS,CAAC,OAAoB;QACxC,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,IAAI,KAAK,SAAS,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,kBAAkB,CAAC,OAAwB;QACrD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM,CAAC;QACtE,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC/C,OAAO,YAAY,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAClG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,kCAAkC,CAAC,OAAoB;QACjE,OAAO,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,kBAAkB,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAC3F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,gBAAgB,CAAC,OAAoB;QAC/C,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,oCAAoC,CAAC,IAAI,OAAO,CAAC,iBAAiB,GAAG,CAAC,CAAC;IAC7G,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,sBAAsB,CAAC,OAAoB;QACrD,OAAO,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,kBAAkB,CAAC,OAAoB;QACjD,OAAO,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,KAAK,IAAI,CAAC;IACpF,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,kBAAkB,CAAC,OAAoB;QACjD,OAAO,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,KAAK,IAAI,CAAC;IACpF,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,MAAM,CAAC,OAAoB;QACrC,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC5C,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACzG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,MAAM,CAAC,OAAoB;QACrC,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QAED,OAAO,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,2BAA2B,CAAC,OAAoB,EAAE,YAAqB;QACjF,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE;YAC1B,MAAM,YAAY,GAAG,OAAc,CAAC;YACpC,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,CAAC,YAAY,IAAI,YAAY,CAAC,cAAc,KAAK,IAAI,IAAI,YAAY,CAAC,cAAc,GAAG,CAAC,CAAC;mBAC1F,CAAC,YAAY,IAAI,YAAY,CAAC,YAAY,KAAK,IAAI,IAAI,YAAY,CAAC,YAAY,GAAG,eAAe,CAAC,CAAC;SAC9G;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,WAAW,CAAC,OAAoB;QAC1C,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,MAAM,YAAY,GAAG,OAA2B,CAAC;QACjD,OAAO,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,YAAY,IAAI,YAAY,CAAC,IAAI,KAAK,QAAQ,CAAC;IACzF,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,mBAAmB,CAAC,OAAoB;QAClD,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE;YAC7C,OAAO,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC,CAAC;IACR,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,iBAAiB,CAAC,OAAoB;QAChD,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC7F,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,qBAAqB,CAAC,OAAoB;QACpD,OAAO,GAAG,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IACjG,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,UAAU,CAAC,OAAoB;QACzC,OAAO,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;IACpC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,WAAW,CAAC,OAAoB;QAC1C,OAAO,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;IACpC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,aAAa,CAAC,OAAoB;QAC5C,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QAED,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACtF,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,iBAAiB,CAAC,OAAoB;QAChD,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,gBAAgB,CAAC,OAAoB;QAC/C,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,YAAY,CAAC,OAAoB,EAAE,QAAyB;QACtE,MAAM,SAAS,GAAG,GAAG,CAAC,sBAAsB,CACxC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,EAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,EAC3F,QAAQ,CACX,CAAC;QAEF,OAAO,GAAG,CAAC,2BAA2B,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,aAAa,CAAC,OAAoB;QAC5C,OAAO,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACjH,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,WAAW,CAAC,OAAoB;QAC1C,OAAO,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,SAAS;eACvF,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,OAAO,KAAK,gBAAgB,CAAC;IACnH,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,uBAAuB,CAAC,OAAoB;QACtD,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC;SAChB;QACD,MAAM,YAAY,GAAG,OAA2B,CAAC;QACjD,iDAAiD;QACjD,MAAM,mBAAmB,GAAG,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,YAAY,IAAI,YAAY,CAAC,IAAI,KAAK,MAAM,CAAC;QACxG,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,gBAAgB,CAAC,CAAC;QAEtF,OAAO,mBAAmB,IAAI,aAAa,CAAC;IAChD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,cAAc;QACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;QACjE,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACxC,4EAA4E;YAC5E,IAAI,OAAO,CAAC,aAAa,CAAC,OAAO,KAAK,WAAW,EAAE;gBAC/C,GAAG,CAAC,gBAAgB,CAAC,OAAsB,EAAE,KAAK,CAAC,CAAC;aACvD;SACJ;IACL,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,gBAAgB,CAAC,cAA2B,EAAE,QAAiB;QACzE,IAAI,CAAC,cAAc,EAAE;YACjB,OAAO;SACV;QACD,IAAI,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;YAChG,QAAQ,GAAG,IAAI,CAAC;SACnB;QACD,IAAI,cAAc,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC3D,cAAc,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;SACzD;QACD,IAAI,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,QAAQ,EAAE;YAC3D,cAAc,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;SACxD;QACD,KAAK,MAAM,YAAY,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE;YAC5D,GAAG,CAAC,gBAAgB,CAAC,YAA2B,EAAE,QAAQ,CAAC,CAAC;SAC/D;IACL,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,cAAc,CAAC,OAAoB;QAC7C,IAAI,CAAC,OAAO,EAAE;YACV,OAAO;SACV;QAED,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE;YAC1B,OAAO,OAAO,CAAC;SAClB;QAED,wDAAwD;QACxD,OAAO,GAAG,CAAC,2BAA2B,CAAC,OAAO,CAAC;YAE3C,sFAAsF;YACtF,GAAG,CAAC,uBAAuB,CAAC,OAAO,CAAC;YAEpC,oGAAoG;YACpG,GAAG,CAAC,sBAAsB,CAAC,OAAO,CAAC;YAEnC,mEAAmE;YACnE,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,eAKX;AALD,WAAY,eAAe;IACvB,uDAAS,CAAA;IACT,6DAAY,CAAA;IACZ,qDAAQ,CAAA;IACR,qDAAQ,CAAA;AACZ,CAAC,EALW,eAAe,KAAf,eAAe,QAK1B","file":"dom.js","sourcesContent":["export interface DomElementProperties {\r\n isForm: boolean;\r\n withinForm: boolean;\r\n isTrap: boolean;\r\n withinTrap: boolean;\r\n isZone: boolean;\r\n withinZone: boolean;\r\n withinZoneWithinForm: boolean;\r\n currentZone: HTMLElement;\r\n currentTrap: HTMLElement;\r\n currentForm: HTMLElement;\r\n}\r\n\r\n/**\r\n * DOM class\r\n * @dynamic\r\n */\r\nexport class Dom {\r\n public static getElementProperties(element: HTMLElement, properties?: DomElementProperties): DomElementProperties {\r\n\r\n if (MsftSme.isNullOrUndefined(properties)) {\r\n properties = {\r\n isForm: Dom.isForm(element),\r\n withinForm: false,\r\n isTrap: Dom.isTrap(element),\r\n withinTrap: false,\r\n isZone: Dom.isZone(element),\r\n withinZone: false,\r\n withinZoneWithinForm: false,\r\n currentZone: null,\r\n currentTrap: null,\r\n currentForm: null\r\n };\r\n }\r\n\r\n if (element === null) {\r\n return properties;\r\n }\r\n\r\n if (!properties.withinForm && Dom.isForm(element)) {\r\n properties.withinForm = true;\r\n properties.currentForm = element;\r\n if (properties.withinZone) {\r\n properties.withinZoneWithinForm = true;\r\n }\r\n }\r\n\r\n if (!properties.withinTrap && Dom.isTrap(element)) {\r\n properties.withinTrap = true;\r\n properties.currentTrap = element;\r\n }\r\n\r\n if (!properties.withinZone && !properties.isZone && Dom.isZone(element)) {\r\n properties.withinZone = true;\r\n properties.currentZone = element;\r\n }\r\n\r\n const parentElement = element.tagName === 'HTML' ?\r\n Dom.getParentIframe(element)\r\n :\r\n element.parentElement;\r\n\r\n return Dom.getElementProperties(parentElement, properties);\r\n }\r\n\r\n public static allowCustomArrowKeyFunctionality(properties: DomElementProperties) {\r\n return !properties.withinForm || properties.withinZoneWithinForm;\r\n }\r\n\r\n public static allowCustomHomeEndKeyFunctionality(element: HTMLElement, properties: DomElementProperties) {\r\n return !Dom.isSearchBox(element) && !Dom.isTextBoxInComboBox(element)\r\n && (!properties.withinForm || properties.withinZoneWithinForm);\r\n }\r\n\r\n /**\r\n * gets all body elements on the page\r\n */\r\n public static getAllBodys(): HTMLElement[] {\r\n const root = Dom.getRootElement();\r\n return Dom.getAllElements(root, Dom.isBody);\r\n }\r\n\r\n /**\r\n * Gets a CSS property value\r\n * @param element The Element\r\n * @param property - The CSS property name\r\n * @returns The value of the CSS property (type depends on property retrieved)\r\n */\r\n public static getStyle(element: HTMLElement, property: string): any {\r\n if (!element) {\r\n return null;\r\n }\r\n\r\n // first try to get the value directly from the element\r\n const value = element.style[property];\r\n if (!MsftSme.isNullOrWhiteSpace(value)) {\r\n return value;\r\n }\r\n\r\n // otherwise get the computed style\r\n return getComputedStyle(element)[property];\r\n }\r\n\r\n /**\r\n * Gets the classes applied to an element\r\n * @param element The Element\r\n * @returns The classes currently applied to the element\r\n */\r\n public static getClasses(element: HTMLElement): any {\r\n if (element) {\r\n const classes = element.className.trim();\r\n if (!MsftSme.isNullOrWhiteSpace(classes)) {\r\n return classes.split(' ');\r\n }\r\n }\r\n return [];\r\n }\r\n\r\n /**\r\n * Determines is an element is disabled via the 'disabled' attribute\r\n * @param element The element to start from.\r\n */\r\n public static isDisabled(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n return !!element['disabled'];\r\n }\r\n\r\n /**\r\n * Determines is an element is hidden via css with \"display: none\"\r\n * @param element The element to start from.\r\n */\r\n public static isNotDisplayed(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n return Dom.getStyle(element, 'display') === 'none';\r\n }\r\n\r\n /**\r\n * Determines is an element is hidden via css with \"visibility: hidden\"\r\n * @param element The element to start from.\r\n */\r\n public static isHidden(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n return Dom.getStyle(element, 'visibility') === 'hidden' || element['hidden'];\r\n }\r\n\r\n /**\r\n * Returns the first element in the current elements ancestory that is focusable.\r\n *\r\n * 'Focusable' is defined as the following:\r\n * - input, select, textarea, button, object\r\n * - anchor with href\r\n * - have a non-negative tab index\r\n *\r\n * An element is not focusable if any of the following is true (even if it meets a condition above)\r\n * - negative tab index\r\n * - disabled\r\n * - display: none\r\n * - visibility: hidden\r\n *\r\n * @param element The element to start from.\r\n * @return true if focus possible\r\n */\r\n public static isFocusable(element: HTMLElement, includeNegativeTabIndex: boolean = false): boolean {\r\n return Dom.checkFocusableConditions(element, includeNegativeTabIndex);\r\n }\r\n\r\n /**\r\n * Returns true if the element could be focusable.\r\n *\r\n * An element that can be focused is the following:\r\n * - input, select, textarea, button, object\r\n * - anchor with href\r\n * - have a non-negative tab index\r\n *\r\n * This method will determine if the element has one of these conditions even if the the element\r\n * is not displayed, visible, enabled, or having a positive z-index.\r\n *\r\n * @param element The element to start from.\r\n * @return true if focus possible.\r\n */\r\n public static isFocusPossible(element: HTMLElement, includeNegativeTabIndex: boolean = false): boolean {\r\n return Dom.checkFocusableConditions(element, includeNegativeTabIndex, true);\r\n }\r\n\r\n private static checkFocusableConditions(\r\n element: HTMLElement,\r\n includeNegativeTabIndex: boolean,\r\n skipDisabledHiddenOrNotDisplayed: boolean = false): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n // if the element or its ancestor is disabled or 'not displayed'/hidden, it is not focusable\r\n if (!skipDisabledHiddenOrNotDisplayed && Dom.getDisabledHiddenOrNotDisplayedAncestor(element)) {\r\n return false;\r\n }\r\n\r\n // if the tab index is set, let it determine focusability\r\n // have to check has attribute because\r\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/4365703/\r\n if (element.hasAttribute('tabindex') && !MsftSme.isNullOrUndefined(element.tabIndex)) {\r\n return element.tabIndex >= 0 || (includeNegativeTabIndex && !element.classList.contains('sme-hidden-focus'));\r\n }\r\n\r\n // anchors with an href are also focusable\r\n if (element.tagName === 'A' && element.hasAttribute('href')) {\r\n return true;\r\n }\r\n\r\n // Otherwise only naturally focusable elements can receive focus\r\n const focusableTags = ['INPUT', 'SELECT', 'TEXTAREA', 'BUTTON', 'OBJECT'];\r\n return focusableTags.some(tag => tag === element.tagName);\r\n }\r\n\r\n /**\r\n * Returns the first element in the current elements ancestry that is focusable.\r\n * Will return the element itself if it is focusable\r\n * @param element The element to start from.\r\n * @return the first focusable ancestor of the element\r\n */\r\n public static getFocusableAncestor(element: HTMLElement): HTMLElement {\r\n if (!element) {\r\n return null;\r\n }\r\n return Dom.isFocusable(element) ? element : Dom.getFocusableAncestor(element.parentElement);\r\n }\r\n\r\n /**\r\n * find an element in a particular position with a specific condition relative to input element\r\n * Does a DFS for this element relative the ancestor zone of input element\r\n * @param element The current element\r\n * @param condition The function to check the kind of element we are looking for\r\n * @param position The ElementPosition of the desired element relative to input element\r\n */\r\n public static findElementFromAncestorZoneDFS(element: HTMLElement, condition: (element: HTMLElement) => boolean,\r\n position: ElementPosition): HTMLElement {\r\n const ancestor = Dom.getAncestorZone(element);\r\n const allElements: HTMLElement[] = Dom.getAllElements(ancestor, condition);\r\n return Dom.getElement(allElements, element, position);\r\n }\r\n\r\n /**\r\n * find an element in a particular position with a specific condition relative to input element\r\n * Does a DFS for this element relative the ancestor trap of input element\r\n * @param element The current element\r\n * @param condition The function to check the kind of element we are looking for\r\n * @param position The ElementPosition of the desired element relative to input element\r\n */\r\n public static findElementFromAncestorTrapDFS(element: HTMLElement, condition: (element: HTMLElement) => boolean,\r\n position: ElementPosition): HTMLElement {\r\n const ancestor = Dom.getAncestorTrap(element);\r\n const allElements: HTMLElement[] = Dom.getAllElements(ancestor, condition);\r\n return Dom.getElement(allElements, element, position);\r\n }\r\n\r\n /**\r\n * find an element in a particular position with a specific condition relative to input element\r\n * Does a DFS for this element relative the root of the graph\r\n * @param element The current element\r\n * @param condition The function to check the kind of element we are looking for\r\n * @param position The ElementPosition of the desired element relative to input element\r\n */\r\n public static findElementFromRootDFS(element: HTMLElement, condition: (element: HTMLElement) => boolean,\r\n position: ElementPosition): HTMLElement {\r\n const root = Dom.getRootElement();\r\n const allElements: HTMLElement[] = Dom.getAllElements(root, condition);\r\n return Dom.getElement(allElements, element, position);\r\n }\r\n\r\n /**\r\n * find an element in a particular position with a specific condition relative to input element\r\n * Does a DFS for this element relative the input element\r\n * @param element The current element\r\n * @param condition The function to check the kind of element we are looking for\r\n * @param position The ElementPosition of the desired element relative to input element\r\n */\r\n public static findChildElementDFS(element: HTMLElement, condition: (element: HTMLElement) => boolean,\r\n position: ElementPosition): HTMLElement {\r\n const allElements: HTMLElement[] = Dom.getAllElements(element, condition);\r\n return Dom.getElement(allElements, element, position);\r\n }\r\n\r\n /**\r\n * gets a element from a list of elements in the position relative to the current element\r\n * @param elements the list of elements\r\n * @param currentElement the current element\r\n * @param position the ElementPosition we want relative to the current element\r\n */\r\n public static getElement(elements: HTMLElement[], currentElement: HTMLElement, position: ElementPosition): HTMLElement {\r\n if (elements && elements.length > 0) {\r\n let currentIndex = 0;\r\n switch (position) {\r\n case ElementPosition.Next:\r\n currentIndex = elements.findIndex(x => x.isSameNode(currentElement));\r\n return currentIndex + 1 < elements.length ? elements[currentIndex + 1] : currentElement;\r\n case ElementPosition.Previous:\r\n currentIndex = elements.findIndex(x => x.isSameNode(currentElement));\r\n return currentIndex - 1 >= 0 ? elements[currentIndex - 1] : currentElement;\r\n case ElementPosition.First:\r\n return elements.first();\r\n case ElementPosition.Last:\r\n return elements.last();\r\n default:\r\n return currentElement;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public static getAllElements(element: HTMLElement, condition: (element: HTMLElement) => boolean) {\r\n return Dom.searchAllElements(element, condition);\r\n }\r\n\r\n /**\r\n * gets the first element that meets a condition\r\n * @param rootElement the element we start with\r\n * @param condition the condition we want to find an element meeting\r\n * @param stopLookingCondition a condition used to stop looking down a certain path\r\n * (ie stop looking down a particular path once we hit a zone)\r\n * @param includeRootElement a condition to include the root element in the search\r\n */\r\n public static getFirstElement(rootElement: HTMLElement,\r\n condition: (element: HTMLElement) => boolean,\r\n stopLookingCondition?: (element: HTMLElement) => boolean,\r\n includeRootElement = true): HTMLElement {\r\n const firstElements = Dom.searchAllElements(rootElement, condition, stopLookingCondition, true, includeRootElement);\r\n // return first element\r\n return MsftSme.first(firstElements);\r\n }\r\n\r\n /**\r\n * finds all elements starting at the input element that meet the given condition\r\n * @param rootElement the element from which to start the depth first search\r\n * @param condition the function that determines whether the desired condition has been met\r\n * @param stopLookingCondition a condition used to stop looking down a certain path\r\n * @param includeRootElement a condition to include the root element in the search\r\n */\r\n private static searchAllElements(\r\n rootElement: HTMLElement,\r\n condition: (element: HTMLElement) => boolean,\r\n stopLookingCondition?: (element: HTMLElement) => boolean,\r\n stopAtFirstResult = false,\r\n includeRootElement = true): HTMLElement[] {\r\n if (!rootElement) {\r\n return null;\r\n }\r\n\r\n // depth first search starting at the root element\r\n const allElements = [];\r\n const conditionalElements = [];\r\n allElements.push(rootElement);\r\n while (allElements.length > 0) {\r\n const currentElement = allElements.pop();\r\n if (currentElement.tagName !== 'SVG' && currentElement.tagName !== 'svg') {\r\n if (condition(currentElement)) {\r\n\r\n // If root element meets the condition, add to conditionalElements\r\n if ((currentElement === rootElement && includeRootElement) || currentElement !== rootElement) {\r\n conditionalElements.push(currentElement);\r\n\r\n if (stopAtFirstResult) {\r\n return conditionalElements;\r\n }\r\n }\r\n }\r\n\r\n if (currentElement === rootElement || !stopLookingCondition || !stopLookingCondition(currentElement)) {\r\n for (let i = currentElement.childElementCount - 1; i >= 0; i--) {\r\n const child = <HTMLElement>currentElement.children.item(i);\r\n allElements.push(child);\r\n }\r\n }\r\n // if the current element is an iframe, start traversing the iframe's body\r\n try {\r\n if (currentElement.contentDocument && currentElement.contentDocument.body) {\r\n allElements.push(currentElement.contentDocument.body);\r\n }\r\n } catch (error) {\r\n // if we can't grab the content document, then we are very likely sideloading a tool in chrome\r\n // you can disable same origin security policy to test accessibility or try in edge\r\n // if this happens, we want to just get as much information as we can about the available elements\r\n\r\n // TODO: log this when this code is moved to different file\r\n }\r\n }\r\n }\r\n\r\n // we need to reverse to get the actual order of elements on the page\r\n return conditionalElements;\r\n }\r\n\r\n /**\r\n * returns the root of the DOM graph\r\n */\r\n public static getRootElement(): HTMLElement {\r\n // we want to try to grab the document body from the window because document.body gives us the body of the current iframe only\r\n try {\r\n if (window.parent && window.parent.document && window.parent.document.body) {\r\n return window.parent.document.body;\r\n }\r\n } catch (error) {\r\n // if we can't grab the document from the window, then we are very likely sideloading a tool in chrome\r\n // you can disable same origin security policy to test accessibility or try in edge\r\n // if this happens, we want to just get as much information as we can about the available elements\r\n\r\n // TODO: log this when this code is moved to different file\r\n }\r\n\r\n return document.body;\r\n }\r\n\r\n /**\r\n * Finds the next zone\r\n * @param element the current zone or an element in the current zone\r\n */\r\n public static getNextZone(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromRootDFS(Dom.getAncestorZone(element) || element, Dom.isZone, ElementPosition.Next);\r\n }\r\n\r\n /**\r\n * gets the first focusable element in the next zone\r\n * if a zone has no focusable elements, it is skipped\r\n * @param element the current element\r\n */\r\n public static getNextZoneElement(element: HTMLElement): HTMLElement {\r\n if (!element) {\r\n return null;\r\n }\r\n\r\n // we are at the end of the page\r\n const nextZone = Dom.getNextZone(element);\r\n if (element.isSameNode(nextZone)) {\r\n return null;\r\n }\r\n\r\n const firstFocusableElement = Dom.getFirstFocusableDescendent(nextZone);\r\n return firstFocusableElement ? firstFocusableElement : Dom.getNextZoneElement(nextZone);\r\n }\r\n\r\n /**\r\n * Finds the previous zone\r\n * @param element the current zone or an element in the current zone\r\n */\r\n public static getPreviousZone(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromRootDFS(Dom.getAncestorZone(element), Dom.isZone, ElementPosition.Previous);\r\n }\r\n\r\n /**\r\n * gets the first focusable element in the previous zone\r\n * if a zone has no focusable elements, it is skipped\r\n * @param element the current element\r\n * @param originalElement the element from which we begin the search. Set automatically if unset by user\r\n */\r\n public static getPreviousZoneElement(element: HTMLElement, originalElement?: HTMLElement): HTMLElement {\r\n if (!element) {\r\n return null;\r\n }\r\n\r\n // save the first element we see so we can skip empty zones later on\r\n if (!originalElement) {\r\n return Dom.getPreviousZoneElement(element, element);\r\n }\r\n\r\n // we are at the beginning of the page\r\n const previousZone = Dom.getPreviousZone(element);\r\n if (element.isSameNode(previousZone)) {\r\n return null;\r\n }\r\n\r\n const firstFocusableElement = Dom.getFirstFocusableDescendent(previousZone);\r\n return firstFocusableElement && firstFocusableElement !== originalElement ?\r\n firstFocusableElement : Dom.getPreviousZoneElement(previousZone, originalElement);\r\n }\r\n\r\n /**\r\n * gets the first ancestor that is disabled\r\n * @param element the element\r\n */\r\n public static getAncestor(element: HTMLElement, condition: MsftSme.Func1<HTMLElement, boolean>): HTMLElement {\r\n if (!element) {\r\n return null;\r\n }\r\n\r\n if (condition(element)) {\r\n return element;\r\n }\r\n\r\n if (element.tagName === 'HTML') {\r\n const iFrameElement = Dom.getParentIframe(element);\r\n return iFrameElement ? Dom.getAncestor(iFrameElement, condition) : null;\r\n }\r\n\r\n return Dom.getAncestor(element.parentElement, condition);\r\n }\r\n\r\n private static getParentIframe(element: HTMLElement): HTMLHtmlElement | null {\r\n const elementFrameName = element && element.getAttribute('sme-frame-name');\r\n if (!elementFrameName) {\r\n return null;\r\n }\r\n // we want to try to grab the document body from the window because document.body gives us the body of the current iframe only\r\n try {\r\n const iFrames = MsftSme.isShell() ?\r\n Array.from(document.getElementsByTagName('iframe'))\r\n :\r\n Array.from(window.parent.document.getElementsByTagName('iframe'));\r\n\r\n let iFrameElement;\r\n if (iFrames && elementFrameName) {\r\n iFrameElement = iFrames.first(frame => frame.id === elementFrameName);\r\n }\r\n return iFrameElement || null;\r\n } catch (error) {\r\n // if we can't grab the document from the window, then we are very likely side-loading a tool in chrome or chromium edge\r\n // you can disable same origin security policy to test accessibility or try in edge\r\n // if this happens, we want to just get as much information as we can about the available elements\r\n return null;\r\n }\r\n }\r\n\r\n\r\n /**\r\n * gets all ancestors that match a given condition\r\n * @param element the element\r\n */\r\n public static getAllAncestors(element: HTMLElement, condition: MsftSme.Func1<HTMLElement, boolean>): HTMLElement[] {\r\n if (!element) { return []; }\r\n const ancestor = Dom.getAncestor(element, condition);\r\n if (!ancestor) { return []; }\r\n return [ancestor].concat(Dom.getAllAncestors(ancestor.parentElement, condition));\r\n }\r\n\r\n /**\r\n * gets the zone that the current element is in\r\n * @param element the element\r\n */\r\n public static getAncestorZone(element: HTMLElement): HTMLElement {\r\n return Dom.getAncestor(element, e => Dom.isZone(e));\r\n }\r\n\r\n /**\r\n * determine if an element is in a trap, if so return the trap element\r\n * @param element HTML element to check\r\n */\r\n public static getAncestorTrap(element: HTMLElement): HTMLElement {\r\n return Dom.getAncestor(element, e => Dom.isTrap(e));\r\n }\r\n\r\n /**\r\n * gets the ancestor form of an element\r\n * @param element the element\r\n */\r\n public static getAncestorForm(element: HTMLElement): HTMLElement {\r\n return Dom.getAncestor(element, e => Dom.isForm(e));\r\n }\r\n\r\n /**\r\n * Find ancestors that are disabled, hidden, or not displayed\r\n * @param element the element\r\n */\r\n public static getDisabledHiddenOrNotDisplayedAncestor(element: HTMLElement): HTMLElement {\r\n return Dom.getAncestor(element, x => Dom.isDisabled(x) || Dom.isNotDisplayed(x) || Dom.isHidden(x));\r\n }\r\n\r\n /**\r\n * gets the first ancestor that is disabled\r\n * @param element the element\r\n */\r\n public static getDisabledAncestor(element: HTMLElement): HTMLElement {\r\n return Dom.getAncestor(element, e => Dom.isDisabled(e));\r\n }\r\n\r\n /**\r\n * returns ancestor table of current element\r\n * @param element the current element\r\n */\r\n public static getAncestorTable(element: HTMLElement): HTMLElement {\r\n return Dom.getAncestor(element, e => e.tagName === 'TABLE');\r\n }\r\n\r\n /**\r\n * gets the next child zone of the current zone\r\n * @param element the current zone or an element in the current zone\r\n */\r\n public static getDescendentZone(element: HTMLElement): HTMLElement {\r\n // if there is no parent zone, just look from the current element forward\r\n return Dom.findChildElementDFS(Dom.getAncestorZone(element) || element, Dom.isZone, ElementPosition.First);\r\n }\r\n\r\n /**\r\n * gets the first focusable descendent of the current element\r\n * @param element the current element\r\n */\r\n public static getFirstFocusableDescendent(element: HTMLElement): HTMLElement {\r\n if (!element) {\r\n return null;\r\n }\r\n return Dom.isFocusable(element) ?\r\n element : Dom.getFirstFocusableDescendent(Dom.findChildElementDFS(\r\n element,\r\n Dom.isFocusable || Dom.isZone,\r\n ElementPosition.First));\r\n }\r\n\r\n /**\r\n * gets the last element in a zone\r\n * @param element the element\r\n */\r\n public static getLastElementInZone(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorZoneDFS(element, Dom.isFocusable, ElementPosition.Last);\r\n }\r\n\r\n /**\r\n * gets the first element in a zone\r\n * @param element the element\r\n */\r\n public static getFirstElementInZone(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorZoneDFS(element, Dom.isFocusable, ElementPosition.First);\r\n }\r\n\r\n /**\r\n * gets the next focusable element in the current zone\r\n * @param element the current element\r\n */\r\n public static getNextFocusableElement(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorZoneDFS(element, Dom.isFocusable, ElementPosition.Next);\r\n }\r\n\r\n /**\r\n * gets the previous focusable element in the current zone\r\n * @param element the current element\r\n */\r\n public static getPreviousFocusableElement(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorZoneDFS(element, Dom.isFocusable, ElementPosition.Previous);\r\n }\r\n\r\n /**\r\n * gets the ancestor of an element that has overflow\r\n * @param element the current element\r\n */\r\n public static getOverflowAncestor(element: HTMLElement): HTMLElement {\r\n if (!element) {\r\n return null;\r\n }\r\n\r\n return element.clientHeight < element.scrollHeight || element.clientWidth < element.scrollWidth ?\r\n element : Dom.getOverflowAncestor(<HTMLElement>element.offsetParent);\r\n }\r\n\r\n /**\r\n * gets the ancestor of an element that meets the specified condition\r\n * @param element the current element\r\n * @param condition the function that will check if element meets the desired condition\r\n */\r\n public static getSpecificAncestor(element: HTMLElement, condition: (element: HTMLElement) => boolean): HTMLElement {\r\n if (!element) {\r\n return null;\r\n }\r\n\r\n return condition(element) ? element : Dom.getSpecificAncestor(element.parentElement, condition);\r\n }\r\n\r\n /**\r\n * gets the next focusable element in the current trap\r\n * @param element the current element\r\n */\r\n public static getNextFocusableElementInTrap(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorTrapDFS(element, Dom.isFocusable, ElementPosition.Next);\r\n }\r\n\r\n /**\r\n * gets the previous focusable element in the current trap\r\n * @param element the current element\r\n */\r\n public static getPreviousFocusableElementInTrap(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorTrapDFS(element, Dom.isFocusable, ElementPosition.Previous);\r\n }\r\n\r\n /**\r\n * true if given element is a body element\r\n * @param element the element\r\n */\r\n public static isBody(element: HTMLElement): boolean {\r\n return element.tagName === 'BODY';\r\n }\r\n\r\n /**\r\n * true if the given element is a zone\r\n * @param element the element\r\n */\r\n public static isZone(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n return Dom.hasZoneRole(element)\r\n || Dom.isSmeFocusZone(element)\r\n || Dom.hasZoneTag(element)\r\n || Dom.isGrowlWithChild(element)\r\n || (Dom.isFocusableFormElement(element) && !Dom.isInZoneWithinForm(element));\r\n }\r\n\r\n /**\r\n * true if the element is a focusable element that is not a zone\r\n * @param element the element\r\n */\r\n public static isFocusableNonZone(element: HTMLElement): boolean {\r\n return !Dom.isZone(element) && Dom.isFocusable(element);\r\n }\r\n\r\n /**\r\n * true if the element is an input, select, or textarea without a form parent\r\n * @param element the element\r\n */\r\n public static isInputWithoutForm(element: HTMLElement): boolean {\r\n const inputTags = ['INPUT', 'SELECT', 'TEXTAREA'];\r\n return inputTags.some(tag => tag === element.tagName) && Dom.getAncestorForm(element) === null;\r\n }\r\n\r\n /**\r\n * true if the element has a role that qualifies as a zone\r\n * @param element the element\r\n */\r\n public static hasZoneRole(element: HTMLElement): boolean {\r\n const role = element.getAttribute('role');\r\n const zoneRoles = ['grid', 'tablist', 'table', 'menubar', 'navigation', 'dialog'];\r\n return zoneRoles.some(zoneRole => zoneRole === role);\r\n }\r\n\r\n /**\r\n * true if the element has class=\"sme-focus-zone\"\r\n * @param element the element\r\n */\r\n public static isSmeFocusZone(element: HTMLElement): boolean {\r\n return element.classList.contains('sme-focus-zone');\r\n }\r\n\r\n /**\r\n * true if the element has a tag that is a zone\r\n * @param element the element\r\n */\r\n public static hasZoneTag(element: HTMLElement): boolean {\r\n // TODO: utilities should not know about specific sme tags.\r\n // These tags should instead use the appropriate roles to identify them as focus zones.\r\n const tag = element.tagName;\r\n const zoneTags = ['SME-BREADCRUMB-HEADER', 'SME-DETAILS', 'SME-SETTINGS-FOOTER'];\r\n return zoneTags.some(zoneTag => zoneTag === tag);\r\n }\r\n\r\n /**\r\n * true if element has role 'tablist'\r\n * @param element the html element\r\n */\r\n public static isTablist(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n const role = element.getAttribute('role');\r\n return role === 'tablist';\r\n }\r\n\r\n /**\r\n * Returns true if element is active\r\n * An element is active if it aria-selected attribute is set as true or has active or sme-active classes\r\n * @param element the html element\r\n */\r\n public static isActiveOrSelected(element: HTMLHtmlElement): boolean {\r\n const ariaSelected = element.getAttribute('aria-selected') === 'true';\r\n const activeClasses = ['active', 'sme-active'];\r\n return ariaSelected || activeClasses.some(className => element.classList.contains(className));\r\n }\r\n\r\n /**\r\n * Returns first active or selected descendant or null if none is found\r\n * @param element the html element\r\n */\r\n public static getFirstActiveOrSelectedDescendant(element: HTMLElement): HTMLElement | null {\r\n return Dom.findChildElementDFS(element, Dom.isActiveOrSelected, ElementPosition.First);\r\n }\r\n\r\n /**\r\n * true if the element is a growl with a child\r\n * @param element the element\r\n */\r\n public static isGrowlWithChild(element: HTMLElement): boolean {\r\n return element.classList.contains('sme-layout-notification-popup-list') && element.childElementCount > 0;\r\n }\r\n\r\n /**\r\n * true if element is focusable element within a form\r\n * @param element the element\r\n */\r\n public static isFocusableFormElement(element: HTMLElement): boolean {\r\n return !!Dom.getAncestorForm(element) && Dom.isFocusable(element);\r\n }\r\n\r\n /**\r\n * true is element is within a zone that is within a form\r\n * @param element the element\r\n */\r\n public static isInZoneWithinForm(element: HTMLElement) {\r\n return Dom.getAncestorForm(Dom.getAncestorZone(element.parentElement)) !== null;\r\n }\r\n\r\n /**\r\n * true is element is within a trap that is within a form\r\n * @param element the element\r\n */\r\n public static isInTrapWithinForm(element: HTMLElement) {\r\n return Dom.getAncestorForm(Dom.getAncestorTrap(element.parentElement)) !== null;\r\n }\r\n\r\n /**\r\n * true if the given element is a trap\r\n * @param element the element\r\n */\r\n public static isTrap(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n const role = element.getAttribute('role');\r\n const trapRoles = ['dialog', 'alertdialog'];\r\n return trapRoles.some(trapRole => trapRole === role) || element.classList.contains('sme-focus-trap');\r\n }\r\n\r\n /**\r\n * return true if element is a form\r\n * @param element the element\r\n */\r\n public static isForm(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n return element.tagName === 'FORM';\r\n }\r\n\r\n /**\r\n * return true if we are inside a search box that has its own arrow key controls\r\n * @param element the element\r\n * @param isRightArrow the right arrow was clicked\r\n */\r\n public static useArrowKeysWithinSearchbox(element: HTMLElement, isRightArrow: boolean): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n if (Dom.isSearchBox(element)) {\r\n const inputElement = element as any;\r\n const innerTextLength = inputElement.value ? inputElement.value.length : 0;\r\n return (!isRightArrow && inputElement.selectionStart !== null && inputElement.selectionStart > 0)\r\n || (isRightArrow && inputElement.selectionEnd !== null && inputElement.selectionEnd < innerTextLength);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * true if given element is a search box\r\n * @param element the element\r\n */\r\n public static isSearchBox(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n const inputElement = element as HTMLInputElement;\r\n return element.tagName === 'INPUT' && inputElement && inputElement.type === 'search';\r\n }\r\n\r\n /**\r\n * true if given element is a textbox in a combobox\r\n * @param element the element\r\n */\r\n public static isTextBoxInComboBox(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n return !!(Dom.getAncestor(element, htmlElement => {\r\n return htmlElement.classList.contains('sme-combobox-header');\r\n }));\r\n }\r\n\r\n /**\r\n * returns the next row in the current table\r\n * @param element the current element\r\n */\r\n public static getNextRowInTable(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorZoneDFS(element, Dom.isTableRow, ElementPosition.Next);\r\n }\r\n\r\n /**\r\n * returns the previous row in the current table\r\n * @param element the current element\r\n */\r\n public static getPreviousRowInTable(element: HTMLElement): HTMLElement {\r\n return Dom.findElementFromAncestorZoneDFS(element, Dom.isTableRow, ElementPosition.Previous);\r\n }\r\n\r\n /**\r\n * returns true if the current element is a table row\r\n * @param element the current element\r\n */\r\n public static isTableRow(element: HTMLElement): boolean {\r\n return element.tagName === 'TR';\r\n }\r\n\r\n /**\r\n * returns true if the current element is a table cell\r\n * @param element the current element\r\n */\r\n public static isTableCell(element: HTMLElement): boolean {\r\n return element.tagName === 'TD';\r\n }\r\n\r\n /**\r\n * returns true if the current element is inside a table cell\r\n * @param element the current element\r\n */\r\n public static isInTableCell(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n return Dom.isTableCell(element) ? true : Dom.isInTableCell(element.parentElement);\r\n }\r\n\r\n /**\r\n * Gets the first action bar on the screen.\r\n * @param element The HTML element.\r\n * @returns The first action bar on the screen.\r\n */\r\n public static getFirstActionBar(element: HTMLElement): HTMLElement {\r\n return this.getActionBar(element, ElementPosition.First);\r\n }\r\n\r\n /**\r\n * Gets the next action bar on the screen.\r\n * @param element The HTML element.\r\n * @returns The first action bar on the screen.\r\n */\r\n public static getNextActionBar(element: HTMLElement): HTMLElement {\r\n return this.getActionBar(element, ElementPosition.Next);\r\n }\r\n\r\n /**\r\n * Gets a specified action bar.\r\n * @param element The HTML element.\r\n * @param position The position of the desired action bar.\r\n * @returns The specified action bar, if possible.\r\n */\r\n public static getActionBar(element: HTMLElement, position: ElementPosition): HTMLElement {\r\n const actionBar = Dom.findElementFromRootDFS(\r\n Dom.getAncestorZone(element),\r\n (x) => Dom.isActionBar(x) && !MsftSme.isNullOrUndefined(Dom.getFirstFocusableDescendent(x)),\r\n position\r\n );\r\n\r\n return Dom.getFirstFocusableDescendent(actionBar);\r\n }\r\n\r\n /**\r\n * Determines if the HTML element is inside of an action bar.\r\n * @param element The HTML element.\r\n * @returns True if the HTML element is in an action bar and false if not.\r\n */\r\n public static isInActionBar(element: HTMLElement): boolean {\r\n return MsftSme.isNullOrUndefined(Dom.getSpecificAncestor(element, (x) => Dom.isActionBar(x))) ? false : true;\r\n }\r\n\r\n /**\r\n * Determines if the HTML element is an action bar.\r\n * @param element The HTML element.\r\n * @returns True if the element is an action bar and false if not.\r\n */\r\n public static isActionBar(element: HTMLElement): boolean {\r\n return MsftSme.isNullOrUndefined(element) ? false : element.getAttribute('role') === 'menubar'\r\n && !MsftSme.isNullOrUndefined(element.parentElement) && element.parentElement.tagName === 'SME-ACTION-BAR';\r\n }\r\n\r\n /**\r\n * Determines if we should treat enter as click for a certain element\r\n * @param element The HTML element to check\r\n */\r\n public static shouldTreatEnterAsClick(element: HTMLElement): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n const inputElement = element as HTMLInputElement;\r\n // TODO: More types of elements may be added here\r\n const isFileUploadControl = element.tagName === 'INPUT' && inputElement && inputElement.type === 'file';\r\n const isInDataTable = !!Dom.getAncestor(element, e => e.tagName === 'SME-DATA-TABLE');\r\n\r\n return isFileUploadControl || isInDataTable;\r\n }\r\n\r\n /**\r\n * Check tab list aria-selected with active status\r\n */\r\n public static checkActiveTab(): void {\r\n const tablists = document.querySelectorAll('[role=\\'tablist\\']');\r\n for (const tablist of Array.from(tablists)) {\r\n // As all controls should, the <sme-pivot> handles accessibility internally.\r\n if (tablist.parentElement.tagName !== 'SME-PIVOT') {\r\n Dom.updateAriaSelect(tablist as HTMLElement, false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update tab aria-selected status\r\n * @param element The HTML element.\r\n * @param isActive The HTML element is active or inactive.\r\n */\r\n public static updateAriaSelect(currentElement: HTMLElement, isActive: boolean): void {\r\n if (!currentElement) {\r\n return;\r\n }\r\n if (currentElement.classList.contains('active') || currentElement.classList.contains('sme-active')) {\r\n isActive = true;\r\n }\r\n if (currentElement.getAttribute('aria-selected') && !isActive) {\r\n currentElement.setAttribute('aria-selected', 'false');\r\n }\r\n if (currentElement.getAttribute('role') === 'tab' && isActive) {\r\n currentElement.setAttribute('aria-selected', 'true');\r\n }\r\n for (const childElement of Array.from(currentElement.children)) {\r\n Dom.updateAriaSelect(childElement as HTMLElement, isActive);\r\n }\r\n }\r\n\r\n /**\r\n * @param element Element whose focus origin we are trying to determine\r\n * @returns The element to focus on\r\n */\r\n public static getFocusOrigin(element: HTMLElement): HTMLElement {\r\n if (!element) {\r\n return;\r\n }\r\n\r\n if (Dom.isFocusable(element)) {\r\n return element;\r\n }\r\n\r\n // return previous focusable element in zone if it exist\r\n return Dom.getPreviousFocusableElement(element) ||\r\n\r\n // return next focusable element in zone if it exists and there is no previous element\r\n Dom.getNextFocusableElement(element) ||\r\n\r\n // return the first focusable element in the previous zone if it exists and there is not a next zone\r\n Dom.getPreviousZoneElement(element) ||\r\n\r\n // return the first focusable element in the next zone if it exists\r\n Dom.getNextZoneElement(element);\r\n }\r\n}\r\n\r\n/**\r\n * describes the position of the desired element in a list of elements\r\n */\r\nexport enum ElementPosition {\r\n First = 0,\r\n Previous = 1,\r\n Next = 2,\r\n Last = 3\r\n}\r\n"]}
|