UNPKG

@ui-tool/core

Version:
1 lines 315 kB
{"version":3,"file":"ui-tool-core.mjs","sources":["../../../../../libs/core/src/constants/injectors/common-validator-injectors.ts","../../../../../libs/core/src/constants/injectors/injectors.ts","../../../../../libs/core/src/constants/injectors/multiple-validation-summarizer-injectors.ts","../../../../../libs/core/src/constants/injectors/validation-summarizer-injectors.ts","../../../../../libs/core/src/constants/built-in-validation-message.constant.ts","../../../../../libs/core/src/constants/dialog-result.constant.ts","../../../../../libs/core/src/constants/dialog-builder-exception.constant.ts","../../../../../libs/core/src/constants/dialog-kind.constant.ts","../../../../../libs/core/src/constants/smart-navigator-exceptions.ts","../../../../../libs/core/src/constants/spinner-commands.ts","../../../../../libs/core/src/constants/stack-item-events.ts","../../../../../libs/core/src/enums/visibilities.ts","../../../../../libs/core/src/models/implementations/dialog-settings/confirmation-dialog-settings.ts","../../../../../libs/core/src/models/implementations/dialog-settings/error-dialog-settings.ts","../../../../../libs/core/src/models/implementations/dialog-settings/info-dialog-settings.ts","../../../../../libs/core/src/models/implementations/dialog-settings/warning-dialog-settings.ts","../../../../../libs/core/src/models/implementations/dialogs/basic-dialog-button.ts","../../../../../libs/core/src/models/implementations/dialogs/dialog-result.ts","../../../../../libs/core/src/models/implementations/dialogs/template-dialog-button.ts","../../../../../libs/core/src/models/implementations/smart-navigators/navigate-to-screen-request.ts","../../../../../libs/core/src/models/implementations/spinners/delete-spinner-command.ts","../../../../../libs/core/src/models/implementations/spinners/display-spinner-command.ts","../../../../../libs/core/src/models/implementations/spinners/display-spinner-options.ts","../../../../../libs/core/src/models/implementations/spinners/purge-spinner-command.ts","../../../../../libs/core/src/models/implementations/stacks/stack-item-options.ts","../../../../../libs/core/src/models/implementations/stacks/stack-item-deleted-event.ts","../../../../../libs/core/src/models/implementations/stacks/stack-item-pushed-event.ts","../../../../../libs/core/src/models/implementations/validation-summarizers/validation-item-build-context.ts","../../../../../libs/core/src/models/implementations/validation-summarizers/validation-message.ts","../../../../../libs/core/src/models/implementations/asset/asset-file.ts","../../../../../libs/core/src/models/implementations/asset/js-script-file.ts","../../../../../libs/core/src/models/implementations/asset/css-file.ts","../../../../../libs/core/src/models/implementations/asset/asset-load-result.ts","../../../../../libs/core/src/models/html-content.ts","../../../../../libs/core/src/models/index.ts","../../../../../libs/core/src/modules/banner/banner.component.ts","../../../../../libs/core/src/modules/banner/banner.component.html","../../../../../libs/core/src/services/implementations/banners/banner.service.ts","../../../../../libs/core/src/services/implementations/window.service.ts","../../../../../libs/core/src/constants/injectors/internal-injectors.ts","../../../../../libs/core/src/factories/banner.factory.ts","../../../../../libs/core/src/modules/banner/banner.module.ts","../../../../../libs/core/src/modules/sentinel/requirement-sentinel/constants/requirement-sentinel-exception-codes.ts","../../../../../libs/core/src/modules/sentinel/requirement-sentinel/constants/requirement-sentinel-exception-types.ts","../../../../../libs/core/src/modules/sentinel/requirement-sentinel/interfaces/external-requirement-sentinel.exception.ts","../../../../../libs/core/src/modules/sentinel/requirement-sentinel/interfaces/internal-requirement-sentinel.exception.ts","../../../../../libs/core/src/modules/sentinel/requirement-sentinel/requirement-sentinel.directive.ts","../../../../../libs/core/src/modules/sentinel/requirement-sentinel/requirement-sentinel.service.ts","../../../../../libs/core/src/factories/requirement-sentinel.factory.ts","../../../../../libs/core/src/modules/sentinel/requirement-sentinel/requirement-sentinel.module.ts","../../../../../libs/core/src/modules/sentinel/feature-sentinel/feature-sentinel.directive.ts","../../../../../libs/core/src/modules/sentinel/feature-sentinel/feature-sentinel.module.ts","../../../../../libs/core/src/modules/sentinel/role-sentinel/role-sentinel.directive.ts","../../../../../libs/core/src/modules/sentinel/role-sentinel/role-sentinel.module.ts","../../../../../libs/core/src/services/implementations/smart-navigator.service.ts","../../../../../libs/core/src/pipes/smart-navigators/to-raw-url.pipe.ts","../../../../../libs/core/src/pipes/smart-navigators/to-url-tree.pipe.ts","../../../../../libs/core/src/pipes/smart-navigators/to-url.pipe.ts","../../../../../libs/core/src/modules/smart-navigator/smart-navigator.module.ts","../../../../../libs/core/src/modules/spinner/basic-spinner/basic-spinner.component.ts","../../../../../libs/core/src/modules/spinner/basic-spinner/basic-spinner.component.html","../../../../../libs/core/src/modules/spinner/spinner-container.component.ts","../../../../../libs/core/src/services/implementations/spinners/spinner.service.ts","../../../../../libs/core/src/modules/spinner/spinner-container.module.ts","../../../../../libs/core/src/modules/spinner/index.ts","../../../../../libs/core/src/services/implementations/stacks/stack.service.ts","../../../../../libs/core/src/modules/stack/stack-service.module.ts","../../../../../libs/core/src/modules/validator/common-validator/validation-summarizer-directive/validator-class-base.ts","../../../../../libs/core/src/modules/validator/common-validator/validation-summarizer-directive/validator-control-watch.directive.ts","../../../../../libs/core/src/modules/validator/common-validator/validation-summarizer-directive/with-invalid-validator-class-in-form-control.directive.ts","../../../../../libs/core/src/modules/validator/common-validator/validation-summarizer-directive/with-invalid-validator-class-not-form-control.directive.ts","../../../../../libs/core/src/services/implementations/validators/validation-summarizers/validation-summarizer-base.service.ts","../../../../../libs/core/src/services/implementations/validators/validation-summarizers/validation-summarizer.service.ts","../../../../../libs/core/src/providers/implementations/validation-summarizer-option.provider.ts","../../../../../libs/core/src/factories/common-validator.factory.ts","../../../../../libs/core/src/modules/validator/common-validator/common-validator.module.ts","../../../../../libs/core/src/modules/validator/multiple-validation-summarizer/directives/multiple-validation-summarizer-item-context.directive.ts","../../../../../libs/core/src/constants/internal-exception-codes.ts","../../../../../libs/core/src/modules/validator/validation-summarizer/validation-summarizer-item/validation-summarizer-item.directive.ts","../../../../../libs/core/src/pipes/sanitizers/to-trusted-html/to-trusted-html.pipe.ts","../../../../../libs/core/src/modules/validator/validation-summarizer/validation-summarizer.component.ts","../../../../../libs/core/src/modules/validator/validation-summarizer/validation-summarizer.component.html","../../../../../libs/core/src/modules/validator/multiple-validation-summarizer/multiple-validation-summarizer.component.ts","../../../../../libs/core/src/modules/validator/multiple-validation-summarizer/multiple-validation-summarizer.component.html","../../../../../libs/core/src/services/implementations/validators/multiple-validation-summarizers/multiple-validation-summarizer.service.ts","../../../../../libs/core/src/factories/multiple-validation-summarizer.factory.ts","../../../../../libs/core/src/factories/validation-summarizer.factory.ts","../../../../../libs/core/src/pipes/sanitizers/to-trusted-html/to-trusted-html-pipe.module.ts","../../../../../libs/core/src/pipes/sanitizers/to-trusted-resource-url/to-trusted-resource-url.pipe.ts","../../../../../libs/core/src/pipes/sanitizers/to-trusted-resource-url/to-trusted-resource-url-pipe.module.ts","../../../../../libs/core/src/pipes/sanitizers/to-trusted-script/to-trusted-script.pipe.ts","../../../../../libs/core/src/pipes/sanitizers/to-trusted-script/to-trusted-script-pipe.module.ts","../../../../../libs/core/src/pipes/sanitizers/to-trusted-style/to-trusted-style.pipe.ts","../../../../../libs/core/src/pipes/sanitizers/to-trusted-style/to-trusted-style-pipe.module.ts","../../../../../libs/core/src/pipes/sanitizers/to-trusted-url/to-trusted-url.pipe.ts","../../../../../libs/core/src/pipes/sanitizers/to-trusted-url/to-trusted-url-pipe.module.ts","../../../../../libs/core/src/modules/validator/validation-summarizer/validation-summarizer.module.ts","../../../../../libs/core/src/modules/validator/multiple-validation-summarizer/multiple-validation-summarizer.module.ts","../../../../../libs/core/src/modules/validator/pipes/has-validators/has-any-validators.pipe.ts","../../../../../libs/core/src/factories/has-any-validators-pipe.factory.ts","../../../../../libs/core/src/modules/validator/pipes/has-validators/has-any-validators.module.ts","../../../../../libs/core/src/modules/window-accessor/window-accessor.module.ts","../../../../../libs/core/src/services/implementations/dialog.service.ts","../../../../../libs/core/src/services/implementations/default-screen-code.resolver.ts","../../../../../libs/core/src/services/implementations/asset/asset.service.ts","../../../../../libs/core/src/services/interfaces/index.ts","../../../../../libs/core/src/modules/asset/asset-service.module.ts","../../../../../libs/core/src/modules/index.ts","../../../../../libs/core/src/public-api.ts","../../../../../libs/core/src/ui-tool-core.ts"],"sourcesContent":["// Multiple validation summarizer\nimport {InjectionToken} from '@angular/core';\nimport {IValidationSummarizerService} from '../../services/interfaces/validation-summarizers/validation-summarizer-service.interface';\nimport {IValidationSummarizerOptions} from '../../models/interfaces/validation-summarizers/validation-summarizer-options.interface';\nimport {IValidationSummarizerOptionProvider} from '../../providers/interfaces/validation-summarizer-options-provider.interface';\nimport {\n ICommonValidatorModuleOptionProvider\n} from '../../providers/interfaces/common-validator-module-option-provider.interface';\n\nexport const COMMON_VALIDATOR_SERVICE = new InjectionToken<IValidationSummarizerService>('COMMON_VALIDATOR_SERVICE');\nexport const COMMON_VALIDATOR_OPTIONS = new InjectionToken<IValidationSummarizerOptions>('COMMON_VALIDATOR_OPTIONS');\nexport const COMMON_VALIDATOR_OPTIONS_PROVIDER =\n new InjectionToken<ICommonValidatorModuleOptionProvider>('COMMON_VALIDATOR_OPTIONS_PROVIDER');\n","import {InjectionToken} from '@angular/core';\nimport {ISpinnerService} from '../../services/interfaces/spinner-service.interface';\nimport {IBannerService} from '../../services/interfaces/banners/banner-service.interface';\nimport {ISmartNavigatorService} from '../../services/interfaces/smart-navigator-service.interface';\nimport {IBannerContentBuilder} from '../../services/interfaces/banners/banner-content-builder.interface';\nimport {IDialogBuilder} from '../../services/interfaces/dialogs/dialog-builder.interface';\nimport {IScreenCodeResolver} from '../../services/interfaces/screen-code-resolver.interface';\nimport {\n IMeetRequirementService\n} from '../../modules/sentinel/requirement-sentinel/requirement-sentinel-service.interface';\nimport {IRoleSentinelService} from '../../modules/sentinel/role-sentinel/role-sentinel-service.interface';\nimport {IRequirementHandler} from '../../modules/sentinel/requirement-sentinel/requirement-handler.interface';\nimport {IFeatureSentinelService} from '../../modules/sentinel/feature-sentinel/feature-sentinel-service.interface';\nimport {IDialogService} from '../../services/interfaces/dialogs/dialog-service.interface';\nimport {DisplaySpinnerOptions} from '../../models';\nimport {IStackService} from '../../services/interfaces/stack-service.interface';\nimport {IAssetService} from '../../services';\n\n// Spinner providers.\nexport const SPINNER_SERVICE = new InjectionToken<ISpinnerService>('SPINNER_SERVICE');\nexport const SPINNER_METHOD_INVOKE_CALLBACK = new InjectionToken<(methodName: string, payload: any) => void>('SPINNER_METHOD_INVOKE_CALLBACK');\nexport const SPINNER_REQUEST_ID = new InjectionToken<string>('SPINNER_REQUEST_ID');\nexport const SPINNER_HOST = new InjectionToken<string>('SPINNER_HOST');\nexport const DISPLAY_SPINNER_OPTIONS = new InjectionToken<DisplaySpinnerOptions>('DISPLAY_SPINNER_OPTIONS');\n\n// Banner providers.\nexport const BANNER_SERVICE = new InjectionToken<IBannerService>('BANNER_SERVICE');\nexport const BANNER_BUILDER = new InjectionToken<IBannerContentBuilder>('BANNER_BUILDER');\n\n// Smart navigator providers.\nexport const SMART_NAVIGATOR_SERVICE = new InjectionToken<ISmartNavigatorService>('SMART_NAVIGATOR_SERVICE');\nexport const SMART_NAVIGATOR_ROUTES = new InjectionToken<{ [key: string]: string }>('SMART_NAVIGATOR_ROUTES');\nexport const SMART_NAVIGATOR_SCREEN_CODE_RESOLVER = new InjectionToken<IScreenCodeResolver>('SMART_NAVIGATOR_SCREEN_CODE_RESOLVER');\n\n// Dialog providers.\nexport const DIALOG_BUILDER = new InjectionToken<IDialogBuilder>('DIALOG_BUILDER');\nexport const DIALOG_SERVICE = new InjectionToken<IDialogService>('DIALOG_SERVICE');\n\n// Windows provider.\nexport const WINDOW = new InjectionToken('WINDOW');\n\n// Sentinel providers\nexport const REQUIREMENT_SENTINEL_SERVICE = new InjectionToken<IMeetRequirementService>('REQUIREMENT_SENTINEL_SERVICE');\nexport const REQUIREMENT_SENTINEL_EXCEPTION_PROCESSOR = new InjectionToken<IMeetRequirementService>('REQUIREMENT_SENTINEL_EXCEPTION_PROCESSOR');\nexport const REQUIREMENT_HANDLER = new InjectionToken<IRequirementHandler>('REQUIREMENT_HANDLER');\n\nexport const FEATURE_SENTINEL_SERVICE = new InjectionToken<IFeatureSentinelService>('FEATURE_SENTINEL_SERVICE');\nexport const ROLE_SENTINEL_SERVICE =\n new InjectionToken<IRoleSentinelService>('ROLE_SENTINEL_SERVICE');\n\nexport const STACK_SERVICE = new InjectionToken<IStackService>('STACK_SERVICE');\n\nexport const ASSET_SERVICE = new InjectionToken<IAssetService>('ASSET_SERVICE');\n","// Multiple validation summarizer\nimport {InjectionToken} from '@angular/core';\nimport {IValidationSummarizerService} from '../../services/interfaces/validation-summarizers/validation-summarizer-service.interface';\nimport {IValidationSummarizerOptions} from '../../models/interfaces/validation-summarizers/validation-summarizer-options.interface';\nimport {IValidationSummarizerOptionProvider} from '../../providers/interfaces/validation-summarizer-options-provider.interface';\n\nexport const MULTIPLE_VALIDATION_SUMMARIZER_SERVICE = new InjectionToken<IValidationSummarizerService>('MULTIPLE_VALIDATION_SUMMARIZER_SERVICE');\nexport const MULTIPLE_VALIDATION_SUMMARIZER_OPTIONS = new InjectionToken<IValidationSummarizerOptions>('MULTIPLE_VALIDATION_SUMMARIZER_OPTIONS_PROVIDER');\nexport const MULTIPLE_VALIDATION_SUMMARIZER_OPTIONS_PROVIDER = new InjectionToken<IValidationSummarizerOptionProvider>('MULTIPLE_VALIDATION_SUMMARIZER_OPTIONS_PROVIDER');\n","// Validation summarizer providers.\nimport {InjectionToken} from '@angular/core';\nimport {\n IValidationSummarizerService\n} from '../../services/interfaces/validation-summarizers/validation-summarizer-service.interface';\nimport {\n IValidationSummarizerItemTemplateBuilder\n} from '../../services/interfaces/validation-summarizers/validation-summarizer-item-template-builder.interface';\nimport {IValidationSummarizerOptionProvider} from '../../providers/interfaces/validation-summarizer-options-provider.interface';\n\nexport const VALIDATION_SUMMARIZER_SERVICE = new InjectionToken<IValidationSummarizerService>('VALIDATION_SUMMARIZER_PROVIDER');\nexport const VALIDATION_ITEM_TEMPLATE_BUILDERS =\n new InjectionToken<IValidationSummarizerItemTemplateBuilder[]>('VALIDATION_ITEM_TEMPLATE_BUILDERS_PROVIDER');\nexport const VALIDATION_SUMMARIZER_OPTIONS_PROVIDER = new InjectionToken<IValidationSummarizerOptionProvider>('VALIDATION_SUMMARIZER_OPTION_PROVIDER');\n","// Key-value which is used for mapping validation error with its actual display.\nexport const builtInValidationMessages: {[name: string]: string; } = {\n required: 'MSG_VALIDATION_PROPERTY_REQUIRED',\n min: 'MSG_VALIDATION_PROPERTY_MIN',\n max: 'MSG_VALIDATION_PROPERTY_MAX',\n minlength: 'MSG_VALIDATION_PROPERTY_MIN_LENGTH',\n maxlength: 'MSG_VALIDATION_PROPERTY_MAX_LENGTH',\n pattern: 'MSG_VALIDATION_PROPERTY_PATTERN',\n email: 'MSG_VALIDATION_PROPERTY_EMAIL'\n};\n","export class DialogResultConstant {\n\n //#region Properties\n\n public static readonly reject = 'DISMISS';\n\n public static readonly resolve = 'MANUALLY_CLOSED';\n\n //#endregion\n\n}\n","export class DialogBuilderExceptionConstant {\n\n //#region Properties\n\n public static readonly invalidDialogSettings = 'INVALID_DIALOG_SETTINGS';\n\n //#endregion\n}\n","export class DialogKindConstant {\n\n //#region Properties\n\n public static readonly confirmation = 'confirmation';\n\n public static readonly error = 'error';\n\n public static readonly info = 'info';\n\n public static readonly warning = 'warning';\n\n //#endregion\n\n}\n","export class SmartNavigatorExceptions {\n\n //#region Properties\n\n public static readonly invalidScreenCode = 'INVALID_SCREEN_CODE';\n\n public static readonly invalidNavigationRequest = 'INVALID_NAVIGATION_REQUEST';\n\n public static readonly screenCodeMappingNotFound = 'SCREEN_CODE_MAPPING_NOT_FOUND';\n\n public static readonly urlNotFound = 'SCREEN_URL_NOT_FOUND';\n\n //#endregion\n\n}\n","export class SpinnerCommands {\n\n //#region Properties\n\n public static readonly display = 'DISPLAY_SPINNER';\n\n public static readonly close = 'CLOSE_SPINNER';\n\n public static readonly purge = 'PURGE_SPINNER';\n\n //#endregion\n\n}\n","export enum StackItemEvents {\n ITEM__DELETED = 'ITEM__DELETED',\n ITEM__PUSHED = 'ITEM__PUSHED'\n}\n","export enum Visibilities {\n hidden,\n visible\n}\n","import {IDialogSettings} from '../../interfaces/dialogs/dialog-settings.interface';\nimport {IDialogButton} from '../../interfaces';\nimport {HtmlContent} from '../../html-content';\nimport {Injector, TemplateRef} from '@angular/core';\nimport {DialogKindConstant} from '../../../constants/dialog-kind.constant';\n\nexport class ConfirmationDialogSettings implements IDialogSettings {\n\n //#region Properties\n\n public readonly kind: string;\n\n public message: string | HtmlContent | TemplateRef<any>;\n\n public icon?: HtmlContent | TemplateRef<any>;\n\n public backdropClasses: string[];\n\n public buttons: IDialogButton[];\n\n public centered: boolean;\n\n public dialogClasses: string[];\n\n public disableClose: boolean;\n\n public injector?: Injector;\n\n public title: string | HtmlContent | TemplateRef<any>;\n\n //#endregion\n\n\n //#region Constructor\n\n public constructor(message: string | HtmlContent | TemplateRef<any>,\n title?: string | HtmlContent | TemplateRef<any>,\n icon?: HtmlContent | TemplateRef<any>,\n injector?: Injector) {\n this.kind = DialogKindConstant.confirmation;\n this.message = message;\n this.title = title || '';\n this.icon = icon;\n this.injector = injector;\n\n this.backdropClasses = [];\n this.buttons = [];\n this.centered = true;\n this.dialogClasses = [];\n this.disableClose = false;\n }\n\n //#endregion\n\n}\n","import {IDialogSettings} from '../../interfaces/dialogs/dialog-settings.interface';\nimport {HtmlContent} from '../../html-content';\nimport {Injector, TemplateRef} from '@angular/core';\nimport {DialogKindConstant} from '../../../constants/dialog-kind.constant';\nimport {IDialogButton} from '../../interfaces';\n\n// tslint:disable-next-line:no-empty-interface\nexport class ErrorDialogSettings implements IDialogSettings {\n\n //#region Properties\n\n public readonly kind: string;\n\n public message: string | HtmlContent | TemplateRef<any>;\n\n public icon?: HtmlContent | TemplateRef<any>;\n\n public backdropClasses: string[];\n\n public buttons: IDialogButton[];\n\n public centered: boolean;\n\n public dialogClasses: string[];\n\n public disableClose: boolean;\n\n public injector?: Injector;\n\n public title: string | HtmlContent | TemplateRef<any>;\n\n //#endregion\n\n\n //#region Constructor\n\n public constructor(message: string | HtmlContent | TemplateRef<any>,\n title?: string | HtmlContent | TemplateRef<any>,\n icon?: HtmlContent | TemplateRef<any>,\n injector?: Injector) {\n this.kind = DialogKindConstant.error;\n this.message = message;\n this.title = title || '';\n this.icon = icon;\n this.injector = injector;\n\n this.backdropClasses = [];\n this.buttons = [];\n this.centered = true;\n this.dialogClasses = [];\n this.disableClose = false;\n }\n\n //#endregion\n}\n","import {IDialogSettings} from '../../interfaces/dialogs/dialog-settings.interface';\nimport {HtmlContent} from '../../html-content';\nimport {Injector, TemplateRef} from '@angular/core';\nimport {DialogKindConstant} from '../../../constants/dialog-kind.constant';\nimport {IDialogButton} from '../../interfaces';\n\n// tslint:disable-next-line:no-empty-interface\nexport class InfoDialogSettings implements IDialogSettings {\n\n //#region Properties\n\n public readonly kind: string;\n\n public message: string | HtmlContent | TemplateRef<any>;\n\n public icon?: HtmlContent | TemplateRef<any>;\n\n public backdropClasses: string[];\n\n public buttons: IDialogButton[];\n\n public centered: boolean;\n\n public dialogClasses: string[];\n\n public disableClose: boolean;\n\n public injector?: Injector;\n\n public title: string | HtmlContent | TemplateRef<any>;\n\n //#endregion\n\n\n //#region Constructor\n\n public constructor(message: string | HtmlContent | TemplateRef<any>,\n title?: string | HtmlContent | TemplateRef<any>,\n icon?: HtmlContent | TemplateRef<any>,\n injector?: Injector) {\n this.kind = DialogKindConstant.info;\n this.message = message;\n this.title = title || '';\n this.icon = icon;\n this.injector = injector;\n\n this.backdropClasses = [];\n this.buttons = [];\n this.centered = true;\n this.dialogClasses = [];\n this.disableClose = false;\n }\n\n //#endregion\n}\n","import {IDialogSettings} from '../../interfaces/dialogs/dialog-settings.interface';\nimport {HtmlContent} from '../../html-content';\nimport {Injector, TemplateRef} from '@angular/core';\nimport {DialogKindConstant} from '../../../constants/dialog-kind.constant';\nimport {IDialogButton} from '../../interfaces';\n\nexport class WarningDialogSettings implements IDialogSettings {\n\n //#region Properties\n\n public readonly kind: string;\n\n public message: string | HtmlContent | TemplateRef<any>;\n\n public icon?: HtmlContent | TemplateRef<any>;\n\n public backdropClasses: string[];\n\n public buttons: IDialogButton[];\n\n public centered: boolean;\n\n public dialogClasses: string[];\n\n public disableClose: boolean;\n\n public injector?: Injector;\n\n public title: string | HtmlContent | TemplateRef<any>;\n\n //#endregion\n\n\n //#region Constructor\n\n public constructor(message: string | HtmlContent | TemplateRef<any>,\n title?: string | HtmlContent | TemplateRef<any>,\n icon?: HtmlContent | TemplateRef<any>,\n injector?: Injector) {\n this.kind = DialogKindConstant.warning;\n this.message = message;\n this.title = title || '';\n this.icon = icon;\n this.injector = injector;\n\n this.backdropClasses = [];\n this.buttons = [];\n this.centered = true;\n this.dialogClasses = [];\n this.disableClose = false;\n }\n\n //#endregion\n}\n","import {Observable} from 'rxjs';\nimport {IDialogButton} from '../../interfaces';\nimport {DialogResult} from './dialog-result';\nimport {HtmlContent} from '../../html-content';\nimport {TemplateRef} from '@angular/core';\n\nexport class BasicDialogButton implements IDialogButton {\n\n //#region Properties\n\n public classes?: string[];\n\n // Whether button should be disabled or not.\n public disabledHandler?: () => boolean;\n\n //#endregion\n\n //#region Constructor\n\n public constructor(public content: string | HtmlContent | TemplateRef<any>,\n public clickHandler?: () => boolean | DialogResult<any> | Observable<DialogResult<any>>,\n classes?: string[]) {\n this.classes = classes;\n }\n\n //#endregion\n\n\n}\n","export class DialogResult<T> {\n\n //#region Properties\n\n // tslint:disable-next-line:variable-name\n private readonly _action: string;\n\n // tslint:disable-next-line:variable-name\n private readonly _data: T;\n\n //#endregion\n\n //#region Accessor\n\n // Modal dialog action.\n public get action(): string {\n return this._action;\n }\n\n // Data.\n public get data(): T {\n return this._data;\n }\n\n //#endregion\n\n //#region Constructor\n\n constructor(action: string, data: T) {\n this._action = action;\n this._data = data;\n }\n\n //#endregion\n\n}\n","import {IDialogButton} from '../../interfaces/dialogs/dialog-button.interface';\nimport {TemplateRef} from '@angular/core';\n\nexport class TemplateDialogButton implements IDialogButton {\n\n //#region Properties\n\n public content: TemplateRef<any>;\n\n //#endregion\n\n //#region Constructor\n\n public constructor(content: TemplateRef<any>) {\n this.content = content;\n }\n\n //#endregion\n\n}\n","import {NavigationExtras} from '@angular/router';\n\nexport class NavigateToScreenRequest<T> {\n\n //#region Properties\n\n public code: string;\n\n public readonly routeParams?: T;\n\n public readonly extras?: NavigationExtras;\n\n //#endregion\n\n //#region Constructor\n\n public constructor(code: string,\n routeParams?: T,\n extras?: NavigationExtras) {\n this.code = code;\n this.routeParams = routeParams;\n this.extras = extras;\n }\n\n //#endregion\n\n}\n","import {ISpinnerCommand} from '../../interfaces';\nimport {SpinnerCommands} from '../../../constants/spinner-commands';\n\nexport class DeleteSpinnerCommand implements ISpinnerCommand {\n\n //#region Properties\n\n public readonly kind: string;\n\n // Request to be deleted.\n public id?: string;\n\n // Id of container whose spinner must be deleted.\n public containerId: string;\n\n //#endregion\n\n //#region Constructor\n\n public constructor(containerId: string, id?: string) {\n this.kind = SpinnerCommands.close;\n this.containerId = containerId;\n this.id = id;\n }\n\n //#endregion\n\n}\n","import {ISpinnerCommand} from '../../interfaces';\nimport {SpinnerCommands} from '../../../constants/spinner-commands';\nimport {DisplaySpinnerOptions} from './display-spinner-options';\n\nexport class DisplaySpinnerCommand implements ISpinnerCommand {\n\n //#region Properties\n\n public readonly kind: string;\n\n //#endregion\n\n //#region Constructor\n\n public constructor(public containerId: string,\n public id: string,\n public options?: DisplaySpinnerOptions) {\n this.kind = SpinnerCommands.display;\n }\n\n //#endregion\n\n}\n","import {Type} from '@angular/core';\n\nexport class DisplaySpinnerOptions {\n\n //#region Properties\n\n // Whether previous displayed spinner must be destroyed or not.\n purge?: boolean;\n\n // If no instance type is defined, the default spinner will be used instead.\n instanceType?: Type<any>;\n\n public closing?: () => boolean;\n\n public closed?: (force: boolean) => void;\n\n public invokedMethod?: (methodName: string, payload: any) => void;\n\n public closeText?: string;\n\n //#endregion\n\n}\n","import {ISpinnerCommand} from '../../interfaces';\nimport {SpinnerCommands} from '../../../constants';\n\nexport class PurgeSpinnerCommand implements ISpinnerCommand {\n\n //#region Properties\n\n public readonly kind: string;\n\n //#endregion\n\n //#region Constructor\n\n public constructor(public readonly containerId: string) {\n this.kind = SpinnerCommands.purge;\n }\n\n //#endregion\n\n}\n","export class StackItemOptions {\n\n //#region Properties\n\n // Whether previous item must be destroyed or not.\n public purge?: boolean;\n\n public onItemBeingRemoved?: () => boolean;\n\n //#endregion\n\n}\n","import {IStackItemEvent} from '../../interfaces/stacks/stack-item-event.interface';\nimport {StackItemEvents} from '../../../constants';\n\nexport class StackItemDeletedEvent implements IStackItemEvent {\n\n //#region Properties\n\n public readonly kind: string;\n\n //#endregion\n\n\n //#region Constructor\n\n public constructor(\n public readonly stackCode: string,\n public readonly itemIds: string[]) {\n this.kind = StackItemEvents.ITEM__DELETED;\n this.stackCode = stackCode;\n }\n\n //#endregion\n\n}\n","import {IStackItemEvent} from '../../interfaces';\nimport {StackItemEvents} from '../../../constants';\n\nexport class StackItemPushedEvent implements IStackItemEvent {\n\n //#region Properties\n\n public readonly kind: string;\n\n //#endregion\n\n //#region Constructor\n\n public constructor(\n public readonly stackCode: string,\n public readonly id: string,\n public readonly itemIds: string[]) {\n this.kind = StackItemEvents.ITEM__PUSHED;\n this.stackCode = stackCode;\n this.id = id;\n }\n\n //#endregion\n\n\n}\n","import {ValidationMessage} from './validation-message';\nimport {AbstractControl, NgControl} from '@angular/forms';\n\nexport class ValidationItemBuildContext {\n\n //#region Constructor\n\n public constructor(public readonly containerGroupId: string,\n public readonly label: string | undefined,\n public readonly validationMessage: ValidationMessage | undefined,\n public readonly control: AbstractControl | NgControl | undefined | null) {\n }\n\n //#endregion\n\n}\n","export class ValidationMessage {\n\n //#region Methods\n\n // Property name which is validated.\n public key: string;\n\n // Validation content.\n public content: string;\n\n // Additional value that can be used in validation.\n public readonly additionalValue: { [key: string]: any};\n\n //#endregion\n\n //#region Constructor\n\n public constructor(key: string, content: string) {\n this.key = key;\n this.content = content;\n this.additionalValue = {};\n }\n\n //#endregion\n}\n","export class AssetFile {\n //#region Properties\n\n public readonly kind: 'js-script' | 'css';\n\n public readonly href?: string;\n\n public readonly link?: string;\n\n //#endregion\n\n //#region Properties\n\n public constructor(kind: 'js-script' | 'css') {\n this.kind = kind;\n }\n\n //#endregion\n}\n","import {AssetFile} from './asset-file';\n\nexport class JsScriptFile extends AssetFile {\n\n //#region Constructor\n\n constructor(public readonly link: string) {\n super('js-script');\n }\n\n //#endregion\n}\n","import {AssetFile} from './asset-file';\n\nexport class CssFile extends AssetFile {\n //#region Constructor\n\n public constructor(public readonly href: string) {\n super('css');\n }\n\n //#endregion\n}\n","export class AssetLoadResult {\n //#region Properties\n\n public readonly kind: 'js-script' | 'css';\n\n public successful: boolean;\n\n //#endregion\n\n //#region Properties\n\n public constructor(kind: 'js-script' | 'css') {\n this.kind = kind;\n this.successful = false;\n }\n\n //#endregion\n}\n","export class HtmlContent {\n\n //#region Constructor\n\n public constructor(public content: string) {\n }\n\n //#endregion\n\n}\n","// Implementations export.\nexport * from './implementations/index';\n\n// Interfaces export.\nexport * from './interfaces/index';\n\n// Single classes export.\nexport * from './html-content';\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ComponentFactoryResolver,\n ComponentRef,\n Injector,\n Input,\n OnDestroy,\n ViewChild,\n ViewContainerRef\n} from '@angular/core';\nimport {BANNER_BUILDER, BANNER_SERVICE, WINDOW} from '../../constants/injectors/injectors';\nimport {Observable, of, Subscription, throwError} from 'rxjs';\nimport {NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router, RouterEvent} from '@angular/router';\nimport {filter, map, mergeMap, retryWhen, switchMap, tap} from 'rxjs/operators';\nimport {BANNER_PRESERVE_MODE, BANNER_QUERY_MODE} from '../../constants/data-type.constant';\nimport {findLastIndex} from 'lodash-es';\nimport {IBannerContentBuilder} from '../../services/interfaces/banners/banner-content-builder.interface';\nimport {BannerService} from '../../services/implementations/banners/banner.service';\nimport {IDisplayBannerRequest} from '../../models/interfaces/banners/add-banner-content-request.interface';\nimport {IBannerContentComponent} from '../../models/interfaces/banners/banner-content-component.interface';\nimport {IDeleteBannerRequest} from '../../models/interfaces/banners/delete-banner-content-request.interface';\n\n@Component({\n // tslint:disable-next-line:component-selector\n selector: 'cms-banner',\n templateUrl: 'banner.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class BannerComponent implements AfterViewInit, OnDestroy {\n\n //#region Properties\n\n // Unique id of a banner container.\n @Input()\n public id: string;\n\n // How banner is queried for being displayed.\n // tslint:disable-next-line:no-input-rename\n @Input('query-mode')\n public queryMode: BANNER_QUERY_MODE;\n\n // How banner preserve message.\n // tslint:disable-next-line:no-input-rename\n @Input('preserve-mode')\n public preserveMode: BANNER_PRESERVE_MODE;\n\n // Get the banner container area.\n @ViewChild('container', {read: ViewContainerRef})\n public container: ViewContainerRef | null;\n\n // Request which is currently applied to the banner container.\n // tslint:disable-next-line:variable-name\n private _displayingRequest: IDisplayBannerRequest | null;\n\n // Background task which is for destroying currently displayed banner.\n // tslint:disable-next-line:variable-name\n private _destroyBannerTimer: number | null;\n\n // List of request about banner display.\n // tslint:disable-next-line:variable-name\n private readonly _displayRequests: IDisplayBannerRequest[];\n\n // Subscription watch list.\n // tslint:disable-next-line:variable-name\n private readonly _subscription: Subscription;\n\n //#endregion\n\n //#region Services\n\n // Service for handling banner business.\n protected readonly bannerService: BannerService;\n\n // Component factory resolver.\n protected readonly componentFactoryResolver: ComponentFactoryResolver;\n\n // Router service.\n protected readonly router: Router;\n\n // Window service.\n protected readonly windowService: Window;\n\n // Banner builder.\n protected readonly bannerBuilders: IBannerContentBuilder[];\n\n protected readonly changeDetectorRef: ChangeDetectorRef;\n\n //#endregion\n\n //#region Constructor\n\n public constructor(protected injector: Injector) {\n this.id = '';\n this.queryMode = 'pop';\n this.preserveMode = 'navigate-start-clear';\n this.container = null;\n this._destroyBannerTimer = null;\n this._displayingRequest = null;\n this._displayRequests = [];\n\n // Service reflection.\n this.bannerService = this.injector.get(BANNER_SERVICE) as any as BannerService;\n this.componentFactoryResolver = this.injector.get(ComponentFactoryResolver);\n this.router = this.injector.get(Router);\n this.windowService = this.injector.get(WINDOW) as Window;\n this.bannerBuilders = this.injector.get(BANNER_BUILDER) as any as IBannerContentBuilder[];\n this.changeDetectorRef = this.injector.get(ChangeDetectorRef);\n this._subscription = new Subscription();\n }\n\n //#endregion\n\n //#region Methods\n\n public ngAfterViewInit(): void {\n\n const id = this.id;\n\n // Subscription about banner display requested.\n const displayBannerSubscription = this.bannerService\n .addedRequestEvent\n .subscribe(request => {\n\n // Container is invalid.\n if (!this.container) {\n return;\n }\n\n // Add the request into list.\n this._displayRequests.push(request);\n\n // No banner has been displayed before.\n if (!this._displayingRequest) {\n this.bannerService.displayNextBanner(id);\n }\n });\n this._subscription.add(displayBannerSubscription);\n\n // Subscription which raises when next banner display is requested.\n const nextBannerDisplayRequestSubscription = this.bannerService\n .nextBannerDisplayRequested\n .pipe(\n switchMap(request => {\n\n // Invalid container.\n if (request.containerId && request.containerId !== id) {\n return of(void (0));\n }\n\n if (!request.containerId) {\n return of(void (0));\n }\n\n // Get the next settings.\n const nextRequest = this.queryMode === 'pop' ? this.popRequest(request.containerId)\n : this.dequeueRequest(request.containerId);\n\n if (!nextRequest) {\n // Clear the host view.\n if (this.container) {\n this.container.clear();\n this._displayingRequest = null;\n }\n\n return of(void (0));\n }\n\n return this.displayBannerAsync(nextRequest)\n .pipe(\n map(_ => void (0))\n );\n })\n )\n .subscribe(() => {\n this.changeDetectorRef.markForCheck();\n });\n\n this._subscription.add(nextBannerDisplayRequestSubscription);\n\n // Listen to navigation event.\n const navigationEventSubscription = this.router\n .events\n .pipe(\n filter(e => e instanceof RouterEvent),\n filter(e => (e instanceof NavigationCancel) || (e instanceof NavigationEnd) || (e instanceof NavigationError))\n )\n .subscribe(e => {\n\n if (!this.container) {\n return;\n }\n\n if (((e instanceof NavigationCancel) || (e instanceof NavigationEnd) || (e instanceof NavigationError))\n && this.preserveMode === 'navigate-end-clear') {\n this.container.clear();\n this.changeDetectorRef.markForCheck();\n }\n\n if ((e instanceof NavigationStart)\n && this.preserveMode === 'navigate-start-clear') {\n this.container.clear();\n this.changeDetectorRef.markForCheck();\n }\n });\n this._subscription.add(navigationEventSubscription);\n\n // Hook delete display banner request.\n this.hookDeleteRequestEvent();\n }\n\n // Called when component is destroyed.\n public ngOnDestroy(): void {\n this._subscription?.unsubscribe();\n\n // Clear the previous timeout.\n if (this._destroyBannerTimer) {\n this.windowService.clearTimeout(this._destroyBannerTimer);\n }\n }\n\n //#endregion\n\n //#region Internal methods\n\n protected hookDeleteRequestEvent(): void {\n const deleteRequestSubscription = this.bannerService\n .deleteRequestEvent\n .subscribe(deleteRequest => {\n\n // Container is invalid.\n if (!this.container) {\n return;\n }\n\n let index = 0;\n\n while (index < this._displayRequests.length) {\n\n // Container is invalid.\n if (deleteRequest.containerId && deleteRequest.containerId !== this.id) {\n index++;\n continue;\n }\n\n // Request id is invalid.\n if (deleteRequest.id && deleteRequest.id !== this._displayingRequest?.id) {\n index++;\n continue;\n }\n\n this._displayRequests.splice(index, 1);\n }\n\n if (!this.ableToDeleteDisplayingRequest(deleteRequest)) {\n return;\n }\n\n this.container.clear();\n this._displayingRequest = null;\n this.changeDetectorRef.markForCheck();\n });\n this._subscription.add(deleteRequestSubscription);\n }\n\n // Display banner by handling request.\n protected displayBannerAsync(bannerDisplayRequest: IDisplayBannerRequest): Observable<void> {\n\n // Invalid request.\n if (!bannerDisplayRequest) {\n return of(void (0));\n }\n\n // Request does not belong to the current container.\n if (bannerDisplayRequest.containerId && this.id\n && bannerDisplayRequest.containerId !== this.id) {\n return of(void (0));\n }\n\n const settings = bannerDisplayRequest.settings;\n if (!settings) {\n return of(void (0));\n }\n\n // Clear the previous timeout.\n if (this._destroyBannerTimer) {\n this.windowService.clearTimeout(this._destroyBannerTimer);\n }\n\n let itemIndex = 0;\n const builders = this.bannerBuilders;\n const isNotAbleToBuildException = 'IS_NOT_ABLE_TO_BE_BUILT';\n const noBuilderAvailableException = 'NO_BUILDER_AVAILABLE';\n const maxRetriesExceeded = 'MAX_RETRIES_EXCEEDED';\n\n return of(void (0))\n .pipe(\n tap(_ => {\n if (!builders) {\n throw noBuilderAvailableException;\n }\n\n if (itemIndex > builders.length - 1) {\n throw maxRetriesExceeded;\n }\n }),\n mergeMap(_ => builders[itemIndex].canBuildAsync(bannerDisplayRequest.settings)),\n mergeMap(ableToBuild => {\n if (!ableToBuild) {\n return throwError(isNotAbleToBuildException);\n }\n\n return builders[itemIndex].buildAsync(bannerDisplayRequest.settings)\n .pipe(\n tap((componentRef: ComponentRef<IBannerContentComponent>) => {\n\n if (!this.container) {\n return;\n }\n\n // Update the request.\n this._displayingRequest = bannerDisplayRequest;\n\n const hookDisposeRequest = componentRef.instance\n .disposeRequestingEvent\n .subscribe((_: any) => {\n this.bannerService.displayNextBanner(this.id);\n });\n\n componentRef.onDestroy(() => {\n if (hookDisposeRequest && !hookDisposeRequest.closed) {\n hookDisposeRequest.unsubscribe();\n }\n\n // Mark no request to be displayed.\n this._displayingRequest = null;\n });\n\n // Detect changes.\n componentRef.changeDetectorRef.detectChanges();\n\n this.container.clear();\n this.container.insert(componentRef.hostView);\n\n if (settings.timeout && settings.timeout.duration && settings.timeout.action) {\n this._destroyBannerTimer = this.windowService\n .setTimeout(() => {\n // Do action on timeout.\n if (settings && settings.timeout) {\n settings.timeout.action();\n }\n }, settings.timeout.duration);\n }\n }),\n map(_ => void (0))\n );\n }),\n retryWhen(exceptionObservable => {\n return exceptionObservable\n .pipe(\n tap(exception => {\n if (exception !== isNotAbleToBuildException) {\n throw exception;\n }\n\n itemIndex++;\n })\n );\n })\n );\n\n //#endregion\n }\n\n // Whether displaying request is removable or not.\n protected ableToDeleteDisplayingRequest(deleteRequest: IDeleteBannerRequest): boolean {\n\n if (deleteRequest.containerId && deleteRequest.containerId !== this.id) {\n return false;\n }\n\n if (deleteRequest.id && deleteRequest.id !== this._displayingRequest?.id) {\n return false;\n }\n\n return true;\n }\n\n // Dequeue request.\n protected dequeueRequest(containerId: string): IDisplayBannerRequest | null {\n if (!this._displayRequests || !this._displayRequests.length) {\n return null;\n }\n\n // Get first match item in the messages list.\n const itemIndex = this._displayRequests.findIndex(x => x.containerId === containerId);\n if (itemIndex < 0) {\n return null;\n }\n\n const item = this._displayRequests[itemIndex];\n this._displayRequests.splice(itemIndex, 1);\n return item;\n }\n\n // Pop request.\n protected popRequest(containerId: string): IDisplayBannerRequest | null {\n if (!this._displayRequests || !this._displayRequests.length) {\n return null;\n }\n\n // Find the last index of item.\n const lastIndex = findLastIndex(this._displayRequests, x => x.containerId === containerId);\n if (lastIndex < 0) {\n return null;\n }\n\n const item = this._displayRequests[lastIndex];\n this._displayRequests.splice(lastIndex, 1);\n return item;\n }\n\n //#endregion\n}\n","<ng-template #container></ng-template>\n","import {Injectable} from '@angular/core';\nimport {Observable, ReplaySubject, Subject} from 'rxjs';\nimport {IBannerService} from '../../interfaces/banners/banner-service.interface';\nimport {IDeleteBannerRequest} from '../../../models/interfaces/banners/delete-banner-content-request.interface';\nimport {IBannerNextDisplayRequest} from '../../../models/interfaces/banners/display-next-banner-content-request.interface';\nimport { IDisplayBannerRequest } from '../../../models/interfaces/banners/add-banner-content-request.interface';\nimport { IBannerContentSettings } from '../../../models/interfaces/banners/banner-content-settings.interface';\n\nexport class BannerService implements IBannerService {\n\n //#region Properties\n\n\n // Raise an event about banner display request.\n // tslint:disable-next-line:variable-name\n private readonly _bannerDisplayRequestSubject: Subject<IDisplayBannerRequest>;\n\n // Raise an event about banner delete request.\n // tslint:disable-next-line:variable-name\n private readonly _deleteRequestSubject: Subject<IDeleteBannerRequest>;\n\n // tslint:disable-next-line:variable-name\n private readonly _displayNextSubject: Subject<IBannerNextDisplayRequest>;\n\n // Raised when a banner display is requested.\n public readonly addedRequestEvent: Observable<IDisplayBannerRequest>;\n\n // Raised when banners deletion is requested.\n public readonly deleteRequestEvent: Observable<IDeleteBannerRequest>;\n\n // Raised when next banner should be displayed.\n public readonly nextBannerDisplayRequested: Observable<IBannerNextDisplayRequest>;\n\n //#endregion\n\n //#region Constructor\n\n public constructor() {\n\n this._bannerDisplayRequestSubject = new ReplaySubject<IDisplayBannerRequest>(1);\n this._deleteRequestSubject = new ReplaySubject<IDeleteBannerRequest>(1);\n this._displayNextSubject = new ReplaySubject<IBannerNextDisplayRequest>(1);\n\n this.addedRequestEvent = this._bannerDisplayRequestSubject.asObservable();\n this.deleteRequestEvent = this._deleteRequestSubject.asObservable();\n this.nextBannerDisplayRequested = this._displayNextSubject.asObservable();\n }\n\n //#endregion\n\n //#region Methods\n\n // Display banner using specific settings.\n // If container id is defined, only the contain whose id matches will display the banner.\n public addBanner(settings: IBannerContentSettings, containerId?: string): string {\n const request: IDisplayBannerRequest = {\n id: settings.id,\n containerId,\n settings\n };\n\n this._bannerDisplayRequestSubject.next(request);\n return request.id;\n }\n\n // Find and delete banner by id.\n // No id is defined, all banner will be deleted.\n public deleteBanner(id?: string, containerId?: string): void {\n\n const deleteRequest: IDeleteBannerRequest = {\n id,\n containerId\n };\n\n this._deleteRequestSubject.next(deleteRequest);\n }\n\n // Get the next banner and display it inside a specific container.\n // If no container id is defined, display next banner into every banner.\n public displayNextBanner(containerId?: string): void {\n const request: IBannerNextDisplayRequest = {\n containerId\n };\n\n this._displayNextSubject.next(request);\n }\n\n //#endregion\n}\n","import {isPlatformBrowser} from '@angular/common';\nimport {FactoryProvider, Injectable, PLATFORM_ID, ValueProvider} from '@angular/core';\nimport {WINDOW} from '../../constants/injectors/injectors';\n\n/* Define abstract class for obtaining reference to the global window object. */\nexport abstract class WindowRef {\n\n // tslint:disable-next-line:ban-types\n get nativeWindow(): Window | Object {\n throw new Error('Not implemented.');\n }\n\n}\n\n/* Define class that implements the abstract class and returns the native window object. */\nexport class BrowserWindowRef extends WindowRef {\n\n constructor() {\n super();\n }\n\n // tslint:disable-next-line:ban-types\n get nativeWindow(): Window | Object {\n return window;\n }\n\n}\n\n/* Create an factory function that returns the native window object. */\n\n// tslint:disable-next-line:ban-types\nexport function windowFa