{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/shared/framework/components/controls/toggles/toggle.ts","webpack:///./src/shared/infrastructure/logging/log.ts","webpack:///./src/company-dashboard/model/sign-up/sign-up-company/index.ts","webpack:///./src/company-dashboard/model/dashboard/employee/entities/employee-status.ts","webpack:///./src/shared/localization/services/locale/locale.ts","webpack:///./src/shared/localization/services/currency/currency.ts","webpack:///./src/shared/framework/services/theme/theme.ts","webpack:///./src/shared/infrastructure/sentry/index.ts","webpack:///./src/shared/infrastructure/api-client/api-obfuscation.ts","webpack:///./src/shared/infrastructure/events/modules/activate-finished-event.ts","webpack:///./src/shared/utilities/operation/operation.ts","webpack:///./src/shared/utilities/timing/debounce.ts","webpack:///./src/company-dashboard/services/identity/index.ts","webpack:///./src/shared/infrastructure/history/index.ts","webpack:///./src/shared/infrastructure/logging/index.ts","webpack:///./src/shared/framework/services/toast/toast.ts","webpack:///./src/shared/infrastructure/api-client/api-result.ts","webpack:///./src/shared/framework/services/focus/index.ts","webpack:///./src/shared/framework/services/modal/modal.ts","webpack:///./src/company-dashboard/model/dashboard/employee/entities/employee-simple.ts","webpack:///./src/company-dashboard/model/dashboard/employee/entities/employee-address.ts","webpack:///./src/company-dashboard/model/dashboard/employee/entities/employee-personal-information.ts","webpack:///./src/company-dashboard/model/dashboard/company/entities/payroll-system-response.ts","webpack:///./src/company-dashboard/model/dashboard/company/services/administrator-service.ts","webpack:///./src/company-dashboard/model/dashboard/company/services/agreement-document-service.ts","webpack:///./src/shared/utilities/id/uuid/index.ts","webpack:///./src/shared/utilities/text/text-split.ts","webpack:///./src/shared/infrastructure/api-client/api-request-defaults.ts","webpack:///./src/shared/framework/components/behaviors/empty-value/empty-value.scss","webpack:///./src/shared/framework/components/behaviors/scroll/scroll.scss","webpack:///./src/shared/framework/services/modal/index.ts","webpack:///./src/shared/framework/components/modals/modal-href/modal-href.scss","webpack:///./src/shared/framework/components/page/page-href/page-href.scss","webpack:///./src/shared/framework/components/validation/validator.scss","webpack:///./src/shared/infrastructure/device/device-service.ts","webpack:///./src/shared/utilities/base-64/base-64.ts","webpack:///./src/shared/utilities/decorators/once.ts","webpack:///./src/shared/utilities/event-manager/event-manager.ts","webpack:///./src/shared/types/errors/abort-error.ts","webpack:///./src/shared/types/general/disposable.ts","webpack:///./src/shared/types/tree/index.ts","webpack:///./src/shared/types/tree/tree-node.ts","webpack:///./src/shared/types/values/date-time-range.ts","webpack:///./src/shared/types/values/time-of-day.ts","webpack:///./src/shared/types/values/time-range.ts","webpack:///./src/shared/utilities/id/id.ts","webpack:///./src/shared/utilities/math/math.ts","webpack:///./src/shared/utilities/promise-controller/promise-controller.ts","webpack:///./src/shared/utilities/text/index.ts","webpack:///./src/shared/utilities/text/slugify.ts","webpack:///./src/shared/utilities/text/escape-regexp.ts","webpack:///./src/shared/utilities/timing/delay.ts","webpack:///./src/shared/utilities/timing/throttle.ts","webpack:///./src/shared/utilities/pick-and-upload-file/pick-and-upload-file.ts","webpack:///./src/shared/infrastructure/history/history-helper.ts","webpack:///./src/shared/framework/services/toast/toast-service.ts","webpack:///./src/shared/infrastructure/logging/integrations/aurelia/log-appender.ts","webpack:///./src/shared/infrastructure/logging/integrations/aurelia/log-navigation.ts","webpack:///./src/shared/infrastructure/sentry/sentry-events.ts","webpack:///./src/shared/infrastructure/sentry/sentry-api-handler.ts","webpack:///./src/shared/infrastructure/api-client/index.ts","webpack:///./src/shared/infrastructure/api-client/api-client.ts","webpack:///./src/shared/infrastructure/api-client/interceptors/response-stub-interceptor.ts","webpack:///./src/shared/infrastructure/api-client/interceptors/correlation-header-interceptor.ts","webpack:///./src/shared/infrastructure/cookies/index.ts","webpack:///./src/shared/infrastructure/cookies/cookies.ts","webpack:///./src/shared/infrastructure/prerender/index.ts","webpack:///./src/shared/infrastructure/prerender/prerender-helper.ts","webpack:///./src/shared/infrastructure/templating/index.ts","webpack:///./src/shared/infrastructure/templating/template-string-parser.ts","webpack:///./src/shared/infrastructure/workers/index.ts","webpack:///./src/shared/infrastructure/workers/typed-worker.ts","webpack:///./src/shared/localization/services/locale/locale-service.ts","webpack:///./src/shared/localization/services/currency/index.ts","webpack:///./src/shared/localization/services/currency/currency-service.ts","webpack:///./src/shared/localization/types/date-format.ts","webpack:///./src/shared/localization/types/number-format.ts","webpack:///./src/shared/localization/types/time-format.ts","webpack:///./src/shared/framework/services/focus/focus-service.ts","webpack:///./src/shared/framework/components/filter/filter.ts","webpack:///./src/shared/framework/services/modal/modal-service.ts","webpack:///./src/shared/framework/services/theme/index.ts","webpack:///./src/shared/framework/services/theme/theme-service.ts","webpack:///./src/company-dashboard/services/identity/services/identity-service.ts","webpack:///./src/company-dashboard/services/identity/entities/identity.ts","webpack:///./src/company-dashboard/model/dashboard/employee/index.ts","webpack:///./src/company-dashboard/services/identity/entities/company-initial.ts","webpack:///./src/company-dashboard/services/identity/entities/administrator-simple.ts","webpack:///./src/company-dashboard/services/identity/entities/onboarding-state.ts","webpack:///./src/company-dashboard/model/dashboard/employee/entities/employee-sign-up.ts","webpack:///./src/company-dashboard/model/dashboard/employee/entities/employee-compensation-information.ts","webpack:///./src/company-dashboard/model/dashboard/employee/entities/employment-type.ts","webpack:///./src/company-dashboard/model/dashboard/employee/entities/employee-group.ts","webpack:///./src/company-dashboard/model/dashboard/employee/entities/subsidiary.ts","webpack:///./src/shared/localization/services/locale/index.ts","webpack:///./src/company-dashboard/model/dashboard/employee/entities/employees-page-response.ts","webpack:///./src/company-dashboard/model/dashboard/shared/entities/payroll-system.ts","webpack:///./src/company-dashboard/model/dashboard/employee/services/employee-service.ts","webpack:///./src/company-dashboard/model/dashboard/company/entities/agreement-document.ts","webpack:///./src/company-dashboard/model/dashboard/company/entities/company-detailed.ts","webpack:///./src/company-dashboard/model/dashboard/company/services/company-service.ts","webpack:///./src/company-dashboard/model/dashboard/company/services/payroll-system-service.ts","webpack:///./src/company-dashboard/model/sign-up/sign-up-company/entities/company.ts","webpack:///./src/company-dashboard/model/sign-up/sign-up-company/entities/administrator.ts","webpack:///./src/company-dashboard/model/sign-up/sign-up-company/entities/company-typeahead.ts","webpack:///./src/company-dashboard/model/sign-up/sign-up-company/services/sign-up-company-service.ts","webpack:///./src/company-dashboard/model/sign-up/administrator-exists/services/administrator-exists-service.ts","webpack:///./src/company-dashboard/model/sign-up/agreement-documents/services/agreement-documents.ts","webpack:///./src/company-dashboard/model/sign-up/agreement-documents/entities/signed-document.ts","webpack:///./src/company-dashboard/model/sign-up/agreement-documents/entities/unsigned-document.ts","webpack:///./src/company-dashboard/model/sign-up/agreement-documents/entities/signing-group.ts","webpack:///./src/shared/infrastructure/device/index.ts","webpack:///./src/shared/utilities/id/sequential/index.ts","webpack:///./src/shared/utilities/id/random/index.ts","webpack:///./src/shared/utilities/text/text-case.ts","webpack:///./src/shared/infrastructure/device/detectors/platforms.ts","webpack:///./src/shared/infrastructure/device/detectors/features.ts","webpack:///./src/shared/framework/components/controls/pickers/date-picker/model/dates-model.ts","webpack:///./src/shared/framework/components/controls/pickers/date-picker/model/months-model.ts","webpack:///./src/shared/framework/components/controls/pickers/date-picker/model/years-model.ts","webpack:///./src/company-dashboard/authenticate-pipeline-step.ts","webpack:///./src/shared/infrastructure/events/modules/activate-started-event.ts","webpack:///./src/company-dashboard/model/sign-up/administrator-exists/index.ts","webpack:///./src/company-dashboard/model/dashboard/company/index.ts","webpack:///./src/shared/framework/components/behaviors/empty-value/empty-value.scss?cbbb","webpack:///./src/shared/framework/components/behaviors/scroll/scroll.scss?bccc","webpack:///./src/shared/framework/components/modals/modal-href/modal-href.scss?48cc","webpack:///./src/shared/framework/components/page/page-href/page-href.scss?3203","webpack:///./src/shared/framework/components/validation/validator.scss?d066","webpack:///./src/resources/themes lazy ^\\.\\/.*\\/styles\\/index\\.scss$ namespace object","webpack:///./src/shared/framework/components/validation/validator.ts","webpack:///./src/resources/settings/index.ts","webpack:///./src/shared/utilities/index.ts","webpack:///./src/shared/types/index.ts","webpack:///./src/sentry.ts","webpack:///./src/shared/framework/components/base-module/base-module.ts","webpack:///./src/shared/utilities/text/text-join.ts","webpack:///./src/shared/framework/services/toast/index.ts","webpack:///./src/company-dashboard/model/dashboard/shared/index.ts","webpack:///./src/company-dashboard/model/sign-up/agreement-documents/index.ts","webpack:///./src/shared/infrastructure/api-client/api-errors.ts","webpack:///./src/company-dashboard/app.ts","webpack:///./src/company-dashboard/app.html","webpack:///./src/company-dashboard/app.scss","webpack:///./src/company-dashboard/components/app-side-menu/app-side-menu.ts","webpack:///./src/company-dashboard/components/app-side-menu/app-side-menu.html","webpack:///./src/company-dashboard/components/app-side-menu/app-side-menu.scss","webpack:///./src/company-dashboard/components/app-top-menu/app-top-menu.ts","webpack:///./src/company-dashboard/components/app-top-menu/app-top-menu.html","webpack:///./src/company-dashboard/components/app-top-menu/app-top-menu.scss","webpack:///./src/company-dashboard/components/page-cta/page-cta.ts","webpack:///./src/company-dashboard/components/page-cta/page-cta.html","webpack:///./src/company-dashboard/components/page-cta/page-cta.scss","webpack:///./src/company-dashboard/components/update-salary-information/update-salary-information.ts","webpack:///./src/company-dashboard/components/update-salary-information/update-salary-information.html","webpack:///./src/company-dashboard/components/update-salary-information/update-salary-information.scss","webpack:///./src/company-dashboard/modals/change-company/change-company.ts","webpack:///./src/company-dashboard/modals/change-company/change-company.html","webpack:///./src/company-dashboard/modals/change-company/change-company.scss","webpack:///./src/company-dashboard/modals/connect-to-payroll-system/connect-to-salary/components/carousel/carousel.ts","webpack:///./src/company-dashboard/modals/connect-to-payroll-system/connect-to-salary/components/carousel/carousel.html","webpack:///./src/company-dashboard/modals/connect-to-payroll-system/connect-to-salary/components/carousel/carousel.scss","webpack:///./src/company-dashboard/modals/connect-to-payroll-system/connect-to-salary/connect-to-salary.ts","webpack:///./src/company-dashboard/modals/connect-to-payroll-system/connect-to-salary/connect-to-salary.html","webpack:///./src/company-dashboard/modals/connect-to-payroll-system/connect-to-salary/connect-to-salary.scss","webpack:///./src/company-dashboard/modals/connect-to-payroll-system/connect-to-zenegy/connect-to-zenegy.ts","webpack:///./src/company-dashboard/modals/connect-to-payroll-system/connect-to-zenegy/connect-to-zenegy.html","webpack:///./src/company-dashboard/modals/connect-to-payroll-system/connect-to-zenegy/connect-to-zenegy.scss","webpack:///./src/company-dashboard/modals/sign-up-employee-flow/components/first-employee/first-employee.ts","webpack:///./src/company-dashboard/modals/sign-up-employee-flow/components/first-employee/first-employee.html","webpack:///./src/company-dashboard/modals/sign-up-employee-flow/components/first-employee/first-employee.scss","webpack:///./src/company-dashboard/modals/sign-up-employee-flow/components/sign-up-employee/components/personal-information/personal-information.ts","webpack:///./src/company-dashboard/modals/sign-up-employee-flow/components/sign-up-employee/components/personal-information/personal-information.html","webpack:///./src/company-dashboard/modals/sign-up-employee-flow/components/sign-up-employee/components/place-of-residence/place-of-residence.ts","webpack:///./src/company-dashboard/modals/sign-up-employee-flow/components/sign-up-employee/components/place-of-residence/place-of-residence.html","webpack:///./src/company-dashboard/modals/sign-up-employee-flow/components/sign-up-employee/components/salary-and-pension/salary-and-pension.ts","webpack:///./src/company-dashboard/modals/sign-up-employee-flow/components/sign-up-employee/components/salary-and-pension/salary-and-pension.html","webpack:///./src/company-dashboard/modals/sign-up-employee-flow/components/sign-up-employee/sign-up-employee.ts","webpack:///./src/company-dashboard/modals/sign-up-employee-flow/components/sign-up-employee/sign-up-employee.html","webpack:///./src/company-dashboard/modals/sign-up-employee-flow/components/sign-up-employee/sign-up-employee.scss","webpack:///./src/company-dashboard/modals/sign-up-employee-flow/sign-up-employee-flow.ts","webpack:///./src/company-dashboard/modals/sign-up-employee-flow/sign-up-employee-flow.html","webpack:///./src/company-dashboard/modals/sign-up-employee-flow/sign-up-employee-flow.scss","webpack:///./src/company-dashboard/modules/dashboard/dashboard.ts","webpack:///./src/company-dashboard/modules/dashboard/dashboard.html","webpack:///./src/company-dashboard/modules/dashboard/modules/company/company.ts","webpack:///./src/company-dashboard/modules/dashboard/modules/company/company.html","webpack:///./src/company-dashboard/modules/dashboard/modules/company/company.scss","webpack:///./src/company-dashboard/modules/dashboard/modules/company/components/administrator-menu/administrator-menu.ts","webpack:///./src/company-dashboard/modules/dashboard/modules/company/components/administrator-menu/administrator-menu.html","webpack:///./src/company-dashboard/modules/dashboard/modules/company/components/administrator-menu/administrator-menu.scss","webpack:///./src/company-dashboard/modules/dashboard/modules/company/modals/add-administrator/add-administrator.ts","webpack:///./src/company-dashboard/modules/dashboard/modules/company/modals/add-administrator/add-administrator.html","webpack:///./src/company-dashboard/modules/dashboard/modules/company/modals/add-administrator/add-administrator.scss","webpack:///./src/company-dashboard/modules/dashboard/modules/company/modals/deactivate-administrator/deactivate-administrator.ts","webpack:///./src/company-dashboard/modules/dashboard/modules/company/modals/deactivate-administrator/deactivate-administrator.html","webpack:///./src/company-dashboard/modules/dashboard/modules/company/modals/deactivate-administrator/deactivate-administrator.scss","webpack:///./src/company-dashboard/modules/dashboard/modules/employees/components/employee-menu/employee-menu.ts","webpack:///./src/company-dashboard/modules/dashboard/modules/employees/components/employee-menu/employee-menu.html","webpack:///./src/company-dashboard/modules/dashboard/modules/employees/components/employee-menu/employee-menu.scss","webpack:///./src/company-dashboard/modules/dashboard/modules/employees/employees.ts","webpack:///./src/company-dashboard/modules/dashboard/modules/employees/employees.html","webpack:///./src/company-dashboard/modules/dashboard/modules/employees/employees.scss","webpack:///./src/company-dashboard/modules/dashboard/modules/employees/modals/deactivate-employee/deactivate-employee.ts","webpack:///./src/company-dashboard/modules/dashboard/modules/employees/modals/deactivate-employee/deactivate-employee.html","webpack:///./src/company-dashboard/modules/dashboard/modules/employees/modals/deactivate-employee/deactivate-employee.scss","webpack:///./src/company-dashboard/modules/dashboard/modules/employees/modals/missing-information-help/missing-information-help.ts","webpack:///./src/company-dashboard/modules/dashboard/modules/employees/modals/missing-information-help/missing-information-help.html","webpack:///./src/company-dashboard/modules/dashboard/modules/employees/modals/missing-information-help/missing-information-help.scss","webpack:///./src/company-dashboard/modules/dashboard/modules/employees/modals/sign-up-help/sign-up-help.ts","webpack:///./src/company-dashboard/modules/dashboard/modules/employees/modals/sign-up-help/sign-up-help.html","webpack:///./src/company-dashboard/modules/dashboard/modules/employees/modals/sign-up-help/sign-up-help.scss","webpack:///./src/company-dashboard/modules/dashboard/modules/payroll-system/modals/disconnect-from-payroll-system/disconnect-from-payroll-system.ts","webpack:///./src/company-dashboard/modules/dashboard/modules/payroll-system/modals/disconnect-from-payroll-system/disconnect-from-payroll-system.html","webpack:///./src/company-dashboard/modules/dashboard/modules/payroll-system/payroll-system.ts","webpack:///./src/company-dashboard/modules/dashboard/modules/payroll-system/payroll-system.html","webpack:///./src/company-dashboard/modules/dashboard/modules/payroll-system/payroll-system.scss","webpack:///./src/company-dashboard/modules/log-in/log-in.ts","webpack:///./src/company-dashboard/modules/log-in/log-in.html","webpack:///./src/company-dashboard/modules/log-in/log-in.scss","webpack:///./src/company-dashboard/modules/log-in/modals/accept-invitation/accept-invitation.ts","webpack:///./src/company-dashboard/modules/log-in/modals/accept-invitation/accept-invitation.html","webpack:///./src/company-dashboard/modules/log-in/modals/accept-invitation/accept-invitation.scss","webpack:///./src/company-dashboard/modules/log-in/modals/forgot-password/forgot-password.ts","webpack:///./src/company-dashboard/modules/log-in/modals/forgot-password/forgot-password.html","webpack:///./src/company-dashboard/modules/log-in/modals/forgot-password/forgot-password.scss","webpack:///./src/company-dashboard/modules/log-in/modals/reset-password/reset-password.ts","webpack:///./src/company-dashboard/modules/log-in/modals/reset-password/reset-password.html","webpack:///./src/company-dashboard/modules/log-in/modals/reset-password/reset-password.scss","webpack:///./src/company-dashboard/modules/sign-up/modules/agreement-documents-mitid/agreement-documents-mitid.ts","webpack:///./src/company-dashboard/modules/sign-up/modules/agreement-documents-mitid/agreement-documents-mitid.html","webpack:///./src/company-dashboard/modules/sign-up/modules/agreement-documents-mitid/agreement-documents-mitid.scss","webpack:///./src/company-dashboard/modules/sign-up/modules/agreement-documents-signed/agreement-documents-signed.ts","webpack:///./src/company-dashboard/modules/sign-up/modules/agreement-documents-signed/agreement-documents-signed.html","webpack:///./src/company-dashboard/modules/sign-up/modules/agreement-documents-signed/agreement-documents-signed.scss","webpack:///./src/company-dashboard/modules/sign-up/modules/agreement-documents/modals/admin-sign-up-from-broker/admin-sign-up-from-broker.ts","webpack:///./src/company-dashboard/modules/sign-up/modules/agreement-documents/modals/admin-sign-up-from-broker/admin-sign-up-from-broker.html","webpack:///./src/company-dashboard/modules/sign-up/modules/agreement-documents/modals/admin-sign-up-from-broker/admin-sign-up-from-broker.scss","webpack:///./src/company-dashboard/modules/sign-up/modules/sign-up-company/components/company-input/company-input.ts","webpack:///./src/company-dashboard/modules/sign-up/modules/sign-up-company/components/company-input/company-input.html","webpack:///./src/company-dashboard/modules/sign-up/modules/sign-up-company/components/company-input/company-input.scss","webpack:///./src/company-dashboard/modules/sign-up/modules/sign-up-company/modals/administrator-already-exists/administrator-already-exists.ts","webpack:///./src/company-dashboard/modules/sign-up/modules/sign-up-company/modals/administrator-already-exists/administrator-already-exists.html","webpack:///./src/company-dashboard/modules/sign-up/modules/sign-up-company/modals/administrator-already-exists/administrator-already-exists.scss","webpack:///./src/company-dashboard/modules/sign-up/modules/sign-up-company/sign-up-company.ts","webpack:///./src/company-dashboard/modules/sign-up/modules/sign-up-company/sign-up-company.html","webpack:///./src/company-dashboard/modules/sign-up/modules/sign-up-company/sign-up-company.scss","webpack:///./src/company-dashboard/modules/sign-up/modules/your-dashboard/your-dashboard.ts","webpack:///./src/company-dashboard/modules/sign-up/modules/your-dashboard/your-dashboard.html","webpack:///./src/company-dashboard/modules/sign-up/modules/your-dashboard/your-dashboard.scss","webpack:///./src/company-dashboard/modules/sign-up/sign-up.ts","webpack:///./src/company-dashboard/modules/sign-up/sign-up.html","webpack:///./src/company-dashboard/modules/sign-up/sign-up.scss","webpack:///./src/company-dashboard/toasts/error/error.ts","webpack:///./src/company-dashboard/toasts/error/error.html","webpack:///./src/company-dashboard/toasts/error/error.scss","webpack:///./src/company-dashboard/toasts/neutral/neutral.ts","webpack:///./src/company-dashboard/toasts/neutral/neutral.html","webpack:///./src/company-dashboard/toasts/neutral/neutral.scss","webpack:///./src/company-dashboard/toasts/success/success.ts","webpack:///./src/company-dashboard/toasts/success/success.html","webpack:///./src/company-dashboard/toasts/success/success.scss","webpack:///./src/index.ts","webpack:///./src/shared/framework/components/behaviors/autofocus/autofocus.ts","webpack:///./src/shared/framework/components/behaviors/empty-value/empty-value.ts","webpack:///./src/shared/framework/components/behaviors/empty/empty.ts","webpack:///./src/shared/framework/components/behaviors/forward-focus/forward-focus.ts","webpack:///./src/shared/framework/components/behaviors/intersection/intersection.ts","webpack:///./src/shared/framework/components/behaviors/scroll-sentinel/scroll-sentinel.ts","webpack:///./src/shared/framework/components/behaviors/scroll-sentinel/scroll-sentinel.html","webpack:///./src/shared/framework/components/behaviors/scroll-sentinel/scroll-sentinel.scss","webpack:///./src/shared/framework/components/behaviors/scroll/scroll.ts","webpack:///./src/shared/framework/components/behaviors/surface/surface.ts","webpack:///./src/shared/framework/components/behaviors/trap-focus/trap-focus.ts","webpack:///./src/shared/framework/components/cards/card-skeleton/card-skeleton.ts","webpack:///./src/shared/framework/components/cards/card-skeleton/card-skeleton.html","webpack:///./src/shared/framework/components/cards/card-skeleton/card-skeleton.scss","webpack:///./src/shared/framework/components/cards/card/card.ts","webpack:///./src/shared/framework/components/cards/card/card.html","webpack:///./src/shared/framework/components/cards/card/card.scss","webpack:///./src/shared/framework/components/controls/buttons/select-button/select-button.ts","webpack:///./src/shared/framework/components/controls/buttons/select-button/select-button.html","webpack:///./src/shared/framework/components/controls/buttons/select-button/select-button.scss","webpack:///./src/shared/framework/components/controls/dropdown/dropdown.ts","webpack:///./src/shared/framework/components/controls/dropdown/dropdown-icon.ts","webpack:///./src/shared/framework/components/controls/dropdown/dropdown-icon.html","webpack:///./src/shared/framework/components/controls/dropdown/dropdown-icon.scss","webpack:///./src/shared/framework/components/controls/dropdown/dropdown.html","webpack:///./src/shared/framework/components/controls/dropdown/dropdown.scss","webpack:///./src/shared/framework/components/controls/inputs/color-input/color-input.ts","webpack:///./src/shared/framework/components/controls/inputs/color-input/color-input.html","webpack:///./src/shared/framework/components/controls/inputs/color-input/color-input.scss","webpack:///./src/shared/framework/components/controls/inputs/date-input/date-input.ts","webpack:///./src/shared/framework/components/controls/inputs/date-input/date-input.html","webpack:///./src/shared/framework/components/controls/inputs/date-input/date-input.scss","webpack:///./src/shared/framework/components/controls/inputs/date-time-input/date-time-input.ts","webpack:///./src/shared/framework/components/controls/inputs/date-time-input/date-time-input.html","webpack:///./src/shared/framework/components/controls/inputs/date-time-input/date-time-input.scss","webpack:///./src/shared/framework/components/controls/inputs/email-input/email-input.ts","webpack:///./src/shared/framework/components/controls/inputs/email-input/email-input.html","webpack:///./src/shared/framework/components/controls/inputs/input.scss","webpack:///./src/shared/framework/components/controls/inputs/number-input/number-input.ts","webpack:///./src/shared/framework/components/controls/inputs/number-input/number-input.html","webpack:///./src/shared/framework/components/controls/inputs/number-input/number-input.scss","webpack:///./src/shared/framework/components/controls/inputs/password-input/password-input.ts","webpack:///./src/shared/framework/components/controls/inputs/password-input/password-input.html","webpack:///./src/shared/framework/components/controls/inputs/password-input/password-input.scss","webpack:///./src/shared/framework/components/controls/inputs/phone-input/phone-input.ts","webpack:///./src/shared/framework/components/controls/inputs/phone-input/phone-input.html","webpack:///./src/shared/framework/components/controls/inputs/search-input/search-input.ts","webpack:///./src/shared/framework/components/controls/inputs/search-input/search-input.html","webpack:///./src/shared/framework/components/controls/inputs/select-input/select-input.ts","webpack:///./src/shared/framework/components/controls/inputs/select-input/select-input.html","webpack:///./src/shared/framework/components/controls/inputs/select-input/select-input.scss","webpack:///./src/shared/framework/components/controls/inputs/slug-input/slug-input.ts","webpack:///./src/shared/framework/components/controls/inputs/slug-input/slug-input.html","webpack:///./src/shared/framework/components/controls/inputs/slug-input/slug-input.scss","webpack:///./src/shared/framework/components/controls/inputs/tags-input/tag.ts","webpack:///./src/shared/framework/components/controls/inputs/tags-input/tag.html","webpack:///./src/shared/framework/components/controls/inputs/tags-input/tag.scss","webpack:///./src/shared/framework/components/controls/inputs/tags-input/tags-input.ts","webpack:///./src/shared/framework/components/controls/inputs/tags-input/tags-input.html","webpack:///./src/shared/framework/components/controls/inputs/tags-input/tags-input.scss","webpack:///./src/shared/framework/components/controls/inputs/text-input/text-input.ts","webpack:///./src/shared/framework/components/controls/inputs/text-input/text-input.html","webpack:///./src/shared/framework/components/controls/inputs/text-input/text-input.scss","webpack:///./src/shared/framework/components/controls/inputs/time-input/time-input.ts","webpack:///./src/shared/framework/components/controls/inputs/time-input/time-input.html","webpack:///./src/shared/framework/components/controls/inputs/time-input/time-input.scss","webpack:///./src/shared/framework/components/controls/inputs/url-input/url-input.ts","webpack:///./src/shared/framework/components/controls/inputs/url-input/url-input.html","webpack:///./src/shared/framework/components/controls/navigation/path-nav/path-nav.ts","webpack:///./src/shared/framework/components/controls/navigation/path-nav/path-nav.html","webpack:///./src/shared/framework/components/controls/navigation/path-nav/path-nav.scss","webpack:///./src/shared/framework/components/controls/navigation/tab-nav/tab.ts","webpack:///./src/shared/framework/components/controls/navigation/tab-nav/tab-nav.ts","webpack:///./src/shared/framework/components/controls/navigation/tab-nav/tab-nav.html","webpack:///./src/shared/framework/components/controls/navigation/tab-nav/tab-nav.scss","webpack:///./src/shared/framework/components/controls/navigation/tab-nav/tab.html","webpack:///./src/shared/framework/components/controls/navigation/tab-nav/tab.scss","webpack:///./src/shared/framework/components/controls/navigation/tree-nav/components/tree-nav-node/tree-nav-node.ts","webpack:///./src/shared/framework/components/controls/navigation/tree-nav/components/tree-nav-node/tree-nav-node.html","webpack:///./src/shared/framework/components/controls/navigation/tree-nav/components/tree-nav-node/tree-nav-node.scss","webpack:///./src/shared/framework/components/controls/navigation/tree-nav/tree-nav.ts","webpack:///./src/shared/framework/components/controls/navigation/tree-nav/tree-nav.html","webpack:///./src/shared/framework/components/controls/navigation/tree-nav/tree-nav.scss","webpack:///./src/shared/framework/components/controls/pickers/color-picker/color-picker.ts","webpack:///./src/shared/framework/components/controls/pickers/color-picker/color-picker.html","webpack:///./src/shared/framework/components/controls/pickers/color-picker/color-picker.scss","webpack:///./src/shared/framework/components/controls/pickers/date-picker/date-picker.ts","webpack:///./src/shared/framework/components/controls/pickers/date-picker/date-picker.html","webpack:///./src/shared/framework/components/controls/pickers/date-picker/date-picker.scss","webpack:///./src/shared/framework/components/controls/pickers/item-picker/item.ts","webpack:///./src/shared/framework/components/controls/pickers/item-picker/item-picker.ts","webpack:///./src/shared/framework/components/controls/pickers/item-picker/item-picker.html","webpack:///./src/shared/framework/components/controls/pickers/item-picker/item-picker.scss","webpack:///./src/shared/framework/components/controls/pickers/item-picker/item.html","webpack:///./src/shared/framework/components/controls/pickers/item-picker/item.scss","webpack:///./src/shared/framework/components/controls/toggles/check-toggle/check-toggle.ts","webpack:///./src/shared/framework/components/controls/toggles/check-toggle/check-toggle.html","webpack:///./src/shared/framework/components/controls/toggles/check-toggle/check-toggle.scss","webpack:///./src/shared/framework/components/controls/toggles/radio-toggle/radio-toggle.ts","webpack:///./src/shared/framework/components/controls/toggles/radio-toggle/radio-toggle.html","webpack:///./src/shared/framework/components/controls/toggles/radio-toggle/radio-toggle.scss","webpack:///./src/shared/framework/components/controls/toggles/switch-toggle/switch-toggle.ts","webpack:///./src/shared/framework/components/controls/toggles/switch-toggle/switch-toggle.html","webpack:///./src/shared/framework/components/controls/toggles/switch-toggle/switch-toggle.scss","webpack:///./src/shared/framework/components/controls/toggles/toggle-group/toggle-group.ts","webpack:///./src/shared/framework/components/controls/toggles/toggle-group/toggle-group.html","webpack:///./src/shared/framework/components/controls/toggles/toggle-group/toggle-group.scss","webpack:///./src/shared/framework/components/controls/toggles/toggle.scss","webpack:///./src/shared/framework/components/controls/toolbar/toolbar.ts","webpack:///./src/shared/framework/components/controls/toolbar/toolbar-group.ts","webpack:///./src/shared/framework/components/controls/toolbar/toolbar-group.html","webpack:///./src/shared/framework/components/controls/toolbar/toolbar-group.scss","webpack:///./src/shared/framework/components/controls/toolbar/toolbar.html","webpack:///./src/shared/framework/components/controls/toolbar/toolbar.scss","webpack:///./src/shared/framework/components/data-table/data-table.ts","webpack:///./src/shared/framework/components/data-table/data-table-cell.ts","webpack:///./src/shared/framework/components/data-table/data-table-cell.html","webpack:///./src/shared/framework/components/data-table/data-table-cell.scss","webpack:///./src/shared/framework/components/data-table/data-table-details.ts","webpack:///./src/shared/framework/components/data-table/data-table-details.html","webpack:///./src/shared/framework/components/data-table/data-table-details.scss","webpack:///./src/shared/framework/components/data-table/data-table-headers.ts","webpack:///./src/shared/framework/components/data-table/data-table-headers.html","webpack:///./src/shared/framework/components/data-table/data-table-headers.scss","webpack:///./src/shared/framework/components/data-table/data-table-pager.ts","webpack:///./src/shared/framework/components/data-table/data-table-pager.html","webpack:///./src/shared/framework/components/data-table/data-table-pager.scss","webpack:///./src/shared/framework/components/data-table/data-table-row.ts","webpack:///./src/shared/framework/components/data-table/data-table-row.html","webpack:///./src/shared/framework/components/data-table/data-table-row.scss","webpack:///./src/shared/framework/components/data-table/data-table.html","webpack:///./src/shared/framework/components/data-table/data-table.scss","webpack:///./src/shared/framework/components/icons/badge/badge.ts","webpack:///./src/shared/framework/components/icons/badge/badge.html","webpack:///./src/shared/framework/components/icons/badge/badge.scss","webpack:///./src/shared/framework/components/icons/icon/icon.ts","webpack:///./src/shared/framework/components/icons/icon/icon.html","webpack:///./src/shared/framework/components/icons/icon/icon.scss","webpack:///./src/shared/framework/components/icons/md-icon/md-icon.ts","webpack:///./src/shared/framework/components/icons/md-icon/md-icon-stack.ts","webpack:///./src/shared/framework/components/icons/md-icon/md-icon-stack.html","webpack:///./src/shared/framework/components/icons/md-icon/md-icon-stack.scss","webpack:///./src/shared/framework/components/icons/md-icon/md-icon.html","webpack:///./src/shared/framework/components/icons/md-icon/md-icon.scss","webpack:///./src/shared/framework/components/if-environment/if-environment.ts","webpack:///./src/shared/framework/components/indicators/busy-indicator/busy-indicator.ts","webpack:///./src/shared/framework/components/indicators/busy-indicator/busy-indicator.html","webpack:///./src/shared/framework/components/indicators/busy-indicator/busy-indicator.scss","webpack:///./src/shared/framework/components/indicators/empty-indicator/empty-indicator.ts","webpack:///./src/shared/framework/components/indicators/empty-indicator/empty-indicator.html","webpack:///./src/shared/framework/components/indicators/empty-indicator/empty-indicator.scss","webpack:///./src/shared/framework/components/layouts/grid-layout/grid-layout.ts","webpack:///./src/shared/framework/components/layouts/grid-layout/grid-layout.html","webpack:///./src/shared/framework/components/layouts/grid-layout/grid-layout.scss","webpack:///./src/shared/framework/components/layouts/list-layout/list-layout.ts","webpack:///./src/shared/framework/components/layouts/list-layout/list-layout.html","webpack:///./src/shared/framework/components/layouts/list-layout/list-layout.scss","webpack:///./src/shared/framework/components/modals/modal-backdrop/modal-backdrop.ts","webpack:///./src/shared/framework/components/modals/modal-backdrop/modal-backdrop.html","webpack:///./src/shared/framework/components/modals/modal-backdrop/modal-backdrop.scss","webpack:///./src/shared/framework/components/modals/modal-dialog/modal-dialog.ts","webpack:///./src/shared/framework/components/modals/modal-dialog/modal-dialog.html","webpack:///./src/shared/framework/components/modals/modal-dialog/modal-dialog.scss","webpack:///./src/shared/framework/components/modals/modal-footer/modal-footer.ts","webpack:///./src/shared/framework/components/modals/modal-footer/modal-footer.html","webpack:///./src/shared/framework/components/modals/modal-footer/modal-footer.scss","webpack:///./src/shared/framework/components/modals/modal-header/modal-header.ts","webpack:///./src/shared/framework/components/modals/modal-header/modal-header.html","webpack:///./src/shared/framework/components/modals/modal-header/modal-header.scss","webpack:///./src/shared/framework/components/modals/modal-href/modal-href.ts","webpack:///./src/shared/framework/components/modals/modal-image/modal-image.ts","webpack:///./src/shared/framework/components/modals/modal-image/modal-image.html","webpack:///./src/shared/framework/components/modals/modal-image/modal-image.scss","webpack:///./src/shared/framework/components/modals/modal-overlay/modal-overlay.ts","webpack:///./src/shared/framework/components/modals/modal-overlay/modal-overlay.html","webpack:///./src/shared/framework/components/modals/modal-overlay/modal-overlay.scss","webpack:///./src/shared/framework/components/modals/modal-panel/modal-panel.ts","webpack:///./src/shared/framework/components/modals/modal-panel/modal-panel.html","webpack:///./src/shared/framework/components/modals/modal-panel/modal-panel.scss","webpack:///./src/shared/framework/components/modals/modal-section/modal-section.ts","webpack:///./src/shared/framework/components/modals/modal-section/modal-section.html","webpack:///./src/shared/framework/components/modals/modal-section/modal-section.scss","webpack:///./src/shared/framework/components/modals/modal-view/modal-view.ts","webpack:///./src/shared/framework/components/modals/modal-view/modal-view.html","webpack:///./src/shared/framework/components/modals/modal-view/modal-view.scss","webpack:///./src/shared/framework/components/overlays/busy-overlay/busy-overlay.ts","webpack:///./src/shared/framework/components/overlays/busy-overlay/busy-overlay.html","webpack:///./src/shared/framework/components/overlays/busy-overlay/busy-overlay.scss","webpack:///./src/shared/framework/components/page/page-href/page-href.ts","webpack:///./src/shared/framework/components/page/page/page.ts","webpack:///./src/shared/framework/components/page/page/page.html","webpack:///./src/shared/framework/components/page/page/page.scss","webpack:///./src/shared/framework/components/toasts/toast-footer/toast-footer.ts","webpack:///./src/shared/framework/components/toasts/toast-footer/toast-footer.html","webpack:///./src/shared/framework/components/toasts/toast-footer/toast-footer.scss","webpack:///./src/shared/framework/components/toasts/toast-header/toast-header.ts","webpack:///./src/shared/framework/components/toasts/toast-header/toast-header.html","webpack:///./src/shared/framework/components/toasts/toast-header/toast-header.scss","webpack:///./src/shared/framework/components/toasts/toast-section/toast-section.ts","webpack:///./src/shared/framework/components/toasts/toast-section/toast-section.html","webpack:///./src/shared/framework/components/toasts/toast-section/toast-section.scss","webpack:///./src/shared/framework/components/toasts/toast-view/toast-view.ts","webpack:///./src/shared/framework/components/toasts/toast-view/toast-view.html","webpack:///./src/shared/framework/components/toasts/toast-view/toast-view.scss","webpack:///./src/shared/framework/components/toasts/toast/toast.ts","webpack:///./src/shared/framework/components/toasts/toast/toast.html","webpack:///./src/shared/framework/components/toasts/toast/toast.scss","webpack:///./src/shared/framework/components/validation/validation.ts","webpack:///./src/shared/framework/components/validation/validators/async-validator/async-validator.ts","webpack:///./src/shared/framework/components/validation/validators/async-validator/async-validator.html","webpack:///./src/shared/framework/components/validation/validators/custom-validator/custom-validator.ts","webpack:///./src/shared/framework/components/validation/validators/custom-validator/custom-validator.html","webpack:///./src/shared/framework/components/validation/validators/dependent-validator/dependent-validator.ts","webpack:///./src/shared/framework/components/validation/validators/input-validator/input-validator.ts","webpack:///./src/shared/framework/components/validation/validators/input-validator/input-validator.html","webpack:///./src/shared/framework/components/validation/validators/invalid-validator/invalid-validator.ts","webpack:///./src/shared/framework/components/validation/validators/invalid-validator/invalid-validator.html","webpack:///./src/shared/framework/components/validation/validators/length-validator/length-validator.ts","webpack:///./src/shared/framework/components/validation/validators/length-validator/length-validator.html","webpack:///./src/shared/framework/components/validation/validators/pattern-validator/pattern-validator.ts","webpack:///./src/shared/framework/components/validation/validators/pattern-validator/pattern-validator.html","webpack:///./src/shared/framework/components/validation/validators/range-validator/range-validator.ts","webpack:///./src/shared/framework/components/validation/validators/range-validator/range-validator.html","webpack:///./src/shared/framework/components/validation/validators/required-validator/required-validator.ts","webpack:///./src/shared/framework/components/validation/validators/required-validator/required-validator.html","webpack:///./src/shared/framework/converters/filter/filter.ts","webpack:///./src/shared/framework/converters/json/json.ts","webpack:///./src/shared/framework/converters/map/map.ts","webpack:///./src/shared/framework/converters/reverse/reverse.ts","webpack:///./src/shared/framework/converters/scale/scale.ts","webpack:///./src/shared/framework/converters/skip/skip.ts","webpack:///./src/shared/framework/converters/take/take.ts","webpack:///./src/shared/framework/converters/time-of-day/time-of-day.ts","webpack:///./src/shared/framework/converters/trim/trim.ts","webpack:///./src/shared/framework/index.ts","webpack:///./src/shared/infrastructure/index.ts","webpack:///./src/shared/localization/converters/case/case.ts","webpack:///./src/shared/localization/converters/currency/currency.ts","webpack:///./src/shared/localization/converters/date-range/date-range.ts","webpack:///./src/shared/localization/converters/date-time-range/date-time-range.ts","webpack:///./src/shared/localization/converters/date-time/date-time.ts","webpack:///./src/shared/localization/converters/date/date.ts","webpack:///./src/shared/localization/converters/duration/duration.ts","webpack:///./src/shared/localization/converters/list/list.ts","webpack:///./src/shared/localization/converters/number/number.ts","webpack:///./src/shared/localization/converters/percent/percent.ts","webpack:///./src/shared/localization/converters/phone/phone.ts","webpack:///./src/shared/localization/converters/plural/plural.ts","webpack:///./src/shared/localization/converters/relative-date/relative-date.ts","webpack:///./src/shared/localization/converters/relative-time/relative-time.ts","webpack:///./src/shared/localization/converters/select/select.ts","webpack:///./src/shared/localization/converters/time-range/time-range.ts","webpack:///./src/shared/localization/converters/time/time.ts","webpack:///./src/shared/localization/converters/weekday-list/weekday-list.ts","webpack:///./src/shared/localization/converters/weekday/weekday.ts","webpack:///./src/shared/localization/index.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","0","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","p","jsonpScriptSrc","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","this","oldJsonpFunction","slice","ToggleCustomElement","element","container","id","sequential","_element","hasResolver","toggleGroup","model","Array","includes","attachToggle","detachToggle","isUpdatingToggles","onToggleActivated","onToggleDeactivated","newValue","oldValue","onToggleModelChanged","dispatchEvent","CustomEvent","bubbles","detail","defaultValue","defaultBindingMode","twoWay","Element","unwrappedConsole","window","_console","Log","log","level","context","consoleMethod","consoleArgs","filter","a","logToConsole","tags","Sentry","withScope","scope","setLevel","setTags","setExtra","keys","captureMessage","captureException","logToSentry","toastService","instance","test","open","showAsToast","setUser","user","isAuthenticated","authenticated","debug","info","warn","args","EmployeeStatus","slug","assign","values","Locale","_name","code","unicodeExtension","codeWithUnicodeExtension","replace","Intl","DisplayNames","privateUseSubtag","split","displayName","fallback","of","Currency","localeService","_localeService","locale","Theme","color","base64Alphabet","obfuscate","plaintext","cipherAlphabet","cipherChars","char","encode","indexOf","join","deobfuscate","ciphertext","base64Chars","decode","ModuleActivateFinishedEvent","moduleName","status","Operation","func","_pending","_aborted","_abortController","AbortController","signal","catch","_error","finally","abort","createDebouncedFunc","wait","options","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","invokeFunc","time","thisArg","shouldInvoke","timeSinceLastCall","timerExpired","Date","now","trailingEdge","timeSinceLastInvoke","remaining","Math","min","remainingWait","debounced","isInvoking","leadingEdge","max","cancel","flush","debounce","Function","descriptor","configurable","Toast","toasts","viewModel","_promiseController","_closed","busy","_toasts","handle","propertyObserver","subscribe","dispose","onComposeSet","reason","toast","index","findIndex","reverse","close","compose","currentViewModel","deactivate","pendingTask","ApiResult","response","Modal","modals","_modals","modal","EmployeeSimple","firstName","lastName","monthlySalary","companyContributionPercentage","companyContribution","ownContributionPercentage","ownContribution","fromJSON","agreementStartDate","fromISO","agreementEndDate","missingPersonalInformation","missingAddressInformation","missingCompensationInformation","EmployeeAddress","streetName","streetNumber","floorAndSide","postalCode","city","country","EmployeePersonalInformation","socialSecurityNumber","cpr","email","phoneNumber","PayrollSystemResponse","payrollSystem","payrollSystemFromJSON","connections","map","connection","PayrollSystemConnection","companyName","connectionAvailable","AdministratorService","apiClient","identityService","_apiClient","_identityService","post","identity","company","body","administratorId","password","confirmPassword","token","receiveMarketingInformation","setTokens","accessToken","refreshToken","configureInfrastructure","AgreementDocumentService","s3Key","blob","Uuid","v1","v4","TextSplitFuncs","pascalCase","text","camelCase","kebabCase","preserveWhitespace","snakeCase","spaceCase","apiRequestDefaults","headers","retry","retryDelay","cache","credentials","redirect","referrer","referrerPolicy","optional","deserialize","jsonReviver","keepalive","___CSS_LOADER_EXPORT___","DeviceService","platform","detectOne","features","detectAll","classNames","formatClassName","documentElement","className","detectorModule","forEach","matches","detectorName","Base64","unicode","btoa","encodeURIComponent","$0","$1","String","fromCharCode","decodeURIComponent","atob","charCodeAt","toString","once","called","oldConstructor","newConstructor","arguments","set","WeakMap","oldMethod","constructor","oldSetter","SyntaxError","EventManager","owner","_subscriptions","Set","_owner","eventOrEvents","callback","subscriptions","events","boundCallback","addEventListener","subscription","removeEventListener","add","delete","AbortError","super","setPrototypeOf","Disposable","_disposed","_callback","TreeNode","parent","expanded","children","badgeCount","path","expandThis","expandPath","nodeOrPath","child","match","find","pathToThis","startsWith","alphaNumeric","f","toJSON","Id","uuid","variant","next","roundNumber","maxFractionDigits","sign","round","PromiseController","_resolve","_reject","aborted","nonSeparatedTextCases","spaceSeparatedTextCases","textCase","fromTextCase","toTextCase","localized","aggressive","textCaseFunc","strings","textSplit","textSplitFunc","baseChars","slugify","strict","localeCode","lang","toLocaleLowerCase","localeCompare","sensitivity","baseChar","escapeRegExp","async","delay","throwOnAbort","abortHandler","timeoutHandle","routeNameSeparator","HistoryHelper","history","router","eventAggregator","_navigating","_history","_router","_eventAggregator","isNavigatingNew","_state","getState","scrollTo","top","left","behavior","publish","offset","back","go","forward","route","subscribeOnce","completed","navigate","then","url","state","urlPattern","urlParams","params","RegExp","query","fragment","success","setState","currentInstruction","instructions","getAllInstructions","config","reduce","previous","current","lifecycleArgs","queryParams","location","hash","substring","ToastService","_registrations","Map","nameOrType","registration","unshift","results","every","LogAppender","logger","messageOrError","x","LogNavigation","instruction","group","queryString","localStorage","getItem","setItem","output","groupEnd","SentryEvents","sentryHub","pushScope","setSpan","startTransaction","op","transaction","getScope","getTransaction","setStatus","Ok","finish","InternalError","Aborted","UnknownError","popScope","SentryApiHandler","method","parentSpan","getSpan","startChild","description","span","toTraceparent","setHttpStatus","ApiClient","sentryApiHandler","_container","_sentryApiHandler","settings","_settings","_interceptors","interceptors","interceptor","interceptorInstance","fetch","endpointPath","start","endpointSettings","getEndpointSettings","requestOptions","getRequestOptions","requestUrl","getRequestUrl","getRequest","getResponse","responseBody","getResponseBody","resourceMissing","ok","createApiError","mergedOptions","defaults","traceHeader","endpointName","bestKey","version","cipher","fetchUrl","endpointUrlPattern","sort","encodeQueryComponent","encodeQueryValue","fetchOptions","integrity","contentType","JSON","stringify","Request","interceptRequest","fetchResponse","interceptResponse","fetchRequest","attempt","transient","retryDelayIndex","delayError","hasJsonBody","parse","isNested","toISOString","toISO","v","from","k","Response","ResponseStubInterceptor","stubs","latency","_stubs","_latency","toUpperCase","URL","stubKey","host","pathname","search","stubValue","stub","stubResult","stubDelay","hasBody","statusText","CorrelationHeaderInterceptor","headerName","_headerName","has","Cookies","_defaults","pairs","cookie","pair","getAll","cookieOptions","secure","sameSite","domain","expires","toHTTP","fromMillis","isPrerenderStatusCodeSet","setPrerenderStatusCode","querySelector","TemplateString","viewResources","bindingLanguage","_text","_viewResources","_bindingLanguage","bindingContext","overrideContext","parts","parseInterpolation","lookupFunctions","expression","evaluate","TemplateStringParser","resources","_resources","TypedWorker","Worker","LocaleService","_locales","_locale","locales","changeFunc","_changeFunc","canonicalLocaleCode","getCanonicalLocales","getLocale","CurrencyService","_currencies","_currency","currencies","currencyCode","canonicalCurrencyCode","currency","getCurrency","date","DateFormat","localeCodeWithExtension","setLocale","toLocaleParts","DATE_SHORT","part","fill","year","inputPattern","keyPattern","month","day","displayFormat","inputFormat","NumberFormat","numberParts","formatToParts","validPattern","decimalSeparator","groupSeparator","minusSign","TimeFormat","TIME_24_SIMPLE","hour","minute","FocusService","_eventManager","_focusVisible","enabled","focusVisible","capture","ctrlKey","altKey","metaKey","defaultPrevented","focusService","focusFunc","HTMLElement","focus","classList","remove","FilterCustomElement","activeFilters","filterFunc","param","formattedKey","propertyName","active","fromView","ModalService","ThemeService","_themes","_theme","themes","themeSlug","theme","getTheme","IdentityService","_identity","verifyAccessTokenExpireDate","autoLogin","tokens","accessTokenExpirationDateTime","local","reauthenticate","initial","logout","infrastructure","api","access","_refreshTokenTimeout","tokenValidityInterval","until","isValid","tokenValidityTime","oneMinute","refresh","minus","unauthenticate","setInitialInformations","Identity","_cookies","companies","administrator","companyData","activeCompanyId","activeCompanyIdString","parseInt","isNaN","isFinite","companyId","expirationDateInSeconds","verify","parsedBody","exp","fromSeconds","reset","CompanyInitial","cvr","documentsSigned","signup","employeesInvited","dashboard","hasMandatoryPlan","firstEmployeePrompted","AdministratorSimple","canBeDeactivated","OnboardingState","hasFinishedOnboarding","EmployeeSignUp","fromPayrollSystem","payrollSystemUrl","personalInformation","address","addressInformation","compensationInformation","employeeGroups","subsidiaries","ownersTaxedPrivately","ownersPersonallyTaxed","companyAgreementStartDate","charAt","mandatory","EmployeeCompensationInformation","employmentType","employmentTypeFromJSON","employmentTypeLocked","monthlySalaryLocked","mandatoryPolicyStartDate","zone","mandatoryPolicyStartDateLocked","possibleEmployeeGroups","employeeGroup","employeeGroupId","employeeGroupLocked","employeeGroupIdLocked","possibleSubsidiaries","subsidiary","b","subsidiaryId","subsidiaryLocked","toISODate","EmploymentType","EmployeeGroup","designation","minimumCompanyContribution","Subsidiary","EmployeesPageResponse","employees","PayrollSystem","logo","dark","light","EmployeeService","employeeId","endDate","employee","AgreementDocument","title","CompanyDetailed","cvrNumber","CompanyService","companyInformation","administrators","agreementDocuments","documents","PayrollSystemService","apiToken","Company","Administrator","receiveMarketingEmails","CompanyTypeahead","SignUpCompanyService","AdministratorExistsService","administratorEmail","exists","AgreementDocumentsService","documentData","documentsRead","hasUnsignedDocuments","unsignedDocument","signedDocument","UnsignedDocument","documentSigningGroup","documentSigningGroupFromJSON","signingGroupNumber","currentSigningGroupNumber","totalSigningGroups","agreementCompanyName","signingGroupText","DocumentSigningGroup","nextId","Sequential","AlphaNumeric","getHexCode","substr","Uint8Array","crypto","getRandomValues","TextCaseFuncs","upperCase","toLocaleUpperCase","lowerCase","toLowerCase","sentenceCase","first","rest","concat","titleCase","filtered","ua","navigator","userAgent","ios","windowsMobile","macos","android","windows","sessionStorage","removeItem","darkMode","matchMedia","DatesModel","datePicker","_datePicker","cursor","toFormat","items","startOf","plus","days","DateItem","isDisabled","today","item","changeValue","shiftKey","focusedValue","preventDefault","hasSame","minValue","diff","valueOf","maxValue","MonthsModel","months","MonthItem","view","YearsModel","decadeStartYear","floor","startYear","YearItem","years","AuthenticatePipelineStep","modalService","_modalService","navigationInstruction","childRoute","signUpFirstEmployee","employeeFlow","firstEmployee","ModuleActivateStartedEvent","locals","webpackAsyncContext","req","ids","Validator","validation","computedEnabled","computedActive","trigger","computedTrigger","parentElement","au","attachValidator","validate","detachValidator","invalid","update","app","defaultThemeSlug","defaultCurrencyCode","defaultToastTimeout","cookies","dsn","environment","release","tracesSampleRate","integrations","levels","attachStacktrace","beforeSend","hint","stacktrace","frames","filteredFrames","filename","BaseModule","routeConfig","doActivate","updateOperation","textJoin","separator","joined","hasSpaceBefore","isWhitespace","repeat","transientHttpStatusCodes","missingHttpStatusCodes","ApiAbortError","ApiError","ApiOriginError","ApiValidationError","validationErrorMessage","validationErrorData","errors","flat","AppModule","menuOpen","_toastService","configureToasts","configureModals","register","routeConfigs","mapUnknownRoutes","addPipelineStep","pushState","titleSeparator","transformTitle","AppSideMenu","themeService","_themeService","childRouter","currentParentRoute","navigation","navModels","navModel","isActive","mobileOpen","AppTopMenu","profileMenu","reload","PageCta","disabled","UpdateSalaryInformation","ChangeCompany","chosenCompany","switchCompany","closeAll","Carousel","currentSlideIndex","initialize","carouselContainer","offsetWidth","slides","sliderFrame","onSlideChange","ConnectToSalary","payrollSystemService","salaryKeyInvalid","_payrollSystemService","operation","salaryPayrollSystem","addPayrollSystemApiToken","salaryKey","connectedToSalary","ConnectToZenegy","getZenegyConnectionUrl","zenegyAutorizationUrl","getZenegyAuthorizationUrl","FirstEmployee","PersonalInformation","employeeService","firstLoad","_employeeService","getPersonalInformation","getSignUpEmployeeInformation","birthDay","Number","birthMonth","birthYear","birthDate","diffNow","getSignUpEmployeeData","capitalizeNames","updatePersonalInformation","heading","onNext","toView","PlaceOfResidence","getAddressInformation","updateAddressInformation","SalaryAndPension","employmentTypes","getCompensationInformation","currentMonth","employeeIsLocked","updateCompensationInformation","signUpEmployee","SignUpEmployee","updateEmployeesPage","employeeFirstName","flow","SignUpEmployeeFlow","_modal","DashboardModule","nav","icon","CompanyModule","companyService","agreementDocumentService","failed","_companyService","_agreementDocumentService","_contructed","updatePage","getAgreementDocument","anchor","href","createObjectURL","download","click","removeChild","revokeObjectURL","getCompanyInformations","AdministratorMenu","administratorFirstName","AddAdministrator","administratorService","administratorAdded","_administratorService","addAdministrator","DeactivateAdministrator","administratorDeactivated","deactivateOperation","deactivateAdministrator","EmployeeMenu","EmployeesModule","_aureliaEventAggregator","pending","missingInformationError","getEmployees","DeactivateEmployee","employeeDeactivated","endOf","deactivateEmployee","MissingAddressInformationHelp","SignUpHelp","DisconnectFromPayrollSystem","disconnectedFromPayrollSystem","removePayrollSystemApiToken","onCloseClick","PayrollSystemModule","resetData","payrollSystemInformation","getPayrollSystemInformation","LogInModule","logIn","AcceptInvitation","passwordReset","acceptInvite","ForgotPassword","forgotPassword","operationFinished","ResetPassword","resetPassword","AgreementDocumentsModule","agreementDocumentsService","_agreementDocumentsService","setDocumentsRead","documentToSignOperation","signingUrl","getDocumentsSigningUrl","getAgreementDocuments","AgreementDocumentsSignedModule","setSignedDocuments","AdminSignUpFromBroker","themseService","claimCompany","CompanyInputCustomElement","signUpCompanyService","_signUpCompanyService","enteredValue","trim","fetchItems","focusInput","itemPicker","scrollToFocusedValue","inputElement","focusToggle","pick","fetchOperation","toggleElement","closeDropdown","openDropdown","inputValue","stopPropagation","searchDelayTimer","searchForCompany","AdministratorAlreadyExists","SignUpCompanyModule","administratorExistsService","currentForm","passwordVisible","_administratorExistsService","alert","lookupMenu","administratorInformationValidation","companyInformationValidation","signUpCompany","mergeQueriedCompany","companySelected","YourDashboardModule","SignUpModule","ErrorToast","_toast","errorName","errorMessage","errorStack","stack","line","_closeTimeouthandle","NeutralToast","SuccessToast","configure","aurelia","addAppender","logLevel","use","standardConfiguration","plugin","feature","globalResources","postTask","currencyService","setCurrency","searchParams","getCurrencyCode","setTheme","getThemeSlug","startSession","setRoot","newLocale","oldLocale","defaultLocale","newCurrency","oldCurrency","newTheme","oldTheme","AutofocusCustomAttribute","customFocusOptions","visible","primaryProperty","EmptyValueCustomAttribute","attributeName","changeHandler","EmptyCustomAttribute","_childListMutationObserver","MutationObserver","mutations","onChildListChanged","_textNodeMutationObserver","onContentChanged","observe","childList","characterData","childNodes","node","nodeType","disconnect","innerText","ignoreWhitespace","some","mutation","removedNodes","addedNodes","ForwardFocusCustomAttribute","originalFocusFunc","nextElement","IntersectionCustomAttribute","cssAnimator","_cssAnimator","contains","propertyChanged","_IntersectionObserver","unobserve","root","rootMargin","threshold","IntersectionObserver","entry","isIntersecting","toggle","enter","leave","ScrollSentinelCustomElement","_pendingIntersects","_intersectionObserver","entries","intersectionRatio","intersect","ScrollCustomAttribute","animationFrameHandle","fadeTargets","cancelAnimationFrame","requestAnimationFrame","scrollTop","scrollLeft","position","internal","getFadeTargets","fadeTarget","style","opacity","height","fadeFactor","removeEventListeners","querySelectorAll","getBoundingClientRect","getAttribute","SurfaceCustomAttribute","_children","parentSurfaceName","attachChild","valueChanged","detachChild","TrapFocusCustomAttribute","_active","_focusTrap","activate","onActivate","onActivating","onDeactivate","onDeactivating","initialFocus","fallbackFocus","returnFocusOnDeactivate","escapeDeactivates","clickOutsideDeactivates","onFocusIn","CardSkeletonCustomElement","CardCustomElement","SelectButtonCustomElement","focusButton","buttonElement","DropdownCustomElement","_attached","_mutationObserver","updateVisibilityAndPosition","attributes","attributeFilter","subtree","createPopper","_popper","destroy","_visible","eventsEnabled","placement","positionFixed","fixed","modifiers","preventOverflow","escapeWithReference","getComputedStyle","visibility","display","enableEventListeners","onKeyDownAnywhere","onInteractionAnywhere","disableEventListeners","ownerStyle","minWidth","width","escape","focusout","DropdownIconCustomElement","ColorInputCustomElement","DateInputCustomElement","dateFormat","fromFormat","preserveTime","DateTimeInputCustomElement","isInternalUpdate","minTime","fromObject","dateValue","_now","timeNow","maxTime","setZone","scheduleNowRefresh","clearInterval","_nowIntervalHandle","timeValue","isToday","computedMinTime","computedMaxTime","setInterval","EmailInputCustomElement","focused","autoselect","setSelectionRange","onInputBlur","onBlur","NumberInputCustomElement","numberFormat","parseFloat","selectionStart","selectionEnd","decimalSeparatorPattern","step","execCommand","PasswordInputCustomElement","PhoneInputCustomElement","phoneValueConverter","_phoneValueConverter","defaultCountryCode","isPossible","countryCode","countryCallingCode","nationalNumber","invalidReason","SearchInputCustomElement","SelectInputCustomElement","filterValue","displayValue","SlugInputCustomElement","TagCustomElement","tagsInput","deselectItem","TagsInputCustomElement","new","pop","composedPath","nodeName","empty","TextInputCustomElement","timeItems","minutes","seconds","TimeInputCustomElement","timeFormat","timeValueConverter","_timeValueConverter","computedMin","minInclusive","computedMax","duration","second","millisecond","UrlInputCustomElement","PathNavCustomElement","TabCustomElement","tabNav","change","TabNavCustomElement","TreeNavNodeCustomElement","renaming","dragover","tree","folderLike","expandable","selectSubtree","newNode","createNode","parentNode","attach","nodeCreated","nodeSettings","confirmed","deleteNode","detach","nodeDeleted","rename","nodeRenamed","dataTransfer","dropEffect","dragOver","drop","oneTime","TreeNavCustomElement","isFolderLike","isFileLike","selectNode","expandNode","notify","oldExpanded","notifyValueChanged","ColorPickerCustomElement","DatePickerCustomElement","_isSettingValueInternally","weekdays","hoverable","focusedElement","minChanged","maxChanged","viewChanged","scheduleTodayRefresh","_todayTimeoutHandle","keyboardChanged","direction","keyboard","onKeyDown","cursorBefore","zoom","as","ItemCustomElement","_itemPicker","equals","excludeValues","_itemPickerElement","closest","controller","attachItem","scrollIntoView","detachItem","elements","textContent","searchText","offsetTop","offsetHeight","value1","value2","ItemPickerCustomElement","_items","newItems","itemsElement","itemElement","itemViewModel","none","CheckToggleCustomElement","single","RadioToggleCustomElement","SwitchToggleCustomElement","ToggleGroupCustomElement","_toggles","newModel","oldModel","ToolbarCustomElement","ToolbarGroupCustomElement","DataTableCustomElement","rows","DataTableCellCustomElement","dataTable","sorting","DataTableDetailsCustomElement","DataTableHeadersCustomElement","toggleAll","allSelected","row","selectable","selected","DataTablePagerCustomElement","pageNumber","pageSize","listSize","pageCount","ceil","page","computedPageCount","DataTableRowCustomElement","onMouseUpAnywhere","draggedModel","selectedModel","selection","HTMLInputElement","clickable","__ignoreRowClick","insert","stopImmediatePropagation","BadgeCustomElement","IconCustomElement","link","rel","MdIconCustomElement","MdIconStackCustomElement","IfEnvironmentCustomAttribute","boundViewFactory","viewSlot","_bound","updateCondition","conditionChanged","condition","requiredEnvironmants","currentEnvironmants","BusyIndicatorCustomElement","EmptyIndicatorCustomElement","GridLayoutCustomElement","ListLayoutCustomElement","ModalBackdropCustomElement","topModal","ModalDialogCustomElement","closeShortcut","ModalFooterCustomElement","ModalHeaderCustomElement","ModalHrefCustomAttribute","onElementClick","HTMLAnchorElement","hasAttribute","ModalImageCustomElement","ModalOverlayCustomElement","ModalPanelCustomElement","ModalSectionCustomElement","slots","header","ModalViewCustomElement","registerInstance","BusyOverlayCustomElement","_parentElement","inert","_xScrollElement","findScrollParent","_yScrollElement","beginUpdatingSize","_scheduledUpdateHandle","busyOverlayContainerElement","getVisibleHeight","getVisibleWidth","blockScrolling","unblockScrolling","includeHidden","overflowX","overflowY","excludeStaticParent","overflowRegex","overflow","scrollElementWidth","scrollElementLeftToElementLeft","right","scrollElementHeight","scrollElementTopToElementTop","bottom","_eventSubscription","passive","PageHrefCustomAttribute","removeAttribute","PageCustomElement","getElementsByTagName","ctaPage","ToastFooterCustomElement","ToastHeaderCustomElement","ToastSectionCustomElement","ToastViewCustomElement","ToastCustomElement","ValidationCustomAttribute","childValidations","validators","parentValidation","attachValidation","onTriggerEvent","detachValidation","validator","recursive","_validationPromise","validationPromises","validationResults","valid","__validationPromise","AsyncValidatorCustomElement","function","CustomValidatorCustomElement","DependentValidatorCustomElement","setValidity","InputValidatorCustomElement","input","attached","validity","InvalidValidatorCustomElement","LengthValidatorCustomElement","size","PatternValidatorCustomElement","_pattern","invert","pattern","RangeValidatorCustomElement","invalidValue","invalidStep","maxInclusive","RequiredValidatorCustomElement","FilterValueConverter","testFunc","JsonValueConverter","replacer","space","breakBeforeBlock","json","MapValueConverter","keyOrFunc","skipUndefined","mappedItems","mappedItem","ReverseValueConverter","ScaleValueConverter","factor","SkipValueConverter","count","TakeValueConverter","TimeOfDayValueConverter","_dateTime","shiftTo","_duration","dateTime","TrimValueConverter","CaseValueConverter","numberFormatCache","CurrencyValueConverter","signals","amount","numberFormatOptions","currencyDisplay","getNumberFormat","minimumFractionDigits","maximumFractionDigits","resolvedOptions","format","cacheKey","DateRangeValueConverter","dateValueConverter","_dateValueConverter","convert","to","DateTimeRangeValueConverter","dateTimeValueConverter","_dateTimeValueConverter","includeToDate","dateTimeStyles","DATETIME_SHORT","DATETIME_MED","DATETIME_FULL","DATETIME_HUGE","DateTimeValueConverter","valueToFormat","toLocal","formatOptions","hour12","toLocaleString","dateStyles","DATE_MED","DATE_FULL","DATE_HUGE","DateValueConverter","DurationValueConverter","templateStringParser","_formats","toObject","hours","listFormatCache","ListValueConverter","listFormat","getListFormat","stringArray","ListFormat","NumberValueConverter","useGrouping","PercentValueConverter","PhoneValueConverter","pluralRulesCache","PluralValueConverter","pluralRules","getPluralRules","pluralCategories","pluralCategory","select","PluralRules","RelativeDateValueConverter","toRelativeCalendar","RelativeTimeValueConverter","unit","padding","toRelative","SelectValueConverter","TimeRangeValueConverter","timeStyles","TIME_SIMPLE","TIME_WITH_SECONDS","TIME_WITH_SHORT_OFFSET","TIME_WITH_LONG_OFFSET","TimeValueConverter","utc","WeekdayListValueConverter","weekdayValueConverter","listValueConverter","_weekdayValueConverter","_listValueConverter","WeekdayValueConverter","weekday"],"mappings":"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","file":"app.199cd8bb359020b46965.bundle.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t0: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({}[chunkId]||chunkId) + \".\" + {\"2\":\"c42aa77cfce140fa1f88\",\"3\":\"b4605b04202bbd300ffa\",\"4\":\"f39a21fc3ef6ff9a4e91\",\"5\":\"a8cbd4a8be74ccf4b131\"}[chunkId] + \".chunk.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = this[\"webpackJsonp\"] = this[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([516,1]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import { Container, autoinject, bindable, bindingMode } from \"aurelia-framework\";\r\nimport { Id } from \"shared/utilities\";\r\nimport { AccentColor } from \"resources/styles\";\r\nimport { ToggleGroupCustomElement } from \"./toggle-group/toggle-group\";\r\n\r\n/**\r\n * Represents the base class from which all toggles must inherit.\r\n */\r\n@autoinject\r\nexport class ToggleCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the class.\r\n\t * @param element The element representing the component.\r\n\t * @param container The `Container` instance.\r\n\t */\r\n\tpublic constructor(element: Element, container: Container)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\r\n\t\t// Get the toggle group, if one exists.\r\n\t\tif (container.hasResolver(ToggleGroupCustomElement, true))\r\n\t\t{\r\n\t\t\tthis.toggleGroup = container.get(ToggleGroupCustomElement);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement;\r\n\r\n\t/**\r\n\t * The goggle group to whihc the toggle belongs, if any.\r\n\t */\r\n\tprotected readonly toggleGroup: ToggleGroupCustomElement | undefined;\r\n\r\n\t/**\r\n\t * The unique ID of the control.\r\n\t */\r\n\tprotected id = Id.sequential();\r\n\r\n\t/**\r\n\t * True if the toggle is a single-select toggle, otherwise false.\r\n\t */\r\n\tpublic readonly single: boolean;\r\n\r\n\t/**\r\n\t * The model associated with the toggle.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic model: any;\r\n\r\n\t/**\r\n\t * True if the toggle is in the active state, false or undefined if the toggle is\r\n\t * in the inactive state, or null if the toggle is in the indeterminate state.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: boolean | null | undefined;\r\n\r\n\t/**\r\n\t * True if the toggle is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the toggle is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n\r\n\t/**\r\n\t * The accent color to use for the toggle,\r\n\t * or undefined to use the current color.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic accent: AccentColor;\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t * Detaches the toggle from the toggle group.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\tif (this.toggleGroup != null)\r\n\t\t{\r\n\t\t\t// If the toggle has no value, set its value based on the group value.\r\n\t\t\tif (this.value == null && this.toggleGroup.value != null)\r\n\t\t\t{\r\n\t\t\t\tthis.value =\r\n\t\t\t\t\tthis.toggleGroup.value === this.model ||\r\n\t\t\t\t\t(this.toggleGroup.value instanceof Array && this.toggleGroup.value.includes(this.model));\r\n\t\t\t}\r\n\r\n\t\t\tthis.toggleGroup.attachToggle(this);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is detached.\r\n\t * Detaches the toggle from the toggle group.\r\n\t */\r\n\tpublic detached(): void\r\n\t{\r\n\t\tif (this.toggleGroup != null)\r\n\t\t{\r\n\t\t\tthis.toggleGroup.detachToggle(this);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `value` property changes.\r\n\t * Updates the group value to match the new state.\r\n\t */\r\n\tprotected valueChanged(): void\r\n\t{\r\n\t\tif (this.toggleGroup != null && !this.toggleGroup.isUpdatingToggles)\r\n\t\t{\r\n\t\t\tif (this.value)\r\n\t\t\t{\r\n\t\t\t\tthis.toggleGroup.onToggleActivated(this);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.toggleGroup.onToggleDeactivated(this);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `model` property changes.\r\n\t * Updates the group value to match the new state.\r\n\t * @param newValue The new property value.\r\n\t * @param oldValue The old property value.\r\n\t */\r\n\tprotected modelChanged(newValue: any, oldValue: any): void\r\n\t{\r\n\t\tif (this.toggleGroup != null)\r\n\t\t{\r\n\t\t\tthis.toggleGroup.onToggleModelChanged(newValue, oldValue);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the toggle is clicked.\r\n\t * Toggels the state of the toggle, dispatches events, and prevents default for the event.\r\n\t */\r\n\tprotected onToggleClick(): boolean\r\n\t{\r\n\t\tthis.value = !this.value;\r\n\r\n\t\t// Dispatch the `input` event to indicate that the comitted value, has changed.\r\n\t\tthis._element.dispatchEvent(new CustomEvent(\"input\", { bubbles: true, detail: { value: this.value } }));\r\n\r\n\t\t// Dispatch the `change` event to indicate that the comitted value, has changed.\r\n\t\tthis._element.dispatchEvent(new CustomEvent(\"change\", { bubbles: true, detail: { value: this.value } }));\r\n\r\n\t\treturn false;\r\n\t}\r\n}\r\n","import { Container } from \"aurelia-framework\";\r\nimport { MapObject, AbortError } from \"shared/types\";\r\n\r\n// TODO: This reference is technically not allowed, as `infrastructure` should reference `framework`.\r\nimport { ToastService } from \"shared/framework/services/toast\";\r\n\r\n// The global Sentry instance, defined once Sentry has been initialized.\r\ndeclare const Sentry: any;\r\n\r\n// The object representing the original console, before being wrapped by Sentry.\r\nconst unwrappedConsole = ((window as any)._console || console) as typeof console;\r\n\r\n/**\r\n * Represents the user info to associate with a log entry.\r\n */\r\nexport interface ILogUser\r\n{\r\n\t/**\r\n\t * The ID of the user.\r\n\t */\r\n\treadonly id?: string;\r\n\r\n\t/**\r\n\t * The type of the user.\r\n\t */\r\n\treadonly type?: string;\r\n\r\n\t/**\r\n\t * If the user is authenticated.\r\n\t */\r\n\treadonly authenticated?: boolean;\r\n}\r\n\r\n/**\r\n * Represents the severity of a log entry.\r\n */\r\nexport type LogLevel = \"debug\" | \"info\" | \"warning\" | \"error\";\r\n\r\n/**\r\n * Represents a log to which messages and errors may be logged.\r\n */\r\nexport namespace Log\r\n{\r\n\t/**\r\n\t * Sets the user that should be associated with log entries.\r\n\t * @param user The user that should be associated with log entries, or undefined to associate no user.\r\n\t */\r\n\texport function setUser(user: ILogUser | undefined): void\r\n\t{\r\n\t\tif (\"Sentry\" in window)\r\n\t\t{\r\n\t\t\tSentry.setUser(\r\n\t\t\t{\r\n\t\t\t\tid: user?.id,\r\n\t\t\t\ttype: user?.type,\r\n\t\t\t\tisAuthenticated: user?.authenticated,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the tags that should be associated with log entries.\r\n\t * @param tags The tags to merge into the tags that should be associated with log entries.\r\n\t */\r\n\texport function setTags(tags: MapObject): void\r\n\t{\r\n\t\tif (\"Sentry\" in window)\r\n\t\t{\r\n\t\t\tSentry.setTags(tags);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Logs the specified debug message, optionally with additional context.\r\n\t * @param message The message to log.\r\n\t * @param context The context to associate with the log entry.\r\n\t */\r\n\texport function debug(message: string, context?: MapObject): void\r\n\t{\r\n\t\tlog(\"debug\", message, undefined, context);\r\n\t}\r\n\r\n\t/**\r\n\t * Logs the specified info message, optionally with additional context.\r\n\t * @param message The message to log.\r\n\t * @param context The context to associate with the log entry.\r\n\t */\r\n\texport function info(message: string, context?: MapObject): void\r\n\t{\r\n\t\tlog(\"info\", message, undefined, context);\r\n\t}\r\n\r\n\t/**\r\n\t * Logs the specified warning message, optionally with additional context.\r\n\t * @param message The message to log.\r\n\t * @param context The context to associate with the log entry.\r\n\t */\r\n\texport function warn(message: string, context?: MapObject): void\r\n\t{\r\n\t\tlog(\"warning\", message, undefined, context);\r\n\t}\r\n\r\n\t/**\r\n\t * Logs the specified error message, optionally with additional context.\r\n\t * @param message The message to log.\r\n\t * @param context The context to associate with the log entry.\r\n\t */\r\n\texport function error(message: string, context?: MapObject): void;\r\n\r\n\t/**\r\n\t * Logs the specified error, optionally with additional context.\r\n\t * Note that errors of type `AbortError` will be ignored.\r\n\t * @param error The error to log.\r\n\t * @param context The context to associate with the log entry.\r\n\t */\r\n\texport function error(errors: Error, context?: MapObject): void;\r\n\r\n\t/**\r\n\t * Logs the specified error message and error, optionally with additional context.\r\n\t * Note that errors of type `AbortError` will be ignored.\r\n\t * @param message The message to log.\r\n\t * @param error The error to associate with the log entry.\r\n\t * @param context The context to associate with the log entry.\r\n\t */\r\n\texport function error(message: string, error: Error | string, context?: MapObject): void;\r\n\r\n\texport function error(...args: any[]): void\r\n\t{\r\n\t\tlet message: string | undefined;\r\n\t\tlet error: Error | string | undefined;\r\n\t\tlet context: MapObject | undefined;\r\n\r\n\t\tif (args[0] instanceof Error)\r\n\t\t{\r\n\t\t\terror = args[0];\r\n\t\t\tcontext = args[1];\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tmessage = args[0];\r\n\r\n\t\t\tif (args[1] instanceof Error || typeof args[0] === \"string\")\r\n\t\t\t{\r\n\t\t\t\terror = args[1];\r\n\t\t\t\tcontext = args[2];\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tcontext = args[1];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (error instanceof AbortError)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlog(\"error\", message, error, context);\r\n\t}\r\n}\r\n\r\n/**\r\n * Logs the specified message and/or errors.\r\n * @param level The severity of the log entry.\r\n * @param message The message to log.\r\n * @param errors The errors to associate with the log entry.\r\n * @param context The context to associate with the log entry.\r\n */\r\nfunction log(level: LogLevel, message?: string, error?: Error | string, context?: MapObject): void\r\n{\r\n\tlogToConsole(level, message, error, context);\r\n\r\n\ttry\r\n\t{\r\n\t\tif (level === \"error\" && \"Sentry\" in window)\r\n\t\t{\r\n\t\t\tlogToSentry(level, message, error, context);\r\n\t\t}\r\n\t}\r\n\tfinally\r\n\t{\r\n\t\tif (level === \"error\")\r\n\t\t{\r\n\t\t\tshowAsToast(level, message, error, context);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Logs the specified message and/or errors to the console.\r\n * @param level The severity of the log entry.\r\n * @param message The message to log.\r\n * @param errors The errors to associate with the log entry.\r\n * @param context The context associated with the log entry.\r\n */\r\nfunction logToConsole(level: LogLevel, message?: string, error?: Error | string, context?: MapObject): void\r\n{\r\n\tconst consoleMethod = level === \"warning\" ? \"warn\" : level;\r\n\tconst consoleArgs = [message, error, context].filter(a => a !== undefined);\r\n\r\n\tunwrappedConsole[consoleMethod](...consoleArgs);\r\n}\r\n\r\n/**\r\n * Logs the specified message and/or errors to Sentry.\r\n * @param level The severity of the log entry.\r\n * @param message The message to log.\r\n * @param errors The errors to associate with the log entry.\r\n * @param context The context associated with the log entry.\r\n */\r\nfunction logToSentry(level: LogLevel, message?: string, error?: Error | string, context?: MapObject): void\r\n{\r\n\tconst { tags, ...data } = context || {};\r\n\r\n\tSentry.withScope((scope: any) =>\r\n\t{\r\n\t\t// Set the level of the log entry.\r\n\t\tscope.setLevel(level);\r\n\r\n\t\t// Attach the tags to the log entry.\r\n\t\tif (tags != null)\r\n\t\t{\r\n\t\t\tscope.setTags(tags);\r\n\t\t}\r\n\r\n\t\t// Sentry has no way to log a message and an error\r\n\t\t// together, so attach any error as data instead.\r\n\t\tif (message && error != null)\r\n\t\t{\r\n\t\t\tscope.setExtra(\"error\", error);\r\n\t\t}\r\n\r\n\t\t// Attach the data to the log entry.\r\n\t\tif (data != null)\r\n\t\t{\r\n\t\t\tfor (const key of Object.keys(data))\r\n\t\t\t{\r\n\t\t\t\tscope.setExtra(key, data[key]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Capture the log entry.\r\n\t\tif (message)\r\n\t\t{\r\n\t\t\tSentry.captureMessage(message);\r\n\t\t}\r\n\t\telse if (error != null)\r\n\t\t{\r\n\t\t\tSentry.captureException(error);\r\n\t\t}\r\n\t});\r\n}\r\n\r\n/**\r\n * Shows the specified message and/or errors as a toast notification.\r\n * @param level The severity of the log entry.\r\n * @param message The message that was logged.\r\n * @param errors The errors associated with the log entry.\r\n * @param context The context associated with the log entry.\r\n */\r\nfunction showAsToast(level: LogLevel, message?: string, error?: Error | string, context?: MapObject): void\r\n{\r\n\tconst toastService = Container.instance.get(ToastService);\r\n\r\n\t// HACK: Prevent what appears to be technical error messages from being used as headings in toasts.\r\n\tif (error == null && /^\\w*Error:/i.test(message!))\r\n\t{\r\n\t\terror = message as any;\r\n\t\tmessage = undefined;\r\n\t}\r\n\r\n\ttoastService.open(level, { message, error, context });\r\n}\r\n","export * from \"./entities/company\";\nexport * from \"./entities/administrator\";\nexport * from \"./entities/company-typeahead\";\nexport * from \"./services/sign-up-company-service\";\n","import { textCase } from \"shared/utilities\";\n\n/**\n * Represents the slug identifying a `EmployeeStatus`.\n */\nexport type EmployeeStatusSlug = keyof typeof EmployeeStatus.values;\n\n/**\n * Represents the status of an employee.\n */\nexport class EmployeeStatus\n{\n /**\n * Create a new instance of this using JSON data\n */\n public static fromJSON(value: number): EmployeeStatus\n {\n if (value === 1)\n {\n return new EmployeeStatus(\"signed-up\");\n }\n else if (value === 2)\n {\n return new EmployeeStatus(\"in-onboarding\");\n }\n else if (value === 3)\n {\n return new EmployeeStatus(\"onboarded\");\n }\n else if (value === 4)\n {\n return new EmployeeStatus(\"deactivated\");\n }\n else if (value === 5)\n {\n return new EmployeeStatus(\"not-supported\");\n }\n else if (value === 100)\n {\n return new EmployeeStatus(\"not-invited\");\n }\n\n // Default to not supported for now.\n return new EmployeeStatus(\"not-supported\");\n }\n\n /**\n * Creates a new instance of the type.\n * @param slug The slug identifying the status of the employee.\n */\n public constructor(slug: EmployeeStatusSlug)\n {\n this.slug = textCase(slug, \"pascal\", \"kebab\") as any;\n Object.assign(this, EmployeeStatus.values[this.slug]);\n }\n\n public slug: EmployeeStatusSlug;\n public name: string;\n public value: number;\n\n /**\n * Gets the data representing this instance.\n */\n public toJSON(): any\n {\n return this.value;\n }\n\n /**\n * The supported values.\n */\n public static readonly values =\n {\n \"signed-up\":\n {\n name: \"Tilmeldt\",\n value: 1\n },\n \"in-onboarding\":\n {\n name: \"Igang\",\n value: 2\n },\n \"onboarded\":\n {\n name: \"Aktiv\",\n value: 3\n },\n \"deactivated\":\n {\n name: \"Deaktiveret\",\n value: 4\n },\n \"not-supported\":\n {\n name: \"Ikke supporteret\",\n value: 5\n },\n \"not-invited\":\n {\n name: \"Ikke inviteret\",\n value: 100\n },\n };\n}\n","import { computedFrom } from \"aurelia-framework\";\r\nimport { textCase } from \"shared/utilities\";\r\n\r\n/**\r\n * Represents the data for a locale.\r\n */\r\nexport interface ILocale\r\n{\r\n\t/**\r\n\t * The IETF language tag identifying the locale, excluding any unicode extension.\r\n\t * This value is case sensitive and consists of a lower-case ISO 639-1 language code, optionally\r\n\t * followed by a lower-case ISO 15924 script code, an upper-case ISO 3166-1 Alpha 2 country code,\r\n\t * and a private use subtag, in that order.\r\n\t */\r\n\tcode: string;\r\n\r\n\t/**\r\n\t * The IETF language tag, including extensions, specifying calendar, numbering system, etc.\r\n\t * This value is case sensitive and must consist of the string starting with `u-`.\r\n\t */\r\n\tunicodeExtension?: string;\r\n\r\n\t/**\r\n\t * The name of the locale, used if no localized name is available.\r\n\t */\r\n\tname?: string;\r\n\r\n\t/**\r\n\t * True if the locale should only be available if debugging is enabled, otherwise false.\r\n\t */\r\n\tdebug?: boolean;\r\n}\r\n\r\n/**\r\n * Represents a locale.\r\n */\r\nexport class Locale\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param data The data from which the instance should be created.\r\n\t */\r\n\tpublic constructor(data: ILocale)\r\n\t{\r\n\t\tthis._name = data.name;\r\n\t\tthis.code = data.code;\r\n\t\tthis.debug = data.debug ?? false;\r\n\r\n\t\tif (data.unicodeExtension)\r\n\t\t{\r\n\t\t\t// Insert the unicode extension between the code and the private use subtag.\r\n\t\t\tthis.codeWithUnicodeExtension = this.code.replace(/(?=-x-)|$/, `-${data.unicodeExtension}`);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.codeWithUnicodeExtension = this.code;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate readonly _name: string | undefined;\r\n\r\n\t/**\r\n\t * The IETF language tag identifying the locale, excluding any unicode extension.\r\n\t * This value is case sensitive and consists of a lower-case ISO 639-1 language code, optionally\r\n\t * followed by a lower-case ISO 15924 script code, an upper-case ISO 3166-1 Alpha 2 country code,\r\n\t * and a private use subtag, in that order.\r\n\t * This is the code that should be used to identify the locale.\r\n\t */\r\n\tpublic readonly code: string;\r\n\r\n\t/**\r\n\t * The IETF language tag, including any unicode extension.\r\n\t * This value is case sensitive and consists of the code, including any unicode extension,\r\n\t * which may specify which calendar, numbering system, etc. should be used.\r\n\t * This is the code that should be used when formatting values.\r\n\t */\r\n\tpublic readonly codeWithUnicodeExtension: string;\r\n\r\n\t/**\r\n\t * True if the locale should only be available if debugging is enabled, otherwise false.\r\n\t */\r\n\tpublic readonly debug: boolean;\r\n\r\n\t/**\r\n\t * The name of the locale, which may be localized.\r\n\t */\r\n\t@computedFrom(\"code\", \"_name\")\r\n\tpublic get name(): string\r\n\t{\r\n\t\tif (Intl.DisplayNames != null)\r\n\t\t{\r\n\t\t\tconst privateUseSubtag = this.code.split(\"-x-\", 2)[1];\r\n\t\t\tconst displayNames = new Intl.DisplayNames(this.code, { type: \"language\", fallback: \"none\" });\r\n\t\t\tlet displayName = displayNames.of(this.code);\r\n\r\n\t\t\tif (privateUseSubtag)\r\n\t\t\t{\r\n\t\t\t\tdisplayName += ` [${privateUseSubtag}]`;\r\n\t\t\t}\r\n\r\n\t\t\treturn displayName ? textCase(displayName, \"space\", \"sentence\", true) : this._name || this.code;\r\n\t\t}\r\n\r\n\t\treturn this._name || this.code;\r\n\t}\r\n}\r\n","import { computedFrom } from \"aurelia-framework\";\r\nimport { textCase } from \"shared/utilities\";\r\nimport { LocaleService } from \"../locale\";\r\n\r\n/**\r\n * Represents the data for a currency.\r\n */\r\nexport interface ICurrency\r\n{\r\n\t/**\r\n\t * The ISO 4217 currency code identifying the currency.\r\n\t * This value is case sensitive.\r\n\t */\r\n\tcode: string;\r\n\r\n\t/**\r\n\t * The name of the currency, used if no localized name is available.\r\n\t */\r\n\tname?: string;\r\n\r\n\t/**\r\n\t * True if the currency should only be available if debugging is enabled, otherwise false.\r\n\t */\r\n\tdebug?: boolean;\r\n}\r\n\r\n/**\r\n * Represents a currency.\r\n */\r\nexport class Currency\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param data The data from which the instance should be created.\r\n\t * @param localeService The `LocaleService` instance.\r\n\t */\r\n\tpublic constructor(data: ICurrency, localeService: LocaleService)\r\n\t{\r\n\t\tthis._name = data.name;\r\n\t\tthis._localeService = localeService;\r\n\t\tthis.code = data.code;\r\n\t\tthis.debug = data.debug ?? false;\r\n\t}\r\n\r\n\tprivate readonly _localeService: LocaleService;\r\n\tprivate readonly _name: string | undefined;\r\n\r\n\t/**\r\n\t * The ISO 4217 currency code identifying the currency.\r\n\t * This value is case sensitive.\r\n\t */\r\n\tpublic readonly code: string;\r\n\r\n\t/**\r\n\t * True if the currency should only be available if debugging is enabled, otherwise false.\r\n\t */\r\n\tpublic readonly debug: boolean;\r\n\r\n\t/**\r\n\t * The name of the currency, which may be localized.\r\n\t */\r\n\t@computedFrom(\"code\", \"_name\", \"_localeService.locale.code\")\r\n\tpublic get name(): string\r\n\t{\r\n\t\tif (Intl.DisplayNames != null && this._localeService.locale != null)\r\n\t\t{\r\n\t\t\tconst displayNames = new Intl.DisplayNames(this._localeService.locale.code, { type: \"currency\", fallback: \"none\" });\r\n\t\t\tconst displayName = displayNames.of(this.code);\r\n\r\n\t\t\treturn displayName ? textCase(displayName, \"space\", \"sentence\", true) : this._name || this.code;\r\n\t\t}\r\n\r\n\t\treturn this._name || this.code;\r\n\t}\r\n}\r\n","/**\r\n * Represents a theme.\r\n */\r\nexport interface ITheme\r\n{\r\n\t/**\r\n\t * The slug identifying the theme.\r\n\t * This must match the name of the theme folder.\r\n\t */\r\n\tslug: string;\r\n\r\n\t/**\r\n\t * The name of the theme.\r\n\t */\r\n\tname: string;\r\n\r\n\t/**\r\n\t * The primary color of the theme, as an RGB HEX value.\r\n\t */\r\n\tcolor: string;\r\n\r\n\t/**\r\n\t * True if the theme should only be available if debugging is enabled, otherwise false.\r\n\t */\r\n\tdebug?: boolean;\r\n}\r\n\r\n/**\r\n * Represents a theme.\r\n */\r\nexport class Theme\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param data The data from which the instance should be created.\r\n\t */\r\n\tpublic constructor(data: ITheme)\r\n\t{\r\n\t\tthis.slug = data.slug;\r\n\t\tthis.name = data.name;\r\n\t\tthis.color = data.color;\r\n\t\tthis.debug = data.debug ?? false;\r\n\t}\r\n\r\n\t/**\r\n\t * The slug identifying the theme.\r\n\t * This must match the name of the theme folder.\r\n\t */\r\n\tpublic readonly slug: string;\r\n\r\n\t/**\r\n\t * The name of the theme.\r\n\t */\r\n\tpublic readonly name: string;\r\n\r\n\t/**\r\n\t * The primary color of the theme, as an RGB HEX value.\r\n\t */\r\n\tpublic readonly color: string;\r\n\r\n\t/**\r\n\t * True if the theme should only be available if debugging is enabled, otherwise false.\r\n\t */\r\n\tpublic readonly debug: boolean;\r\n}\r\n","export * from \"./sentry-events\";\nexport * from \"./sentry-api-handler\";\n","import { Base64 } from \"shared/utilities\";\r\n\r\n// This is a simple implementation of an obfuscator and deobfuscator for use in API protection.\r\n// This is obviously not intended to provide any real security, but simply attempts to obscure\r\n// things enough, that the casual observer will not be immediately tempted to abuse the services.\r\n//\r\n// The approach taken here, is to combine Unicode-safe Base64 encoding with a Substitution Cipher.\r\n// This ensures the ciphertext is URL-safe, impedes the recognition of the encoding being used,\r\n// and prevents decoding by simply copying and pasting the ciphertext into any Base64 decoder.\r\n//\r\n// For more info, see:\r\n// https://en.wikipedia.org/wiki/Base64\r\n// https://en.wikipedia.org/wiki/Substitution_cipher\r\n\r\nconst base64Alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\r\n\r\n/**\r\n * Obfuscates the specified string by encoding it as Base64 and then encrypting it using a Caesar Cipher.\r\n * @param plaintext The text that should be obfuscated.\r\n * @param cipherAlphabet The cipher alphabet to use.\r\n * @returns The obfuscated text.\r\n */\r\nexport function obfuscate(plaintext: string, cipherAlphabet: string): string\r\n{\r\n\tconst cipherChars: string[] = [];\r\n\r\n\tfor (const char of Base64.encode(plaintext, true))\r\n\t{\r\n\t\tcipherChars.push(cipherAlphabet[base64Alphabet.indexOf(char)]);\r\n\t}\r\n\r\n\treturn cipherChars.join(\"\");\r\n}\r\n\r\n/**\r\n * Deobfuscates the specified string by decrypting it using a Caesar Cipher and then decoding it as Base64.\r\n * @param ciphertext The text that should be deobfuscated.\r\n * @param cipherAlphabet The cipher alphabet to use.\r\n * @returns The deobfuscated text.\r\n */\r\nexport function deobfuscate(ciphertext: string, cipherAlphabet: string): string\r\n{\r\n\tconst base64Chars: string[] = [];\r\n\r\n\tfor (const char of ciphertext)\r\n\t{\r\n\t\tbase64Chars.push(base64Alphabet[cipherAlphabet.indexOf(char)]);\r\n\t}\r\n\r\n\treturn Base64.decode(base64Chars.join(\"\"), true);\r\n}\r\n","export class ModuleActivateFinishedEvent\n{\n\tpublic constructor(\n\t\tmoduleName: string | undefined,\n\t\tstatus: \"error\" | \"aborted\" | \"success\",\n\t\terror?: Error)\n\t{\n\t\tthis.moduleName = moduleName ?? \"\";\n\t\tthis.status = status;\n\t\tthis.error = error;\n\t}\n\n\tpublic readonly moduleName: string;\n\tpublic readonly status: \"error\" | \"aborted\" | \"success\";\n\tpublic readonly error: Error | undefined;\n}\n","import { computedFrom } from \"aurelia-binding\";\r\nimport { AbortError } from \"shared/types\";\r\n\r\n/**\r\n * Represents an async operation, that may succeede, fail with an error, or be aborted.\r\n */\r\nexport class Operation\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param func The function to execute, which will be called immediately.\r\n\t */\r\n\tpublic constructor(func: (signal: AbortSignal) => Promise)\r\n\t{\r\n\t\t// Create the abort controller.\r\n\t\tthis._abortController = new AbortController();\r\n\r\n\t\t// Execute the function and get its promise.\r\n\t\tthis.promise = func(this._abortController.signal);\r\n\r\n\t\tthis.promise\r\n\t\t\t.catch(error =>\r\n\t\t\t{\r\n\t\t\t\t// Throw if not caused by an abort.\r\n\t\t\t\tif (!(error instanceof AbortError) || !this._aborted)\r\n\t\t\t\t{\r\n\t\t\t\t\t// Store the error on the operation.\r\n\t\t\t\t\tthis._error = error;\r\n\r\n\t\t\t\t\tthrow error;\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.finally(() =>\r\n\t\t\t{\r\n\t\t\t\t// Indicate that the operation is no longer pending.\r\n\t\t\t\tthis._pending = false;\r\n\t\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * The abort controller for the current operation.\r\n\t */\r\n\tprivate readonly _abortController: AbortController;\r\n\r\n\t/**\r\n\t * True if the operation is pending, otherwise false.\r\n\t */\r\n\tprivate _pending = true;\r\n\r\n\t/**\r\n\t * True if the operation was aborted, otherwise false.\r\n\t */\r\n\tprivate _aborted = false;\r\n\r\n\t/**\r\n\t * The error that occurred, or undefined if the operation is pending or succeeded.\r\n\t */\r\n\tprivate _error: Error;\r\n\r\n\t/**\r\n\t * The promise for the operation.\r\n\t */\r\n\tpublic readonly promise: Promise;\r\n\r\n\t/**\r\n\t * True if the operation is pending, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_pending\")\r\n\tpublic get pending(): boolean\r\n\t{\r\n\t\treturn this._pending;\r\n\t}\r\n\r\n\t/**\r\n\t * True if the operation was aborted, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_aborted\")\r\n\tpublic get aborted(): boolean\r\n\t{\r\n\t\treturn this._aborted;\r\n\t}\r\n\r\n\t/**\r\n\t * The error that occurred, or undefined if the operation is pending or succeeded.\r\n\t */\r\n\t@computedFrom(\"_error\")\r\n\tpublic get error(): Error\r\n\t{\r\n\t\treturn this._error;\r\n\t}\r\n\r\n\t/**\r\n\t * Aborts the operation, and rejects its promise with an `AbortError`.\r\n\t */\r\n\tpublic abort(): void\r\n\t{\r\n\t\tthis._aborted = true;\r\n\t\tthis._abortController.abort();\r\n\t}\r\n}\r\n","/**\r\n * Represents the options to use when creating a debounced function.\r\n */\r\nexport interface IDebounceOptions\r\n{\r\n\t/**\r\n\t * True to invoke the function on the leading edge, otherwise false.\r\n\t * Default is false.\r\n\t */\r\n\tleading?: boolean;\r\n\r\n\t/**\r\n\t * True to invoke the function on the trailing edge, otherwise false.\r\n\t * Default is true.\r\n\t */\r\n\ttrailing?: boolean;\r\n\r\n\t/**\r\n\t * The maximum time to wait before invoking the function.\r\n\t * Default is undefined.\r\n\t */\r\n\tmaxWait?: number;\r\n}\r\n\r\n/**\r\n * Represents a debounced function.\r\n */\r\nexport interface IDebouncedFunc extends Function\r\n{\r\n\t/**\r\n\t * Cancels any delayed invocation.\r\n\t */\r\n\tcancel(): void;\r\n\r\n\t/**\r\n\t * Immediately executes any delayed invocation.\r\n\t * @returns The result of the delayed invocation or undefined.\r\n\t */\r\n\tflush(): any;\r\n}\r\n\r\n/**\r\n * Creates a debounced function, wrapping the specified function.\r\n * @param func The function to debounce.\r\n * @param wait The wait period, in milliseconds.\r\n * @param options The options to use.\r\n * @returns A debounced function, wrapping the specified function.\r\n */\r\nfunction createDebouncedFunc(func: TFunc, wait = 0, options?: IDebounceOptions): TFunc & IDebouncedFunc\r\n{\r\n\tlet lastArgs: any;\r\n\tlet lastThis: any;\r\n\tlet maxWait: number | undefined;\r\n\tlet result: any;\r\n\tlet timerId: any;\r\n\tlet lastCallTime: number | undefined;\r\n\r\n\tlet lastInvokeTime = 0;\r\n\tlet leading = false;\r\n\tlet maxing = false;\r\n\tlet trailing = true;\r\n\r\n\tif (typeof func !== \"function\")\r\n\t{\r\n\t\tthrow new TypeError(\"Expected a function\");\r\n\t}\r\n\r\n\twait = +wait || 0;\r\n\r\n\tif (options != null)\r\n\t{\r\n\t\tleading = !!options.leading;\r\n\t\tmaxing = \"maxWait\" in options;\r\n\t\tmaxWait = maxing ? Math.max(+(options.maxWait || 0), wait) : maxWait;\r\n\t\ttrailing = \"trailing\" in options ? !!options.trailing : trailing;\r\n\t}\r\n\r\n\tfunction invokeFunc(time: number): any\r\n\t{\r\n\t\tconst args = lastArgs;\r\n\t\tconst thisArg = lastThis;\r\n\r\n\t\tlastArgs = lastThis = undefined;\r\n\t\tlastInvokeTime = time;\r\n\t\tresult = func.apply(thisArg, args);\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfunction leadingEdge(time: number): any\r\n\t{\r\n\t\t// Reset any `maxWait` timer.\r\n\t\tlastInvokeTime = time;\r\n\r\n\t\t// Start the timer for the trailing edge.\r\n\t\ttimerId = setTimeout(timerExpired, wait);\r\n\r\n\t\t// Invoke the leading edge.\r\n\t\treturn leading ? invokeFunc(time) : result;\r\n\t}\r\n\r\n\tfunction remainingWait(time: number): number\r\n\t{\r\n\t\tconst timeSinceLastCall = time - lastCallTime!;\r\n\t\tconst timeSinceLastInvoke = time - lastInvokeTime;\r\n\t\tconst remaining = wait - timeSinceLastCall;\r\n\r\n\t\treturn maxing ? Math.min(remaining, maxWait! - timeSinceLastInvoke) : remaining;\r\n\t}\r\n\r\n\tfunction shouldInvoke(time: number): boolean\r\n\t{\r\n\t\tconst timeSinceLastCall = time - lastCallTime!;\r\n\t\tconst timeSinceLastInvoke = time - lastInvokeTime;\r\n\r\n\t\t// Either this is the first call, activity has stopped and we're at the\r\n\t\t// trailing edge, the system time has gone backwards and we're treating\r\n\t\t// it as the trailing edge, or we've hit the `maxWait` limit.\r\n\t\treturn (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\r\n\t\t\t(timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait!));\r\n\t}\r\n\r\n\tfunction timerExpired(): any\r\n\t{\r\n\t\tconst time = Date.now();\r\n\r\n\t\tif (shouldInvoke(time))\r\n\t\t{\r\n\t\t\treturn trailingEdge(time);\r\n\t\t}\r\n\r\n\t\t// Restart the timer.\r\n\t\ttimerId = setTimeout(timerExpired, remainingWait(time));\r\n\t}\r\n\r\n\tfunction trailingEdge(time: number): any\r\n\t{\r\n\t\ttimerId = undefined;\r\n\r\n\t\t// Only invoke if we have `lastArgs` which means `func` has been\r\n\t\t// debounced at least once.\r\n\t\tif (trailing && lastArgs)\r\n\t\t{\r\n\t\t\treturn invokeFunc(time);\r\n\t\t}\r\n\r\n\t\tlastArgs = lastThis = undefined;\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfunction cancel(): void\r\n\t{\r\n\t\tif (timerId !== undefined)\r\n\t\t{\r\n\t\t\tclearTimeout(timerId);\r\n\t\t}\r\n\r\n\t\tlastInvokeTime = 0;\r\n\t\tlastArgs = lastCallTime = lastThis = timerId = undefined;\r\n\t}\r\n\r\n\tfunction flush(): any\r\n\t{\r\n\t\treturn timerId === undefined ? result : trailingEdge(Date.now());\r\n\t}\r\n\r\n\tfunction debounced(this: any, ...args: any[]): any\r\n\t{\r\n\t\tconst time = Date.now();\r\n\t\tconst isInvoking = shouldInvoke(time);\r\n\r\n\t\tlastThis = this;\r\n\t\tlastArgs = args;\r\n\t\tlastCallTime = time;\r\n\r\n\t\tif (isInvoking)\r\n\t\t{\r\n\t\t\tif (timerId === undefined)\r\n\t\t\t{\r\n\t\t\t\treturn leadingEdge(lastCallTime);\r\n\t\t\t}\r\n\r\n\t\t\tif (maxing)\r\n\t\t\t{\r\n\t\t\t\t// Handle invocations in a tight loop.\r\n\t\t\t\ttimerId = setTimeout(timerExpired, wait);\r\n\r\n\t\t\t\treturn invokeFunc(lastCallTime);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (timerId === undefined)\r\n\t\t{\r\n\t\t\ttimerId = setTimeout(timerExpired, wait);\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t(debounced as any).cancel = cancel;\r\n\t(debounced as any).flush = flush;\r\n\r\n\treturn debounced as any;\r\n}\r\n\r\n/**\r\n * Decorates a class method such that invocation is delayed until the specified\r\n * wait period have elapsed since the most recent call to the method.\r\n *\r\n * The method is always invoked with the arguments provided in the most recent call.\r\n * Any debounced calls to the method return the result of the most recent invocation.\r\n *\r\n * Additional options may be provided to indicate whether the method should\r\n * be invoked on the leading and/or trailing edge of the wait periodt.\r\n *\r\n * Note that if `leading` and `trailing` options are true, the method is invoked on\r\n * the trailing edge of the wait period, only if the method is called more\r\n * than once during the wait period. If the wait period is 0 and `leading` is false,\r\n * method invocation is deferred until the next tick.\r\n *\r\n * Note that the debounced method is extended with a `cancel` method to cancel\r\n * any delayed invocations and a `flush` method to execute them immediately.\r\n *\r\n * For an explanation of the difference between debouncing and throttling,\r\n * see: https://css-tricks.com/debouncing-throttling-explained-examples\r\n *\r\n * @param wait The wait period, in milliseconds.\r\n * @param options The options to use.\r\n */\r\nexport function debounce(wait: number, options?: IDebounceOptions): any;\r\n\r\n/**\r\n * Creates a debounced function that wraps the specified function, such that invocation\r\n * of the function is delayed until the specified wait period have elapsed since the most\r\n * recent call to the function.\r\n *\r\n * The function is always invoked with the arguments provided in the most recent call.\r\n * Any debounced calls to the function return the result of the most recent invocation.\r\n *\r\n * Additional options may be provided to indicate whether the function should\r\n * be invoked on the leading and/or trailing edge of the wait periodt.\r\n *\r\n * Note that if `leading` and `trailing` options are true, the function is invoked on\r\n * the trailing edge of the wait period, only if the function is called more\r\n * than once during the wait period. If the wait period is 0 and `leading` is false,\r\n * function invocation is deferred until the next tick.\r\n *\r\n * Note that the debounced function is extended with a `cancel` method to cancel\r\n * any delayed invocations and a `flush` method to execute them immediately.\r\n *\r\n * For an explanation of the difference between debouncing and throttling,\r\n * see: https://css-tricks.com/debouncing-throttling-explained-examples\r\n *\r\n * @param func The function to debounce.\r\n * @param wait The wait period, in milliseconds. Default is 0.\r\n * @param options The options to use.\r\n * @returns A debounced function, wrapping the specified function.\r\n */\r\nexport function debounce(func: TFunc, wait: number, options?: IDebounceOptions): TFunc & IDebouncedFunc;\r\n\r\nexport function debounce(...args: any[]): any\r\n{\r\n\tif (args[0] instanceof Function)\r\n\t{\r\n\t\treturn createDebouncedFunc(args[0], args[1], args[2]);\r\n\t}\r\n\r\n\treturn function once(target: any, key?: any, descriptor?: any): any\r\n\t{\r\n\t\treturn {\r\n\t\t\tconfigurable: true,\r\n\t\t\tenumerable: descriptor.enumerable,\r\n\t\t\tget: function getter(): Function\r\n\t\t\t{\r\n\t\t\t\t// Attach this function to the instance.\r\n\t\t\t\tObject.defineProperty(this, key,\r\n\t\t\t\t{\r\n\t\t\t\t\tconfigurable: true,\r\n\t\t\t\t\tenumerable: descriptor.enumerable,\r\n\t\t\t\t\tvalue: createDebouncedFunc(descriptor.value, args[0], args[1])\r\n\t\t\t\t});\r\n\r\n\t\t\t\treturn this[key];\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n}\r\n","export * from \"./services/identity-service\";\nexport * from \"./entities/identity\";\nexport * from \"./entities/company-initial\";\nexport * from \"./entities/administrator-simple\";\nexport * from \"./entities/onboarding-state\";\n","export * from \"./history-helper\";\r\n","export * from \"./log\";\r\nexport * from \"./integrations/aurelia/log-appender\";\r\nexport * from \"./integrations/aurelia/log-navigation\";\r\n","import { Container, BindingEngine } from \"aurelia-framework\";\r\nimport { Compose } from \"aurelia-templating-resources\";\r\nimport { Type } from \"shared/types\";\r\nimport { PromiseController } from \"shared/utilities\";\r\nimport { ToastCloseReason } from \"./toast-close-reason\";\r\n\r\n/**\r\n * Represents a toast on the stack.\r\n */\r\nexport class Toast\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param toasts The stack of open toasts.\r\n\t * @param viewModel The type of the component to present, or its module ID.\r\n\t * @param model The model to pass to the `activate` life cycle method of the component.\r\n\t */\r\n\tpublic constructor(toasts: Toast[], viewModel: string | Type, model?: TModel)\r\n\t{\r\n\t\tthis._toasts = toasts;\r\n\t\tthis.viewModel = viewModel;\r\n\t\tthis.model = model;\r\n\r\n\t\tconst bindingEngine = Container.instance.get(BindingEngine);\r\n\t\tconst handle = bindingEngine.propertyObserver(this, \"compose\").subscribe((newValue: any) =>\r\n\t\t{\r\n\t\t\thandle.dispose();\r\n\r\n\t\t\tthis.onComposeSet(newValue);\r\n\t\t});\r\n\t}\r\n\r\n\tprivate readonly _promiseController = new PromiseController();\r\n\tprivate readonly _toasts: Toast[];\r\n\tprivate _closed = false;\r\n\r\n\t/**\r\n\t * The type of the component to present, or its module ID.\r\n\t */\r\n\tpublic readonly viewModel: string | Type;\r\n\r\n\t/**\r\n\t * The model to pass to the `activate` life cycle method of the component.\r\n\t */\r\n\tpublic readonly model?: TModel;\r\n\r\n\t/**\r\n\t * The `Compose` instance presenting the component.\r\n\t */\r\n\tpublic compose: Compose | undefined;\r\n\r\n\t/**\r\n\t * True if the toast is busy, false if the toast is not busy, or null\r\n\t * if the toast is technically not busy, but should still appear as busy, e.g.\r\n\t * because it is in the process of closing.\r\n\t * Note that all interaction with the toast is blocked when this is not false.\r\n\t */\r\n\tpublic busy: boolean | null = false;\r\n\r\n\t/**\r\n\t * The promise that will be resolved when the toast is closed.\r\n\t */\r\n\tpublic get promise(): Promise\r\n\t{\r\n\t\treturn this._promiseController.promise;\r\n\t}\r\n\r\n\t/**\r\n\t * Attempts to close all open toasts, up to an including this.\r\n\t * @param reason The reason for closing the toasts, which may affect how the toasts responds.\r\n\t * @returns A promise that will be resolved with true if all toasts accepted the close request,\r\n\t * or false if one of them rejected it with a reason other than an `Error` instance.\r\n\t */\r\n\tpublic async closeAll(reason?: ToastCloseReason): Promise\r\n\t{\r\n\t\tconsole.info(\"Attempting to close all toasts, starting from this.\", { toast: this, reason, toasts: this._toasts });\r\n\r\n\t\tconst index = this._toasts.findIndex(m => m === this);\r\n\r\n\t\tfor (const toast of this._toasts.slice(0, index + 1).reverse())\r\n\t\t{\r\n\t\t\tconst closed = await toast.close(reason);\r\n\r\n\t\t\tif (!closed)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Closes the toast.\r\n\t * @param reason The reason for closing the toast, which may affect how the toast responds.\r\n\t * Standard reasons include `backdrop-clicked` and `navigation`, but it may be anything.\r\n\t * @returns A promise that will be resolved with true if the toast accepted the close request,\r\n\t * or false if it rejected it with a reason other than an `Error` instance.\r\n\t */\r\n\tpublic async close(reason?: ToastCloseReason): Promise\r\n\t{\r\n\t\tif (this._closed)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tconsole.info(\"Attempting to close toast.\", { toast: this, reason });\r\n\r\n\t\tlet result: TResult | undefined;\r\n\r\n\t\tconst compose = this.compose as any;\r\n\r\n\t\tif (compose?.currentViewModel?.deactivate)\r\n\t\t{\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tresult = await compose.currentViewModel.deactivate(reason);\r\n\t\t\t}\r\n\t\t\tcatch (reason)\r\n\t\t\t{\r\n\t\t\t\tif (reason instanceof Error)\r\n\t\t\t\t{\r\n\t\t\t\t\tconsole.warn(\"Toast failed to close.\", { toast: this, reason });\r\n\r\n\t\t\t\t\tthrow reason;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconsole.warn(\"Toast refused to close.\", { toast: this, reason });\r\n\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tawait Promise.resolve();\r\n\t\t}\r\n\r\n\t\tconst index = this._toasts.findIndex(m => m === this);\r\n\t\tthis._toasts.splice(index, 1);\r\n\r\n\t\tthis._closed = true;\r\n\r\n\t\tconsole.info(\"Toast closed.\", { toast: this, result });\r\n\r\n\t\tthis._promiseController.resolve(result);\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the `compose` property is set.\r\n\t * @param compose The `Compose` instance presenting the component.\r\n\t */\r\n\tprivate async onComposeSet(compose: any): Promise\r\n\t{\r\n\t\ttry\r\n\t\t{\r\n\t\t\tawait compose.pendingTask;\r\n\r\n\t\t\tconsole.info(\"Toast opened.\", { toast: this });\r\n\t\t}\r\n\t\tcatch (reason)\r\n\t\t{\r\n\t\t\tconst index = this._toasts.findIndex(m => m === this);\r\n\r\n\t\t\tif (index >= 0)\r\n\t\t\t{\r\n\t\t\t\tthis._toasts.splice(index, 1);\r\n\t\t\t}\r\n\r\n\t\t\tthis._closed = true;\r\n\r\n\t\t\tif (reason instanceof Error)\r\n\t\t\t{\r\n\t\t\t\tconsole.error(\"Toast failed to open.\", { toast: this, reason });\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tconsole.warn(\"Toast refused to open.\", { toast: this, reason });\r\n\t\t\t}\r\n\r\n\t\t\tthis._promiseController.reject(reason);\r\n\t\t}\r\n\t}\r\n}\r\n","/**\r\n * Represents the result of a successful request.\r\n */\r\nexport class ApiResult\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param request The request sent to the server.\r\n\t * @param response The response received from the server.\r\n\t * @param data The deserialized response body, if available.\r\n\t */\r\n\tpublic constructor(request: Request, response: Response, data?: T)\r\n\t{\r\n\t\tthis.request = request;\r\n\t\tthis.response = response;\r\n\t\tthis.data = data;\r\n\t}\r\n\r\n\t/**\r\n\t * The request sent to the server\r\n\t */\r\n\tpublic request: Request;\r\n\r\n\t/**\r\n\t * The response received from the server\r\n\t */\r\n\tpublic response: Response;\r\n\r\n\t/**\r\n\t * The deserialized response body.\r\n\t */\r\n\tpublic data: T | undefined;\r\n}\r\n","export * from \"./focus-service\";\r\n","import { Container, BindingEngine } from \"aurelia-framework\";\r\nimport { Compose } from \"aurelia-templating-resources\";\r\nimport { Type } from \"shared/types\";\r\nimport { PromiseController } from \"shared/utilities\";\r\nimport { ModalCloseReason } from \"./modal-close-reason\";\r\n\r\n/**\r\n * Represents a modal on the stack.\r\n */\r\nexport class Modal\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param modals The stack of open modals.\r\n\t * @param viewModel The type of the component to present, or its module ID.\r\n\t * @param model The model to pass to the `activate` life cycle method of the component.\r\n\t */\r\n\tpublic constructor(modals: Modal[], viewModel: string | Type, model?: TModel)\r\n\t{\r\n\t\tthis._modals = modals;\r\n\t\tthis.viewModel = viewModel;\r\n\t\tthis.model = model;\r\n\r\n\t\tconst bindingEngine = Container.instance.get(BindingEngine);\r\n\t\tconst handle = bindingEngine.propertyObserver(this, \"compose\").subscribe((newValue: any) =>\r\n\t\t{\r\n\t\t\thandle.dispose();\r\n\r\n\t\t\tthis.onComposeSet(newValue);\r\n\t\t});\r\n\t}\r\n\r\n\tprivate readonly _promiseController = new PromiseController();\r\n\tprivate readonly _modals: Modal[];\r\n\tprivate _closed = false;\r\n\r\n\t/**\r\n\t * The type of the component to present, or its module ID.\r\n\t */\r\n\tpublic readonly viewModel: string | Type;\r\n\r\n\t/**\r\n\t * The model to pass to the `activate` life cycle method of the component.\r\n\t */\r\n\tpublic readonly model?: TModel;\r\n\r\n\t/**\r\n\t * The `Compose` instance presenting the component.\r\n\t */\r\n\tpublic compose: Compose | undefined;\r\n\r\n\t/**\r\n\t * True if the modal is busy, false if the modal is not busy, or null\r\n\t * if the modal is technically not busy, but should still appear as busy, e.g.\r\n\t * because it is in the process of closing.\r\n\t * Note that all interaction with the modal is blocked when this is not false.\r\n\t */\r\n\tpublic busy: boolean | null = false;\r\n\r\n\t/**\r\n\t * The promise that will be resolved when the modal is closed.\r\n\t */\r\n\tpublic get promise(): Promise\r\n\t{\r\n\t\treturn this._promiseController.promise;\r\n\t}\r\n\r\n\t/**\r\n\t * Attempts to close all open modals, up to an including this.\r\n\t * @param reason The reason for closing the modals, which may affect how the modals responds.\r\n\t * @returns A promise that will be resolved with true if all modals accepted the close request,\r\n\t * or false if one of them rejected it with a reason other than an `Error` instance.\r\n\t */\r\n\tpublic async closeAll(reason?: ModalCloseReason): Promise\r\n\t{\r\n\t\tconsole.info(\"Attempting to close all modals, starting from this.\", { modal: this, reason, modals: this._modals });\r\n\r\n\t\tconst index = this._modals.findIndex(m => m === this);\r\n\r\n\t\tfor (const modal of this._modals.slice(0, index + 1).reverse())\r\n\t\t{\r\n\t\t\tconst closed = await modal.close(reason);\r\n\r\n\t\t\tif (!closed)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Closes the modal.\r\n\t * @param reason The reason for closing the modal, which may affect how the modal responds.\r\n\t * Standard reasons include `backdrop-clicked` and `navigation`, but it may be anything.\r\n\t * @returns A promise that will be resolved with true if the modal accepted the close request,\r\n\t * or false if it rejected it with a reason other than an `Error` instance.\r\n\t */\r\n\tpublic async close(reason?: ModalCloseReason): Promise\r\n\t{\r\n\t\tif (this._closed)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tconsole.info(\"Attempting to close modal.\", { modal: this, reason });\r\n\r\n\t\tif (this._modals[this._modals.length - 1] !== this)\r\n\t\t{\r\n\t\t\tconsole.error(\"The modal being closed is not at the top of the stack.\", { modal: this });\r\n\t\t}\r\n\r\n\t\tlet result: TResult | undefined;\r\n\r\n\t\tconst compose = this.compose as any;\r\n\r\n\t\tif (compose?.currentViewModel?.deactivate)\r\n\t\t{\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tresult = await compose.currentViewModel.deactivate(reason);\r\n\t\t\t}\r\n\t\t\tcatch (reason)\r\n\t\t\t{\r\n\t\t\t\tif (reason instanceof Error)\r\n\t\t\t\t{\r\n\t\t\t\t\tconsole.warn(\"Modal failed to close.\", { modal: this, reason });\r\n\r\n\t\t\t\t\tthrow reason;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconsole.warn(\"Modal refused to close.\", { modal: this, reason });\r\n\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tawait Promise.resolve();\r\n\t\t}\r\n\r\n\t\tconst index = this._modals.findIndex(m => m === this);\r\n\t\tthis._modals.splice(index, 1);\r\n\r\n\t\tthis._closed = true;\r\n\r\n\t\tconsole.info(\"Modal closed.\", { modal: this, result });\r\n\r\n\t\tthis._promiseController.resolve(result);\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the `compose` property is set.\r\n\t * @param compose The `Compose` instance presenting the component.\r\n\t */\r\n\tprivate async onComposeSet(compose: any): Promise\r\n\t{\r\n\t\ttry\r\n\t\t{\r\n\t\t\tawait compose.pendingTask;\r\n\r\n\t\t\tconsole.info(\"Modal opened.\", { modal: this });\r\n\t\t}\r\n\t\tcatch (reason)\r\n\t\t{\r\n\t\t\tconst index = this._modals.findIndex(m => m === this);\r\n\r\n\t\t\tif (index >= 0)\r\n\t\t\t{\r\n\t\t\t\tthis._modals.splice(index, 1);\r\n\t\t\t}\r\n\r\n\t\t\tthis._closed = true;\r\n\r\n\t\t\tif (reason instanceof Error)\r\n\t\t\t{\r\n\t\t\t\tconsole.error(\"Modal failed to open.\", { modal: this, reason });\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tconsole.warn(\"Modal refused to open.\", { modal: this, reason });\r\n\t\t\t}\r\n\r\n\t\t\tthis._promiseController.reject(reason);\r\n\t\t}\r\n\t}\r\n}\r\n","import clone from \"clone\";\nimport { DateTime } from \"luxon\";\nimport { EmployeeStatus } from \"./employee-status\";\n\n/**\n * The employee instance used in data tables.\n */\nexport class EmployeeSimple\n{\n /**\n * Creates a new instance of the type.\n * @param data The response data from which the instance should be created.\n */\n public constructor(data: any)\n {\n this.id = data.id;\n this.firstName = data.firstName ?? \"\";\n this.lastName = data.lastName ?? \"\";\n this.monthlySalary = data.monthlySalary;\n this.companyContributionPercentage = data.companyContribution;\n this.ownContributionPercentage = data.ownContribution;\n this.status = EmployeeStatus.fromJSON(data.status);\n this.agreementStartDate = data.agreementStartDate ? DateTime.fromISO(data.agreementStartDate) : undefined;\n this.agreementEndDate = data.agreementEndDate ? DateTime.fromISO(data.agreementEndDate) : undefined;\n this.missingPersonalInformation = data.missingPersonalInformation ?? false;\n this.missingAddressInformation = data.missingAddressInformation ?? false;\n this.missingCompensationInformation = data.missingCompensationInformation ?? false;\n }\n\n public readonly id: number;\n\n public readonly firstName: string;\n\n public readonly lastName: string;\n\n public readonly companyContributionPercentage: number;\n\n public readonly ownContributionPercentage: number;\n\n public readonly monthlySalary: number;\n\n public readonly status: EmployeeStatus;\n\n public readonly agreementStartDate?: DateTime;\n\n public readonly agreementEndDate?: DateTime;\n\n public readonly missingPersonalInformation: boolean;\n\n public readonly missingAddressInformation: boolean;\n\n public readonly missingCompensationInformation: boolean;\n\n /**\n * Gets a clone of this instance, suitable for editing.\n */\n public get fullName(): string\n {\n return `${this.firstName} ${this.lastName}`;\n }\n\n /**\n * Gets a clone of this instance, suitable for editing.\n */\n public clone(): any\n {\n return clone(this);\n }\n}\n","import clone from \"clone\";\n\nexport class EmployeeAddress\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param data The response data from which the instance should be created.\n\t */\n\tpublic constructor(data: any)\n\t{\n\t\tthis.streetName = data?.streetName;\n\t\tthis.streetNumber = data?.streetNumber;\n\t\tthis.floorAndSide = data?.floorAndSide;\n\t\tthis.postalCode = data?.postalCode;\n\t\tthis.city = data?.city;\n\t\tthis.country = data?.country;\n\t}\n\n\tpublic streetName: string;\n\tpublic streetNumber: string;\n\tpublic floorAndSide: string;\n\tpublic postalCode: string;\n\tpublic city: string;\n\tpublic country: string;\n\n\t/**\n\t * Gets a clone of this instance, suitable for editing.\n\t */\n\tpublic clone(): any\n\t{\n\t\treturn clone(this);\n\t}\n}\n","import clone from \"clone\";\n\nexport class EmployeePersonalInformation\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param data The response data from which the instance should be created.\n\t */\n\tpublic constructor(data: any)\n\t{\n\t\tthis.firstName = data.firstName;\n\t\tthis.lastName = data.lastName;\n\t\tthis.socialSecurityNumber = data.cpr;\n\t\tthis.email = data.email;\n\t\tthis.phoneNumber = data.phoneNumber;\n\t}\n\n\tpublic firstName: string;\n\tpublic lastName: string;\n\tpublic socialSecurityNumber: string;\n\tpublic email: string;\n\tpublic phoneNumber: string;\n\n\t/**\n\t * Gets a clone of this instance, suitable for editing.\n\t */\n\tpublic clone(): any\n\t{\n\t\treturn clone(this);\n\t}\n\n\t/**\n\t * Gets the data representing this instance.\n\t */\n\tpublic toJSON(): any\n\t{\n\t\treturn {\n\t\t\tfirstName: this.firstName,\n\t\t\tlastName: this.lastName,\n\t\t\tcpr: this.socialSecurityNumber,\n\t\t\temail: this.email,\n\t\t\tphoneNumber: this.phoneNumber\n\t\t};\n\t}\n}\n","import clone from \"clone\";\nimport { PayrollSystem } from \"../../shared\";\n\nexport class PayrollSystemResponse {\n /**\n * Creates a new instance of the type.\n * @param data The response data from which the instance should be created.\n */\n public constructor(data: any) {\n this.payrollSystem = PayrollSystem.payrollSystemFromJSON(data.payrollSystem);\n this.connections = data.connections.map((connection: any) => new PayrollSystemConnection(connection));\n }\n\n public readonly payrollSystem: PayrollSystem;\n\n public readonly connections: PayrollSystemConnection[];\n\n /**\n * Gets a clone of this instance, suitable for editing.\n */\n public clone(): any {\n return clone(this);\n }\n}\n\nexport class PayrollSystemConnection {\n /**\n * Creates a new instance of the type.\n * @param data The response data from which the instance should be created.\n */\n public constructor(data: any) {\n this.id = data.id;\n this.companyName = data.companyName;\n this.connectionAvailable = data.connectionAvailable;\n }\n\n public readonly id: number;\n\n public readonly companyName: string;\n\n public readonly connectionAvailable: boolean;\n\n /**\n * Gets a clone of this instance, suitable for editing.\n */\n public clone(): any {\n return clone(this);\n }\n}\n","import { IdentityService } from \"company-dashboard/services/identity\";\nimport { autoinject } from \"aurelia-framework\";\nimport { ApiClient } from \"shared/infrastructure\";\n\n@autoinject\nexport class AdministratorService\n{\n\tprivate readonly _apiClient: ApiClient;\n\tprivate readonly _identityService: IdentityService;\n\n\tpublic constructor(\n\t\tapiClient: ApiClient,\n\t\tidentityService: IdentityService)\n\t{\n\t\tthis._apiClient = apiClient;\n\t\tthis._identityService = identityService;\n\t}\n\n\tpublic async addAdministrator(\n\t\tfirstName: string,\n\t\tlastName: string,\n\t\temail: string,\n\t\tsignal?: AbortSignal): Promise\n\t{\n\t\tawait this._apiClient.post(\n\t\t\t`/${this._identityService.identity.company?.id}/administrator/add`,\n\t\t\t{\n\t\t\t\tbody: { firstName: firstName, lastName: lastName, email: email },\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async deactivateAdministrator(administratorId: number, signal?: AbortSignal): Promise\n\t{\n\t\tawait this._apiClient.post(\n\t\t\t`/${this._identityService.identity.company?.id}/administrator/${administratorId}/deactivate`,\n\t\t\t{\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Creates a password for the new user and authenticates the user.\n\t * @param password The new password for the user.\n\t * @param confirmPassword The confirmed password.\n\t * @param token The code used to identify a confirmed user.\n\t * @param id The id of the user resetting their password.\n\t * @param receiveMarketingInformation If the user consents to receive marketing information.\n\t * @param signal The abort signal to use, or undefined to use no abort signal.\n\t * @returns A promise that will be resolved when the operation succeeds.\n\t */\n\tpublic async acceptInvite(password: string, confirmPassword: string, token: string, id: string, receiveMarketingInformation: boolean, signal?: AbortSignal): Promise\n\t{\n\t\tconst result = await this._apiClient.post(\n\t\t\t`/administrator/accept-invite`,\n\t\t\t{\n\t\t\t\tbody: {\n\t\t\t\t\tpassword: password,\n\t\t\t\t\tconfirmPassword: confirmPassword,\n\t\t\t\t\ttoken: token,\n\t\t\t\t\tid: id,\n\t\t\t\t\treceiveMarketingInformation: receiveMarketingInformation\n\t\t\t\t},\n\t\t\t\tsignal: signal\n\t\t\t});\n\n\t\tthis._identityService.identity.setTokens(result.data.accessToken, result.data.refreshToken);\n\t\tthis._identityService.configureInfrastructure();\n\t}\n}\n","import { IdentityService } from \"company-dashboard/services/identity\";\nimport { autoinject } from \"aurelia-framework\";\nimport { ApiClient } from \"shared/infrastructure\";\n\n@autoinject\nexport class AgreementDocumentService\n{\n\tprivate readonly _apiClient: ApiClient;\n\tprivate readonly _identityService: IdentityService;\n\n\tpublic constructor(\n\t\tapiClient: ApiClient,\n\t\tidentityService: IdentityService)\n\t{\n\t\tthis._apiClient = apiClient;\n\t\tthis._identityService = identityService;\n\t}\n\n\tpublic async getAgreementDocument(s3Key: string, signal?: AbortSignal): Promise\n\t{\n\t\tlet data = await this._apiClient.get(\n\t\t\t`/${this._identityService.identity.company?.id}/document/${s3Key}`,\n\t\t\t{\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\n\t\treturn data.response.blob();\n\t}\n}\n","import * as uuid from \"uuid\";\r\n\r\n/**\r\n * Namespace providing methods for generating RFC4122 compliant UUIDs.\r\n * Note that the quality of the UUIDs generated depend heavily on the type\r\n * and quality of the random number generators available on the platform.\r\n */\r\nexport namespace Uuid\r\n{\r\n\t/**\r\n\t * Generates a new RFC4122 v1 (timestamp-based) UUID.\r\n\t * This is suitable for situations where uniqueness is the primary concern.\r\n\t * @returns A string representing the generated UUID.\r\n\t */\r\n\texport function v1(): string\r\n\t{\r\n\t\treturn uuid.v1();\r\n\t}\r\n\r\n\t/**\r\n\t * Generates a new RFC4122 v4 (random) UUID.\r\n\t * This is suitable for situations where randomness is the primary concern.\r\n\t * @returns A string representing the generated UUID.\r\n\t */\r\n\texport function v4(): string\r\n\t{\r\n\t\treturn uuid.v1();\r\n\t}\r\n}\r\n","/**\r\n * Represents a function that splits the specified text into strings using the rules of a specific text case.\r\n * @param text The text to split.\r\n * @param preserveWhitespace True to also extract whitespace between strings, false to only extract strings.\r\n * @returns The strings extracted from the text.\r\n */\r\nexport type TextSplitFunc = (text: string, preserveWhitespace: boolean) => string[];\r\n\r\n/**\r\n * Provides functions that splits a text into strings using the rules of a text case.\r\n */\r\nexport namespace TextSplitFuncs\r\n{\r\n\t/**\r\n\t * Splits the specified text using 'PascalCase' rules,\r\n\t * meaning that the text will be split on every upper-case letter.\r\n\t * Note that this only supports ASCII characters.\r\n\t * @param text The text to split.\r\n\t * @returns The strings extracted from the text.\r\n\t */\r\n\texport function pascalCase(text: string): string[]\r\n\t{\r\n\t\treturn text.split(/([A-Z][^A-Z]*)/g).filter(s => s);\r\n\t}\r\n\r\n\t/**\r\n\t * Splits the specified text using 'camelCase' rules,\r\n\t * meaning that the text will be split on every upper-case letter.\r\n\t * Note that this only supports ASCII characters.\r\n\t * @param text The text to split.\r\n\t * @returns The strings extracted from the text.\r\n\t */\r\n\texport function camelCase(text: string): string[]\r\n\t{\r\n\t\treturn text.split(/([A-Z][^A-Z]*)/g).filter(s => s);\r\n\t}\r\n\r\n\t/**\r\n\t * Splits the specified text using 'kebab-case' rules,\r\n\t * meaning that the text will be split when one or more `-` characters are encountered.\r\n\t * @param text The text to split.\r\n\t * @param preserveWhitespace True to also extract the separators as whitespace, false to only extract words.\r\n\t * @returns The strings extracted from the text.\r\n\t */\r\n\texport function kebabCase(text: string, preserveWhitespace: boolean): string[]\r\n\t{\r\n\t\treturn (preserveWhitespace ? text.replace(/-/g, \" \").split(/(\\s+)/g) : text.split(/-+/g)).filter(s => s);\r\n\t}\r\n\r\n\t/**\r\n\t * Splits the specified text using 'snake_case' rules,\r\n\t * meaning that the text will be split when one or more `_` characters are encountered.\r\n\t * @param text The text to split.\r\n\t * @param preserveWhitespace True to also extract the separators as whitespace, false to only extract words.\r\n\t * @returns The strings extracted from the text.\r\n\t */\r\n\texport function snakeCase(text: string, preserveWhitespace: boolean): string[]\r\n\t{\r\n\t\treturn (preserveWhitespace ? text.replace(/_/g, \" \").split(/(\\s+)/g) : text.split(/_+/g)).filter(s => s);\r\n\t}\r\n\r\n\t/**\r\n\t * Splits the specified text using 'space case' rules,\r\n\t * meaning that the text will be split when one or more whitespace characters are encountered.\r\n\t * @param text The text to split.\r\n\t * @param preserveWhitespace True to also extract the whitespace, false to only extract words.\r\n\t * @returns The strings extracted from the text.\r\n\t */\r\n\texport function spaceCase(text: string, preserveWhitespace: boolean): string[]\r\n\t{\r\n\t\treturn (preserveWhitespace ? text.split(/(\\s+)/g) : text.split(/\\s+/g)).filter(s => s);\r\n\t}\r\n}\r\n","import { IApiRequestOptions } from \"./api-request-options\";\r\n\r\n/**\r\n * The default settings to use as fallback.\r\n */\r\nexport const apiRequestDefaults: IApiRequestOptions =\r\n{\r\n\theaders:\r\n\t{\r\n\t\t\"accept\": \"application/json\",\r\n\t\t\"content-type\": \"application/json\"\r\n\t},\r\n\tretry: 3,\r\n\tretryDelay: [100, 1000, 3000],\r\n\tmode: \"cors\",\r\n\tcache: \"default\",\r\n\tcredentials: \"same-origin\",\r\n\tredirect: \"follow\",\r\n\treferrer: \"client\",\r\n\treferrerPolicy: \"no-referrer-when-downgrade\",\r\n\toptional: false,\r\n\tdeserialize: true,\r\n\tjsonReviver: undefined,\r\n\tkeepalive: false\r\n};\r\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"[empty-value=true]::before{content:\\\"--\\\";opacity:var(--opacity-faded)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/behaviors/empty-value/empty-value.scss\"],\"names\":[],\"mappings\":\"AAEC,2BAEC,YAAA,CACA,4BAAA\",\"sourcesContent\":[\"[empty-value=\\\"true\\\"]\\r\\n{\\r\\n\\t&::before\\r\\n\\t{\\r\\n\\t\\tcontent: \\\"--\\\";\\r\\n\\t\\topacity: var(--opacity-faded);\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"[scroll]{overflow-y:auto;overflow-y:overlay;overflow-x:hidden;--fade-duration: 0.3s;--fade-timing-function: ease-out;-webkit-overflow-scrolling:touch;-ms-scroll-chaining:none;overscroll-behavior:none}[scroll].disable-hover *{pointer-events:none !important}html:not(.platform-macos):not(.platform-ios) [scroll],[scroll].scroll--custom{--scrollbar-thickness: 12rem;--scrollbar-min-length: calc(var(--scrollbar-thickness) * 3);scrollbar-width:thin;scrollbar-color:var(--surface-scrollbar-thumb-color) var(--surface-scrollbar-track-color);-ms-overflow-style:-ms-autohiding-scrollbar}html:not(.platform-macos):not(.platform-ios) [scroll]::-webkit-scrollbar,[scroll].scroll--custom::-webkit-scrollbar{width:var(--scrollbar-thickness);height:var(--scrollbar-thickness)}html:not(.platform-macos):not(.platform-ios) [scroll]::-webkit-scrollbar-track:vertical,[scroll].scroll--custom::-webkit-scrollbar-track:vertical{border-left:1rem solid var(--surface-scrollbar-track-color)}html:not(.platform-macos):not(.platform-ios) [scroll]::-webkit-scrollbar-track:vertical:hover,[scroll].scroll--custom::-webkit-scrollbar-track:vertical:hover{border-left:1rem solid var(--surface-scrollbar-track-color--hover)}html:not(.platform-macos):not(.platform-ios) [scroll]::-webkit-scrollbar-track:horizontal,[scroll].scroll--custom::-webkit-scrollbar-track:horizontal{border-top:1rem solid var(--surface-scrollbar-track-color)}html:not(.platform-macos):not(.platform-ios) [scroll]::-webkit-scrollbar-track:horizontal:hover,[scroll].scroll--custom::-webkit-scrollbar-track:horizontal:hover{border-top:1rem solid var(--surface-scrollbar-track-color--hover)}html:not(.platform-macos):not(.platform-ios) [scroll]::-webkit-scrollbar-corner,[scroll].scroll--custom::-webkit-scrollbar-corner{background-color:var(--surface-scrollbar-track-color)}html:not(.platform-macos):not(.platform-ios) [scroll]::-webkit-scrollbar-thumb,[scroll].scroll--custom::-webkit-scrollbar-thumb{min-height:calc(var(--scrollbar-thickness) * 3);border:2rem solid transparent;border-radius:calc(var(--scrollbar-thickness) / 2);box-shadow:inset 0 0 var(--scrollbar-thickness) var(--scrollbar-thickness) var(--surface-scrollbar-thumb-color)}html:not(.platform-macos):not(.platform-ios) [scroll]::-webkit-scrollbar-thumb:hover,[scroll].scroll--custom::-webkit-scrollbar-thumb:hover{box-shadow:inset 0 0 var(--scrollbar-thickness) var(--scrollbar-thickness) var(--surface-scrollbar-thumb-color--hover)}html:not(.platform-macos):not(.platform-ios) [scroll]::-webkit-scrollbar-button,[scroll].scroll--custom::-webkit-scrollbar-button{display:none}[scroll] [scroll-fade]{transition:opacity var(--fade-duration);transition-timing-function:var(--fade-timing-function)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/behaviors/scroll/scroll.scss\"],\"names\":[],\"mappings\":\"AAEA,SAGC,eAAA,CAGA,kBAAA,CACA,iBAAA,CAGA,qBAAA,CAGA,gCAAA,CAGA,gCAAA,CAGA,wBAAA,CAAA,wBAAA,CAEA,yBAGC,8BAAA,CAGD,8EAIC,4BAAA,CAGA,4DAAA,CAGA,oBAAA,CAGA,yFAAA,CAGA,2CAAA,CAIA,oHAEC,gCAAA,CACA,iCAAA,CAMA,kJAEC,2DAAA,CAEA,8JAEC,kEAAA,CAKF,sJAEC,0DAAA,CAEA,kKAEC,iEAAA,CAKH,kIAEC,qDAAA,CAGD,gIAEC,+CAAA,CACA,6BAAA,CACA,kDAAA,CACA,+GAAA,CAEA,4IAEC,sHAAA,CAIF,kIAEC,YAAA,CAIF,uBAGC,uCAAA,CACA,sDAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\n[scroll]\\r\\n{\\r\\n\\t// HACK: Because Firefox does not support the `overlay` value.\\r\\n\\toverflow-y: auto;\\r\\n\\r\\n\\t// Enable vertical scrolling.\\r\\n\\toverflow-y: overlay;\\r\\n\\toverflow-x: hidden;\\r\\n\\r\\n\\t// The duration to use for opacity transitions.\\r\\n\\t--fade-duration: 0.3s;\\r\\n\\r\\n\\t// The timing function to use for opacity transitions.\\r\\n\\t--fade-timing-function: ease-out;\\r\\n\\r\\n\\t// Enable momentum-based scrolling.\\r\\n\\t-webkit-overflow-scrolling: touch;\\r\\n\\r\\n\\t// Prevent pull-to-refresh.\\r\\n\\toverscroll-behavior: none;\\r\\n\\r\\n\\t&.disable-hover *\\r\\n\\t{\\r\\n\\t\\t// Disable pointer events to prevent hover effects while scrolling.\\r\\n\\t\\tpointer-events: none !important;\\r\\n\\t}\\r\\n\\r\\n\\thtml:not(.platform-macos):not(.platform-ios) &,\\r\\n\\t&.scroll--custom\\r\\n\\t{\\r\\n\\t\\t// The thickness of the scrollbar.\\r\\n\\t\\t--scrollbar-thickness: 12rem;\\r\\n\\r\\n\\t\\t// The min length of the scrollbar.\\r\\n\\t\\t--scrollbar-min-length: calc(var(--scrollbar-thickness) * 3);\\r\\n\\r\\n\\t\\t// Use a thin scroll bar in Firefox browsers.\\r\\n\\t\\tscrollbar-width: thin;\\r\\n\\r\\n\\t\\t// Style the scrollbar in Firefox browsers.\\r\\n\\t\\tscrollbar-color: var(--surface-scrollbar-thumb-color) var(--surface-scrollbar-track-color);\\r\\n\\r\\n\\t\\t// Use overlay scroll bars in browsers based on the Trident and EdgeHTML engines.\\r\\n\\t\\t-ms-overflow-style: -ms-autohiding-scrollbar;\\r\\n\\r\\n\\t\\t// Style the scrollbar in browsers based on the WebKit and Blink engines.\\r\\n\\r\\n\\t\\t&::-webkit-scrollbar\\r\\n\\t\\t{\\r\\n\\t\\t\\twidth: var(--scrollbar-thickness);\\r\\n\\t\\t\\theight: var(--scrollbar-thickness);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&::-webkit-scrollbar-track\\r\\n\\t\\t{\\r\\n\\t\\t\\t// stylelint-disable-next-line selector-pseudo-class-no-unknown\\r\\n\\t\\t\\t&:vertical\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tborder-left: 1rem solid var(--surface-scrollbar-track-color);\\r\\n\\r\\n\\t\\t\\t\\t&:hover\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tborder-left: 1rem solid var(--surface-scrollbar-track-color--hover);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t// stylelint-disable-next-line selector-pseudo-class-no-unknown\\r\\n\\t\\t\\t&:horizontal\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tborder-top: 1rem solid var(--surface-scrollbar-track-color);\\r\\n\\r\\n\\t\\t\\t\\t&:hover\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tborder-top: 1rem solid var(--surface-scrollbar-track-color--hover);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&::-webkit-scrollbar-corner\\r\\n\\t\\t{\\r\\n\\t\\t\\tbackground-color: var(--surface-scrollbar-track-color);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&::-webkit-scrollbar-thumb\\r\\n\\t\\t{\\r\\n\\t\\t\\tmin-height: calc(var(--scrollbar-thickness) * 3);\\r\\n\\t\\t\\tborder: 2rem solid transparent;\\r\\n\\t\\t\\tborder-radius: calc(var(--scrollbar-thickness) / 2);\\r\\n\\t\\t\\tbox-shadow: inset 0 0 var(--scrollbar-thickness) var(--scrollbar-thickness) var(--surface-scrollbar-thumb-color);\\r\\n\\r\\n\\t\\t\\t&:hover\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tbox-shadow: inset 0 0 var(--scrollbar-thickness) var(--scrollbar-thickness) var(--surface-scrollbar-thumb-color--hover);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&::-webkit-scrollbar-button\\r\\n\\t\\t{\\r\\n\\t\\t\\tdisplay: none;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t[scroll-fade]\\r\\n\\t{\\r\\n\\t\\t// Apply transition to smoothe opacity changes.\\r\\n\\t\\ttransition: opacity var(--fade-duration);\\r\\n\\t\\ttransition-timing-function: var(--fade-timing-function);\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","export * from \"./modal\";\r\nexport * from \"./modal-service\";\r\nexport * from \"./modal-close-reason\";\r\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"[modal-href]{cursor:pointer}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/modals/modal-href/modal-href.scss\"],\"names\":[],\"mappings\":\"AAAA,aAGC,cAAA\",\"sourcesContent\":[\"[modal-href]\\r\\n{\\r\\n\\t// Use cursor to indicate the element is clickable.\\r\\n\\tcursor: pointer;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"[page-href]{cursor:pointer}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/page/page-href/page-href.scss\"],\"names\":[],\"mappings\":\"AAAA,YAGC,cAAA\",\"sourcesContent\":[\"[page-href]\\r\\n{\\r\\n\\t// Use cursor to indicate the element is clickable.\\r\\n\\tcursor: pointer;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"validation-message{display:block}validation-message.--single:not(:only-of-type),validation-message+[slot=validation] validation-message.--single{display:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/validation/validator.scss\"],\"names\":[],\"mappings\":\"AAAA,mBAEC,aAAA,CAKA,gHAGC,YAAA\",\"sourcesContent\":[\"validation-message\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\t// HACK: Some validation messages, e.g. from the `required-validator`,\\r\\n\\t// should only appear when no other validation messages are present.\\r\\n\\t// This is not perfect, it but should get the job done in most cases.\\r\\n\\t&.--single:not(:only-of-type),\\r\\n\\t+ [slot=\\\"validation\\\"] validation-message.--single\\r\\n\\t{\\r\\n\\t\\tdisplay: none;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\r\nimport { textCase } from \"shared/utilities\";\r\nimport * as platforms from \"./detectors/platforms\";\r\nimport * as features from \"./detectors/features\";\r\n\r\n/**\r\n * Represents a service that provides info about the device on which the app is running.\r\n */\r\n@autoinject\r\nexport class DeviceService\r\n{\r\n\t/**\r\n\t * Creates a new instance of the class.\r\n\t */\r\n\tpublic constructor()\r\n\t{\r\n\t\t// Execute detectors.\r\n\t\tthis.platform = this.detectOne(platforms);\r\n\t\tthis.features = this.detectAll(features);\r\n\r\n\t\t// Add class names to the `html` element.\r\n\t\tconst classNames =\r\n\t\t[\r\n\t\t\tthis.platform ? `platform-${this.formatClassName(this.platform)}` : \"\",\r\n\t\t\t...Object.keys(this.features).map(name => `feature-${this.features[name] ? \"\" : \"no-\"}${this.formatClassName(name)}`)\r\n\t\t];\r\n\r\n\t\tdocument.documentElement.className += ` ${classNames.filter(name => name).join(\" \")}`;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the platform, if successfully detected.\r\n\t */\r\n\tpublic readonly platform: keyof typeof platforms | null | undefined;\r\n\r\n\t/**\r\n\t * Gets an object representing the availability of specific feature.\r\n\t */\r\n\tpublic readonly features: { [name in keyof typeof features]: boolean };\r\n\r\n\t/**\r\n\t * Executes all detectors in the specified detector module, returning all results.\r\n\t * @param detectorModule The module implementing the detectors.\r\n\t * @returns An object in which keys represent the detectors, and values represent the detection result.\r\n\t */\r\n\tprivate detectAll(detectorModule: T): { [K in keyof T]: boolean }\r\n\t{\r\n\t\tconst result = {} as any;\r\n\r\n\t\tObject.keys(detectorModule).forEach(key =>\r\n\t\t\tresult[key] = detectorModule[key] instanceof Function ? detectorModule[key](this) : detectorModule[key]);\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t/**\r\n\t * Executes all detectors in the specified detector module, returning a single result.\r\n\t * @param detectorModule The module implementing the detectors.\r\n\t * @returns The name of the single detector that matched, or null if no detectors matched.\r\n\t * If more than one detector matched, undefined is returned.\r\n\t */\r\n\tprivate detectOne(detectorModule: object): keyof typeof detectorModule | null | undefined\r\n\t{\r\n\t\tconst matches = Object.keys(detectorModule).filter(key =>\r\n\t\t\tdetectorModule[key] instanceof Function ? detectorModule[key](this) : detectorModule[key]);\r\n\r\n\t\treturn (matches.length === 1 ? matches[0] : matches.length === 0 ? null : undefined) as any;\r\n\t}\r\n\r\n\t/**\r\n\t * Formats the specified detector name as a class name.\r\n\t * @param detectorName The detector name to format.\r\n\t * @returns The detector name formatted as kebab case, or `unknown` if null or undefined.\r\n\t */\r\n\tprivate formatClassName(detectorName: string): string\r\n\t{\r\n\t\treturn detectorName ? textCase(detectorName, \"camel\", \"kebab\") : \"unknown\";\r\n\t}\r\n}\r\n","// Note: This is needed because the native `btoa` and `atob` functions doesn't handle Unicode characters correctly.\r\n// See: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem\r\n\r\n/**\r\n * Namespace providing functions for Base64 encoding and decoding.\r\n */\r\nexport namespace Base64\r\n{\r\n\t/**\r\n\t * Encodes a unicode string to a Base64 string.\r\n\t * @param text The string to encode.\r\n\t * @param unicode True to use URL encoding to handle Unicode characters, otherwise false.\r\n\t * @returns The encoded string.\r\n\t */\r\n\texport function encode(text: string, unicode = false): string\r\n\t{\r\n\t\treturn unicode ?\r\n\t\t\tbtoa(encodeURIComponent(text).replace(/%([0-9A-F]{2})/g, ($0, $1) => String.fromCharCode(`0x${$1}` as any))) :\r\n\t\t\tbtoa(text);\r\n\t}\r\n\r\n\t/**\r\n\t * Decodes a Base64 string to a unicode string.\r\n\t * @param text The string to decode.\r\n\t * @param unicode True to use URL decoding to handle Unicode characters, otherwise false.\r\n\t * @returns The decoded string.\r\n\t */\r\n\texport function decode(text: string, unicode = false): string\r\n\t{\r\n\t\treturn unicode ?\r\n\t\t\tdecodeURIComponent(atob(text).split(\"\").map(c => `%${(`00${c.charCodeAt(0).toString(16)}`).slice(-2)}`).join(\"\")) :\r\n\t\t\tatob(text);\r\n\t}\r\n}\r\n","/**\r\n * Decorator applicable to classes, methods and property setters.\r\n * Enforces that the constructor, method or setter to which it is applied should only be called once,\r\n * throwing an error on any subsequent calls.\r\n */\r\nexport function once(target: any, key?: any, descriptor?: any): any\r\n{\r\n\tif (target instanceof Function)\r\n\t{\r\n\t\tlet called = false;\r\n\r\n\t\t// Store a reference to the original constructor.\r\n\t\tconst oldConstructor = target;\r\n\r\n\t\t// Define the new constructor.\r\n\t\tconst newConstructor = function(this: any): any\r\n\t\t{\r\n\t\t\tif (called)\r\n\t\t\t{\r\n\t\t\t\tthrow new Error(`The class '${target.name}' may only be constructed once.`);\r\n\t\t\t}\r\n\r\n\t\t\tcalled = true;\r\n\r\n\t\t\t// Call the original constructor to create the instance.\r\n\t\t\treturn oldConstructor.apply(this, arguments) as T;\r\n\t\t};\r\n\r\n\t\t// Copy the prototype so `intanceof` operator still works as expected.\r\n\t\tnewConstructor.prototype = oldConstructor.prototype;\r\n\r\n\t\t// Return the new constructor.\r\n\t\treturn newConstructor as any;\r\n\t}\r\n\r\n\tif (key != null && descriptor != null && typeof (descriptor.value || descriptor.set) === \"function\")\r\n\t{\r\n\t\tconst called = new WeakMap();\r\n\r\n\t\tif (descriptor.value != null)\r\n\t\t{\r\n\t\t\t// Store a reference to the original method.\r\n\t\t\tconst oldMethod = descriptor.value;\r\n\r\n\t\t\t// Define the new method.\r\n\t\t\tdescriptor.value = function(this: any): void\r\n\t\t\t{\r\n\t\t\t\tif (called.get(this))\r\n\t\t\t\t{\r\n\t\t\t\t\tthrow new Error(`The method '${key.toString()}' on class '${target.constructor.name}' may only be called once`);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcalled.set(this, true);\r\n\r\n\t\t\t\t// Call the original method.\r\n\t\t\t\toldMethod.apply(this, arguments);\r\n\t\t\t} as any;\r\n\t\t}\r\n\t\telse if (descriptor.set != null)\r\n\t\t{\r\n\t\t\t// Store a reference to the original setter.\r\n\t\t\tconst oldSetter = descriptor.set;\r\n\r\n\t\t\t// Define the new setter.\r\n\t\t\tdescriptor.set = function(this: any): void\r\n\t\t\t{\r\n\t\t\t\tif (called.get(this))\r\n\t\t\t\t{\r\n\t\t\t\t\tthrow new Error(`The setter '${key.toString()}' on class '${target.constructor.name}' may only be called once`);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcalled.set(this, true);\r\n\r\n\t\t\t\t// Call the original setter.\r\n\t\t\t\toldSetter.apply(this, arguments);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t// Return the descriptor.\r\n\t\treturn descriptor;\r\n\t}\r\n\r\n\tthrow new SyntaxError(\"Only constructors, methods and setters can be marked as callable only once.\");\r\n}\r\n","import { Disposable } from \"shared/types\";\r\n\r\n/**\r\n * Represents a manager for DOM event listeners, providing a convenient API\r\n * for subscribing and unsubscribing, while tracking the subscriptions so\r\n * they can be easily disposed all at once.\r\n */\r\nexport class EventManager\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param owner The instance that should be used as `this` when calling the callbacks.\r\n\t */\r\n\tpublic constructor(owner: object)\r\n\t{\r\n\t\tthis._owner = owner;\r\n\t}\r\n\r\n\tprivate readonly _owner: object;\r\n\tprivate readonly _subscriptions = new Set();\r\n\r\n\t/**\r\n\t * Adds the specified callback as a listener for the specified events,\r\n\t * and tracks it so it can be removed when this instance is disposed.\r\n\t * @param element The element to which the listener should be attached.\r\n\t * @param eventOrEvents The event or events to listen for.\r\n\t * @param callback The callback to call when the event occurs.\r\n\t * @param options The listener options.\r\n\t * @returns A disposable, which when disposed removes the listener.\r\n\t */\r\n\tpublic addEventListener(element: Document | Element, eventOrEvents: string | string[], callback: (event: Event) => any, options?: EventListenerOptions): Disposable\r\n\t{\r\n\t\tconst subscriptions: Disposable[] = [];\r\n\r\n\t\tconst events = typeof eventOrEvents === \"string\" ? [eventOrEvents] : eventOrEvents;\r\n\r\n\t\tfor (const event of events)\r\n\t\t{\r\n\t\t\tconst boundCallback = callback.bind(this._owner);\r\n\r\n\t\t\telement.addEventListener(event, boundCallback, options);\r\n\r\n\t\t\tconst subscription = new Disposable(() => element.removeEventListener(event, boundCallback, options));\r\n\r\n\t\t\tsubscriptions.push(subscription);\r\n\t\t\tthis._subscriptions.add(subscription);\r\n\t\t}\r\n\r\n\t\treturn new Disposable(() =>\r\n\t\t{\r\n\t\t\tfor (const subscription of subscriptions)\r\n\t\t\t{\r\n\t\t\t\tsubscription.dispose();\r\n\t\t\t\tthis._subscriptions.delete(subscription);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Removes all event listeners tracked by this instance.\r\n\t */\r\n\tpublic removeEventListeners(): void\r\n\t{\r\n\t\tfor (const subscription of this._subscriptions)\r\n\t\t{\r\n\t\t\tsubscription.dispose();\r\n\t\t\tthis._subscriptions.delete(subscription);\r\n\t\t}\r\n\t}\r\n}\r\n","/**\r\n * Represents the error thrown when an operation is aborted.\r\n */\r\nexport class AbortError extends Error\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param message The message describing the error.\r\n\t */\r\n\tpublic constructor(message?: string)\r\n\t{\r\n\t\tsuper();\r\n\r\n\t\t// Required to ensure a correct prototype chain.\r\n\t\t// See: https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n\t\tObject.setPrototypeOf(this, AbortError.prototype);\r\n\r\n\t\tthis.name = \"AbortError\";\r\n\t\tthis.message = message || \"The operation was aborted.\";\r\n\t}\r\n}\r\n","/**\r\n * Represents an instance that may be disposed.\r\n */\r\nexport interface IDisposable\r\n{\r\n\t/**\r\n\t * Disposes the instance.\r\n\t */\r\n\tdispose(): void;\r\n}\r\n\r\n/**\r\n * Represents a handle that may be disposed.\r\n */\r\nexport class Disposable implements IDisposable\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param callback The function to call when the handle is disposed.\r\n\t */\r\n\tpublic constructor(callback: () => any)\r\n\t{\r\n\t\tthis._callback = callback;\r\n\t}\r\n\r\n\tprivate readonly _callback: () => any;\r\n\tprivate _disposed = false;\r\n\r\n\t/**\r\n\t * True if the handle is disposed, otherwise false.\r\n\t */\r\n\tpublic get disposed(): boolean\r\n\t{\r\n\t\treturn this._disposed;\r\n\t}\r\n\r\n\t/**\r\n\t * Disposes the handle.\r\n\t */\r\n\tpublic dispose(): void\r\n\t{\r\n\t\tif (!this._disposed)\r\n\t\t{\r\n\t\t\tthis._disposed = true;\r\n\t\t\tthis._callback();\r\n\t\t}\r\n\t}\r\n}\r\n","export * from \"./tree-node\";\r\n","import { computedFrom } from \"aurelia-binding\";\r\nimport { Id, slugify } from \"shared/utilities\";\r\n\r\n/**\r\n * Represents the data for a node in a tree.\r\n */\r\nexport interface ITreeNode = any>\r\n{\r\n\t/**\r\n\t * The slug to use in the path that identifies this node within the tree,\r\n\t * or undefined to use the name.\r\n\t */\r\n\tslug?: string;\r\n\r\n\t/**\r\n\t * The name of the node.\r\n\t */\r\n\tname: string;\r\n\r\n\t/**\r\n\t * The parent node, or undefined if this node represents the root in the tree.\r\n\t */\r\n\tparent?: TTreeNode;\r\n\r\n\t/**\r\n\t * The child nodes, or undefined if this node represents a leaf in the tree.\r\n\t */\r\n\tchildren?: TTreeNode[];\r\n\r\n\t/**\r\n\t * True if the node is expanded, otherwise false,\r\n\t */\r\n\texpanded?: boolean;\r\n\r\n\t/**\r\n\t * The number to show on the node badge, if any,\r\n\t */\r\n\tbadgeCount?: number;\r\n}\r\n\r\n/**\r\n * Represents a node in a tree.\r\n */\r\nexport class TreeNode = any> implements ITreeNode\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param data The response data from which the instance should be created.\r\n\t * @param parent The parent node, or undefined if this node represents the root in the tree.\r\n\t */\r\n\tpublic constructor(data: ITreeNode, parent?: TTreeNode)\r\n\t{\r\n\t\tthis.slug = data.slug != null ? data.slug : data.name;\r\n\t\tthis.name = data.name;\r\n\t\tthis.expanded = data.expanded;\r\n\t\tthis.children = data.children;\r\n\t\tthis.parent = parent;\r\n\t\tthis.badgeCount = data.badgeCount;\r\n\t}\r\n\r\n\t/**\r\n\t * The slug to use in the path that identifies this node within the tree.\r\n\t */\r\n\tpublic slug: string;\r\n\r\n\t/**\r\n\t * The name of the node.\r\n\t */\r\n\tpublic name: string;\r\n\r\n\t/**\r\n\t * The parent node, or undefined if this node represents the root in the tree.\r\n\t */\r\n\tpublic parent: TTreeNode | undefined;\r\n\r\n\t/**\r\n\t * The child nodes, or undefined if this node represents a leaf in the tree.\r\n\t */\r\n\tpublic children: TTreeNode[] | undefined;\r\n\r\n\t/**\r\n\t * True if the node is expanded, otherwise false,\r\n\t */\r\n\tpublic expanded?: boolean;\r\n\r\n\t/**\r\n\t * The number to show on the node badge, if any,\r\n\t */\r\n\tpublic badgeCount?: number;\r\n\r\n\t/**\r\n\t * The sequence of slugs, separated by `/`, that identify the node within the tree.\r\n\t */\r\n\t@computedFrom(\"parent.path\", \"slug\")\r\n\tpublic get path(): string\r\n\t{\r\n\t\tif (this.parent != null && this.parent.path)\r\n\t\t{\r\n\t\t\treturn this.slug ? `${this.parent.path}/${this.slug}` : this.parent.path;\r\n\t\t}\r\n\r\n\t\treturn this.slug || \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Expands every node along the path to this node, optionally including this node.\r\n\t * @param expandThis True to expand this node, false to collapse this node, or undefined to keep its current state.\r\n\t */\r\n\tpublic expandPath(expandThis?: boolean): void\r\n\t{\r\n\t\tif (this.parent != null)\r\n\t\t{\r\n\t\t\tthis.parent.expandPath(true);\r\n\t\t}\r\n\r\n\t\tif (expandThis != null)\r\n\t\t{\r\n\t\t\tthis.expanded = expandThis;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Finds the first node for which the specified function returns true.\r\n\t * @param testFunc The function used to determien whether a node is a match.\r\n\t * @returns The matched node, or undefined if not found.\r\n\t */\r\n\tpublic find(testFunc: (node: this | TTreeNode) => boolean): this | TTreeNode | undefined;\r\n\r\n\t/**\r\n\t * Finds the node matching the specified path.\r\n\t * @param path The sequence of node slugs, separated by `/`, that identify the node within the tree.\r\n\t * @returns The matched node, or undefined if not found.\r\n\t */\r\n\tpublic find(path: string): this | TTreeNode | undefined;\r\n\r\n\tpublic find(nodeOrPath: string | ((node: this | TTreeNode) => boolean)): this | TTreeNode | undefined\r\n\t{\r\n\t\tif (nodeOrPath instanceof Function)\r\n\t\t{\r\n\t\t\t// Find using test function.\r\n\r\n\t\t\tif (nodeOrPath(this))\r\n\t\t\t{\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.children != null)\r\n\t\t\t{\r\n\t\t\t\tfor (const child of this.children)\r\n\t\t\t\t{\r\n\t\t\t\t\tconst match = child.find(nodeOrPath);\r\n\r\n\t\t\t\t\tif (match != null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\treturn match;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t// Find using path.\r\n\r\n\t\t\tconst pathToThis = this.path;\r\n\r\n\t\t\tif (nodeOrPath === pathToThis)\r\n\t\t\t{\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\r\n\t\t\tconst isPartialMatch = pathToThis === \"\" || nodeOrPath.startsWith(`${pathToThis}/`);\r\n\r\n\t\t\tif (isPartialMatch && this.children != null)\r\n\t\t\t{\r\n\t\t\t\tfor (const child of this.children)\r\n\t\t\t\t{\r\n\t\t\t\t\tconst match = child.find(nodeOrPath);\r\n\r\n\t\t\t\t\tif (match != null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\treturn match as any;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * Renames the node.\r\n\t * @param name The new name for the node.\r\n\t */\r\n\tpublic rename(name: string): void\r\n\t{\r\n\t\tthis.name = name;\r\n\r\n\t\t// Create the new slug based on the name, or default to a random ID.\r\n\t\tthis.slug = slugify(name, true) || Id.alphaNumeric(10);\r\n\t}\r\n\r\n\t/**\r\n\t * Detaches this node from its parent node.\r\n\t */\r\n\tpublic detach(): void\r\n\t{\r\n\t\tif (this.parent == null)\r\n\t\t{\r\n\t\t\tthrow new Error(\"Cannot detach a node that has no parent node.\");\r\n\t\t}\r\n\r\n\t\tconst index = this.parent.children!.indexOf(this as any);\r\n\t\tthis.parent.children!.splice(index, 1);\r\n\r\n\t\tthis.parent = undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * Attaches this node as a child of the specified parent node.\r\n\t * @param node The node that should become the parent node of this node.\r\n\t */\r\n\tpublic attach(parent: TreeNode): void\r\n\t{\r\n\t\tif (parent.children == null)\r\n\t\t{\r\n\t\t\tthrow new Error(\"Cannot attach a node to a parent node with no child collection.\");\r\n\t\t}\r\n\r\n\t\tparent.children.push(this as any);\r\n\r\n\t\tthis.parent = parent as any;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the data representing this instance.\r\n\t * @returns The data representing this instance.\r\n\t */\r\n\tpublic toJSON(): any\r\n\t{\r\n\t\treturn {\r\n\t\t\tname: this.name,\r\n\t\t\tslug: this.slug,\r\n\t\t\tchildren: this.children != null ? this.children.map(f => f.toJSON()) : undefined\r\n\t\t};\r\n\t}\r\n}\r\n","import { DateTime, Duration, DateTimeOptions, ISOTimeOptions } from \"luxon\";\r\n\r\n/**\r\n * Represents a data and time range, which may optionally be open ended.\r\n */\r\nexport class DateTimeRange\r\n{\r\n\t/**\r\n\t * Creates a new instance of the class.\r\n\t * @param data The response data from which the instance should be created.\r\n\t * @param options The parsing options to use.\r\n\t */\r\n\tpublic constructor(data?: any, options?: DateTimeOptions)\r\n\t{\r\n\t\tif (data != null)\r\n\t\t{\r\n\t\t\tif (data.from instanceof DateTime)\r\n\t\t\t{\r\n\t\t\t\tthis.from = data.from;\r\n\t\t\t}\r\n\t\t\telse if (data.from != null)\r\n\t\t\t{\r\n\t\t\t\tthis.from = DateTime.fromISO(data.from, options);\r\n\t\t\t}\r\n\r\n\t\t\tif (data.to instanceof DateTime)\r\n\t\t\t{\r\n\t\t\t\tthis.to = data.to;\r\n\t\t\t}\r\n\t\t\telse if (data.to != null)\r\n\t\t\t{\r\n\t\t\t\tthis.to = DateTime.fromISO(data.to, options);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * The first date and time included in the range,\r\n\t * or undefined if the range has no start date.\r\n\t */\r\n\tpublic from?: DateTime;\r\n\r\n\t/**\r\n\t * The last date and time included in the range,\r\n\t * or undefined if the range has no end date.\r\n\t */\r\n\tpublic to?: DateTime;\r\n\r\n\t/**\r\n\t * The duration of the range.\r\n\t */\r\n\tpublic get duration(): Duration\r\n\t{\r\n\t\tif (!this.from || !this.to)\r\n\t\t{\r\n\t\t\treturn Duration.fromMillis(0);\r\n\t\t}\r\n\r\n\t\treturn this.to.diff(this.from);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns true if this range starts before the specified date, otherwise false.\r\n\t */\r\n\tpublic startsBefore(dateTime: DateTime | undefined): boolean | undefined\r\n\t{\r\n\t\tif (!this.from && !dateTime)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!this.from && dateTime)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (this.from && !dateTime)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn this.from!.diff(dateTime!).valueOf() < 0;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns true if this range ends after the specified date, otherwise false.\r\n\t */\r\n\tpublic endsAfter(dateTime: DateTime | undefined): boolean | undefined\r\n\t{\r\n\t\tif (!this.to && !dateTime)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!this.to && dateTime)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (this.to && !dateTime)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn this.to!.diff(dateTime!).valueOf() > 0;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the data representing this instance.\r\n\t * @param options The formatting options to use.\r\n\t */\r\n\tpublic toJSON(options?: ISOTimeOptions): any\r\n\t{\r\n\t\treturn {\r\n\t\t\tfrom: this.from ? this.from.toISO(options) : undefined,\r\n\t\t\tto: this.to ? this.to.toISO(options) : undefined\r\n\t\t};\r\n\t}\r\n}\r\n","import { DateTime, LocaleOptions, DateTimeFormatOptions } from \"luxon\";\r\n\r\n/**\r\n * Represents a time of a day.\r\n * @deprecated This class is deprecated and should not be used.\r\n * Use the `Duration` class from Luxon instead, and note that in JSON,\r\n * time should ideally be represented as an ISO 8601 period, or\r\n * alternatively as seconds since midnight.\r\n */\r\nexport class TimeOfDay\r\n{\r\n\t/**\r\n\t * The hours since the beginning of the day.\r\n\t */\r\n\tpublic hour: number;\r\n\r\n\t/**\r\n\t * The minutes since the beginning of the hour.\r\n\t */\r\n\tpublic minute: number;\r\n\r\n\t/**\r\n\t * The seconds since the beginnign of the minute.\r\n\t */\r\n\tpublic second: number;\r\n\r\n\t/**\r\n\t * The milliseconds since the beginnign of the minute.\r\n\t */\r\n\tpublic millisecond: number;\r\n\r\n\t/**\r\n\t * Formats the time of day as a string.\r\n\t * @param precision The precision of the formatted time.\r\n\t * @returns The formatted time, which at full precision has the format \"hh:mm:ss.sss\".\r\n\t */\r\n\tpublic toString(precision: \"hour\" | \"minute\" | \"second\" | \"millisecond\" = \"minute\"): string\r\n\t{\r\n\t\tlet result = this.hour.toString().padStart(2, \"0\");\r\n\r\n\t\tif (precision !== \"hour\")\r\n\t\t{\r\n\t\t\tresult += `:${this.minute.toString().padStart(2, \"0\")}`;\r\n\r\n\t\t\tif (precision !== \"minute\")\r\n\t\t\t{\r\n\t\t\t\tresult += `:${this.second.toString().padStart(2, \"0\")}`;\r\n\r\n\t\t\t\tif (precision !== \"second\")\r\n\t\t\t\t{\r\n\t\t\t\t\tresult += `.${this.millisecond.toString().padStart(3, \"0\")}`;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t/**\r\n\t * Formats the time of day as a localized string.\r\n\t * @param options The formatting options to use.\r\n\t * @returns The formatted, localized time.\r\n\t */\r\n\tpublic toLocaleString(options?: LocaleOptions & DateTimeFormatOptions): string\r\n\t{\r\n\t\treturn DateTime.fromObject(this).toLocaleString(\r\n\t\t{\r\n\t\t\t...options,\r\n\t\t\t...DateTime.TIME_SIMPLE\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the primitive value of the instance, as the number of milliseconds since midnight.\r\n\t * @returns The number of milliseconds since midnight.\r\n\t */\r\n\tpublic valueOf(): number\r\n\t{\r\n\t\treturn (this.hour * 60 * 60 * 1000) + (this.minute * 60 * 1000) + (this.second * 1000) + (this.millisecond);\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a new instance of the class, based on the specified string,\r\n\t * which must be in the ISO8601 time-of-day format.\r\n\t * @param text The string from which the instance should be created..\r\n\t * @returns The new instance.\r\n\t */\r\n\tpublic static fromString(text: string): TimeOfDay\r\n\t{\r\n\t\tconst parts = text.split(/:|\\./g);\r\n\t\tconst result = new TimeOfDay();\r\n\r\n\t\tresult.hour = parseInt(parts[0]);\r\n\t\tresult.minute = parseInt(parts[1] || \"0\");\r\n\t\tresult.second = parseInt(parts[2] || \"0\");\r\n\t\tresult.millisecond = parseFloat(`0.${parts[3] || \"0\"}`) * 1000;\r\n\r\n\t\treturn result;\r\n\t}\r\n}\r\n","import { Duration } from \"luxon\";\r\n\r\n/**\r\n * Represents a time range, which may optionally be open ended.\r\n */\r\nexport class TimeRange\r\n{\r\n\t/**\r\n\t * Creates a new instance of the class.\r\n\t * @param data The response data from which the instance should be created.\r\n\t */\r\n\tpublic constructor(data?: any)\r\n\t{\r\n\t\tif (data != null)\r\n\t\t{\r\n\t\t\tif (data.from instanceof Duration)\r\n\t\t\t{\r\n\t\t\t\tthis.from = data.from;\r\n\t\t\t}\r\n\t\t\telse if (data.from != null)\r\n\t\t\t{\r\n\t\t\t\tthis.from = Duration.fromObject({ second: data.from });\r\n\t\t\t}\r\n\r\n\t\t\tif (data.to instanceof Duration)\r\n\t\t\t{\r\n\t\t\t\tthis.to = data.to;\r\n\t\t\t}\r\n\t\t\telse if (data.to != null)\r\n\t\t\t{\r\n\t\t\t\tthis.to = Duration.fromObject({ second: data.to });\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * The first time included in the range,\r\n\t * or undefined if the range has no start time.\r\n\t */\r\n\tpublic from?: Duration;\r\n\r\n\t/**\r\n\t * The last time included in the range,\r\n\t * or undefined if the range has no end time.\r\n\t */\r\n\tpublic to?: Duration;\r\n\r\n\t/**\r\n\t * Gets the data representing this instance.\r\n\t */\r\n\tpublic toJSON(): any\r\n\t{\r\n\t\treturn {\r\n\t\t\tfrom: this.from ? this.from.as(\"seconds\") : undefined,\r\n\t\t\tto: this.to ? this.to.as(\"seconds\") : undefined\r\n\t\t};\r\n\t}\r\n}\r\n","import { Uuid } from \"./uuid\";\r\nimport { Sequential } from \"./sequential\";\r\nimport { AlphaNumeric } from \"./random\";\r\n\r\n/**\r\n * Namespace providing methods for generating RFC4122 compliant UUIDs.\r\n * Note that the quality of the UUIDs generated depend heavily on the type\r\n * and quality of the random number generators available on the platform.\r\n */\r\nexport namespace Id\r\n{\r\n\t/**\r\n\t * Generates a new RFC4122 UUID.\r\n\t * @param variant The variant of UUID to generate.\r\n\t * Variant 1 is timestamp-based and suitable for situations where uniqueness is the primary concern.\r\n\t * Variant 4 is random and suitable for situations where randomness is the primary concern.\r\n\t * @returns A string representing the generated UUID.\r\n\t */\r\n\texport function uuid(variant: 1 | 4): string\r\n\t{\r\n\t\treturn (variant === 1 ? Uuid.v1() : variant === 4 ? Uuid.v4() : undefined)!;\r\n\t}\r\n\r\n\t/**\r\n\t * Generates a new sequential numeric ID.\r\n\t * This is suitable for situations where uniqueness is only required within the app session.\r\n\t * @returns A number representing the generated ID.\r\n\t */\r\n\texport function sequential(): number\r\n\t{\r\n\t\treturn Sequential.next();\r\n\t}\r\n\r\n\t/**\r\n\t * Generates a random alpha-numeric ID.\r\n\t * @param length The desired length of the ID.\r\n\t * @returns A string representing the generated ID.\r\n\t */\r\n\texport function alphaNumeric(length: number): string\r\n\t{\r\n\t\treturn AlphaNumeric.next(length);\r\n\t}\r\n}\r\n","/**\r\n * Rounds the specified value to at most the specified number of fraction digits.\r\n * Note that this always rounds away from zero.\r\n * @param value The value to round.\r\n * @param maxFractionDigits The max number of fraction digits to round to. The default is 0.\r\n */\r\nexport function roundNumber(value: number, maxFractionDigits: number = 0): number\r\n{\r\n\tconst sign = Math.sign(value);\r\n\r\n\treturn sign * +(Math.round(+`${value * sign}e+${maxFractionDigits}`) + `e-${maxFractionDigits}`);\r\n}\r\n","import { AbortError } from \"shared/types\";\r\n\r\n/**\r\n * Represents a controller for a promise, which exposes its resolve and reject functions,\r\n * thus making it possible to resolve or reject the promise from outside the scope of the\r\n * function passed to the promise constructor.\r\n */\r\nexport class PromiseController\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param signal The abort signal to use, or undefined to use no abort signal.\r\n\t */\r\n\tpublic constructor(signal?: AbortSignal)\r\n\t{\r\n\t\tthis.promise = new Promise((resolve, reject) =>\r\n\t\t{\r\n\t\t\tthis._resolve = resolve;\r\n\t\t\tthis._reject = reject;\r\n\t\t});\r\n\r\n\t\tif (signal != null)\r\n\t\t{\r\n\t\t\tif (signal.aborted)\r\n\t\t\t{\r\n\t\t\t\tthis.reject(new AbortError());\r\n\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tsignal.addEventListener(\"abort\", () =>\r\n\t\t\t{\r\n\t\t\t\tthis.reject(new AbortError());\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _resolve: (value: T) => void;\r\n\tprivate _reject: (reason: any) => void;\r\n\r\n\t/**\r\n\t * The promise wrapped by this promise source.\r\n\t */\r\n\tpublic readonly promise: Promise;\r\n\r\n\t/**\r\n\t * Function that, when called, resolves the promise wrapped by this promise source.\r\n\t * @param reason The value with which the promise should be resolved.\r\n\t */\r\n\tpublic get resolve(): (value: T) => void\r\n\t{\r\n\t\treturn this._resolve;\r\n\t}\r\n\r\n\t/**\r\n\t * Function that, when called, rejects the promise wrapped by this promise source.\r\n\t * @param reason The reason with which the promise should be rejected.\r\n\t */\r\n\tpublic get reject(): (reason: any) => void\r\n\t{\r\n\t\treturn this._reject;\r\n\t}\r\n\r\n\t/**\r\n\t * Function that, when called, rejects the promise wrapped by this promise source,\r\n\t * providing an `AbortError` as reason.\r\n\t * @param reason The reason for the abort, used when creating the `AbortError` instance.\r\n\t */\r\n\tpublic abort(reason: any): void\r\n\t{\r\n\t\tthis._reject(new AbortError(reason));\r\n\t}\r\n}\r\n","import { TextSplitFuncs, TextSplitFunc } from \"./text-split\";\r\nimport { TextCaseFuncs, TextCaseFunc, TextCase } from \"./text-case\";\r\n\r\n// Text cases which do not require the string to be split before the conversion.\r\nconst nonSeparatedTextCases = [\"space\", \"upper\", \"lower\", \"sentence\"];\r\n\r\n// Text cases which use whitespace as separator.\r\nconst spaceSeparatedTextCases = [\"space\", \"upper\", \"lower\", \"sentence\", \"title\"];\r\n\r\n/**\r\n * Converts the specified strings to a single string in the specified text case.\r\n * @param strings The strings to convert.\r\n * @param toTextCase The text case to which the text should be converted.\r\n * @param localized True to use the rules of the current locale when upper-casing or lower-casing, otherwise false. The default is false.\r\n * @param aggressive True to aggressively normalize casing and whitespace, false to apply only essential changes, leaving remaining characters unchanged.\r\n * The default is false, which means whitespace will be preserved or converted if possible, and no characters will be lower-cased when converting to\r\n * 'Title Case' or 'Sentence case', thus making those operations less invasive and more performant.\r\n * @returns The converted text.\r\n */\r\nexport function textCase(strings: string[], toCase: TextCase, localized?: boolean, aggressive?: boolean): string;\r\n\r\n/**\r\n * Converts the specified text from the specified text case to the specified text case.\r\n * @param text The text to convert.\r\n * @param fromTextCase The text case from which the text should be converted.\r\n * @param toTextCase The text case to which the text should be converted.\r\n * @param localized True to use the rules of the current locale when upper-casing or lower-casing, otherwise false. The default is false.\r\n * @param aggressive True to aggressively normalize casing and whitespace, false to apply only essential changes, leaving remaining characters unchanged.\r\n * The default is false, which means whitespace will be preserved or converted if possible, and no characters will be lower-cased when converting to\r\n * 'Title Case' or 'Sentence case', thus making those operations less invasive and more performant.\r\n * @returns The converted text.\r\n */\r\nexport function textCase(text: string, fromCase: TextCase, toCase: TextCase, localized?: boolean, aggressive?: boolean): string;\r\n\r\nexport function textCase(...args: any[]): string\r\n{\r\n\tconst value = args[0];\r\n\tconst fromTextCase = args[0] instanceof Array ? undefined : args[1];\r\n\tconst toTextCase = args[0] instanceof Array ? args[1] : args[2];\r\n\tconst localized = args[0] instanceof Array ? args[2] : args[3];\r\n\tconst aggressive = args[0] instanceof Array ? args[3] : args[4];\r\n\r\n\tconst textCaseFunc = (TextCaseFuncs as any)[`${toTextCase}Case`] as TextCaseFunc;\r\n\r\n\tif (textCaseFunc == null)\r\n\t{\r\n\t\tthrow new Error(`The text case '${toTextCase}' is not supported.`);\r\n\t}\r\n\r\n\tlet strings: string[];\r\n\r\n\tif (value instanceof Array)\r\n\t{\r\n\t\tstrings = value;\r\n\t}\r\n\telse if (!aggressive && fromTextCase === \"space\" && nonSeparatedTextCases.includes(toTextCase))\r\n\t{\r\n\t\tstrings = [value];\r\n\t}\r\n\telse if (!aggressive && fromTextCase === \"space\" && toTextCase === \"title\")\r\n\t{\r\n\t\tstrings = textSplit(value, fromTextCase, true);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tstrings = textSplit(value, fromTextCase, !aggressive);\r\n\t}\r\n\r\n\treturn textCaseFunc(strings, localized, aggressive);\r\n}\r\n\r\n/**\r\n * Splits the specified text into strings using the rules of a specific text case..\r\n * @param text The text to split.\r\n * @param preserveWhitespace True to also extract the whitespace, false to only extract strings.\r\n * @returns The strings extracted from the text.\r\n */\r\nexport function textSplit(text: string, fromTextCase: TextCase, preserveWhitespace = true): string[]\r\n{\r\n\tconst textSplitFunc = spaceSeparatedTextCases.includes(fromTextCase) ?\r\n\t\tTextSplitFuncs.spaceCase :\r\n\t\t(TextSplitFuncs as any)[`${fromTextCase}Case`] as TextSplitFunc;\r\n\r\n\tif (textSplitFunc == null)\r\n\t{\r\n\t\tthrow new Error(`The text case '${fromTextCase}' is not supported.`);\r\n\t}\r\n\r\n\treturn textSplitFunc(text, preserveWhitespace);\r\n}\r\n\r\nexport { TextCase } from \"./text-case\";\r\nexport { textJoin } from \"./text-join\";\r\nexport { slugify } from \"./slugify\";\r\nexport { escapeHtml } from \"./escape-html\";\r\nexport { escapeRegExp } from \"./escape-regexp\";\r\n","// The base character to use in slugs.\r\nconst baseChars =\r\n[\r\n\t...\"a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z\".split(\",\"),\r\n\t...\"ss,aa,ae,ao,au,av,ay,dz,hv,lj,nj,oi,ou,oo,tz,vy\".split(\",\")\r\n];\r\n\r\n/**\r\n * Creates a slug based on the specified text.\r\n * @param text The text from which the slug should be created.\r\n * @param strict True to return undefined if any character fails to slugify nicely, false to just skip such characters.\r\n * @param localeCode The locale code to use, or undefined to use the document locale.\r\n * @returns The slugified text, or undefined if strict mode is enabled and a good slug could not be created.\r\n */\r\nexport function slugify(text: string, strict: true, localeCode?: string): string | undefined;\r\n\r\n/**\r\n * Creates a slug based on the specified text.\r\n * @param text The text from which the slug should be created.\r\n * @param strict True to return undefined if any character fails to slugify nicely, false to just skip such characters.\r\n * @param localeCode The locale code to use, or undefined to use the document locale.\r\n * @returns The slugified text, or undefined if strict mode is enabled and a good slug could not be created.\r\n */\r\nexport function slugify(text: string, strict: false, localeCode?: string): string;\r\n\r\nexport function slugify(text: string, strict: boolean, localeCode = document.documentElement.lang): string | undefined\r\n{\r\n\tconst result = text\r\n\t\t.toLocaleLowerCase()\r\n\t\t.replace(/[^\\w\\s\\d-]/g, char =>\r\n\t\t{\r\n\t\t\t// Replace any character that would be sorted before `0` with the separator character.\r\n\t\t\t// This should include all punctuation characters, etc.\r\n\t\t\tif (char.localeCompare(\"0\", localeCode, { sensitivity: \"base\" }) < 0)\r\n\t\t\t{\r\n\t\t\t\treturn \"-\";\r\n\t\t\t}\r\n\r\n\t\t\t// For any other character, try to find a matching base character, or default to `?`.\r\n\t\t\treturn baseChars.find(baseChar =>\r\n\t\t\t\tchar.localeCompare(baseChar, localeCode, { sensitivity: \"base\" }) === 0) || \"?\";\r\n\t\t});\r\n\r\n\t// In strict mode, return an empty string if any character failed to match.\r\n\tif (strict && result.includes(\"?\"))\r\n\t{\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\t// Strip out unmatched characters, replace consecutive non-alpha-numeric\r\n\t// characters with a separator, and strip leading and trailing separators.\r\n\treturn result\r\n\t\t.replace(/\\?/g, \"\")\r\n\t\t.replace(/(_|[^\\w\\d])+/g, \"-\")\r\n\t\t.replace(/^-|-$/g, \"\");\r\n}\r\n","/**\r\n * Escapes the specified text, so it can safely be used within a regular expression.\r\n * Note that this only supports ASCII characters.\r\n * @param text The text to escape.\r\n * @returns The escaped text.\r\n */\r\nexport function escapeRegExp(text: string): string\r\n{\r\n\t// See: https://github.com/bergus/RegExp.escape/blob/master/EscapedChars.md\r\n\treturn text.replace(/[\\\\^$*+?.()|[\\]{}-]/g, \"\\\\$&\");\r\n}\r\n","import { AbortError } from \"shared/types\";\r\n\r\n/**\r\n * Returns a promise that will be resolved when the specified time has elapsed.\r\n * Alternatively, if the specified signal is triggered, the promise will by default\r\n * be rejected with an `AbortError`, but can be configured to be resolved instead.\r\n * @param time The time in milliseconds to wait before resolving the promise.\r\n * @param signal The abort signal to use, or undefined to use no abort signal.\r\n * @param throwOnAbort True to throw an `AbortError` if the specified abort signal is triggered, false to resolve the promise.\r\n * @returns The delay promise.\r\n */\r\nexport async function delay(time: number, signal?: AbortSignal, throwOnAbort = true): Promise\r\n{\r\n\treturn new Promise((resolve, reject) =>\r\n\t{\r\n\t\tif (signal != null)\r\n\t\t{\r\n\t\t\tconst abortHandler = throwOnAbort\r\n\t\t\t\t? () => reject(new AbortError())\r\n\t\t\t\t: () => resolve();\r\n\r\n\t\t\tif (signal.aborted)\r\n\t\t\t{\r\n\t\t\t\tabortHandler();\r\n\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tsignal.addEventListener(\"abort\", () =>\r\n\t\t\t{\r\n\t\t\t\tclearTimeout(timeoutHandle);\r\n\t\t\t\tabortHandler();\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst timeoutHandle = setTimeout(resolve, time);\r\n\t});\r\n}\r\n","import { debounce } from \"./debounce\";\r\n\r\n/**\r\n * Represents the options to use when creating a throttled function.\r\n */\r\nexport interface IThrottleOptions\r\n{\r\n\t/**\r\n\t * True to invoke the function on the leading edge, otherwise false.\r\n\t * Default is true.\r\n\t */\r\n\tleading?: boolean;\r\n\r\n\t/**\r\n\t * True to invoke the function on the trailing edge, otherwise false.\r\n\t * Default is true.\r\n\t */\r\n\ttrailing?: boolean;\r\n}\r\n\r\n/**\r\n * Represents a debounced function.\r\n */\r\nexport interface IThrottledFunc extends Function\r\n{\r\n\t/**\r\n\t * Cancels any delayed invocation.\r\n\t */\r\n\tcancel(): void;\r\n\r\n\t/**\r\n\t * Immediately executes any delayed invocation.\r\n\t * @returns The result of the delayed invocation or undefined.\r\n\t */\r\n\tflush(): any;\r\n}\r\n\r\n/**\r\n * Creates a throttled function, wrapping the specified function.\r\n * @param func The function to throttle.\r\n * @param wait The wait period, in milliseconds.\r\n * @param options The options to use.\r\n * @returns A throttled function, wrapping the specified function.\r\n */\r\nexport function createThrottledFunc(func: TFunc, wait = 0, options?: IThrottleOptions): TFunc & IThrottledFunc\r\n{\r\n\tlet leading = true;\r\n\tlet trailing = true;\r\n\r\n\tif (typeof func !== \"function\")\r\n\t{\r\n\t\tthrow new TypeError(\"Expected a function\");\r\n\t}\r\n\r\n\tif (options != null)\r\n\t{\r\n\t\tleading = \"leading\" in options ? !!options.leading : leading;\r\n\t\ttrailing = \"trailing\" in options ? !!options.trailing : trailing;\r\n\t}\r\n\r\n\treturn debounce(func, wait,\r\n\t{\r\n\t\tleading: leading,\r\n\t\tmaxWait: wait,\r\n\t\ttrailing: trailing\r\n\t});\r\n}\r\n\r\n/**\r\n * Decorates a class method such that invocation happens at most once every wait period.\r\n *\r\n * The method is always invoked with the arguments provided in the most recent call.\r\n * Any throttled calls to the method return the result of the most recent invocation.\r\n *\r\n * Additional options may be provided to indicate whether the method should\r\n * be invoked on the leading and/or trailing edge of the wait periodt.\r\n *\r\n * Note that if `leading` and `trailing` options are true, the method is invoked on\r\n * the trailing edge of the wait period, only if the method is called more\r\n * than once during the wait period. If the wait period is 0 and `leading` is false,\r\n * method invocation is deferred until the next tick.\r\n *\r\n * Note that the throttled method is extended with a `cancel` method to cancel\r\n * any delayed invocations and a `flush` method to execute them immediately.\r\n *\r\n * For an explanation of the difference between debouncing and throttling,\r\n * see: https://css-tricks.com/debouncing-throttling-explained-examples\r\n *\r\n * @param wait The wait period, in milliseconds.\r\n * @param options The options to use.\r\n */\r\nexport function throttle(wait: number, options?: IThrottleOptions): any;\r\n\r\n/**\r\n * Creates a throittled function that wraps the specified function, such that invocation\r\n * happens at most once every wait period.\r\n *\r\n * The function is always invoked with the arguments provided in the most recent call.\r\n * Any throttled calls to the function return the result of the most recent invocation.\r\n *\r\n * Additional options may be provided to indicate whether the function should\r\n * be invoked on the leading and/or trailing edge of the wait periodt.\r\n *\r\n * Note that if `leading` and `trailing` options are true, the function is invoked on\r\n * the trailing edge of the wait period, only if the function is called more\r\n * than once during the wait period. If the wait period is 0 and `leading` is false,\r\n * function invocation is deferred until the next tick.\r\n *\r\n * Note that the throttled function is extended with a `cancel` method to cancel\r\n * any delayed invocations and a `flush` method to execute them immediately.\r\n *\r\n * For an explanation of the difference between debouncing and throttling,\r\n * see: https://css-tricks.com/debouncing-throttling-explained-examples\r\n *\r\n * @param func The function to throttle.\r\n * @param wait The wait period, in milliseconds. Default is 0.\r\n * @param options The options to use.\r\n * @returns A throttled function, wrapping the specified function.\r\n */\r\nexport function throttle(func: TFunc, wait: number, options?: IThrottleOptions): TFunc & IThrottledFunc;\r\n\r\nexport function throttle(...args: any[]): any\r\n{\r\n\tif (args[0] instanceof Function)\r\n\t{\r\n\t\treturn createThrottledFunc(args[0], args[1], args[2]);\r\n\t}\r\n\r\n\treturn function once(target: any, key?: any, descriptor?: any): any\r\n\t{\r\n\t\treturn {\r\n\t\t\tconfigurable: true,\r\n\t\t\tenumerable: descriptor.enumerable,\r\n\t\t\tget: function getter(): Function\r\n\t\t\t{\r\n\t\t\t\t// Attach this function to the instance.\r\n\t\t\t\tObject.defineProperty(this, key,\r\n\t\t\t\t{\r\n\t\t\t\t\tconfigurable: true,\r\n\t\t\t\t\tenumerable: descriptor.enumerable,\r\n\t\t\t\t\tvalue: createThrottledFunc(descriptor.value, args[0], args[1])\r\n\t\t\t\t});\r\n\r\n\t\t\t\treturn this[key];\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n}\r\n","import { Container } from \"aurelia-framework\";\r\nimport { ApiClient, ApiResult } from \"shared/infrastructure\";\r\nimport { MapObject } from \"shared/types\";\r\nimport { Operation } from \"../operation/operation\";\r\n\r\n/**\r\n * Represents a file upload request.\r\n */\r\nexport interface IFileUploadRequest\r\n{\r\n\t/**\r\n\t * The upload operation.\r\n\t */\r\n\toperation: Operation>;\r\n\r\n\t/**\r\n\t * The file being uploaded.\r\n\t */\r\n\tfile: Blob;\r\n}\r\n\r\n/**\r\n * Opens a file picker, and if a file is picked, uploads it to the specified URL.\r\n * @param method The HTTP method to use.\r\n * @param path The path, or path segments, identifying the endpoint to which the file should be uploaded.\r\n * @param query The query parameters to associate with the request, if any.\r\n * @param accept The file type specifiers for the file types to accept.\r\n * @returns A promise that will be resolved if the user picks a file.\r\n */\r\nexport async function pickAndUploadFile(method: string, path: string | string[], query?: MapObject, accept = \"*\"): Promise>\r\n{\r\n\tconst apiClient = Container.instance.get(ApiClient);\r\n\r\n\treturn new Promise((resolve, reject) =>\r\n\t{\r\n\t\tconst form = document.createElement(\"form\");\r\n\t\tform.setAttribute(\"enctype\", \"multipart/form-data\");\r\n\r\n\t\tconst input = document.createElement(\"input\");\r\n\t\tinput.setAttribute(\"type\", \"file\");\r\n\t\tinput.setAttribute(\"name\", \"file\");\r\n\t\tinput.setAttribute(\"accept\", accept);\r\n\r\n\t\tform.appendChild(input);\r\n\r\n\t\tinput.addEventListener(\"change\", () =>\r\n\t\t{\r\n\t\t\tconst operation = new Operation(async signal =>\r\n\t\t\t{\r\n\t\t\t\treturn apiClient[method](path,\r\n\t\t\t\t{\r\n\t\t\t\t\theaders:\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t\"content-type\": \"multipart/form-data\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\tbody: new FormData(form),\r\n\t\t\t\t\tquery,\r\n\t\t\t\t\tsignal\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\tresolve({ operation, file: input.files![0] });\r\n\t\t});\r\n\r\n\t\tinput.click();\r\n\t});\r\n}\r\n","import { singleton, computedFrom } from \"aurelia-framework\";\r\nimport { History } from \"aurelia-history\";\r\nimport { AppRouter, PipelineResult } from \"aurelia-router\";\r\nimport { EventAggregator } from \"aurelia-event-aggregator\";\r\nimport { MapObject } from \"shared/types\";\r\n\r\n// The separator used between segments of a route name.\r\nexport const routeNameSeparator = \"/\";\r\n\r\n/**\r\n * Represents info about a new or existing history state.\r\n */\r\nexport interface IHistoryState\r\n{\r\n\t/**\r\n\t * The path for the route, which may contain dynamic segments.\r\n\t */\r\n\tpath: string;\r\n\r\n\t/**\r\n\t * The parameters for the route.\r\n\t */\r\n\tparams: TParams;\r\n\r\n\t/**\r\n\t * The fragment in the URL.\r\n\t */\r\n\tfragment: string | undefined;\r\n\r\n\t/**\r\n\t * The data associated with the state in the browser history.\r\n\t */\r\n\tdata: TData;\r\n}\r\n\r\n/**\r\n * Represents the options to use during navigation.\r\n */\r\nexport interface IHistoryOptions\r\n{\r\n\t/**\r\n\t * True ro trigger routing and lifecycle methods, false to only change the location.\r\n\t */\r\n\ttrigger?: boolean;\r\n\r\n\t/**\r\n\t * True to replace the current state in the browser history, false to push a new state.\r\n\t */\r\n\treplace?: boolean;\r\n}\r\n\r\n/**\r\n * Helper service providing methods for interacting with the browser history and current location.\r\n */\r\n@singleton()\r\nexport class HistoryHelper\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param history The `History` instance.\r\n\t * @param router The `AppRouter` instance.\r\n\t * @param eventAggregator The `EventAggregator` instance.\r\n\t */\r\n\tpublic constructor(history: History, router: AppRouter, eventAggregator: EventAggregator)\r\n\t{\r\n\t\tthis._history = history;\r\n\t\tthis._router = router;\r\n\t\tthis._eventAggregator = eventAggregator;\r\n\r\n\t\tlet isNavigatingNew = false;\r\n\r\n\t\tthis._eventAggregator.subscribe(\"router:navigation:processing\", () =>\r\n\t\t{\r\n\t\t\tthis._navigating = true;\r\n\t\t\tisNavigatingNew = router.isNavigatingNew;\r\n\t\t});\r\n\r\n\t\tthis._eventAggregator.subscribe(\"router:navigation:success\", () =>\r\n\t\t{\r\n\t\t\tthis._state = this.getState();\r\n\r\n\t\t\t// Reset the scroll position if navigating to a new history entry.\r\n\t\t\tif (isNavigatingNew)\r\n\t\t\t{\r\n\t\t\t\twindow.scrollTo({ top: 0, left: 0, behavior: \"auto\" });\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis._eventAggregator.subscribe(\"router:navigation:complete\", (event: any) =>\r\n\t\t{\r\n\t\t\tisNavigatingNew = false;\r\n\t\t\tthis._navigating = false;\r\n\r\n\t\t\tthis._eventAggregator.publish(\"router:navigation:idle\", event);\r\n\t\t});\r\n\t}\r\n\r\n\tprivate readonly _history: History;\r\n\tprivate readonly _router: AppRouter;\r\n\tprivate readonly _eventAggregator: EventAggregator;\r\n\tprivate _navigating = true;\r\n\tprivate _state: IHistoryState;\r\n\r\n\t/**\r\n\t * True if the router is navigating, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_navigating\")\r\n\tpublic get navigating(): boolean\r\n\t{\r\n\t\treturn this._navigating;\r\n\t}\r\n\r\n\t/**\r\n\t * The current history state.\r\n\t * Note that this will be undefined until the initial navigation succeedes.\r\n\t */\r\n\t@computedFrom(\"_state\")\r\n\tpublic get state(): IHistoryState\r\n\t{\r\n\t\treturn this._state;\r\n\t}\r\n\r\n\t/**\r\n\t * Navigates back in the browser history.\r\n\t * @param offset The number of states to navigate back.\r\n\t */\r\n\tpublic navigateBack(offset?: number): void\r\n\t{\r\n\t\tif (offset == null)\r\n\t\t{\r\n\t\t\thistory.back();\r\n\t\t}\r\n\t\telse if (offset > 0)\r\n\t\t{\r\n\t\t\thistory.go(-offset);\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"Offset must be a positive integer or undefined.\");\r\n\t}\r\n\r\n\t/**\r\n\t * Navigates forward in the browser history.\r\n\t * @param offset The number of states to navigate forward.\r\n\t */\r\n\tpublic navigateForward(offset?: number): void\r\n\t{\r\n\t\tif (offset == null)\r\n\t\t{\r\n\t\t\thistory.forward();\r\n\t\t}\r\n\t\telse if (offset > 0)\r\n\t\t{\r\n\t\t\thistory.go(offset);\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"Offset must be a positive integer or undefined.\");\r\n\t}\r\n\r\n\t/**\r\n\t * Navigates to the specified URL.\r\n\t * @param url The URL to navigate to.\r\n\t * @param options The options to use for the navigation.\r\n\t * @returns A promise that will be resolved when the navigation succeedes.\r\n\t */\r\n\tpublic async navigate(url: string, options?: IHistoryOptions): Promise;\r\n\r\n\t/**\r\n\t * Navigates to a new state, defined by the specified state info.\r\n\t * @param state The info describing the state to navigate to.\r\n\t * @param options The options to use for the navigation.\r\n\t * @returns A promise that will be resolved when the navigation succeedes.\r\n\t */\r\n\tpublic async navigate(state: Partial, options?: IHistoryOptions): Promise;\r\n\r\n\t/**\r\n\t * Navigates to a new state, defined as a mutation of the current state info.\r\n\t * @param state The function that mutates the current state info to produce the new state info.\r\n\t * @param options The options to use for the navigation.\r\n\t * @returns A promise that will be resolved when the navigation succeedes.\r\n\t */\r\n\tpublic async navigate(state: (state: IHistoryState) => void, options?: IHistoryOptions): Promise;\r\n\r\n\tpublic async navigate(...args: any[]): Promise\r\n\t{\r\n\t\t// Do we need the current instruction?\r\n\t\tconst needsInstruction =\r\n\t\t\t(typeof args[0] === \"function\") || (typeof args[0] === \"object\" && !args[0].route);\r\n\r\n\t\t// If we need the current instruction, and the router is navigating, wait for navigation to complete.\r\n\t\tif (needsInstruction && this._navigating)\r\n\t\t{\r\n\t\t\treturn new Promise((resolve, reject) =>\r\n\t\t\t{\r\n\t\t\t\tthis._eventAggregator.subscribeOnce(\"router:navigation:idle\", (event: any) =>\r\n\t\t\t\t{\r\n\t\t\t\t\t// Only continue if the navigation succeeded.\r\n\t\t\t\t\tif (event.result.completed)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis.navigate.apply(this, args).then(resolve).catch(reject);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tresolve(false);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Push or replace the state as requested.\r\n\r\n\t\tconst options = args[1];\r\n\r\n\t\tif (typeof args[0] === \"string\")\r\n\t\t{\r\n\t\t\tconst url = args[0];\r\n\r\n\t\t\treturn this._router.navigate(url, options);\r\n\t\t}\r\n\r\n\t\tif (typeof args[0] === \"function\")\r\n\t\t{\r\n\t\t\tlet state = { ...this.state };\r\n\r\n\t\t\tstate = args[0](state) || state;\r\n\r\n\t\t\treturn this.navigate(state, options);\r\n\t\t}\r\n\r\n\t\tconst state = args[0];\r\n\r\n\t\tconst urlPattern = state.url || this.state.path;\r\n\t\tconst urlParams = { ...state.params };\r\n\r\n\t\tlet url = urlPattern;\r\n\r\n\t\tfor (const key of Object.keys(urlParams))\r\n\t\t{\r\n\t\t\turl = url.replace(new RegExp(`:${key}(/|$)`), ($0: string, $1: string) =>\r\n\t\t\t{\r\n\t\t\t\tconst value = urlParams[key];\r\n\r\n\t\t\t\tdelete urlParams[key];\r\n\r\n\t\t\t\treturn `${value}${$1}`;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst query = Object.keys(urlParams)\r\n\t\t\t.filter(key => urlParams[key] !== undefined)\r\n\t\t\t.map(key => `${key}=${urlParams[key].toString()}`).join(\"&\");\r\n\r\n\t\tif (query)\r\n\t\t{\r\n\t\t\turl += `?${query}`;\r\n\t\t}\r\n\r\n\t\tif (state.fragment)\r\n\t\t{\r\n\t\t\turl += `#${encodeURIComponent(state.fragment).replace(/%2F/g, \"/\").replace(/%3F/g, \"?\")}`;\r\n\t\t}\r\n\r\n\t\tconst success = this._router.navigate(url, options) !== false;\r\n\r\n\t\tif (success)\r\n\t\t{\r\n\t\t\tif (state.data)\r\n\t\t\t{\r\n\t\t\t\tthis._history.setState(\"data\", state.data);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn success;\r\n\t}\r\n\r\n\t/**\r\n\t * Handler for the navigation success event, which gets the current state info.\r\n\t * @return An object representing the current state info.\r\n\t */\r\n\tprivate getState(): IHistoryState\r\n\t{\r\n\t\tif (!this._router.currentInstruction)\r\n\t\t{\r\n\t\t\tthrow new Error(\"Cannot get the current navigation instruction.\");\r\n\t\t}\r\n\r\n\t\tconst instructions = this._router.currentInstruction.getAllInstructions();\r\n\r\n\t\tconst path = instructions.map(i => (i.config.route as string).replace(\"/*childRoute\", \"\")).join(routeNameSeparator);\r\n\r\n\t\tconst params = instructions.reduce((previous, current) =>\r\n\t\t({\r\n\t\t\t...previous,\r\n\t\t\t...(current as any).lifecycleArgs[0]\r\n\t\t}),\r\n\t\tthis._router.currentInstruction.queryParams);\r\n\r\n\t\tconst fragment = location.hash.substring(1) || undefined;\r\n\r\n\t\tconst data = this._history.getState(\"data\");\r\n\r\n\t\treturn { path, params, fragment, data };\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { Type } from \"shared/types\";\r\nimport { Toast } from \"./toast\";\r\nimport { ToastCloseReason } from \"./toast-close-reason\";\r\n\r\n/**\r\n * Represents the type of the object passed to the `activate` life cycle method of a component.\r\n */\r\ntype Model = TToast extends { activate(toast: infer TModel): any } ? TModel : never;\r\n\r\n/**\r\n * Represents the type of the object returned by the `deactivate` life cycle method of a component.\r\n */\r\ntype Result = TToast extends { deactivate(): infer TResult } ? TResult : TToast extends never ? any : void;\r\n\r\n/**\r\n * Represents the registration to which a toast name maps.\r\n */\r\ninterface IToastRegistration\r\n{\r\n\t/**\r\n\t * The type of the component to present, or its module ID.\r\n\t */\r\n\tviewModel: string | Type;\r\n\r\n\t/**\r\n\t * The default model to pass to the `activate` life cycle method of the component\r\n\t * if no model is specified when the toast is opened.\r\n\t */\r\n\tmodel?: any;\r\n}\r\n\r\n/**\r\n * Represents a service that manages the toasts on the stack.\r\n * Inject this where needed, and use it to open and close toasts.\r\n */\r\n@autoinject\r\nexport class ToastService\r\n{\r\n\tprivate readonly _registrations = new Map();\r\n\r\n\t/**\r\n\t * The stack of toasts currently being presented,\r\n\t * with the most recently opened toast at the top.\r\n\t */\r\n\tpublic readonly toasts: Toast[] = [];\r\n\r\n\t/**\r\n\t * Registers the component with the specified module ID, as a toast with the specified name.\r\n\t * @param name The name under which the toast should be registered.\r\n\t * @param viewModel The type of the component to present, or its module ID.\r\n\t * @param model The default model to use, if not specified when the toast is opened.\r\n\t */\r\n\tpublic register(name: string, viewModel: string | Type, model?: any): void\r\n\t{\r\n\t\tthis._registrations.set(name, { viewModel, model });\r\n\t}\r\n\r\n\t/**\r\n\t * Unregisters the toast with the specified name.\r\n\t * @param name The name of the toast to unregister.\r\n\t */\r\n\tpublic unregister(name: string): void\r\n\t{\r\n\t\tthis._registrations.delete(name);\r\n\t}\r\n\r\n\t/**\r\n\t * Opens a toast of the specified type.\r\n\t * @param viewModel The type of the toast.\r\n\t * @param model The model to pass to the `activate` life cycle method of the component.\r\n\t * @returns A promise that will be resolved when the toast is closed.\r\n\t */\r\n\tpublic open(viewModel: Type, model?: Model): Toast, Result>;\r\n\r\n\t/**\r\n\t * Opens the toast with the specified name.\r\n\t * @param name The name under which the toast was registered.\r\n\t * @param model The model to pass to the `activate` life cycle method of the component.\r\n\t * @returns A promise that will be resolved when the toast is closed.\r\n\t */\r\n\tpublic open(name: string, model?: TModel): Toast;\r\n\r\n\tpublic open(nameOrType: string | Type, model?: any): Toast\r\n\t{\r\n\t\tconsole.info(\"Attempting to open toast.\", { nameOrType, model });\r\n\r\n\t\tlet registration: IToastRegistration | undefined;\r\n\r\n\t\tif (typeof nameOrType === \"string\")\r\n\t\t{\r\n\t\t\tregistration = this._registrations.get(nameOrType);\r\n\r\n\t\t\tif (registration == null)\r\n\t\t\t{\r\n\t\t\t\tthrow new Error(`No toast has been registered with the name '${nameOrType}'.`);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tregistration = { viewModel: nameOrType };\r\n\t\t}\r\n\r\n\t\tconst toast = new Toast(this.toasts, registration.viewModel, model !== undefined ? model : registration.model);\r\n\r\n\t\tthis.toasts.unshift(toast);\r\n\r\n\t\treturn toast;\r\n\t}\r\n\r\n\t/**\r\n\t * Attempts to close all open toasts.\r\n\t * @param reason The reason for closing the toasts, which may affect how the toasts responds.\r\n\t * @returns A promise that will be resolved with true if all toasts accepted the close request,\r\n\t * or false if one of them rejected it with a reason other than an `Error` instance.\r\n\t */\r\n\tpublic async closeAll(reason: ToastCloseReason): Promise\r\n\t{\r\n\t\tif (this.toasts.length === 0)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tconsole.info(\"Attempting to close all toasts.\", { toasts: this.toasts, reason });\r\n\r\n\t\tconst promises: Promise[] = [];\r\n\r\n\t\tfor (const toast of this.toasts.slice().reverse())\r\n\t\t{\r\n\t\t\tpromises.push(toast.close(reason));\r\n\t\t}\r\n\r\n\t\treturn Promise.all(promises).then(results => results.every(r => r));\r\n\t}\r\n\r\n\t/**\r\n\t * Finds all open toasts of the specified type.\r\n\t * @param viewModel The type of the toast.\r\n\t * @returns The open toasts with the specified name, if any.\r\n\t */\r\n\tpublic find(viewModel: Type): Toast[];\r\n\r\n\t/**\r\n\t * Finds all open toasts with the specified name.\r\n\t * @param name The name under which the toast was registered.\r\n\t * @returns The open toasts with the specified name, if any.\r\n\t */\r\n\tpublic find(name: string): Toast[];\r\n\r\n\tpublic find(nameOrType: string | Type): Toast[]\r\n\t{\r\n\t\tlet registration: IToastRegistration | undefined;\r\n\r\n\t\tif (typeof nameOrType === \"string\")\r\n\t\t{\r\n\t\t\tregistration = this._registrations.get(nameOrType);\r\n\r\n\t\t\tif (registration == null)\r\n\t\t\t{\r\n\t\t\t\tthrow new Error(`No toast has been registered with the name '${nameOrType}'.`);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tregistration = { viewModel: nameOrType };\r\n\t\t}\r\n\r\n\t\treturn this.toasts.filter(m => m.viewModel === registration!.viewModel);\r\n\t}\r\n}\r\n","import { Logger } from \"aurelia-logging\";\r\nimport { Log } from \"../../log\";\r\n\r\n/**\r\n * Represents a `LogAppender` that captures log entries generated\r\n * by Aurelia anbd logs them using our logging infrastructure.\r\n */\r\nexport class LogAppender\r\n{\r\n\tpublic debug(logger: Logger, message: string, ...data: any[]): void\r\n\t{\r\n\t\tconst context = data.length > 0 ? { data } : undefined;\r\n\t\tLog.debug(message, { tags: { logger: logger.id }, ...context });\r\n\t}\r\n\r\n\tpublic info(logger: Logger, message: string, ...data: any[]): void\r\n\t{\r\n\t\tconst context = data.length > 0 ? { data } : undefined;\r\n\t\tLog.info(message, { tags: { logger: logger.id }, ...context });\r\n\t}\r\n\r\n\tpublic warn(logger: Logger, message: string, ...data: any[]): void\r\n\t{\r\n\t\tconst context = data.length > 0 ? { data } : undefined;\r\n\t\tLog.warn(message, { tags: { logger: logger.id }, ...context });\r\n\t}\r\n\r\n\tpublic error(logger: Logger, messageOrError: string | Error, ...data: any[]): void\r\n\t{\r\n\t\tif (typeof messageOrError === \"string\")\r\n\t\t{\r\n\t\t\tconst error = data.find(x => x instanceof Error);\r\n\t\t\tconst context = data.length > 0 ? { data: data.filter(d => d !== error) } : undefined;\r\n\t\t\tLog.error(messageOrError, error, { tags: { logger: logger.id }, ...context });\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tconst context = data.length > 0 ? { data } : undefined;\r\n\t\t\tLog.error(messageOrError, { tags: { logger: logger.id }, ...context });\r\n\t\t}\r\n\t}\r\n}\r\n","import { singleton } from \"aurelia-framework\";\r\nimport { EventAggregator } from \"aurelia-event-aggregator\";\r\n\r\nexport const enum Local_Storage_Navigation_Key {\r\n\tPrevious = \"previous\",\r\n\tCurrent = \"current\"\r\n}\r\n\r\n/**\r\n * Helper service that logs navigation events to the console.\r\n */\r\n@singleton()\r\nexport class LogNavigation\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param eventAggregator The `EventAggregator` instance.\r\n\t */\r\n\tpublic constructor(eventAggregator: EventAggregator)\r\n\t{\r\n\t\teventAggregator.subscribe(\"router:navigation:processing\", (event: any) =>\r\n\t\t{\r\n\t\t\tconst i = event.instruction;\r\n\t\t\tconsole.group(`Navigation to '${i.fragment}${i.queryString ? `?${i.queryString}` : \"\"}'`);\r\n\r\n\t\t\t// Hack to get the previous navigation as Aurelia router currently is broken to this regard\r\n\t\t\tif (window.localStorage.getItem(Local_Storage_Navigation_Key.Current) != null)\r\n\t\t\t{\r\n\t\t\t\twindow.localStorage.setItem(Local_Storage_Navigation_Key.Previous, window.localStorage.getItem(Local_Storage_Navigation_Key.Current)!);\r\n\t\t\t}\r\n\t\t\twindow.localStorage.setItem(Local_Storage_Navigation_Key.Current, i.fragment);\r\n\t\t});\r\n\r\n\t\teventAggregator.subscribe(\"router:navigation:idle\", (event: any) =>\r\n\t\t{\r\n\t\t\tif (event.result.status === \"completed\")\r\n\t\t\t{\r\n\t\t\t\tconsole.info(\"Navigation completed\");\r\n\t\t\t}\r\n\t\t\telse if (event.result.output)\r\n\t\t\t{\r\n\t\t\t\tconsole.error(\"Navigation failed\");\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tconsole.warn(\"Navigation cancelled\");\r\n\t\t\t}\r\n\r\n\t\t\tconsole.groupEnd();\r\n\t\t});\r\n\t}\r\n}\r\n","import { singleton } from \"aurelia-framework\";\nimport { EventAggregator } from \"aurelia-event-aggregator\";\nimport * as Sentry from \"@sentry/browser\";\nimport { SpanStatus } from \"@sentry/tracing\";\nimport { ModuleActivateFinishedEvent } from \"../events/modules/activate-finished-event\";\nimport { ModuleActivateStartedEvent } from \"../events/modules/activate-started-event\";\n\n/**\n * Helper service that subscribes to events that Sentry must log.\n */\n@singleton()\nexport class SentryEvents\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param eventAggregator The `EventAggregator` instance.\n\t */\n\tpublic constructor(eventAggregator: EventAggregator)\n\t{\n\t\teventAggregator.subscribe(\"grandhood:module:activate:started\", (event: ModuleActivateStartedEvent) =>\n\t\t{\n\t\t\tconst sentryHub = Sentry.getCurrentHub();\n\t\t\tconst scope = sentryHub.pushScope();\n\t\t\tscope.setSpan(sentryHub.startTransaction(\n\t\t\t{\n\t\t\t\tname: event.moduleName,\n\t\t\t\top: \"navigation\"\n\t\t\t}));\n\t\t});\n\n\t\teventAggregator.subscribe(\"grandhood:module:activate:finished\", (event: ModuleActivateFinishedEvent) =>\n\t\t{\n\t\t\tconst sentryHub = Sentry.getCurrentHub();\n\t\t\tconst transaction = sentryHub\n\t\t\t\t?.getScope()\n\t\t\t\t?.getTransaction();\n\n\t\t\tif(transaction == null)\n\t\t\t{\n\t\t\t\tsentryHub.popScope();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (event.status === \"success\")\n\t\t\t{\n\t\t\t\ttransaction.setStatus(SpanStatus.Ok);\n\t\t\t\ttransaction.finish();\n\t\t\t}\n\t\t\telse if (event.status === \"error\")\n\t\t\t{\n\t\t\t\ttransaction.setStatus(SpanStatus.InternalError);\n\t\t\t\ttransaction.finish();\n\t\t\t}\n\t\t\telse if(event.status === \"aborted\")\n\t\t\t{\n\t\t\t\ttransaction.setStatus(SpanStatus.Aborted);\n\t\t\t\ttransaction.finish();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttransaction.setStatus(SpanStatus.UnknownError);\n\t\t\t\ttransaction.finish();\n\t\t\t}\n\n\t\t\tsentryHub.popScope();\n\t\t});\n\t}\n}\n","import { singleton } from \"aurelia-framework\";\nimport * as Sentry from \"@sentry/browser\";\n\n/**\n * Helper service adds span for api calls.\n */\n@singleton()\nexport class SentryApiHandler\n{\n\tpublic start(\n\t\tmethod: string,\n\t\tpath: string\n\t): void\n\t{\n\t\tconst sentryHub = Sentry.getCurrentHub();\n\t\tconst scope = sentryHub.pushScope();\n\t\tconst parentSpan = scope.getSpan();\n\t\tscope.setSpan(parentSpan?.startChild(\n\t\t\t{\n\t\t\t\top: \"http call\",\n\t\t\t\tdescription: `${method} ${path}`,\n\t\t\t}\n\t\t));\n\t}\n\n\tpublic get traceHeader(): string | undefined\n\t{\n\t\tconst span = Sentry\n\t\t\t.getCurrentHub()\n\t\t\t?.getScope()\n\t\t\t?.getSpan();\n\n\t\treturn span?.toTraceparent();\n\t}\n\n\tpublic finish(status: number): void\n\t{\n\t\tconst sentryHub = Sentry.getCurrentHub();\n\t\tconst scope = sentryHub.getScope();\n\t\tif (scope?.getSpan())\n\t\t{\n\t\t\tscope.getSpan()?.setHttpStatus(status);\n\t\t\tscope.getSpan()?.finish();\n\t\t}\n\n\t\tsentryHub.popScope();\n\t}\n}\n","export * from \"./api-client\";\r\nexport * from \"./api-client-settings\";\r\nexport * from \"./api-request-options\";\r\nexport * from \"./api-errors\";\r\nexport * from \"./api-result\";\r\nexport * from \"./api-interceptor\";\r\nexport * from \"./interceptors/response-stub-interceptor\";\r\nexport * from \"./interceptors/correlation-header-interceptor\";\r\n","import { Container, autoinject } from \"aurelia-framework\";\r\nimport { SentryApiHandler } from \"../sentry\";\r\n\r\nimport { once, delay } from \"shared/utilities\";\r\nimport { IApiClientSettings, IApiEndpointSettings } from \"./api-client-settings\";\r\nimport { IApiInterceptor } from \"./api-interceptor\";\r\nimport { IApiRequestOptions } from \"./api-request-options\";\r\nimport { apiRequestDefaults } from \"./api-request-defaults\";\r\nimport { ApiAbortError, ApiError, ApiOriginError, ApiValidationError, transientHttpStatusCodes, missingHttpStatusCodes } from \"./api-errors\";\r\nimport { ApiResult } from \"./api-result\";\r\n\r\n// TODO: We should ideally refactor those dependencies out,\r\n// such that a custom obfuscator/deobfuscator can be used.\r\nimport { obfuscate, deobfuscate } from \"./api-obfuscation\";\r\n\r\n// TODO: We should ideally refactor those dependencies out,\r\n// such that a custom serializer/deserializer can be used.\r\nimport { DateTime, Duration } from \"luxon\";\r\n\r\n/**\r\n * Represents a specialized HTTP client for interacting with API endpoints.\r\n */\r\n@autoinject()\r\nexport class ApiClient\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t */\r\n\tpublic constructor(\r\n\t\tcontainer: Container,\r\n\t\tsentryApiHandler: SentryApiHandler)\r\n\t{\r\n\t\tthis._container = container;\r\n\t\tthis._sentryApiHandler = sentryApiHandler;\r\n\t}\r\n\r\n\tprivate readonly _container: Container;\r\n\tprivate readonly _sentryApiHandler: SentryApiHandler;\r\n\tprivate _settings: IApiClientSettings;\r\n\tprivate _interceptors: IApiInterceptor[];\r\n\r\n\t/**\r\n\t * Configures the instance.\r\n\t * @param settings The settings to use.\r\n\t */\r\n\t@once\r\n\tpublic configure(settings: IApiClientSettings): void\r\n\t{\r\n\t\tthis._settings = settings;\r\n\t\tthis._interceptors = [];\r\n\r\n\t\t// Addx any interceptors specified in the settings.\r\n\t\tif (this._settings.interceptors != null)\r\n\t\t{\r\n\t\t\tfor (const interceptor of this._settings.interceptors)\r\n\t\t\t{\r\n\t\t\t\tconst interceptorInstance = interceptor instanceof Function ? this._container.get(interceptor) : interceptor;\r\n\t\t\t\tthis._interceptors.push(interceptorInstance);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Sends a `HEAD` request to the specified endpoint.\r\n\t * This should get a response identical to that of a `GET` request, but without the response body.\r\n\t * Note that a `HEAD` request cannot have a body.\r\n\t * @param path The path, or path segments, identifying the endpoint.\r\n\t * @param options The request options to use, or undefined to use the default options.\r\n\t * @returns A promise that will be resolved with the result of the request, if successful.\r\n\t */\r\n\tpublic async head(path: string | string[], options?: IApiRequestOptions): Promise>\r\n\t{\r\n\t\tif (options != null && options.body !== undefined)\r\n\t\t{\r\n\t\t\tthrow new Error(\"A HEAD request cannot have a body.\");\r\n\t\t}\r\n\r\n\t\treturn this.fetch(\"HEAD\", path, options);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends a `GET` request to the specified endpoint.\r\n\t * This should get the entity at the specified resource.\r\n\t * Note that a `GET` request cannot have a body.\r\n\t * @param path The path, or path segments, identifying the endpoint.\r\n\t * @param options The request options to use, or undefined to use the default options.\r\n\t * @returns A promise that will be resolved with the result of the request, if successful.\r\n\t */\r\n\tpublic async get(path: string | string[], options?: IApiRequestOptions): Promise>\r\n\t{\r\n\t\tif (options != null && options.body !== undefined)\r\n\t\t{\r\n\t\t\tthrow new Error(\"A GET request cannot have a body.\");\r\n\t\t}\r\n\r\n\t\treturn this.fetch(\"GET\", path, { retry: 0, ...options });\r\n\t}\r\n\r\n\t/**\r\n\t * Sends a `PUT` request to the specified endpoint.\r\n\t * This should replace the entity at the specified resource.\r\n\t * @param path The path, or path segments, identifying the endpoint.\r\n\t * @param options The request options to use, or undefined to use the default options.\r\n\t * @returns A promise that will be resolved with the result of the request, if successful.\r\n\t */\r\n\tpublic async put(path: string | string[], options?: IApiRequestOptions): Promise>\r\n\t{\r\n\t\treturn this.fetch(\"PUT\", path, { retry: 0, ...options });\r\n\t}\r\n\r\n\t/**\r\n\t * Sends a `POST` request to the specified endpoint.\r\n\t * This should add an entity to the specified resource, or if the resource is an action, execute it.\r\n\t * @param path The path, or path segments, identifying the endpoint.\r\n\t * @param options The request options to use, or undefined to use the default options.\r\n\t * @returns A promise that will be resolved with the result of the request, if successful.\r\n\t */\r\n\tpublic async post(path: string | string[], options?: IApiRequestOptions): Promise>\r\n\t{\r\n\t\treturn this.fetch(\"POST\", path, { retry: 0, ...options });\r\n\t}\r\n\r\n\t/**\r\n\t * Sends a `PATCH` request to the specified endpoint.\r\n\t * This should partially update the entity at the specified resource.\r\n\t * @param path The path, or path segments, identifying the endpoint.\r\n\t * @param options The request options to use, or undefined to use the default options.\r\n\t * @returns A promise that will be resolved with the result of the request, if successful.\r\n\t */\r\n\tpublic async patch(path: string | string[], options?: IApiRequestOptions): Promise>\r\n\t{\r\n\t\treturn this.fetch(\"PATCH\", path, { retry: 0, ...options });\r\n\t}\r\n\r\n\t/**\r\n\t * Sends a `DELETE` request to the specified endpoint.\r\n\t * This should delete the entity at the specified resource.\r\n\t * Note that a `DELETE` request cannot have a body.\r\n\t * @param path The path, or path segments, identifying the endpoint.\r\n\t * @param options The request options to use, or undefined to use the default options.\r\n\t * @returns A promise that will be resolved with the result of the request, if successful.\r\n\t */\r\n\tpublic async delete(path: string | string[], options?: IApiRequestOptions): Promise>\r\n\t{\r\n\t\tif (options != null && options.body !== undefined)\r\n\t\t{\r\n\t\t\tthrow new Error(\"A DELETE request cannot have a body.\");\r\n\t\t}\r\n\r\n\t\treturn this.fetch(\"DELETE\", path, { retry: 0, ...options });\r\n\t}\r\n\r\n\t/**\r\n\t * Fetches the response from the specified endpoint.\r\n\t * @param method The HTTP method to use.\r\n\t * @param path The path, or path segments, identifying the endpoint.\r\n\t * @param options The request options to use.\r\n\t * @returns A promise that will be resolved with the result of the request.\r\n\t */\r\n\tprivate async fetch(method: string, path: string | string[], options?: IApiRequestOptions): Promise>\r\n\t{\r\n\t\t// Get the endpoint path.\r\n\t\tconst endpointPath = path instanceof Array ? path.join(\"/\") : path;\r\n\r\n\t\t// Telling sentry a call is being made\r\n\t\tthis._sentryApiHandler.start(\r\n\t\t\tmethod,\r\n\t\t\tendpointPath\r\n\t\t);\r\n\r\n\t\t// Get the endpoint settings.\r\n\t\tconst endpointSettings = this.getEndpointSettings(endpointPath);\r\n\r\n\t\t// Get the request options to use.\r\n\t\tconst requestOptions = this.getRequestOptions(options);\r\n\r\n\t\t// Get the request URL.\r\n\t\tconst requestUrl = this.getRequestUrl(endpointPath, requestOptions, endpointSettings);\r\n\r\n\t\t// Create the request.\r\n\t\tconst request = this.getRequest(method, requestUrl, requestOptions, endpointSettings);\r\n\r\n\t\t// Send the request and get the response.\r\n\t\tconst response = await this.getResponse(request, requestOptions);\r\n\r\n\t\t// Get the deobfuscated and deserialized response body.\r\n\t\tconst responseBody = await this.getResponseBody(response, requestOptions, endpointSettings);\r\n\r\n\t\t// Does the response indicate that the resource is missing?\r\n\t\tconst resourceMissing = missingHttpStatusCodes.includes(response.status);\r\n\r\n\t\t// Tells sentry that call has finished\r\n\t\tthis._sentryApiHandler.finish(response.status);\r\n\r\n\t\t// Throw an `ApiError` if the request was unsuccessful.\r\n\t\tif (!response.ok && !(resourceMissing && requestOptions.optional))\r\n\t\t{\r\n\t\t\tthrow this.createApiError(false, request, response, undefined, responseBody);\r\n\t\t}\r\n\r\n\t\t// Return the result of the request.\r\n\t\treturn new ApiResult(request, response, responseBody);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the request options to use, by the merging hardcoded defaults,\r\n\t * the configured defaults, and the specified options.\r\n\t * @param options The options specified for the request.\r\n\t * @returns The merged request options.\r\n\t */\r\n\tprivate getRequestOptions(options?: IApiRequestOptions): IApiRequestOptions\r\n\t{\r\n\t\t// Merge the defaults, settings and options.\r\n\t\tconst mergedOptions: IApiRequestOptions =\r\n\t\t{\r\n\t\t\t...apiRequestDefaults,\r\n\t\t\t...this._settings.defaults,\r\n\t\t\t...options\r\n\t\t};\r\n\r\n\t\t// Merge the headers specified in the defaults, settings and options.\r\n\t\tmergedOptions.headers =\r\n\t\t{\r\n\t\t\t\"sentry-trace\": this._sentryApiHandler.traceHeader,\r\n\t\t\t...apiRequestDefaults.headers,\r\n\t\t\t...this._settings.defaults?.headers,\r\n\t\t\t...(options?.body == null || options?.body === \"\" ? { \"content-type\": undefined } : undefined),\r\n\t\t\t...options?.headers\r\n\t\t};\r\n\r\n\t\tfor (const key of Object.keys(mergedOptions.headers))\r\n\t\t{\r\n\t\t\tif (mergedOptions.headers[key] === undefined)\r\n\t\t\t{\r\n\t\t\t\tdelete mergedOptions.headers[key];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn mergedOptions;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the settings for the endpoint with the specified path.\r\n\t * @param path The path, or path segments, identifying the endpoint.\r\n\t * @returns The settings to use for the endpoint.\r\n\t */\r\n\tprivate getEndpointSettings(path: string): IApiEndpointSettings\r\n\t{\r\n\t\t// Get the name of the endpoint configuration that best matches the path.\r\n\t\tconst endpointName = Object.keys(this._settings.endpointSettings)\r\n\t\t\t.filter(key => path === key || path.startsWith(`${key}/`))\r\n\t\t\t.reduce((bestKey, key) => key.length > bestKey.length ? key : bestKey, \"\");\r\n\r\n\t\t// Get the settings for the endpoint.\r\n\t\tlet endpointSettings = { ...this._settings.endpointSettings[endpointName] };\r\n\r\n\t\t// Verify that the settings were found.\r\n\t\tif (endpointSettings == null)\r\n\t\t{\r\n\t\t\tthrow new Error(`Could not find any settings matching the endpoint '${path}'.`);\r\n\t\t}\r\n\r\n\t\t// If the settings are a string, assume it's the version.\r\n\t\tif (typeof endpointSettings === \"string\")\r\n\t\t{\r\n\t\t\tendpointSettings = { version: endpointSettings };\r\n\t\t}\r\n\r\n\t\t// Verify that the settings include a version.\r\n\t\tif (!endpointSettings.version)\r\n\t\t{\r\n\t\t\tthrow new Error(`The settings for the endpoint '${path}' must specify a version.`);\r\n\t\t}\r\n\r\n\t\t// Resolve whether obfuscation should be used.\r\n\t\tif (endpointSettings.obfuscate === undefined)\r\n\t\t{\r\n\t\t\tendpointSettings.obfuscate = this._settings.obfuscate;\r\n\t\t}\r\n\r\n\t\treturn endpointSettings;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the URL to be used for the request.\r\n\t * @param path The path, or path segments, identifying the endpoint.\r\n\t * @param options The request options to use.\r\n\t * @param endpointSettings The endpoint settings to use.\r\n\t * @returns The URL to be used for the request.\r\n\t */\r\n\tprivate getRequestUrl(path: string, options: IApiRequestOptions, endpointSettings: IApiEndpointSettings): string\r\n\t{\r\n\t\t// Obfuscate the path segments, if enabled.\r\n\t\tif (endpointSettings.obfuscate)\r\n\t\t{\r\n\t\t\tpath = path.split(\"/\").map(s => obfuscate(s, this._settings.cipher)).join(\"/\");\r\n\t\t}\r\n\r\n\t\t// Construct the endpoint URL.\r\n\t\tlet fetchUrl = this._settings.endpointUrlPattern\r\n\t\t\t.replace(\"{version}\", endpointSettings.version)\r\n\t\t\t.replace(\"{path}\", path);\r\n\r\n\t\t// Construct and append the query string.\r\n\t\tif (options.query != null)\r\n\t\t{\r\n\t\t\tconst queryParams: string[] = [];\r\n\r\n\t\t\t// Append the parameters, ordered by name to ensure consistent, cache-friendly URLs.\r\n\t\t\tfor (const key of Object.keys(options.query).sort())\r\n\t\t\t{\r\n\t\t\t\t// Get the value of the query parameter.\r\n\t\t\t\tconst value = options.query[key];\r\n\r\n\t\t\t\t// If the value is null or undefined, ignore it.\r\n\t\t\t\tif (value == null)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Add the encoded query parameter.\r\n\t\t\t\tqueryParams.push(`${this.encodeQueryComponent(key)}=${this.encodeQueryValue(value)}`);\r\n\t\t\t}\r\n\r\n\t\t\tif (queryParams.length > 0)\r\n\t\t\t{\r\n\t\t\t\t// Construct the query string by join the parameters.\r\n\t\t\t\tlet query = queryParams.join(\"&\");\r\n\r\n\t\t\t\t// Obfuscate the query string, if enabled.\r\n\t\t\t\tif (endpointSettings.obfuscate)\r\n\t\t\t\t{\r\n\t\t\t\t\tquery = obfuscate(query, this._settings.cipher);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Append the query string to the endpoint URL.\r\n\t\t\t\tfetchUrl += `${fetchUrl.includes(\"?\") ? \"&\" : \"?\"}${query}`;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn fetchUrl;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the fetch request to be sent.\r\n\t * @param method The HTTP method to use.\r\n\t * @param fetchUrl The URL to be used for the request.\r\n\t * @param options The request options to use.\r\n\t * @param endpointSettings The endpoint settings to use.\r\n\t * @returns The fetch request to be sent.\r\n\t */\r\n\tprivate getRequest(method: string, fetchUrl: string, options: IApiRequestOptions, endpointSettings: IApiEndpointSettings): Request\r\n\t{\r\n\t\t// Construct the fetch options.\r\n\t\tconst fetchOptions: RequestInit =\r\n\t\t{\r\n\t\t\tmethod,\r\n\t\t\theaders: options.headers,\r\n\t\t\tmode: options.mode,\r\n\t\t\tcache: options.cache,\r\n\t\t\tredirect: options.redirect,\r\n\t\t\treferrer: options.referrer,\r\n\t\t\treferrerPolicy: options.referrerPolicy,\r\n\t\t\tsignal: options.signal,\r\n\t\t\tintegrity: options.integrity,\r\n\t\t\tcredentials: options.credentials,\r\n\t\t\tkeepalive: options.keepalive,\r\n\t\t\twindow: options.window\r\n\t\t};\r\n\r\n\t\t// Add the body, if specified.\r\n\t\tif (options.body !== undefined)\r\n\t\t{\r\n\t\t\t// Determine whether the request body should be serialized as JSON.\r\n\t\t\tconst contentType = options.headers ? options.headers[\"content-type\"] : undefined;\r\n\t\t\tconst hasJsonBody = contentType != null && /^application\\/(.+\\+)?json(;|$)/.test(contentType);\r\n\r\n\t\t\t// Stringify the request body, if needed.\r\n\t\t\tconst body = hasJsonBody && typeof options.body !== \"string\" ? JSON.stringify(options.body) : options.body as any;\r\n\r\n\t\t\t// Obfuscate the body, if enabled.\r\n\t\t\tif (endpointSettings.obfuscate && typeof body === \"string\")\r\n\t\t\t{\r\n\t\t\t\tfetchOptions.body = obfuscate(body, this._settings.cipher);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tfetchOptions.body = body;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Create the request.\r\n\t\treturn new Request(fetchUrl, fetchOptions);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the response to the specified fetch request, passing the request\r\n\t * and response through any registered interceptors along the way.\r\n\t * @param fetchRequest The request to send.\r\n\t * @param options The request options to use.\r\n\t * @returns A promise that will be resolved with the response to the fetch request.\r\n\t */\r\n\tprivate async getResponse(request: Request, options: IApiRequestOptions): Promise\r\n\t{\r\n\t\tlet current: Request | Response = request;\r\n\r\n\t\twhile (current instanceof Request)\r\n\t\t{\r\n\t\t\t// Apply the interceptors to the request.\r\n\t\t\tcurrent = await this.interceptRequest(current, options);\r\n\r\n\t\t\tif (current instanceof Request)\r\n\t\t\t{\r\n\t\t\t\tcurrent = await this.fetchResponse(current, options);\r\n\t\t\t}\r\n\r\n\t\t\t// Apply the interceptors to the response.\r\n\t\t\tcurrent = await this.interceptResponse(current, options);\r\n\t\t}\r\n\r\n\t\treturn current;\r\n\t}\r\n\r\n\t/**\r\n\t * Sends the specified fetch request and gets the response.\r\n\t * @param fetchRequest The request to send.\r\n\t * @param options The request options to use.\r\n\t * @returns A promise that will be resolved with the response to the fetch request.\r\n\t */\r\n\tprivate async fetchResponse(fetchRequest: Request, options: IApiRequestOptions): Promise\r\n\t{\r\n\t\tlet fetchResponse: Response | undefined;\r\n\r\n\t\t// Attempt to get the response, retrying as specified in the options.\r\n\t\tfor (let attempt = 0; attempt < options.retry! + 1; attempt++)\r\n\t\t{\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\t// Send the request and await the response.\r\n\t\t\t\tfetchResponse = await fetch(fetchRequest);\r\n\r\n\t\t\t\t// Does the response represent a transient error?\r\n\t\t\t\tif (transientHttpStatusCodes.includes(fetchResponse.status))\r\n\t\t\t\t{\r\n\t\t\t\t\tthrow this.createApiError(true, fetchRequest, fetchResponse);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Success, skip remaining retry attempts.\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tcatch (error: any)\r\n\t\t\t{\r\n\t\t\t\t// TODO: Should we treat an error with no response as transient?\r\n\r\n\t\t\t\t// Throw an `AbortError` if the request was intentionally aborted.\r\n\t\t\t\tif (error.name === \"AbortError\")\r\n\t\t\t\t{\r\n\t\t\t\t\tthrow new ApiAbortError(fetchRequest);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Throw an `ApiError` if the error is non-transient.\r\n\t\t\t\tif (error.transient !== true)\r\n\t\t\t\t{\r\n\t\t\t\t\tthrow this.createApiError(false, fetchRequest, fetchResponse, error.message);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Throw an `ApiError` if the error is transient and the retry attempts have been exhausted.\r\n\t\t\t\tif (attempt === options.retry)\r\n\t\t\t\t{\r\n\t\t\t\t\tthrow this.createApiError(true, fetchRequest, fetchResponse, error.message);\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttry\r\n\t\t\t\t{\r\n\t\t\t\t\t// Await the next retry.\r\n\t\t\t\t\tconst retryDelayIndex = Math.min(attempt, options.retryDelay!.length - 1);\r\n\t\t\t\t\tconst retryDelay = options.retryDelay![retryDelayIndex];\r\n\t\t\t\t\tawait delay(retryDelay, options.signal);\r\n\t\t\t\t}\r\n\t\t\t\tcatch (delayError)\r\n\t\t\t\t{\r\n\t\t\t\t\tthrow new ApiAbortError(fetchRequest);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn fetchResponse!;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the deobfuscated and deserialized response body, if enabled.\r\n\t * @param fetchRequest The request to send.\r\n\t * @param options The request options to use.\r\n\t * @param endpointSettings The endpoint settings to use.\r\n\t * @returns A promise that will be resolved with the deobfuscated and deserialized\r\n\t * response body, or undefined if deserialization is disabled.\r\n\t */\r\n\tprivate async getResponseBody(fetchResponse: Response, options: IApiRequestOptions, endpointSettings: IApiEndpointSettings): Promise\r\n\t{\r\n\t\t// Determine whether the response body can be parsed as JSON.\r\n\t\tconst contentType = fetchResponse.headers.get(\"content-type\");\r\n\t\tconst hasJsonBody = contentType != null && /^application\\/(.+\\+)?json(;|$)/.test(contentType);\r\n\r\n\t\t// Deserialize the response body, if enabled.\r\n\t\tif (options.deserialize && hasJsonBody)\r\n\t\t{\r\n\t\t\t// Await the response body.\r\n\t\t\tlet text = await fetchResponse.text();\r\n\r\n\t\t\tif (text.length > 0)\r\n\t\t\t{\r\n\t\t\t\t// Deobfuscate the body, if enabled.\r\n\t\t\t\tif (endpointSettings.obfuscate)\r\n\t\t\t\t{\r\n\t\t\t\t\ttext = deobfuscate(text, this._settings.cipher);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Deserialize the body, using the configured JSON reviver.\r\n\t\t\t\treturn JSON.parse(text, options.jsonReviver);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates the appropiate error for the specified response.\r\n\t * @param transient True if the error is a transient error, otherwise false.\r\n\t * @param request The request sent to the server.\r\n\t * @param response The response received from the server.\r\n\t * @param message The message describing the error.\r\n\t * @param data The deserialized response body, if available.\r\n\t */\r\n\tprivate createApiError(transient: boolean, request: Request, response?: Response, message?: string, data?: any): ApiError\r\n\t{\r\n\t\t// Does the response conform to the RFC-7807 specification,\r\n\t\t// indicating it came from the origin server?\r\n\t\tif (response != null && response.headers.get(\"content-type\")?.includes(\"application/problem+json\"))\r\n\t\t{\r\n\t\t\t// Does the error represent a validation error?\r\n\t\t\tif (data.status || response.status === 400)\r\n\t\t\t{\r\n\t\t\t\treturn new ApiValidationError(transient, request, response, message, data);\r\n\t\t\t}\r\n\r\n\t\t\treturn new ApiOriginError(transient, request, response, message, data);\r\n\t\t}\r\n\r\n\t\treturn new ApiError(transient, request, response, message, data);\r\n\t}\r\n\r\n\t/**\r\n\t * Encodes the specified text for use in a query string.\r\n\t * @param text The text to encode.\r\n\t * @returns The encoded text.\r\n\t */\r\n\tprivate encodeQueryComponent(text: any): string\r\n\t{\r\n\t\t// Encode the text, taking into account that the characters `/` and `?`\r\n\t\t// do not need to be encoded in the query part of an URL.\r\n\t\treturn encodeURIComponent(text.toString()).replace(/%2F/g, \"/\").replace(/%3F/g, \"?\");\r\n\t}\r\n\r\n\t/**\r\n\t * Encodes the specified value for use in a query string.\r\n\t * @param value The value to encode.\r\n\t * @param isNested True if the value is nested, and therefore can't be complex, otherwise false.\r\n\t * @returns The encoded value.\r\n\t */\r\n\tprivate encodeQueryValue(value: any, isNested?: boolean): string\r\n\t{\r\n\t\t// If the value is null or undefined, return an empty string.\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\r\n\t\t// If the value is a `Date` instance, convert it to ISO-8601 format.\r\n\t\tif (value instanceof Date)\r\n\t\t{\r\n\t\t\treturn value.toISOString();\r\n\t\t}\r\n\r\n\t\t// If the value is a `DateTime` instance, convert it to ISO-8601 format.\r\n\t\tif (value instanceof DateTime)\r\n\t\t{\r\n\t\t\treturn value.toISO();\r\n\t\t}\r\n\r\n\t\t// If the value is a `Duration`instance, convert it to ISO-8601 format.\r\n\t\tif (value instanceof Duration)\r\n\t\t{\r\n\t\t\treturn value.toISO();\r\n\t\t}\r\n\r\n\t\t// If the value is an `Array` instance, convert it to a comma-separated list of values.\r\n\t\tif (!isNested && value instanceof Array)\r\n\t\t{\r\n\t\t\treturn value.map(v => this.encodeQueryValue(v, true)).join(\",\");\r\n\t\t}\r\n\r\n\t\t// If the value is a `Set` instance, convert it to a comma-separated list of values.\r\n\t\tif (!isNested && value instanceof Set)\r\n\t\t{\r\n\t\t\treturn Array.from(value).map(v => this.encodeQueryValue(v, true)).join(\",\");\r\n\t\t}\r\n\r\n\t\t// If the value is a `Map` instance, convert it to a comma-separated list of `key:value` pairs.\r\n\t\tif (!isNested && value instanceof Map)\r\n\t\t{\r\n\t\t\treturn Array.from(value).map(([k, v]) => `${k}:${this.encodeQueryValue(v, true)}`).join(\",\");\r\n\t\t}\r\n\r\n\t\t// If the value is an `Object` instance, convert it to comma-separated list of `key:value` pairs.\r\n\t\tif (!isNested && value instanceof Object)\r\n\t\t{\r\n\t\t\treturn Object.keys(value).map(k => `${k}:${this.encodeQueryValue(value[k], true)}`).join(\",\");\r\n\t\t}\r\n\r\n\t\t// Otherwise, convert the value to its default string representation.\r\n\t\treturn this.encodeQueryComponent(value.toString());\r\n\t}\r\n\r\n\t/**\r\n\t * Applies any registered interceptors to the specified request.\r\n\t * @param request The request to intercept.\r\n\t * @param options The request options to use.\r\n\t * @returns The request or response to use, or the specified request if not intercepted.\r\n\t */\r\n\tprivate async interceptRequest(request: Request, options: IApiRequestOptions): Promise\r\n\t{\r\n\t\tlet current = request;\r\n\r\n\t\tfor (const interceptor of this._interceptors)\r\n\t\t{\r\n\t\t\tif (interceptor.request != null)\r\n\t\t\t{\r\n\t\t\t\tconst result = await interceptor.request(current, options);\r\n\r\n\t\t\t\tif (result instanceof Request)\r\n\t\t\t\t{\r\n\t\t\t\t\tcurrent = result;\r\n\t\t\t\t}\r\n\t\t\t\telse if (result instanceof Response)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn current;\r\n\t}\r\n\r\n\t/**\r\n\t * Applies any registered interceptors to the specified response.\r\n\t * @param response The response to intercept.\r\n\t * @param options The request options that were used.\r\n\t * @returns The response to use, or a new request.\r\n\t */\r\n\tprivate async interceptResponse(response: Response, options: IApiRequestOptions): Promise\r\n\t{\r\n\t\tlet current = response;\r\n\r\n\t\tfor (const interceptor of this._interceptors)\r\n\t\t{\r\n\t\t\tif (interceptor.response != null)\r\n\t\t\t{\r\n\t\t\t\tconst result = await interceptor.response(current, options);\r\n\r\n\t\t\t\tif (result instanceof Response)\r\n\t\t\t\t{\r\n\t\t\t\t\tcurrent = result;\r\n\t\t\t\t}\r\n\t\t\t\telse if (result instanceof Request)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn current;\r\n\t}\r\n\r\n}\r\n","import { MapObject } from \"shared/types\";\r\nimport { delay } from \"shared/utilities\";\r\nimport { IApiInterceptor } from \"../api-interceptor\";\r\nimport { IApiRequestOptions } from \"../api-request-options\";\r\n\r\n/**\r\n * Represents an interceptor that responds with a stubbed response, if one is available for the request.\r\n */\r\nexport class ResponseStubInterceptor implements IApiInterceptor\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param stubs The response stubs to use.\r\n\t * @param latency The network latency to simulate, in milliseconds.\r\n\t */\r\n\tpublic constructor(stubs: IResponseStubs, latency = 0)\r\n\t{\r\n\t\tthis._stubs = stubs;\r\n\t\tthis._latency = latency;\r\n\r\n\t\t// Validate the stubs to prevent some of the most common mistakes.\r\n\t\tif (ENVIRONMENT.debug)\r\n\t\t{\r\n\t\t\tconst invalidStubs: any[] = [];\r\n\r\n\t\t\tfor (const key of Object.keys(this._stubs))\r\n\t\t\t{\r\n\t\t\t\tif (!/^[A-Z]+ \\/\\/?/.test(key))\r\n\t\t\t\t{\r\n\t\t\t\t\tinvalidStubs.push(key);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (invalidStubs.length > 0)\r\n\t\t\t{\r\n\t\t\t\tthrow new Error(`The following HTTP response stubs are invalid:\\n${invalidStubs.join(\"\\n\")}`);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate readonly _stubs: IResponseStubs;\r\n\tprivate readonly _latency: number;\r\n\r\n\t/**\r\n\t * Called when a request is intercepted.\r\n\t * @param request The request that was intercepted.\r\n\t * @param options The request options to use.\r\n\t * @returns A promise that will be resolved with the request to send, or the stubbed response, if available.\r\n\t */\r\n\tpublic async request(request: Request, options: IApiRequestOptions): Promise\r\n\t{\r\n\t\tconst method = request.method.toUpperCase();\r\n\t\tconst url = new URL(request.url);\r\n\r\n\t\t// Try to get the response stub.\r\n\r\n\t\tconst stubUrl = (url.host == null || url.host === location.host)\r\n\t\t\t? url.pathname + url.search\r\n\t\t\t: `//${url.host}${url.pathname + url.search}`;\r\n\r\n\t\tconst stubKey = `${method} ${stubUrl}`;\r\n\t\tconst stubValue = this._stubs[stubKey];\r\n\r\n\t\t// Do we have a response stub for this request?\r\n\t\tif (stubValue != null)\r\n\t\t{\r\n\t\t\t// Resolve the stub value.\r\n\r\n\t\t\tlet stub: IResponseStub;\r\n\r\n\t\t\tif (stubValue instanceof Function)\r\n\t\t\t{\r\n\t\t\t\t// Get the result of the stub.\r\n\t\t\t\tconst stubResult = await stubValue(method, url, options);\r\n\r\n\t\t\t\t// If the result is a request or response, return that.\r\n\t\t\t\tif (stubResult instanceof Request || stubResult instanceof Response)\r\n\t\t\t\t{\r\n\t\t\t\t\t// Log a warning to the console, including info about the request and response.\r\n\t\t\t\t\tconsole.warn(`Using response stub for '${method} ${request.url}'\\n`,\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\trequest: { ...options },\r\n\t\t\t\t\t\tresponse: stubResult\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\treturn stubResult;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tstub = { ...stubResult };\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tstub = { ...stubValue };\r\n\t\t\t}\r\n\r\n\t\t\t// Determine the response delay to use.\r\n\t\t\tconst stubDelay = this._latency + (stub.delay || 0);\r\n\r\n\t\t\t// Determine the content type to use.\r\n\t\t\tconst hasBody = stub.body != null && stub.body !== \"\";\r\n\t\t\tconst contentType = stub.headers?.[\"content-type\"] ?? (hasBody ? \"application/json\" : undefined);\r\n\r\n\t\t\t// Determine whether the request body should be serialized as JSON.\r\n\t\t\tconst hasJsonBody = contentType != null && /^application\\/(.+\\+)?json(;|$)/.test(contentType);\r\n\r\n\t\t\t// Set the content type of the stub, if not specified.\r\n\t\t\tif (contentType != null)\r\n\t\t\t{\r\n\t\t\t\tstub.headers =\r\n\t\t\t\t{\r\n\t\t\t\t\t\"content-type\": contentType,\r\n\t\t\t\t\t...stub.headers\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\t// Set the status of the stub, if not specified.\r\n\t\t\tif (stub.status == null)\r\n\t\t\t{\r\n\t\t\t\tstub.status = 200;\r\n\t\t\t}\r\n\r\n\t\t\t// Log a warning to the console, including info about the request and response.\r\n\t\t\tconsole.warn(`Using response stub for '${method} ${request.url}'\\n`,\r\n\t\t\t{\r\n\t\t\t\trequest: { ...options },\r\n\t\t\t\tresponse: { ...stub },\r\n\t\t\t\tdelay: stubDelay\r\n\t\t\t});\r\n\r\n\t\t\t// Get the body to use for the request.\r\n\t\t\tconst body =\r\n\t\t\t\tstub.body == null ? undefined :\r\n\t\t\t\ttypeof stub.body === \"string\" ? stub.body :\r\n\t\t\t\thasJsonBody ? JSON.stringify(stub.body) :\r\n\t\t\t\tstub.body as any;\r\n\r\n\t\t\t// Get the headers to use for the request.\r\n\t\t\tconst headers =\r\n\t\t\t\tstub.headers == null ? undefined :\r\n\t\t\t\tObject.keys(stub.headers).map(name => [name, stub.headers![name]]);\r\n\r\n\t\t\t// Delay the response.\r\n\t\t\tawait delay(stubDelay, request.signal);\r\n\r\n\t\t\t// Create and return the response.\r\n\t\t\treturn new Response(body,\r\n\t\t\t{\r\n\t\t\t\tstatus: stub.status,\r\n\t\t\t\tstatusText: stub.statusText,\r\n\t\t\t\theaders: headers\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// No response stub was found, so continue with the original request.\r\n\t\treturn request;\r\n\t}\r\n}\r\n\r\n/**\r\n * Represents the available response stubs.\r\n */\r\nexport interface IResponseStubs\r\n{\r\n\t/**\r\n\t * The response stubs, where the keys must be of the form `METHOD url`,\r\n\t * where `METHOD` is the HTTP verb to match and `url` is the URL to match.\r\n\t * Note that the URL must start with either `/` or `//`.\r\n\t */\r\n\t[url: string]: IResponseStub | ((method: string, url: URL, options: IApiRequestOptions)\r\n\t\t=> IResponseStub | Request | Response | Promise);\r\n}\r\n\r\n/**\r\n * Represents a response stub.\r\n */\r\nexport interface IResponseStub\r\n{\r\n\t/**\r\n\t * The response status code.\r\n\t * The default is to 200.\r\n\t */\r\n\tstatus?: number;\r\n\r\n\t/**\r\n\t * The response status text.\r\n\t * The default is `ok` for status code 200, otherwise an empty string.\r\n\t */\r\n\tstatusText?: string;\r\n\r\n\t/**\r\n\t * The response headers.\r\n\t * The default is `{ \"content-type\": \"application/json\" }` if a body is\r\n\t * specified, or `{}` if no body is specified.\r\n\t */\r\n\theaders?: MapObject;\r\n\r\n\t/**\r\n\t * The response body, which if represented as an object, and the content type\r\n\t * is a JSON variant, will be serialized as JSON.\r\n\t * The default is undefined;\r\n\t */\r\n\tbody?: object | string | Blob | ArrayBufferView | ArrayBuffer | FormData | URLSearchParams | ReadableStream;\r\n\r\n\t/**\r\n\t * The number of milliseconds to delay the response, in addition to the configured stub latency,\r\n\t * undefined to respond with no additional delay, or null to respond immediately.\r\n\t * The default is undefined;\r\n\t */\r\n\tdelay?: number;\r\n}\r\n","import { Id } from \"shared/utilities\";\r\nimport { IApiInterceptor } from \"../api-interceptor\";\r\nimport { IApiRequestOptions } from \"../api-request-options\";\r\n\r\n/**\r\n * Represents an interceptor that adds a header with a correlation ID to the request.\r\n * Note that the header will only be added if it does not already exists.\r\n */\r\nexport class CorrelationHeaderInterceptor implements IApiInterceptor\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param headerName The name of the header to add.\r\n\t */\r\n\tpublic constructor(headerName: string)\r\n\t{\r\n\t\tthis._headerName = headerName;\r\n\t}\r\n\r\n\tprivate readonly _headerName: string;\r\n\r\n\t/**\r\n\t * Called when a request is intercepted.\r\n\t * @param request The request that was intercepted.\r\n\t * @param options The request options to use.\r\n\t * @returns A promise that will be resolved with the request to send, or the stubbed response, if available.\r\n\t */\r\n\tpublic async request(request: Request, options: IApiRequestOptions): Promise\r\n\t{\r\n\t\tif (!request.headers.has(this._headerName))\r\n\t\t{\r\n\t\t\trequest.headers.set(this._headerName, Id.uuid(1));\r\n\t\t}\r\n\r\n\t\treturn request;\r\n\t}\r\n}\r\n","export * from \"./cookies\";\r\nexport * from \"./cookie-options\";\r\n","import { DateTime } from \"luxon\";\r\nimport { singleton } from \"aurelia-framework\";\r\nimport { once } from \"shared/utilities\";\r\nimport { ICookieOptions } from \"./cookie-options\";\r\n\r\n/**\r\n * Represents an abstraction around the browsers cookie API.\r\n */\r\n@singleton()\r\nexport class Cookies\r\n{\r\n\tprivate _defaults: ICookieOptions;\r\n\r\n\t/**\r\n\t * Configures the instance.\r\n\t * @param defaults The default options used when setting cookies.\r\n\t */\r\n\t@once\r\n\tpublic configure(defaults: ICookieOptions): void\r\n\t{\r\n\t\tthis._defaults = defaults;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets a map of all cookie values.\r\n\t * @returns A map of all cookie values.\r\n\t */\r\n\tpublic getAll(): Map\r\n\t{\r\n\t\tconst result = new Map();\r\n\t\tconst pairs = document.cookie.split(/\\s*;\\s*/);\r\n\r\n\t\tif (pairs[0] === \"\")\r\n\t\t{\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tfor (const pair of pairs)\r\n\t\t{\r\n\t\t\tlet [name, value] = pair.split(/\\s*=\\s*/);\r\n\r\n\t\t\tname = decodeURIComponent(name);\r\n\t\t\tvalue = decodeURIComponent(value || \"\");\r\n\r\n\t\t\tresult.set(name, value);\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the value of the specified cookie.\r\n\t * @param name The cookie for which the value should be returned.\r\n\t * @returns The value for the specified cookie, or undefined if the cookie is not found.\r\n\t */\r\n\tpublic get(name: string): string | undefined\r\n\t{\r\n\t\treturn this.getAll().get(name);\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the value for the specified cookie.\r\n\t * @param name The cookie for which the value should be set.\r\n\t * @param value The value to be set, or undefined to delete the cookie.\r\n\t * @param options The options to use when setting the value, where each option overrides the default.\r\n\t */\r\n\tpublic set(name: string, value: string | undefined, options?: ICookieOptions): void\r\n\t{\r\n\t\tif (typeof name !== \"string\" || /^\\s*$/.test(name))\r\n\t\t{\r\n\t\t\tthrow new Error(\"The 'name' argument is required.\");\r\n\t\t}\r\n\r\n\t\tconst cookieOptions = { secure: false, sameSite: \"lax\", ...this._defaults, ...options };\r\n\r\n\t\tlet cookie = `${encodeURIComponent(name)}=`;\r\n\r\n\t\tif (value != null)\r\n\t\t{\r\n\t\t\tcookie += encodeURIComponent(value);\r\n\t\t}\r\n\r\n\t\tif (cookieOptions.domain)\r\n\t\t{\r\n\t\t\tcookie += `;domain=${cookieOptions.domain}`;\r\n\t\t}\r\n\r\n\t\tif (cookieOptions.path)\r\n\t\t{\r\n\t\t\tcookie += `;path=${cookieOptions.path}`;\r\n\t\t}\r\n\r\n\t\tif (cookieOptions.secure)\r\n\t\t{\r\n\t\t\tcookie += \";secure\";\r\n\t\t}\r\n\r\n\t\tif (cookieOptions.sameSite)\r\n\t\t{\r\n\t\t\tcookie += `;samesite=${cookieOptions.sameSite}`;\r\n\t\t}\r\n\r\n\t\tif (value != null)\r\n\t\t{\r\n\t\t\tif (cookieOptions.expires)\r\n\t\t\t{\r\n\t\t\t\tcookie += `;expires=${cookieOptions.expires.toHTTP()}`;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tcookie += `;expires=${DateTime.fromMillis(0).toHTTP()}`;\r\n\t\t}\r\n\r\n\t\tdocument.cookie = cookie;\r\n\t}\r\n}\r\n","export * from \"./prerender-helper\";\r\n","let isPrerenderStatusCodeSet = false;\r\n\r\n/**\r\n * Sets the status code that should be returned to crawlers.\r\n */\r\nexport function setPrerenderStatusCode(code: number): void\r\n{\r\n\tif (!isPrerenderStatusCodeSet)\r\n\t{\r\n\t\tisPrerenderStatusCodeSet = true;\r\n\r\n\t\t// Set the status code that should be returned to crawlers.\r\n\t\tconst prerenderStatusCodeElement = document.head.querySelector('meta[name=\"prerender-status-code\"]') as HTMLMetaElement;\r\n\t\tprerenderStatusCodeElement.setAttribute(\"content\", code.toString());\r\n\t}\r\n}\r\n","export * from \"./template-string-parser\";\r\n","import { autoinject, BindingLanguage, Expression, ViewResources, createOverrideContext } from \"aurelia-framework\";\r\n\r\n// Represents the sequence of static and dynamic parts resulting from parsing a text.\r\ntype TemplateStringParts = (Expression | string)[];\r\n\r\n// Cache containing parsed template string parts, using the parsed text as key.\r\nconst cache = new Map();\r\n\r\n/**\r\n * Represents an interpolation expression, such as `The price is ${price | currency}`,\r\n * which when evaluated against a binding context results in a formatted string,\r\n * such as `The price is 42 USD`.\r\n */\r\n@autoinject\r\nexport class TemplateString\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param text The text representing the interpolation expression.\r\n\t * @param viewResources The view resources to use when evaluating the interpolation expression.\r\n\t * @param bindingLanguage The `BindingLanguage` instance.\r\n\t */\r\n\tpublic constructor(text: string, viewResources: ViewResources, bindingLanguage: BindingLanguage)\r\n\t{\r\n\t\tthis._text = text;\r\n\t\tthis._viewResources = viewResources;\r\n\t\tthis._bindingLanguage = bindingLanguage;\r\n\t}\r\n\r\n\tprivate readonly _text: string;\r\n\tprivate readonly _viewResources: ViewResources;\r\n\tprivate readonly _bindingLanguage: BindingLanguage;\r\n\r\n\t/**\r\n\t * Evaluates the interpolation expression against the specified context.\r\n\t * @param bindingContext The context against which expressions should be evaluated.\r\n\t * @param overrideContext The override context against which expressions should be evaluated.\r\n\t * @returns The string resulting from evaluating the interpolation expression.\r\n\t */\r\n\tpublic evaluate(bindingContext?: any, overrideContext?: any): string\r\n\t{\r\n\t\tlet parts = cache.get(this._text);\r\n\r\n\t\tif (parts == null)\r\n\t\t{\r\n\t\t\tparts = ((this._bindingLanguage as any)\r\n\t\t\t\t.parseInterpolation(null, this._text) || [this._text]) as (Expression | string)[];\r\n\r\n\t\t\tcache.set(this._text, parts);\r\n\t\t}\r\n\r\n\t\tconst scope =\r\n\t\t{\r\n\t\t\tbindingContext: bindingContext || {},\r\n\t\t\toverrideContext: overrideContext || createOverrideContext(bindingContext)\r\n\t\t};\r\n\r\n\t\tconst lookupFunctions = (this._viewResources as any).lookupFunctions;\r\n\r\n\t\treturn parts.map(expression =>\r\n\t\t{\r\n\t\t\tif (typeof expression === \"string\")\r\n\t\t\t{\r\n\t\t\t\treturn expression;\r\n\t\t\t}\r\n\r\n\t\t\treturn expression.evaluate(scope, lookupFunctions);\r\n\r\n\t\t}).join(\"\");\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the string representation of this template string.\r\n\t * @returns The string from which the template string was created.\r\n\t */\r\n\tpublic toString(): string\r\n\t{\r\n\t\treturn this._text;\r\n\t}\r\n}\r\n\r\n/**\r\n * Represents a parser that parses strings representing interpolation expressions,\r\n * such as `The price is ${price | currency}`.\r\n */\r\n@autoinject\r\nexport class TemplateStringParser\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param resources The view resources to use when evaluating expressions.\r\n\t * @param bindingLanguage The `BindingLanguage` instance.\r\n\t */\r\n\tpublic constructor(resources: ViewResources, bindingLanguage: BindingLanguage)\r\n\t{\r\n\t\tthis._resources = resources;\r\n\t\tthis._bindingLanguage = bindingLanguage;\r\n\t}\r\n\r\n\tprivate readonly _resources: ViewResources;\r\n\tprivate readonly _bindingLanguage: BindingLanguage;\r\n\r\n\t/**\r\n\t * Parses the specified text as an interpolation expression.\r\n\t * @param text The text representing the interpolation expression.\r\n\t * @returns A TemplateString instance representing the interpolation expression.\r\n\t */\r\n\tpublic parse(text: string): TemplateString\r\n\t{\r\n\t\treturn new TemplateString(text, this._resources, this._bindingLanguage);\r\n\t}\r\n}\r\n","export * from \"./typed-worker\";\r\n","/**\r\n * Represents a typed Web Worker, loaded by Webpack.\r\n * See: https://github.com/webpack-contrib/worker-loader\r\n *\r\n * Note that when importing this into a worker, you must import import directly from this file,\r\n * not from the `index` file of the `infrastructure`folder. This is required to avoid pulling\r\n * in other things that are not compatible with web workers.\r\n */\r\nexport class TypedWorker extends Worker\r\n{\r\n\tpublic constructor()\r\n\t{\r\n\t\t// Ensure this class is never instantiated.\r\n\t\t// This is needed because this class is only intended to provide type safety during development.\r\n\t\t// When the worker is loaded by the `worker-loader`, it wraps the worker in an instance of its own class.\r\n\t\tthrow new Error(\"This class cannot be instantiated.\");\r\n\r\n\t\tsuper(\"\");\r\n\t}\r\n\r\n\r\n\t// @ts-ignore\r\n\tpublic onmessage: (this: TypedWorker, event: IMessageEvent) => any;\r\n\r\n\t// @ts-ignore\r\n\tpublic postMessage(this: TypedWorker, message: TMessage, transferList?: ArrayBuffer[]): any;\r\n\r\n\t// @ts-ignore\r\n\tpublic addEventListener(type: \"message\", listener: (this: TypedWorker, event: IMessageEvent) => any, useCapture?: boolean): void;\r\n\r\n\t// @ts-ignore\r\n\tpublic addEventListener(type: \"error\", listener: (this: TypedWorker, event: ErrorEvent) => any, useCapture?: boolean): void;\r\n}\r\n\r\n/**\r\n * Represents a message sent to or from a typed Web Worker.\r\n * Note that the data specified here must support JSON serialization.\r\n */\r\nexport interface IMessageEvent extends MessageEvent\r\n{\r\n\tdata: TMessage;\r\n}\r\n","import { autoinject, computedFrom, signalBindings } from \"aurelia-framework\";\r\nimport { EventAggregator } from \"aurelia-event-aggregator\";\r\nimport { ILocale, Locale } from \"./locale\";\r\n\r\n/**\r\n * Represents a function that will be invoked before the locale changes.\r\n * Use this to prepare the app for the new locale.\r\n * @param newLocale The new locale being set.\r\n * @param oldLocale The old locale, or undefined if not previously set.\r\n * @returns Nothing, or a promise that will be resolved when the app is ready for the new locale.\r\n */\r\ntype LocaleChangeFunc = (newLocale: Locale, oldLocale: Locale | undefined) => void | Promise;\r\n\r\n/**\r\n * Represents a service that manages locales.\r\n */\r\n@autoinject\r\nexport class LocaleService\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param eventAggregator The `EventAggregator` instance.\r\n\t */\r\n\tpublic constructor(eventAggregator: EventAggregator)\r\n\t{\r\n\t\tthis._eventAggregator = eventAggregator;\r\n\t}\r\n\r\n\tprivate readonly _eventAggregator: EventAggregator;\r\n\tprivate _locales: Locale[];\r\n\tprivate _locale: Locale;\r\n\tprivate _changeFunc: LocaleChangeFunc;\r\n\r\n\t/**\r\n\t * Gets the supported locales.\r\n\t */\r\n\t@computedFrom(\"_locales\")\r\n\tpublic get locales(): ReadonlyArray\r\n\t{\r\n\t\treturn this._locales;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the current locale.\r\n\t */\r\n\t@computedFrom(\"_locale\")\r\n\tpublic get locale(): Locale\r\n\t{\r\n\t\treturn this._locale;\r\n\t}\r\n\r\n\t/**\r\n\t * Configures the instance.\r\n\t * @param locales The locales supported by the app.\r\n\t * @param changeFunc The function that is invoked before the locale changes.\r\n\t */\r\n\tpublic configure(locales: ILocale[], changeFunc?: LocaleChangeFunc): void\r\n\t{\r\n\t\tthis._locales = locales.filter(l => ENVIRONMENT.debug || !l.debug).map(l => new Locale(l));\r\n\t\tthis._changeFunc = changeFunc || (() => undefined);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the locale with the specified locale code.\r\n\t * @param localeCode The case-insensitive locale code.\r\n\t * @returns The locale with the specified locale code.\r\n\t */\r\n\tpublic getLocale(localeCode: string): Locale\r\n\t{\r\n\t\tconst canonicalLocaleCode = Intl.getCanonicalLocales([localeCode])[0];\r\n\t\tconst locale = this._locales.find(l => l.code === canonicalLocaleCode);\r\n\r\n\t\tif (locale == null)\r\n\t\t{\r\n\t\t\tthrow new Error(`The locale '${canonicalLocaleCode}' is not supported.`);\r\n\t\t}\r\n\r\n\t\treturn locale;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the current locale.\r\n\t * @param localeCode The new case-insensitive locale code.\r\n\t * @returns A promise that will be resolved with the `Locale` instance when the new locale is loaded.\r\n\t */\r\n\tpublic async setLocale(localeCode: string): Promise\r\n\t{\r\n\t\tif (this._locale != null && localeCode === this._locale.code)\r\n\t\t{\r\n\t\t\treturn Promise.resolve(this._locale);\r\n\t\t}\r\n\r\n\t\tconst locale = this.getLocale(localeCode);\r\n\r\n\t\tawait this._changeFunc(locale, this._locale);\r\n\r\n\t\tthis._locale = locale;\r\n\r\n\t\tthis._eventAggregator.publish(\"locale-changed\");\r\n\r\n\t\tsignalBindings(\"locale-changed\");\r\n\r\n\t\treturn this._locale;\r\n\t}\r\n}\r\n","export * from \"./currency-service\";\r\nexport * from \"./currency\";\r\n","import { autoinject, computedFrom, signalBindings } from \"aurelia-framework\";\r\nimport { EventAggregator } from \"aurelia-event-aggregator\";\r\nimport { LocaleService } from \"../locale\";\r\nimport { ICurrency, Currency } from \"./currency\";\r\n\r\n/**\r\n * Represents a function that will be invoked before the currency changes.\r\n * Use this to prepare the app for the new currency.\r\n * @param newCurrency The new currency being set.\r\n * @param oldCurrency The old currency, or undefined if not previously set.\r\n * @returns Nothing, or a promise that will be resolved when the app is ready for the new currency.\r\n */\r\ntype CurrencyChangeFunc = (newCurrency: Currency, oldCurrency: Currency | undefined) => void | Promise;\r\n\r\n/**\r\n * Represents a service that manages currencies.\r\n */\r\n@autoinject\r\nexport class CurrencyService\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param eventAggregator The `EventAggregator` instance.\r\n\t * @param localeService The `LocaleService` instance.\r\n\t */\r\n\tpublic constructor(localeService: LocaleService, eventAggregator: EventAggregator)\r\n\t{\r\n\t\tthis._localeService = localeService;\r\n\t\tthis._eventAggregator = eventAggregator;\r\n\t}\r\n\r\n\tprivate readonly _localeService: LocaleService;\r\n\tprivate readonly _eventAggregator: EventAggregator;\r\n\tprivate _currencies: Currency[];\r\n\tprivate _currency: Currency;\r\n\tprivate _changeFunc: CurrencyChangeFunc;\r\n\r\n\t/**\r\n\t * Gets the supported currencies.\r\n\t */\r\n\t@computedFrom(\"_currencies\")\r\n\tpublic get currencies(): ReadonlyArray\r\n\t{\r\n\t\treturn this._currencies;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the current currency.\r\n\t */\r\n\t@computedFrom(\"_currency\")\r\n\tpublic get currency(): Currency\r\n\t{\r\n\t\treturn this._currency;\r\n\t}\r\n\r\n\t/**\r\n\t * Configures the instance.\r\n\t * @param currencies The currencies supported by the app.\r\n\t * @param changeFunc The function that is invoked before the currency changes.\r\n\t */\r\n\tpublic configure(currencies: ICurrency[], changeFunc?: CurrencyChangeFunc): void\r\n\t{\r\n\t\tthis._currencies = currencies.filter(c => ENVIRONMENT.debug || !c.debug).map(c => new Currency(c, this._localeService));\r\n\t\tthis._changeFunc = changeFunc || (() => undefined);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the currency with the specified currency code.\r\n\t * @param currencyCode The case-insensitive currency code.\r\n\t * @returns The currency with the specified currency code.\r\n\t */\r\n\tpublic getCurrency(currencyCode: string): Currency\r\n\t{\r\n\t\tconst canonicalCurrencyCode = currencyCode.toUpperCase();\r\n\t\tconst currency = this._currencies.find(c => c.code === canonicalCurrencyCode);\r\n\r\n\t\tif (currency == null)\r\n\t\t{\r\n\t\t\tthrow new Error(`The currency '${canonicalCurrencyCode}' is not supported.`);\r\n\t\t}\r\n\r\n\t\treturn currency;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the current currency.\r\n\t * @param currencyCode The new case-insensitive currency code.\r\n\t * @returns A promise that will be resolved with the `Currency` instance when the new currency is loaded.\r\n\t */\r\n\tpublic async setCurrency(currencyCode: string): Promise\r\n\t{\r\n\t\tif (this._currency != null && currencyCode === this._currency.code)\r\n\t\t{\r\n\t\t\treturn Promise.resolve(this._currency);\r\n\t\t}\r\n\r\n\t\tconst currency = this.getCurrency(currencyCode);\r\n\r\n\t\tawait this._changeFunc(currency, this._currency);\r\n\r\n\t\tthis._currency = currency;\r\n\r\n\t\tthis._eventAggregator.publish(\"currency-changed\");\r\n\r\n\t\tsignalBindings(\"currency-changed\");\r\n\r\n\t\treturn this._currency;\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { DateTime } from \"luxon\";\r\nimport { escapeRegExp } from \"shared/utilities\";\r\nimport { LocaleService } from \"../services/locale\";\r\nimport formatTokens from \"../resources/strings/format-tokens.json\";\r\n\r\n// The date used when resolving format parts.\r\nconst date = DateTime.fromMillis(0);\r\n\r\n/**\r\n * Represents a date format for a specific locale.\r\n */\r\n@autoinject\r\nexport class DateFormat\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param localeService The `LocaleService`instance.\r\n\t */\r\n\tpublic constructor(localeService: LocaleService)\r\n\t{\r\n\t\t// Get the locale code, including any unicode extension.\r\n\t\tconst localeCodeWithExtension = localeService.locale.codeWithUnicodeExtension;\r\n\r\n\t\t// Get the date format parts.\r\n\t\tconst dateParts = date.setLocale(localeCodeWithExtension).toLocaleParts(\r\n\t\t{\r\n\t\t\t...DateTime.DATE_SHORT\r\n\t\t});\r\n\r\n\t\t// Extract the relevant info from the date format parts.\r\n\r\n\t\tconst parts = dateParts.map(part =>\r\n\t\t{\r\n\t\t\tswitch (part.type)\r\n\t\t\t{\r\n\t\t\t\tcase \"year\":\r\n\t\t\t\t{\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\ttoken: \"y\",\r\n\t\t\t\t\t\tvalue: Array(4).fill(formatTokens.year).join(\"\"),\r\n\t\t\t\t\t\tinputPattern: [\"(\\\\d(\\\\d(\\\\d(\\\\d\", \")?)?)?)?\"],\r\n\t\t\t\t\t\tkeyPattern: \"\\\\d\"\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\tcase \"month\":\r\n\t\t\t\t{\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\ttoken: \"M\",\r\n\t\t\t\t\t\tvalue: Array(2).fill(formatTokens.month).join(\"\"),\r\n\t\t\t\t\t\tinputPattern: [\"(\\\\d(\\\\d\", \")?)?\"],\r\n\t\t\t\t\t\tkeyPattern: \"\\\\d\"\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\tcase \"day\":\r\n\t\t\t\t{\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\ttoken: \"d\",\r\n\t\t\t\t\t\tvalue: Array(2).fill(formatTokens.day).join(\"\"),\r\n\t\t\t\t\t\tinputPattern: [\"(\\\\d(\\\\d\", \")?)?\"],\r\n\t\t\t\t\t\tkeyPattern: \"\\\\d\"\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\tdefault:\r\n\t\t\t\t{\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\ttoken: part.value,\r\n\t\t\t\t\t\tvalue: part.value,\r\n\t\t\t\t\t\tinputPattern: [part.value.replace(/./g, ($0: string) => `(${escapeRegExp($0)}`), part.value.replace(/./g, \")?\")],\r\n\t\t\t\t\t\tkeyPattern: [...part.value].map(c => escapeRegExp(c)).join(\"|\")\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.displayFormat = parts.map(part => part.value).join(\"\");\r\n\t\tthis.inputFormat = parts.map(part => part.token).join(\"\");\r\n\t\tthis.inputPattern = new RegExp(`^${[...parts.map(part => part.inputPattern[0]), ...parts.map(part => part.inputPattern[1])].join(\"\")}$`);\r\n\t\tthis.keyPattern = new RegExp(`^(${[...parts.map(part => part.keyPattern)].join(\"|\")})$`);\r\n\t}\r\n\r\n\t/**\r\n\t * The format string to present to users.\r\n\t */\r\n\tpublic readonly displayFormat: string;\r\n\r\n\t/**\r\n\t * The format string to use for parsing user input.\r\n\t * Note that this format is specific to the `luxon` package.\r\n\t */\r\n\tpublic readonly inputFormat: string;\r\n\r\n\t/**\r\n\t * The pattern to use when validating user input while the user is typing.\r\n\t * Note that the actual validity of the input should always be determined\r\n\t * based on whether the input was be successfully parsed.\r\n\t */\r\n\tpublic readonly inputPattern: RegExp;\r\n\r\n\t/**\r\n\t * The pattern to use when validating whether a character being typed is valid.\r\n\t */\r\n\tpublic readonly keyPattern: RegExp;\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { escapeRegExp } from \"shared/utilities\";\r\nimport { LocaleService } from \"../services/locale\";\r\n\r\n// The number used when resolving format parts.\r\nconst number = -1.1;\r\n\r\n/**\r\n * Represents a number format for a specific locale.\r\n */\r\n@autoinject\r\nexport class NumberFormat\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param localeService The `LocaleService`instance.\r\n\t */\r\n\tpublic constructor(localeService: LocaleService)\r\n\t{\r\n\t\t// Get the locale code, including any unicode extension.\r\n\t\tconst localeCodeWithExtension = localeService.locale.codeWithUnicodeExtension;\r\n\r\n\t\t// Get the number format.\r\n\t\tconst numberFormat = new Intl.NumberFormat(localeCodeWithExtension);\r\n\r\n\t\t// Get the number format parts.\r\n\t\tconst numberParts = numberFormat.formatToParts(number);\r\n\r\n\t\t// Extract the relevant info from the number format parts.\r\n\r\n\t\tconst parts = numberParts.map((part: any) =>\r\n\t\t{\r\n\t\t\tswitch (part.type)\r\n\t\t\t{\r\n\t\t\t\tcase \"integer\":\r\n\t\t\t\t{\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tvalidPattern: \"\\\\d+\",\r\n\t\t\t\t\t\tinputPattern: [\"(\\\\d+\", \")?\"],\r\n\t\t\t\t\t\tkeyPattern: \"\\\\d\"\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\tcase \"fraction\":\r\n\t\t\t\t{\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tvalidPattern: \"\\\\d+)?\",\r\n\t\t\t\t\t\tinputPattern: [\"(\\\\d+\", \")?\"],\r\n\t\t\t\t\t\tkeyPattern: \"\\\\d\"\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\tcase \"decimal\":\r\n\t\t\t\t{\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tvalidPattern: `(${escapeRegExp(part.value)}`,\r\n\t\t\t\t\t\tinputPattern: [`(${escapeRegExp(part.value)}`, \")?\"],\r\n\t\t\t\t\t\tkeyPattern: escapeRegExp(part.value)\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\tcase \"minusSign\":\r\n\t\t\t\t{\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tvalidPattern: `(${escapeRegExp(part.value)})?`,\r\n\t\t\t\t\t\tinputPattern: [`((${escapeRegExp(part.value)})?`, \")?\"],\r\n\t\t\t\t\t\tkeyPattern: escapeRegExp(part.value)\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\tdefault:\r\n\t\t\t\t{\r\n\t\t\t\t\tthrow new Error(\"Unexpected format part.\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.validPattern = new RegExp(`^${parts.map(part => part.validPattern).join(\"\")}$`);\r\n\t\tthis.inputPattern = new RegExp(`^${[...parts.map(part => part.inputPattern[0]), ...parts.map(part => part.inputPattern[1])].join(\"\")}$`);\r\n\t\tthis.keyPattern = new RegExp(`^(${[...parts.map(part => part.keyPattern)].join(\"|\")})$`);\r\n\t\tthis.decimalSeparator = numberParts.find(p => p.type === \"decimal\")!.value;\r\n\t\tthis.groupSeparator = numberParts.find(p => p.type === \"group\")?.value;\r\n\t\tthis.minusSign = numberParts.find(p => p.type === \"minusSign\")!.value;\r\n\t}\r\n\r\n\t/**\r\n\t * The pattern to use when validating user input before parsing.\r\n\t */\r\n\tpublic readonly validPattern: RegExp;\r\n\r\n\t/**\r\n\t * The pattern to use when validating user input while the user is typing.\r\n\t * Note that the actual validity of the input should always be determined\r\n\t * based on whether the input was be successfully parsed.\r\n\t */\r\n\tpublic readonly inputPattern: RegExp;\r\n\r\n\t/**\r\n\t * The pattern to use when validating whether a character being typed is valid.\r\n\t */\r\n\tpublic readonly keyPattern: RegExp;\r\n\r\n\t/**\r\n\t * The minus sign to use.\r\n\t */\r\n\tpublic readonly minusSign: string;\r\n\r\n\t/**\r\n\t * The decimal separator to use.\r\n\t */\r\n\tpublic readonly decimalSeparator: string;\r\n\r\n\t/**\r\n\t * The group separator to use, if any.\r\n\t */\r\n\tpublic readonly groupSeparator: string | undefined;\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { DateTime } from \"luxon\";\r\nimport { escapeRegExp } from \"shared/utilities\";\r\nimport { LocaleService } from \"../services/locale\";\r\nimport formatTokens from \"../resources/strings/format-tokens.json\";\r\n\r\n// The date used when resolving format parts.\r\nconst date = DateTime.fromMillis(0);\r\n\r\n/**\r\n * Represents a time format for a specific locale.\r\n */\r\n@autoinject\r\nexport class TimeFormat\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param localeService The `LocaleService`instance.\r\n\t */\r\n\tpublic constructor(localeService: LocaleService)\r\n\t{\r\n\t\t// Get the locale code, including any unicode extension.\r\n\t\tconst localeCodeWithExtension = localeService.locale.codeWithUnicodeExtension;\r\n\r\n\t\t// Get the date format parts.\r\n\t\tconst dateParts = date.setLocale(localeCodeWithExtension).toLocaleParts(\r\n\t\t{\r\n\t\t\t...DateTime.TIME_24_SIMPLE\r\n\t\t});\r\n\r\n\t\t// Extract the relevant info from the date format parts.\r\n\r\n\t\tconst parts = dateParts.map(part =>\r\n\t\t{\r\n\t\t\tswitch (part.type)\r\n\t\t\t{\r\n\t\t\t\tcase \"hour\":\r\n\t\t\t\t{\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\ttoken: \"M\",\r\n\t\t\t\t\t\tvalue: Array(2).fill(formatTokens.hour).join(\"\"),\r\n\t\t\t\t\t\tinputPattern: [\"(\\\\d(\\\\d\", \")?)?\"],\r\n\t\t\t\t\t\tkeyPattern: \"\\\\d\"\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\tcase \"minute\":\r\n\t\t\t\t{\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\ttoken: \"d\",\r\n\t\t\t\t\t\tvalue: Array(2).fill(formatTokens.minute).join(\"\"),\r\n\t\t\t\t\t\tinputPattern: [\"(\\\\d(\\\\d\", \")?)?\"],\r\n\t\t\t\t\t\tkeyPattern: \"\\\\d\"\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\tdefault:\r\n\t\t\t\t{\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\ttoken: part.value,\r\n\t\t\t\t\t\tvalue: part.value,\r\n\t\t\t\t\t\tinputPattern: [part.value.replace(/./g, ($0: string) => `(${escapeRegExp($0)}`), part.value.replace(/./g, \")?\")],\r\n\t\t\t\t\t\tkeyPattern: [...part.value].map(c => escapeRegExp(c)).join(\"|\")\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.displayFormat = parts.map(part => part.value).join(\"\");\r\n\t\tthis.inputFormat = parts.map(part => part.token).join(\"\");\r\n\t\tthis.inputPattern = new RegExp(`^${[...parts.map(part => part.inputPattern[0]), ...parts.map(part => part.inputPattern[1])].join(\"\")}$`);\r\n\t\tthis.keyPattern = new RegExp(`^(${[...parts.map(part => part.keyPattern)].join(\"|\")})$`);\r\n\t}\r\n\r\n\t/**\r\n\t * The format string to present to users.\r\n\t */\r\n\tpublic readonly displayFormat: string;\r\n\r\n\t/**\r\n\t * The format string to use for parsing user input.\r\n\t * Note that this format is specific to the `luxon` package.\r\n\t */\r\n\tpublic readonly inputFormat: string;\r\n\r\n\t/**\r\n\t * The pattern to use when validating user input while the user is typing.\r\n\t * Note that the actual validity of the input should always be determined\r\n\t * based on whether the input was be successfully parsed.\r\n\t */\r\n\tpublic readonly inputPattern: RegExp;\r\n\r\n\t/**\r\n\t * The pattern to use when validating whether a character being typed is valid.\r\n\t */\r\n\tpublic readonly keyPattern: RegExp;\r\n}\r\n","import { singleton, computedFrom } from \"aurelia-framework\";\r\nimport { EventManager } from \"shared/utilities\";\r\n\r\n// The class name added to the `body` element during keyboard navigation.\r\nconst focusVisibleClassName = \"focus-visible\";\r\n\r\n/**\r\n * Represents the extended options that may be passed to the standard `focus` method,\r\n * to control how focus visibility is affected.\r\n */\r\nexport interface IExtendedFocusOptions extends FocusOptions\r\n{\r\n\t/**\r\n\t * True to make the focus visible, false to make it invisible,\r\n\t * or undefined to keep the current visibility.\r\n\t * The default is undefined.\r\n\t */\r\n\tfocusVisible?: boolean;\r\n}\r\n\r\n/**\r\n * Represents a service that manages the visibility of focus, by adding a\r\n * class to the `body` element when keyboard navigation occurs, and removing\r\n * it when any mouse, touch or pointer interaction occurs.\r\n * Note that this only manages the class; styling must be provided separately.\r\n */\r\n@singleton()\r\nexport class FocusService\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t */\r\n\tpublic constructor()\r\n\t{\r\n\t\t// Hide keyboard focus when any mouse, touch or pointer event occurs.\r\n\t\tthis._eventManager.addEventListener(document, [\"mousedown\", \"touchstart\", \"pointerdown\"], () =>\r\n\t\t{\r\n\t\t\tthis.focusVisible = false;\r\n\t\t},\r\n\t\t{ capture: true });\r\n\r\n\t\t// Show keyboard focus when the `Tab` key is pressed.\r\n\t\tthis._eventManager.addEventListener(document, \"keydown\", (event: KeyboardEvent) =>\r\n\t\t{\r\n\t\t\tif (event.key === \"Tab\" && !event.ctrlKey && !event.altKey && !event.metaKey && !event.defaultPrevented)\r\n\t\t\t{\r\n\t\t\t\tthis.focusVisible = true;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Optionally show or hide focus when set programmatically.\r\n\t\tconst focusService = this;\r\n\t\tconst focusFunc = HTMLElement.prototype.focus;\r\n\t\tHTMLElement.prototype.focus = function(options?: IExtendedFocusOptions): void\r\n\t\t{\r\n\t\t\tif (options != null && options.focusVisible != null)\r\n\t\t\t{\r\n\t\t\t\tfocusService.focusVisible = options.focusVisible;\r\n\t\t\t}\r\n\r\n\t\t\tfocusFunc.apply(this, arguments as any);\r\n\t\t};\r\n\t}\r\n\r\n\tprivate readonly _eventManager = new EventManager(this);\r\n\tprivate _focusVisible = false;\r\n\r\n\t/**\r\n\t * True to enable automatic focus management, otherwise false.\r\n\t * The default is true.\r\n\t */\r\n\tpublic enabled = true;\r\n\r\n\t/**\r\n\t * True if focus is visible, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_focusVisible\")\r\n\tpublic get focusVisible(): boolean\r\n\t{\r\n\t\treturn this._focusVisible;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets whether focus should be visible.\r\n\t * Note that this can be set regardless of whether the service is enabled or disabled.\r\n\t * @param value True if focus should be visible, otherwise false.\r\n\t */\r\n\tpublic set focusVisible(value: boolean)\r\n\t{\r\n\t\tthis._focusVisible = value;\r\n\r\n\t\tif (value)\r\n\t\t{\r\n\t\t\tdocument.body.classList.add(focusVisibleClassName);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdocument.body.classList.remove(focusVisibleClassName);\r\n\t\t}\r\n\t}\r\n}\r\n","import { bindable, bindingMode } from \"aurelia-framework\";\r\nimport { textCase } from \"shared/utilities\";\r\n\r\n/**\r\n * Represents a function that tests an entity to determine whether it matches a filter.\r\n */\r\nexport type FilterFunc = (entity: TEntity) => boolean;\r\n\r\n/**\r\n * Represents a base class for custom elements that implement filter functionality.\r\n */\r\nexport abstract class FilterCustomElement\r\n{\r\n\t/**\r\n\t * The set of currently active filters.\r\n\t */\r\n\tprotected readonly activeFilters = new Set();\r\n\r\n\t/**\r\n\t * The filter function, which will be assigned to the property to which it is bound.\r\n\t * This property is re-assigned when a filter property changes, thereby enabling consumers of the\r\n\t * function, such as the `filter` value converter, to react to the change.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.fromView })\r\n\tpublic filterFunc: FilterFunc = this.filter.bind(this);\r\n\r\n\t/**\r\n\t * Sets the filter state based on the specified URL parameter value.\r\n\t * @param param The URL parameter value, as a comma-separated list of active filters.\r\n\t */\r\n\tpublic fromUrlParam(param: string | undefined): void\r\n\t{\r\n\t\tparam?.split(/\\s*,\\s*/)\r\n\t\t\t.forEach(formattedKey =>\r\n\t\t\t{\r\n\t\t\t\tconst parts = formattedKey.split(\":\", 2);\r\n\r\n\t\t\t\tthis[textCase(parts[0], \"kebab\", \"camel\")] = parts.length === 1 ? true : decodeURIComponent(parts[1]);\r\n\t\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the URL parameter value representing the filter state.\r\n\t * @returns The comma-separated list of active filters.\r\n\t */\r\n\tpublic toUrlParam(): string | undefined\r\n\t{\r\n\t\treturn Array.from(this.activeFilters)\r\n\t\t\t.map(key =>\r\n\t\t\t{\r\n\t\t\t\tconst formattedKey = textCase(key, \"camel\", \"kebab\");\r\n\r\n\t\t\t\treturn this[key] === true ? formattedKey : `${formattedKey}:${encodeURIComponent(this[key])}`;\r\n\t\t\t})\r\n\t\t\t.join(\",\") || undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when a property changes.\r\n\t * Tracks active filters and re-assigns the filter function, thereby triggering a binding update.\r\n\t * @param propertyName The name of the property that changed.\r\n\t * @param newValue The new property value.\r\n\t * @param oldValue The old property value.\r\n\t * @param active True to explicitly indicate that the filter is now active, false to explicitly\r\n\t * indicate it is inactive, or undefined to consider it active if the new value is truthy.\r\n\t */\r\n\tprotected propertyChanged(propertyName: string, newValue: any, oldValue: any, active?: boolean): void\r\n\t{\r\n\t\tif (propertyName !== \"filterFunc\")\r\n\t\t{\r\n\t\t\tif (active ?? newValue)\r\n\t\t\t{\r\n\t\t\t\tthis.activeFilters.add(propertyName);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.activeFilters.delete(propertyName);\r\n\t\t\t}\r\n\r\n\t\t\tthis.filterFunc = this.filter.bind(this);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * When implemented in a derived class, determines whether an entity matches the filters.\r\n\t * @param entity The entity to test.\r\n\t * @returns True if the entity matches the filters, otherwise false.\r\n\t */\r\n\tprotected abstract filter(entity: TEntity): boolean;\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { Type } from \"shared/types\";\r\nimport { Modal } from \"./modal\";\r\nimport { ModalCloseReason } from \"./modal-close-reason\";\r\n\r\n/**\r\n * Represents the type of the object passed to the `activate` life cycle method of a component.\r\n */\r\ntype Model = TModal extends { activate(modal: infer TModel): any } ? TModel : never;\r\n\r\n/**\r\n * Represents the type of the object returned by the `deactivate` life cycle method of a component.\r\n */\r\ntype Result = TModal extends { deactivate(): infer TResult } ? TResult : TModal extends never ? any : void;\r\n\r\n/**\r\n * Represents the registration to which a modal name maps.\r\n */\r\ninterface IModalRegistration\r\n{\r\n\t/**\r\n\t * The type of the component to present, or its module ID.\r\n\t */\r\n\tviewModel: string | Type;\r\n\r\n\t/**\r\n\t * The default model to pass to the `activate` life cycle method of the component\r\n\t * if no model is specified when the modal is opened.\r\n\t */\r\n\tmodel?: any;\r\n}\r\n\r\n/**\r\n * Represents a service that manages the modals on the stack.\r\n * Inject this where needed, and use it to open and close modals.\r\n */\r\n@autoinject\r\nexport class ModalService\r\n{\r\n\tprivate readonly _registrations = new Map();\r\n\r\n\t/**\r\n\t * The stack of modals currently being presented,\r\n\t * in the order they were openend.\r\n\t */\r\n\tpublic readonly modals: Modal[] = [];\r\n\r\n\t/**\r\n\t * Registers the component with the specified module ID, as a modal with the specified name.\r\n\t * @param name The name under which the modal should be registered.\r\n\t * @param viewModel The type of the component to present, or its module ID.\r\n\t * @param model The default model to use, if not specified when the modal is opened.\r\n\t */\r\n\tpublic register(name: string, viewModel: string | Type, model?: any): void\r\n\t{\r\n\t\tthis._registrations.set(name, { viewModel, model });\r\n\t}\r\n\r\n\t/**\r\n\t * Unregisters the modal with the specified name.\r\n\t * @param name The name of the modal to unregister.\r\n\t */\r\n\tpublic unregister(name: string): void\r\n\t{\r\n\t\tthis._registrations.delete(name);\r\n\t}\r\n\r\n\t/**\r\n\t * Opens a modal of the specified type.\r\n\t * @param viewModel The type of the modal.\r\n\t * @param model The model to pass to the `activate` life cycle method of the component.\r\n\t * @returns A promise that will be resolved when the modal is closed.\r\n\t */\r\n\tpublic open(viewModel: Type, model?: Model): Modal, Result>;\r\n\r\n\t/**\r\n\t * Opens the modal with the specified name.\r\n\t * @param name The name under which the modal was registered.\r\n\t * @param model The model to pass to the `activate` life cycle method of the component.\r\n\t * @returns A promise that will be resolved when the modal is closed.\r\n\t */\r\n\tpublic open(name: string, model?: TModel): Modal;\r\n\r\n\tpublic open(nameOrType: string | Type, model?: any): Modal\r\n\t{\r\n\t\tconsole.info(\"Attempting to open modal.\", { nameOrType, model });\r\n\r\n\t\tlet registration: IModalRegistration | undefined;\r\n\r\n\t\tif (typeof nameOrType === \"string\")\r\n\t\t{\r\n\t\t\tregistration = this._registrations.get(nameOrType);\r\n\r\n\t\t\tif (registration == null)\r\n\t\t\t{\r\n\t\t\t\tthrow new Error(`No modal has been registered with the name '${nameOrType}'.`);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tregistration = { viewModel: nameOrType };\r\n\t\t}\r\n\r\n\t\tconst modal = new Modal(this.modals, registration.viewModel, model !== undefined ? model : registration.model);\r\n\r\n\t\tthis.modals.push(modal);\r\n\r\n\t\treturn modal;\r\n\t}\r\n\r\n\t/**\r\n\t * Attempts to close all open modals.\r\n\t * @param reason The reason for closing the modals, which may affect how the modals responds.\r\n\t * @returns A promise that will be resolved with true if all modals accepted the close request,\r\n\t * or false if one of them rejected it with a reason other than an `Error` instance.\r\n\t */\r\n\tpublic async closeAll(reason: ModalCloseReason): Promise\r\n\t{\r\n\t\tif (this.modals.length === 0)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tconsole.info(\"Attempting to close all modals.\", { modals: this.modals, reason });\r\n\r\n\t\tfor (const modal of this.modals.slice().reverse())\r\n\t\t{\r\n\t\t\tconst closed = await modal.close(reason);\r\n\r\n\t\t\tif (!closed)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Finds all open modals of the specified type.\r\n\t * @param viewModel The type of the modal.\r\n\t * @returns The open modals with the specified name, if any.\r\n\t */\r\n\tpublic find(viewModel: Type): Modal[];\r\n\r\n\t/**\r\n\t * Finds all open modals with the specified name.\r\n\t * @param name The name under which the modal was registered.\r\n\t * @returns The open modals with the specified name, if any.\r\n\t */\r\n\tpublic find(name: string): Modal[];\r\n\r\n\tpublic find(nameOrType: string | Type): Modal[]\r\n\t{\r\n\t\tlet registration: IModalRegistration | undefined;\r\n\r\n\t\tif (typeof nameOrType === \"string\")\r\n\t\t{\r\n\t\t\tregistration = this._registrations.get(nameOrType);\r\n\r\n\t\t\tif (registration == null)\r\n\t\t\t{\r\n\t\t\t\tthrow new Error(`No modal has been registered with the name '${nameOrType}'.`);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tregistration = { viewModel: nameOrType };\r\n\t\t}\r\n\r\n\t\treturn this.modals.filter(m => m.viewModel === registration!.viewModel);\r\n\t}\r\n}\r\n","export * from \"./theme-service\";\r\nexport * from \"./theme\";\r\n","import { autoinject, computedFrom } from \"aurelia-framework\";\r\nimport { ITheme, Theme } from \"./theme\";\r\nimport { once } from \"shared/utilities\";\r\n\r\n/**\r\n * Represents a function that will be invoked before the theme changes.\r\n * Use this to prepare the app for the new theme.\r\n * @param newTheme The new theme being set.\r\n * @param oldTheme The old theme, or undefined if not previously set.\r\n * @returns Nothing, or a promise that will be resolved when the app is ready for the new theme.\r\n */\r\ntype ThemeChangeFunc = (newTheme: Theme, oldTheme: Theme | undefined) => void | Promise;\r\n\r\n/**\r\n * Represents a service that manages themes.\r\n */\r\n@autoinject\r\nexport class ThemeService\r\n{\r\n\tprivate _themes: Theme[];\r\n\tprivate _theme: Theme;\r\n\tprivate _changeFunc: ThemeChangeFunc;\r\n\r\n\t/**\r\n\t * Gets the supported themes.\r\n\t */\r\n\t@computedFrom(\"_themes\")\r\n\tpublic get themes(): ReadonlyArray\r\n\t{\r\n\t\treturn this._themes;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the current theme.\r\n\t */\r\n\t@computedFrom(\"_theme\")\r\n\tpublic get theme(): Theme\r\n\t{\r\n\t\treturn this._theme;\r\n\t}\r\n\r\n\t/**\r\n\t * Configures the instance.\r\n\t * @param themes The themes supported by the app.\r\n\t * @param themeFolderPath The path for the folder containing the themes.\r\n\t * @param changeFunc The function that is invoked before the theme changes.\r\n\t */\r\n\t@once\r\n\tpublic configure(themes: ITheme[], changeFunc: ThemeChangeFunc): void\r\n\t{\r\n\t\tthis._themes = themes.filter(t => ENVIRONMENT.debug || !t.debug).map(t => new Theme(t));\r\n\r\n\t\tthis._changeFunc = changeFunc;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the theme with the specified slug.\r\n\t * @param themeSlug The slug iddentifying the theme.\r\n\t * @returns The theme with the specified slug.\r\n\t */\r\n\tpublic getTheme(themeSlug: string): Theme\r\n\t{\r\n\t\tconst theme = this._themes.find(t => t.slug === themeSlug);\r\n\r\n\t\tif (theme == null)\r\n\t\t{\r\n\t\t\tthrow new Error(`The theme '${themeSlug}' is not supported.`);\r\n\t\t}\r\n\r\n\t\treturn theme;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the current theme.\r\n\t * @param themeSlug The slug identifying the theme.\r\n\t * @returns A promise that will be resolved with the `Theme` instance when the new theme is loaded.\r\n\t */\r\n\tpublic async setTheme(themeSlug: string): Promise\r\n\t{\r\n\t\tif (this._theme != null && themeSlug === this._theme.slug)\r\n\t\t{\r\n\t\t\treturn Promise.resolve(this._theme);\r\n\t\t}\r\n\r\n\t\tconst theme = this.getTheme(themeSlug);\r\n\r\n\t\tawait this._changeFunc(theme, this._theme);\r\n\r\n\t\tthis._theme = theme;\r\n\r\n\t\treturn this._theme;\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\nimport { Log, ApiClient } from \"shared/infrastructure\";\nimport settings from \"resources/settings\";\nimport { Identity } from \"..\";\nimport { DateTime, Duration } from \"luxon\";\n\n/**\n * Represents a service that manages the authentication and identity of the user.\n */\n@autoinject\nexport class IdentityService\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param apiClient The `ApiClient` instance.\n\t */\n\tpublic constructor(apiClient: ApiClient)\n\t{\n\t\tthis._apiClient = apiClient;\n\t}\n\n\tprivate readonly _apiClient: ApiClient;\n\tprivate _identity: Identity | undefined;\n\tprivate _refreshTokenTimeout: any;\n\n\t/**\n\t * The identity of the currently authenticated user, or undefined if not authenticated.\n\t */\n\tpublic get identity(): Identity\n\t{\n\t\tif (this._identity == null)\n\t\t{\n\t\t\tthis._identity = new Identity();\n\n\t\t\tthis.configureInfrastructure();\n\t\t}\n\n\t\treturn this._identity;\n\t}\n\n\t/**\n\t * Called when the user is authenticated, to configure the app.\n\t */\n\tpublic authenticated(): void\n\t{\n\t\tthis.configureInfrastructure();\n\t\tthis.verifyAccessTokenExpireDate();\n\t}\n\n\t/**\n\t * Attempts to start the session for logged in users\n\t * @returns A promise that will be resolved with a boolean indicating whether reauthentication succeeded.\n\t */\n\tpublic async startSession(): Promise\n\t{\n\t\ttry\n\t\t{\n\t\t\tawait this.autoLogin();\n\t\t}\n\t\tfinally\n\t\t{\n\t\t\tthis.authenticated();\n\t\t}\n\n\t\treturn Promise.resolve(this.identity.tokens != null);\n\t}\n\n\t/**\n\t * Check the user as authenticated in the case\n\t * of auto login and tokens\n\t * @returns A promise that will be resolved when the operation succeeds.\n\t */\n\tpublic async autoLogin(): Promise\n\t{\n\t\tif (this.identity.tokens != null)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (this.identity.accessTokenExpirationDateTime < DateTime.local())\n\t\t\t\t{\n\t\t\t\t\tawait this.reauthenticate();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tawait this.verifyAccessTokenExpireDate();\n\t\t\t\t}\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tawait this.initial();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Unauthenticate the user, removing the authentication token stored on the device.\n\t * @returns A promise that will be resolved with a boolean indicating whether unauthentication succeeded.\n\t */\n\tpublic async unauthenticate(): Promise\n\t{\n\t\ttry\n\t\t{\n\t\t\tthis.identity.logout();\n\t\t\tthis._identity = undefined;\n\t\t}\n\t\tfinally\n\t\t{\n\t\t\tthis.configureInfrastructure();\n\t\t}\n\n\t\treturn Promise.resolve(true);\n\t}\n\n\t/**\n\t * Configures the infrastructure.\n\t * Adds or removes the tokens to the set of default headers used by the `ApiClient`,\n\t * and sets the user associated with log entries.\n\t */\n\tpublic configureInfrastructure(): void\n\t{\n\t\tif (this.identity.tokens != null)\n\t\t{\n\t\t\tsettings.infrastructure.api.defaults!.headers![\"authorization\"] = `Bearer ${this.identity.tokens.access}`;\n\t\t\tLog.setUser({\n\t\t\t\tid: this._identity?.company?.id.toString(),\n\t\t\t\ttype: \"company\",\n\t\t\t\tauthenticated: this._identity?.authenticated\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdelete settings.infrastructure.api.defaults!.headers![\"authorization\"];\n\t\t\tLog.setUser(undefined);\n\t\t}\n\t}\n\n\t/**\n\t * Verifies the access token's expire date\n\t * This will also call a new re-authentication one minute before expiring.\n\t */\n\tprivate async verifyAccessTokenExpireDate(): Promise\n\t{\n\t\tclearTimeout(this._refreshTokenTimeout);\n\n\t\tif (this.identity.tokens == null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst tokenValidityInterval = DateTime.local().until(this.identity.accessTokenExpirationDateTime);\n\t\tif (!tokenValidityInterval.isValid)\n\t\t{\n\t\t\tawait this.reauthenticate();\n\t\t}\n\t\tvar tokenValidityTime = Duration.fromMillis(tokenValidityInterval.length());\n\t\tconst oneMinute = Duration.fromMillis(1000 * 60);\n\n\t\tconst refresh = tokenValidityTime.minus(oneMinute);\n\n\t\tthis._refreshTokenTimeout = setTimeout(\n\t\t\tasync () => await this.reauthenticate(),\n\t\t\trefresh.get(\"milliseconds\")\n\t\t);\n\t}\n\n\t/**\n\t * Attempts to reauthenticate the user using the authentication cookie stored on the device.\n\t * @returns A promise that will be resolved with a boolean indicating whether reauthentication succeeded.\n\t */\n\tpublic async reauthenticate(): Promise\n\t{\n\t\ttry\n\t\t{\n\t\t\tsettings.infrastructure.api.defaults!.headers![\"authorization\"] = `Bearer ${this.identity.tokens?.refresh}`;\n\t\t\tconst result = await this._apiClient.post(\"/authentication/refresh-access-token\");\n\t\t\tthis.identity.setTokens(result.data.accessToken, this.identity.tokens?.refresh!);\n\t\t}\n\t\tcatch\n\t\t{\n\t\t\tthis.unauthenticate();\n\t\t\treturn false;\n\t\t}\n\t\tfinally\n\t\t{\n\t\t\tthis.authenticated();\n\t\t}\n\n\t\treturn Promise.resolve(this.identity.tokens != null);\n\t}\n\n\t/**\n\t * Authenticates and logs in the user.\n\t * @param email The email used as login credentials.\n\t * @param password The password used to log in.\n\t * @param signal The abort signal to use, or undefined to use no abort signal.\n\t * @returns A promise that will be resolved when the operation succeeds.\n\t */\n\tpublic async logIn(email: string, password: string, signal?: AbortSignal): Promise\n\t{\n\t\tconst result = await this._apiClient.post(\"/authentication/login\",\n\t\t\t{\n\t\t\t\tbody: { email: email, password: password },\n\t\t\t\tsignal: signal\n\t\t\t});\n\n\t\tthis.identity.setTokens(result.data.accessToken, result.data.refreshToken);\n\t\tthis.configureInfrastructure();\n\n\t\tthis.verifyAccessTokenExpireDate();\n\t}\n\n\t/**\n\t * Resets password and authenticates the user.\n\t * @param password The new password for the user.\n\t * @param confirmPassword The confirmed password.\n\t * @param token The code used to identify a confirmed user.\n\t * @param id The id of the user resetting their password.\n\t * @param signal The abort signal to use, or undefined to use no abort signal.\n\t * @returns A promise that will be resolved when the operation succeeds.\n\t */\n\tpublic async resetPassword(password: string, confirmPassword: string, token: string, id: string, signal?: AbortSignal): Promise\n\t{\n\t\tconst result = await this._apiClient.post(\"/authentication/reset-password\",\n\t\t\t{\n\t\t\t\tbody: {\n\t\t\t\t\tpassword: password,\n\t\t\t\t\tconfirmPassword: confirmPassword,\n\t\t\t\t\ttoken: token,\n\t\t\t\t\tid: id\n\t\t\t\t},\n\t\t\t\tsignal: signal\n\t\t\t});\n\n\t\tthis.identity.setTokens(result.data.accessToken, result.data.refreshToken);\n\t\tthis.configureInfrastructure();\n\t}\n\n\t/**\n\t * Resets password and authenticates the user.\n\t * @param password The new password for the user.\n\t * @param confirmPassword The confirmed password.\n\t * @param token The code used to identify a confirmed user.\n\t * @param id The id of the user resetting their password.\n\t * @param signal The abort signal to use, or undefined to use no abort signal.\n\t * @returns A promise that will be resolved when the operation succeeds.\n\t */\n\tpublic async claimCompany(password: string, confirmPassword: string, token: string, id: string, receiveMarketingInformation: boolean, signal?: AbortSignal): Promise\n\t{\n\t\tconst result = await this._apiClient.post(\"/company/claim\",\n\t\t\t{\n\t\t\t\tbody: {\n\t\t\t\t\tpassword: password,\n\t\t\t\t\tconfirmPassword: confirmPassword,\n\t\t\t\t\ttoken: token,\n\t\t\t\t\tid: id,\n\t\t\t\t\treceiveMarketingInformation: receiveMarketingInformation\n\t\t\t\t},\n\t\t\t\tsignal: signal\n\t\t\t});\n\n\t\tthis.identity.setTokens(result.data.accessToken, result.data.refreshToken);\n\t\tthis.configureInfrastructure();\n\t}\n\n\t/**\n\t * Tries to reset the password for a user, who can't remember their password.\n\t * @param email The email of the user, who can't remember their password.\n\t * @param signal The abort signal to use, or undefined to use no abort signal.\n\t * @returns A promise that will be resolved when the operation succeeds.\n\t */\n\tpublic async forgotPassword(email: string, signal?: AbortSignal): Promise\n\t{\n\t\tawait this._apiClient.post(\"/authentication/forgot-password\",\n\t\t\t{\n\t\t\t\tbody: { email: email },\n\t\t\t\tsignal: signal\n\t\t\t});\n\t}\n\n\t/**\n\t * Gets the base user information using the access token.\n\t * @param signal The abort signal to use, or undefined to use no abort signal.\n\t * @returns A promise that will be resolved when the operation succeeds.\n\t */\n\tpublic async initial(signal?: AbortSignal): Promise\n\t{\n\t\tconst result = await this._apiClient.get(\"/initial\",\n\t\t\t{\n\t\t\t\tsignal: signal\n\t\t\t});\n\n\t\tif ([401, 403].includes(result.response.status))\n\t\t{\n\t\t\tthis.verifyAccessTokenExpireDate();\n\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.identity.setInitialInformations(result.data);\n\t\tthis.configureInfrastructure();\n\n\t\treturn true;\n\t}\n}\n","import { Cookies } from \"shared/infrastructure\";\nimport { AdministratorSimple, CompanyInitial } from \"..\";\nimport { computedFrom, autoinject } from \"aurelia-framework\";\nimport njwt from \"njwt\";\nimport { DateTime } from \"luxon\";\n\nconst enum Path\n{\n\tActiveCompanyId = \"active-company-id\",\n\tAccessToken = \"access-token\",\n\tRefreshToken = \"refresh-token\",\n\tLocale = \"locale\"\n}\n\n/**\n * Represents the identity of an authenticated user.\n */\n @autoinject\nexport class Identity\n{\n\t/**\n\t * Creates a new instance of the type.\n\t */\n\tpublic constructor()\n\t{\n\t\tthis.companies = CompanyInitial[0];\n\n\t\tconst accessToken = this._cookies.get(Path.AccessToken);\n\t\tconst refreshToken = this._cookies.get(Path.RefreshToken);\n\n\t\tif (accessToken != null && refreshToken != null)\n\t\t{\n\t\t\tthis.tokens = { access: accessToken, refresh: refreshToken };\n\t\t}\n\t}\n\n\tprivate readonly _cookies: Cookies = new Cookies();\n\n\t/**\n\t * The tokens to use when accessing the API.\n\t */\n\tpublic tokens: { refresh: string; access: string } | undefined;\n\n\t/**\n\t * The information of the user logged in.\n\t */\n\tpublic administrator: AdministratorSimple;\n\n\t/**\n\t * The active company currently administered by the user.\n\t */\n\t public company: CompanyInitial | undefined;\n\n\t/**\n\t * The companies the user is allowed to administer.\n\t */\n\tpublic companies: CompanyInitial[];\n\n\t/**\n\t * Sets the access and refresh tokens for the user\n\t * and checks the user as authenticated\n\t */\n\tpublic setTokens(accessToken: string, refreshToken: string): void\n\t{\n\t\tthis._cookies.set(Path.RefreshToken, refreshToken, { path: \"/\" });\n\t\tthis._cookies.set(Path.AccessToken, accessToken, { path: \"/\" });\n\t\tthis.tokens = { access: accessToken, refresh: refreshToken };\n\t}\n\n\t/**\n\t * Gets and fill out the data from the initial call\n\t */\n\tpublic setInitialInformations(data: any): void\n\t{\n\t\tthis.administrator = new AdministratorSimple(data.administrator);\n\t\tthis.companies = data.companies.map((companyData: any) => new CompanyInitial(companyData));\n\n\t\tlet activeCompanyId = this.activeCompanyId;\n\t\tif(activeCompanyId == null || this.companies.find(company => company.id === activeCompanyId) == null)\n\t\t{\n\t\t\tactiveCompanyId = this.companies[this.companies.length - 1].id;\n\n\t\t\t// Setting the initial company id as there either no nothing currently\n\t\t\t// or the currently set does not match any companies the administrator\n\t\t\t// has access to.\n\t\t\tthis._cookies.set(Path.ActiveCompanyId, activeCompanyId.toString(), { path: \"/\" });\n\t\t}\n\n\t\tthis.company = this.companies.find(company => company.id === activeCompanyId);\n\t}\n\n\tprivate get activeCompanyId(): number | undefined\n\t{\n\t\tconst activeCompanyIdString = this._cookies.get(Path.ActiveCompanyId);\n\t\tif(activeCompanyIdString == null)\n\t\t{\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst activeCompanyId = parseInt(activeCompanyIdString);\n\t\tif(isNaN(activeCompanyId) || !isFinite(activeCompanyId))\n\t\t{\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn activeCompanyId;\n\t}\n\n\t/**\n\t * Switches the active company to the provided\n\t */\n\tpublic switchCompany(companyId: number): void\n\t{\n\t\tthis._cookies.set(Path.ActiveCompanyId, companyId.toString(), { path: \"/\" });\n\t}\n\n\t/**\n\t * Whether or not the user is authenticated.\n\t */\n\t @computedFrom(\"tokens\")\n\tpublic get authenticated(): boolean\n\t{\n\t\tif (this.tokens == null)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst expires = this.accessTokenExpirationDateTime;\n\n\t\tif (expires < DateTime.local())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic get accessTokenExpirationDateTime(): DateTime\n\t{\n\t\tlet expirationDateInSeconds: number;\n\n\t\ttry\n\t\t{\n\t\t\tconst jwt = njwt.verify(this.tokens?.access);\n\t\t\texpirationDateInSeconds = jwt.parsedBody.exp;\n\t\t}\n\t\tcatch(error: any)\n\t\t{\n\t\t\tif (error.parsedBody == null)\n\t\t\t{\n\t\t\t\tthrow new Error(`Could not parse the JWT token. ${error.message}`);\n\t\t\t}\n\n\t\t\texpirationDateInSeconds = error.parsedBody.exp;\n\t\t}\n\n\t\treturn DateTime.fromSeconds(expirationDateInSeconds);\n\t}\n\n\t/**\n\t * Resets the identity of the user\n\t */\n\tprivate reset(): void\n\t{\n\t\tthis.tokens = undefined;\n\t\tthis.company = undefined;\n\n\t\tthis._cookies.set(Path.ActiveCompanyId, undefined, { path: \"/\" });\n\t\tthis._cookies.set(Path.AccessToken, undefined, { path: \"/\" });\n\t\tthis._cookies.set(Path.RefreshToken, undefined, { path: \"/\" });\n\t}\n\n\t/**\n\t * The logout triggers a reset of the identity of the user\n\t */\n\tpublic logout(): void\n\t{\n\t\tthis.reset();\n\t}\n}\n","export * from \"./entities/employee-simple\";\nexport * from \"./entities/employee-sign-up\";\nexport * from \"./entities/employee-status\";\nexport * from \"./entities/employee-address\";\nexport * from \"./entities/employee-personal-information\";\nexport * from \"./entities/employee-compensation-information\";\nexport * from \"./entities/employment-type\";\nexport * from \"./entities/employee-group\";\nexport * from \"./entities/subsidiary\";\nexport * from \"./entities/employees-page-response\";\nexport * from \"./services/employee-service\";\n","import clone from \"clone\";\n\nexport class CompanyInitial\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param data The response data from which the instance should be created.\n\t */\n\tpublic constructor(data: any)\n\t{\n\t\tthis.id = data.company.id;\n\t\tthis.name = data.company.name;\n\t\tthis.cvr = data.company.cvr;\n\t\tthis.documentsSigned = data.signup.documentsSigned;\n\t\tthis.employeesInvited = data.dashboard.employeesInvited;\n\t\tthis.hasMandatoryPlan = data.dashboard.hasMandatoryPlan;\n\t\tthis.firstEmployeePrompted = this.employeesInvited === true ? true : false;\n\t}\n\n\tpublic readonly id: number;\n\n\tpublic readonly name: string;\n\n\tpublic readonly cvr: string;\n\n\tpublic readonly documentsSigned: boolean;\n\n\tpublic readonly employeesInvited: boolean;\n\n\tpublic readonly hasMandatoryPlan: boolean;\n\n\tpublic firstEmployeePrompted: boolean;\n\n\t/**\n\t * Gets a clone of this instance, suitable for editing.\n\t */\n\tpublic clone(): any\n\t{\n\t\treturn clone(this);\n\t}\n}\n","import clone from \"clone\";\n\nexport class AdministratorSimple\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param data The response data from which the instance should be created.\n\t */\n\tpublic constructor(data: any)\n\t{\n\t\tthis.id = data.id;\n\t\tthis.firstName = data.firstName;\n\t\tthis.lastName = data.lastName;\n\t\tthis.canBeDeactivated = data.canBeDeactivated;\n\t}\n\n\tpublic readonly id: number | undefined;\n\n\tpublic readonly firstName: string;\n\n\tpublic readonly lastName: string;\n\t\n\tpublic readonly canBeDeactivated: boolean;\n\n\t/**\n\t * Gets a clone of this instance, suitable for editing.\n\t */\n\tpublic clone(): any\n\t{\n\t\treturn clone(this);\n\t}\n\n\tpublic get fullName(): string\n\t{\n\t\treturn `${this.firstName} ${this.lastName}`;\n\t}\n\n\tpublic get initials(): string\n\t{\n\t\treturn `${this.firstName[0]}${this.lastName[0]}`;\n\t}\n}\n","import clone from \"clone\";\n\nexport class OnboardingState\n{\n\t\t/**\n\t\t * Creates a new instance of the type.\n\t\t * @param data The response data from which the instance should be created.\n\t\t */\n\t\tpublic constructor(data: any)\n\t\t{\n\t\t\tthis.hasFinishedOnboarding = data.hasFinishedOnboarding;\n\t\t}\n\n\t\tpublic readonly hasFinishedOnboarding: boolean;\n\n\t\t/**\n\t\t * Gets a clone of this instance, suitable for editing.\n\t\t */\n\t\tpublic clone(): any\n\t\t{\n\t\t\treturn clone(this);\n\t\t}\n\n\t\t/**\n\t\t * Gets the data representing this instance.\n\t\t */\n\t\tpublic toJSON(): any\n\t\t{\n\t\t\treturn {\n\t\t\t\thasFinishedOnboarding: this.hasFinishedOnboarding\n\t\t\t};\n\t\t}\n}\n","import clone from \"clone\";\nimport { DateTime } from \"luxon\";\nimport { EmployeeStatus } from \"./employee-status\";\nimport { EmployeeAddress } from \"./employee-address\";\nimport { EmployeeCompensationInformation } from \"..\";\nimport { EmployeePersonalInformation } from \"./employee-personal-information\";\n\n/**\n * The detailed instance of an employee.\n */\nexport class EmployeeSignUp\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param data The response data from which the instance should be created.\n\t */\n\tpublic constructor(data: any)\n\t{\n\t\tthis.id = data.id == null ? undefined : data.id;\n\n\t\tthis.fromPayrollSystem = data.fromPayrollSystem;\n\t\tthis.payrollSystemUrl = data.payrollSystemUrl;\n\n\t\tthis.personalInformation = new EmployeePersonalInformation(data.personalInformation ?? {});\n\t\tthis.address = new EmployeeAddress(data.addressInformation ?? {});\n\t\tthis.compensationInformation = new EmployeeCompensationInformation(\n\t\t\t{\n\t\t\t\t...data.compensationInformation,\n\t\t\t\temployeeGroups: data.employeeGroups,\n\t\t\t\tsubsidiaries: data.subsidiaries\n\t\t\t}\n\t\t);\n\n\t\tthis.status = EmployeeStatus.fromJSON(data.status);\n\t\tthis.ownersTaxedPrivately = data.ownersPersonallyTaxed;\n\t\tthis.agreementEndDate = data.agreementEndDate == null ? undefined : DateTime.fromISO(data.agreementEndDate);\n\t\tthis.companyAgreementStartDate = DateTime.fromISO(data.companyAgreementStartDate);\n\t}\n\n\tpublic id: number;\n\n\tpublic fromPayrollSystem: boolean;\n\n\tpublic payrollSystemUrl?: string;\n\n\tpublic personalInformation: EmployeePersonalInformation;\n\n\tpublic address: EmployeeAddress;\n\n\tpublic compensationInformation: EmployeeCompensationInformation;\n\n\tpublic readonly status: EmployeeStatus | undefined;\n\n\tpublic readonly ownersTaxedPrivately: boolean;\n\n public readonly agreementEndDate?: DateTime;\n\n\tpublic readonly companyAgreementStartDate: DateTime;\n\n\t/**\n\t * Concatenates the first and last name of the Employee\n\t */\n\tpublic get fullName(): string\n\t{\n\t\treturn `${this.personalInformation.firstName} ${this.personalInformation.lastName}`;\n\t}\n\n\t/**\n\t * Capitalizes the first and last name of the Employee\n\t */\n\tpublic capitalizeNames(): void\n\t{\n\t\tthis.personalInformation.firstName = this.personalInformation.firstName.split(\" \").map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(\" \");\n\t\tthis.personalInformation.lastName = this.personalInformation.lastName.split(\" \").map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(\" \");\n\t}\n\n\t/**\n\t * Gets a clone of this instance, suitable for editing.\n\t */\n\tpublic clone(): any\n\t{\n\t\treturn clone(this);\n\t}\n\n\t/**\n\t * Gets the data representing this instance.\n\t */\n\tpublic toJSON(mandatory: boolean): any\n\t{\n\t\treturn {\n\t\t\tid: this.id,\n\t\t\tpersonalInformation: this.personalInformation.toJSON(),\n\t\t\taddressInformation: mandatory ? this.address : undefined,\n\t\t\tcompensationInformation: this.compensationInformation.toJSON()\n\t\t};\n\t}\n}\n","import clone from \"clone\";\nimport { DateTime } from \"luxon\";\nimport { EmployeeGroup, EmploymentType, Subsidiary } from \"..\";\n\nexport class EmployeeCompensationInformation\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param data The response data from which the instance should be created.\n\t */\n\tpublic constructor(data: any)\n\t{\n\t\tthis.employmentType = this.employmentTypeFromJSON(data.employmentType);\n\t\tthis.employmentTypeLocked = data.employmentTypeLocked ?? false;\n\t\tthis.monthlySalary = data.monthlySalary;\n\t\tthis.monthlySalaryLocked = data.monthlySalaryLocked ?? false;\n\t\tthis.companyContributionPercentage = data.companyContribution;\n\t\tthis.mandatoryPolicyStartDate = data.mandatoryPolicyStartDate == null ? undefined : DateTime.fromISO(data.mandatoryPolicyStartDate, { zone: \"utc\" });\n\t\tthis.mandatoryPolicyStartDateLocked = data.mandatoryPolicyStartDateLocked ?? false;\n\t\tthis.possibleEmployeeGroups = data.employeeGroups?.map(employeeGroup => new EmployeeGroup(employeeGroup));\n\t\tthis.employeeGroup = this.possibleEmployeeGroups?.find(employeeGroup => data.employeeGroupId === employeeGroup.id);\n\t\tthis.employeeGroupLocked = data.employeeGroupIdLocked ?? false;\n\n\t\tthis.possibleSubsidiaries = data\n\t\t\t.subsidiaries\n\t\t\t?.map(subsidiary => new Subsidiary(subsidiary))\n\t\t\t?.sort((a, b) =>\n\t\t\t{\n\t\t\t\tif(a.name > b.name)\n\t\t\t\t{\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}) ?? Subsidiary[0];\n\n\t\tthis.subsidiary = this.possibleSubsidiaries?.find(subsidiary => data.subsidiaryId === subsidiary.id);\n\t\tthis.subsidiaryLocked = data.subsidiaryLocked ?? false;\n\t}\n\n\tpublic employmentType: EmploymentType | undefined;\n\tpublic readonly employmentTypeLocked: boolean;\n\tpublic monthlySalary: number | undefined;\n\tpublic readonly monthlySalaryLocked: boolean;\n\tpublic companyContributionPercentage: number | undefined;\n\tpublic mandatoryPolicyStartDate: DateTime | undefined;\n\tpublic readonly mandatoryPolicyStartDateLocked: boolean;\n\tpublic readonly possibleEmployeeGroups: EmployeeGroup[] | undefined;\n\tpublic readonly employeeGroup: EmployeeGroup | undefined;\n\tpublic readonly employeeGroupLocked: boolean;\n\tpublic readonly possibleSubsidiaries: Subsidiary[];\n\tpublic readonly subsidiary: Subsidiary | undefined;\n\tpublic readonly subsidiaryLocked: boolean;\n\n\t/**\n\t * Translates the frontend value to backend ditto\n\t */\n\tpublic employmentTypeFromJSON(value: number): EmploymentType | undefined\n\t{\n\t\tif (value === 2)\n\t\t{\n\t\t\treturn new EmploymentType(\"owner\");\n\t\t}\n\t\telse if (value === 1)\n\t\t{\n\t\t\treturn new EmploymentType(\"employee\");\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Gets a clone of this instance, suitable for editing.\n\t */\n\tpublic clone(): any\n\t{\n\t\treturn clone(this);\n\t}\n\n\t/**\n\t * Gets the data representing this instance.\n\t */\n\tpublic toJSON(): any\n\t{\n\t\treturn {\n\t\t\tmonthlySalary: this.monthlySalary,\n\t\t\tcompanyContribution: this.employmentType?.slug == \"employee\" ? this.companyContributionPercentage : 0,\n\t\t\tmandatoryPolicyStartDate: this.mandatoryPolicyStartDate?.toISODate(),\n\t\t\temploymentType: this.employmentType?.value,\n\t\t\temployeeGroupId: this.employeeGroup?.id,\n\t\t\tsubsidiaryId: this.subsidiary?.id\n\t\t};\n\t}\n}\n","import { textCase } from \"shared/utilities\";\n\n/**\n * Represents the slug identifying a `EmploymentType`.\n */\nexport type EmploymentTypeSlug = keyof typeof EmploymentType.values;\n\n/**\n * Represents the type of an employment.\n */\nexport class EmploymentType\n{\n /**\n * Creates a new instance of the type.\n * @param slug The slug identifying the type of the employment.\n */\n public constructor(slug: EmploymentTypeSlug)\n {\n this.slug = textCase(slug, \"pascal\", \"kebab\") as any;\n Object.assign(this, EmploymentType.values[this.slug]);\n }\n\n public slug: EmploymentTypeSlug;\n public name: string;\n public value: number;\n\n /**\n * Gets the data representing this instance.\n */\n public toJSON(): any\n {\n return this.value;\n }\n\n /**\n * The supported values.\n */\n public static readonly values =\n {\n \"employee\":\n {\n name: \"Medarbejder\",\n value: 1\n },\n \"owner\":\n {\n name: \"Ejer\",\n value: 2\n }\n };\n}\n","import clone from \"clone\";\n\nexport class EmployeeGroup\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param data The response data from which the instance should be created.\n\t */\n\tpublic constructor(data: any)\n\t{\n\t\tthis.id = data.id;\n\t\tthis.name = data.designation;\n\t\tthis.minimumCompanyContribution = data.companyContribution;\n\t}\n\n\tpublic readonly id: number;\n\n\tpublic readonly name: string;\n\n\tpublic readonly minimumCompanyContribution: number;\n\n\t/**\n\t * Gets a clone of this instance, suitable for editing.\n\t */\n\tpublic clone(): any\n\t{\n\t\treturn clone(this);\n\t}\n}\n","import clone from \"clone\";\n\nexport class Subsidiary\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param data The response data from which the instance should be created.\n\t */\n\tpublic constructor(data: any)\n\t{\n\t\tthis.id = data.id;\n\t\tthis.name = data.name;\n\t}\n\n\tpublic readonly id: number | undefined;\n\n\tpublic readonly name: string;\n\n\t/**\n\t * Gets a clone of this instance, suitable for editing.\n\t */\n\tpublic clone(): any\n\t{\n\t\treturn clone(this);\n\t}\n}\n","export * from \"./locale-service\";\r\nexport * from \"./locale\";\r\n","import clone from \"clone\";\nimport { PayrollSystem } from \"../../shared\";\nimport { EmployeeSimple } from \"./employee-simple\";\n\nexport class EmployeesPageResponse\n{\n /**\n * Creates a new instance of the type.\n * @param data The response data from which the instance should be created.\n */\n public constructor(data: any)\n {\n\t\tthis.employees = data.employees.map((data: any) => new EmployeeSimple(data));\n\t\tthis.payrollSystem = PayrollSystem.payrollSystemFromJSON(data.payrollSystem);\n }\n\n\tpublic readonly employees: EmployeeSimple[];\n\n public readonly payrollSystem: PayrollSystem;\n\n /**\n * Gets a clone of this instance, suitable for editing.\n */\n public clone(): any\n {\n return clone(this);\n }\n}\n","import { textCase } from \"shared/utilities\";\n\n/**\n * Represents the slug identifying a `PayrollSystem`.\n */\nexport type PayrollSystemSlug = keyof typeof PayrollSystem.values;\n\n/**\n * Represents the salary system.\n */\nexport class PayrollSystem\n{\n\t/**\n\t * Create a new instance of this using JSON data\n\t */\n\t public static payrollSystemFromJSON(value: number): PayrollSystem\n\t {\n\t\t if (value === 0)\n\t\t {\n\t\t\t return new PayrollSystem(\"unknown\");\n\t\t }\n\t\t else if (value === 2)\n\t\t {\n\t\t\t return new PayrollSystem(\"salary\");\n\t\t }\n\t\t else if (value === 3)\n\t\t {\n\t\t\t return new PayrollSystem(\"zenegy\");\n\t\t }\n\t\t else if (value === 4)\n\t\t {\n\t\t\t return new PayrollSystem(\"danloen\");\n\t\t }\n\n\t\t return new PayrollSystem(\"none\");\n\t }\n\n /**\n * Creates a new instance of the type.\n * @param slug The slug identifying the salary system.\n */\n public constructor(slug: PayrollSystemSlug)\n {\n this.slug = textCase(slug, \"pascal\", \"kebab\") as any;\n Object.assign(this, PayrollSystem.values[this.slug]);\n }\n\n public slug: PayrollSystemSlug;\n public name: string;\n\tpublic logo: { dark: string, light: string }\n public value: number;\n\n /**\n * Gets the data representing this instance.\n */\n public toJSON(): any\n {\n return this.value;\n }\n\n /**\n * The supported values.\n */\n public static readonly values =\n {\n \"unknown\":\n {\n name: \"unknown\",\n value: 0\n },\n \"none\":\n {\n name: \"none\",\n value: 1\n },\n \"salary\":\n {\n name: \"Salary\",\n\t\t\tlogo: { dark: \"salary-logo--dark.svg\", light: \"salary-logo--white.svg\" },\n value: 2\n },\n \"zenegy\":\n {\n name: \"Zenegy\",\n\t\t\tlogo: { dark: \"zenegy-logo.svg\", light: \"zenegy-logo.svg\" },\n value: 3\n },\n \"danloen\":\n {\n name: \"Danløn\",\n\t\t\tlogo: { dark: \"danloen--dark.svg\", light: \"danloen-logo--white.svg\" },\n value: 4\n },\n };\n}\n","import { IdentityService } from \"company-dashboard/services/identity\";\nimport { autoinject } from \"aurelia-framework\";\nimport { ApiClient } from \"shared/infrastructure\";\nimport { EmployeeSignUp, EmployeesPageResponse } from \"..\";\nimport { DateTime } from \"luxon\";\n\n/**\n * Represents a service that manages employees.\n */\n@autoinject\nexport class EmployeeService\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param apiClient The `ApiClient` instance.\n\t * @param identityService The `IdentityService` instance.\n\t */\n\tpublic constructor(apiClient: ApiClient, identityService: IdentityService)\n\t{\n\t\tthis._apiClient = apiClient;\n\t\tthis._identityService = identityService;\n\t}\n\n\tprivate readonly _apiClient: ApiClient;\n\tprivate readonly _identityService: IdentityService;\n\n\t/**\n\t * Gets all employees visible to the current user.\n\t * @param signal The abort signal to use, or undefined to use no abort signal.\n\t * @returns A promise that will be resolved with the employees.\n\t */\n\tpublic async getEmployees(signal?: AbortSignal): Promise\n\t{\n\t\tconst result = await this._apiClient.get(`/${this._identityService.identity.company?.id}/employees`,\n\t\t\t{\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\n\t\treturn new EmployeesPageResponse(result.data);\n\t}\n\n\tpublic async deactivateEmployee(employeeId: number, endDate: DateTime, signal?: AbortSignal): Promise\n\t{\n\t\tawait this._apiClient.post(\n\t\t\t`/${this._identityService.identity.company?.id}/employee/${employeeId}/deactivate`,\n\t\t\t{\n\t\t\t\tbody: {\n\t\t\t\t\tendDate: endDate\n\t\t\t\t},\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async getAddressInformation(\n\t\tid?: number,\n\t\tsignal?: AbortSignal\n\t): Promise\n\t{\n\t\tif(id == null)\n\t\t{\n\t\t\tthrow \"Employee id cannot be null\";\n\t\t}\n\n\t\tconst result = await this._apiClient.get(`/${this._identityService.identity.company?.id}/employee/${id}/update/address-information`,\n\t\t\t{\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\n\t\treturn new EmployeeSignUp(result.data);\n\t}\n\n\tpublic async getCompensationInformation(\n\t\tid?: number,\n\t\tsignal?: AbortSignal\n\t): Promise\n\t{\n\t\tif(id == null)\n\t\t{\n\t\t\tthrow \"Employee id cannot be null\";\n\t\t}\n\t\t\n\t\tconst result = await this._apiClient.get(`/${this._identityService.identity.company?.id}/employee/${id}/update/compensation-information`,\n\t\t\t{\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\n\t\treturn new EmployeeSignUp(result.data);\n\t}\n\n\tpublic async getPersonalInformation(\n\t\tid?: number,\n\t\tsignal?: AbortSignal\n\t): Promise\n\t{\n\t\tif(id == null)\n\t\t{\n\t\t\tthrow \"Employee id cannot be null\";\n\t\t}\n\n\t\tconst result = await this._apiClient.get(`/${this._identityService.identity.company?.id}/employee/${id}/update/personal-information`,\n\t\t\t{\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\n\t\treturn new EmployeeSignUp(result.data);\n\t}\n\n\tpublic async signUpEmployee(employee: EmployeeSignUp, signal?: AbortSignal): Promise\n\t{\n\t\tawait this._apiClient.post(`/${this._identityService.identity.company?.id}/employee/register`,\n\t\t\t{\n\t\t\t\tbody: employee.toJSON(this._identityService.identity.company!.hasMandatoryPlan),\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async getSignUpEmployeeData(signal?: AbortSignal): Promise\n\t{\n\t\tconst result = await this._apiClient.get(`/${this._identityService.identity.company?.id}/employee/register`,\n\t\t\t{\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\n\t\treturn new EmployeeSignUp(result.data);\n\t}\n\n\tpublic async updateAddressInformation(employee: EmployeeSignUp, signal?: AbortSignal): Promise\n\t{\n\t\tawait this._apiClient.post(`/${this._identityService.identity.company?.id}/employee/${employee.id}/update/address-information`,\n\t\t\t{\n\t\t\t\tbody: employee.address,\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async updateCompensationInformation(employee: EmployeeSignUp, signal?: AbortSignal): Promise\n\t{\n\t\tawait this._apiClient.post(`/${this._identityService.identity.company?.id}/employee/${employee.id}/update/compensation-information`,\n\t\t\t{\n\t\t\t\tbody: employee.compensationInformation.toJSON(),\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async updatePersonalInformation(employee: EmployeeSignUp, signal?: AbortSignal): Promise\n\t{\n\t\tawait this._apiClient.post(`/${this._identityService.identity.company?.id}/employee/${employee.id}/update/personal-information`,\n\t\t\t{\n\t\t\t\tbody: employee.personalInformation.toJSON(),\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\t}\n}\n","import clone from \"clone\";\n\nexport class AgreementDocument\n{\n /**\n * Creates a new instance of the type.\n * @param data The response data from which the instance should be created.\n */\n public constructor(data: any)\n {\n this.id = data.id;\n this.title = data.title;\n this.description = data.description;\n this.s3Key = data.s3Key;\n }\n\n public readonly id: number;\n\n public readonly title: string;\n\n public readonly description: string;\n\n public readonly s3Key: string;\n\n /**\n * Gets a clone of this instance, suitable for editing.\n */\n public clone(): any\n {\n return clone(this);\n }\n}\n","import clone from \"clone\";\n\nexport class CompanyDetailed\n{\n /**\n * Creates a new instance of the type.\n * @param data The response data from which the instance should be created.\n */\n public constructor(data: any)\n {\n this.name = data.name;\n this.cvrNumber = data.cvrNumber;\n }\n\n public readonly name: number;\n\n public readonly cvrNumber: string;\n\n /**\n * Gets a clone of this instance, suitable for editing.\n */\n public clone(): any\n {\n return clone(this);\n }\n}\n","import { AdministratorSimple, IdentityService } from \"company-dashboard/services/identity\";\nimport { autoinject } from \"aurelia-framework\";\nimport { ApiClient } from \"shared/infrastructure\";\nimport { AgreementDocument, CompanyDetailed } from \"..\";\n\nexport interface CompanyPageInformation\n{\n companyInformation: CompanyDetailed,\n agreementDocuments: AgreementDocument[],\n administrators: AdministratorSimple[]\n}\n\n/**\n * Represents a service that manages the company page.\n */\n@autoinject\nexport class CompanyService\n{\n /**\n * Creates a new instance of the type.\n * @param apiClient The `ApiClient` instance.\n * @param identityService The `IdentityService` instance.\n */\n public constructor(apiClient: ApiClient, identityService: IdentityService)\n {\n this._apiClient = apiClient;\n this._identityService = identityService;\n }\n\n private readonly _apiClient: ApiClient;\n private readonly _identityService: IdentityService;\n\n /**\n * Get the company information displayed in the .\n * @param signal The abort signal to use, or undefined to use no abort signal.\n * @returns A promise that will be resolved with a list of administrators.\n */\n public async getCompanyInformations(signal?: AbortSignal): Promise\n {\n const result = await this._apiClient.get(`/${this._identityService.identity.company?.id}/company`,\n {\n signal\n });\n\n return {\n companyInformation: new CompanyDetailed(result.data.companyInformation),\n administrators: result.data.administrators.map((administrator: any) => new AdministratorSimple(administrator)),\n agreementDocuments: result.data.documents.map((document: any) => new AgreementDocument(document))\n };\n }\n}\n","import { IdentityService } from \"company-dashboard/services/identity\";\nimport { autoinject } from \"aurelia-framework\";\nimport { ApiClient } from \"shared/infrastructure\";\nimport { PayrollSystemConnection, PayrollSystemResponse } from \"../entities/payroll-system-response\";\nimport { PayrollSystem } from \"../../shared\";\n\n@autoinject\nexport class PayrollSystemService\n{\n\tprivate readonly _apiClient: ApiClient;\n\tprivate readonly _identityService: IdentityService;\n\n\tpublic constructor(\n\t\tapiClient: ApiClient,\n\t\tidentityService: IdentityService)\n\t{\n\t\tthis._apiClient = apiClient;\n\t\tthis._identityService = identityService;\n\t}\n\n\tpublic async getPayrollSystemInformation(signal?: AbortSignal): Promise\n\t{\n\t\tconst response = await this._apiClient.get(\n\t\t\t`/${this._identityService.identity.company?.id}/payroll-system`,\n\t\t\t{\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\n\t\treturn new PayrollSystemResponse(response.data);\n\t}\n\n\tpublic async getZenegyAuthorizationUrl(signal?: AbortSignal): Promise\n\t{\n\t\tlet response = await this._apiClient.get(\n\t\t\t`/${this._identityService.identity.company?.id}/payroll-system/zenegy/authorization-url`,\n\t\t\t{\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\n\t\treturn response.data.url;\n\t}\n\n\tpublic async addPayrollSystemApiToken(apiToken: string, payrollSystem: PayrollSystem, signal?: AbortSignal): Promise\n\t{\n\t\tawait this._apiClient.post(\n\t\t\t`/${this._identityService.identity.company?.id}/payroll-system/add`,\n\t\t\t{\n\t\t\t\tbody: { apiToken: apiToken, payrollSystem: payrollSystem.value },\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async removePayrollSystemApiToken(connection: PayrollSystemConnection, signal?: AbortSignal): Promise\n\t{\n\t\tawait this._apiClient.post(\n\t\t\t`/${this._identityService.identity.company?.id}/payroll-system/delete/${connection.id}`,\n\t\t\t{\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\t}\n}\n","import clone from \"clone\";\nimport { CompanyTypeahead } from \"..\";\n\nexport class Company\n{\n\tpublic constructor()\n\t{\n\t\tthis.name = \"\";\n\t\tthis.cvrNumber = \"\";\n\t\tthis.phoneNumber = \"\";\n\t}\n\n\tpublic name: string;\n\n\tpublic cvrNumber: string;\n\n\tpublic phoneNumber: string;\n\n\tpublic mergeQueriedCompany(company: CompanyTypeahead): Company\n\t{\n\t\tthis.cvrNumber = company.cvrNumber;\n\t\tthis.name = company.name;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets a clone of this instance, suitable for editing.\n\t */\n\tpublic clone(): any\n\t{\n\t\treturn clone(this);\n\t}\n}\n","import clone from \"clone\";\n\nexport class Administrator\n{\n\tpublic constructor()\n\t{\n\t\tthis.firstName = \"\";\n\t\tthis.lastName = \"\";\n\t\tthis.email = \"\";\n\t\tthis.password = \"\";\n\t\tthis.receiveMarketingEmails = false;\n\t}\n\n\tpublic firstName: string;\n\n\tpublic lastName: string;\n\n\tpublic email: string;\n\n\tpublic password: string\n\n\tpublic receiveMarketingEmails: boolean;\n\n\t/**\n\t * Gets a clone of this instance, suitable for editing.\n\t */\n\tpublic clone(): any\n\t{\n\t\treturn clone(this);\n\t}\n\n\tpublic get fullName(): string\n\t{\n\t\treturn `${this.firstName} ${this.lastName}`;\n\t}\n}\n","import clone from \"clone\";\n\nexport class CompanyTypeahead\n{\n\tpublic constructor(data: any)\n\t{\n\t\tthis.name = data.name;\n\t\tthis.cvrNumber = data.cvr;\n\t}\n\n\tpublic readonly name: string;\n\n\tpublic readonly cvrNumber: string;\n\n\t/**\n\t * Gets a clone of this instance, suitable for editing.\n\t */\n\tpublic clone(): any\n\t{\n\t\treturn clone(this);\n\t}\n}\n","import { IdentityService } from \"company-dashboard/services/identity\";\nimport { autoinject } from \"aurelia-framework\";\nimport { ApiClient } from \"shared/infrastructure\";\nimport { Administrator, Company, CompanyTypeahead } from \"..\";\n\n@autoinject\nexport class SignUpCompanyService\n{\n\tprivate readonly _apiClient: ApiClient;\n\tprivate readonly _identityService: IdentityService;\n\n\tpublic constructor(\n\t\tapiClient: ApiClient,\n\t\tidentityService: IdentityService)\n\t{\n\t\tthis._apiClient = apiClient;\n\t\tthis._identityService = identityService;\n\t}\n\n\tpublic async searchForCompany(\n\t\tquery: string,\n\t\tsignal?: AbortSignal): Promise\n\t{\n\t\tconst response = await this._apiClient.get(\n\t\t\t\"/company/typeahead\",\n\t\t\t{\n\t\t\t\tquery: { companyName: query },\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\n\t\treturn response.data.map(companyData => new CompanyTypeahead(companyData));\n\t}\n\n\tpublic async signUpCompany(\n\t\tcompany: Company,\n\t\tadministrator: Administrator,\n\t\tsignal?: AbortSignal): Promise\n\t{\n\t\tconst response = await this._apiClient.post(\n\t\t\t\"/company/register\",\n\t\t\t{\n\t\t\t\tbody: { administrator: administrator, ...company },\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\n\t\ttry\n\t\t{\n\t\t\tthis._identityService.identity.setTokens(response.data.accessToken, response.data.refreshToken);\n\t\t}\n\t\tfinally\n\t\t{\n\t\t\tthis._identityService.configureInfrastructure();\n\t\t}\n\t}\n}\n","import { autoinject } from \"aurelia-framework\";\nimport { ApiClient } from \"shared/infrastructure\";\n\n@autoinject\nexport class AdministratorExistsService\n{\n\tprivate readonly _apiClient: ApiClient;\n\n\tpublic constructor(apiClient: ApiClient)\n\t{\n\t\tthis._apiClient = apiClient;\n\t}\n\n\tpublic async exists(administratorEmail: string, signal?: AbortSignal): Promise\n\t{\n\t\tvar result = await this._apiClient.post(\n\t\t\t\"/administrator/exists\",\n\t\t\t{\n\t\t\t\tbody: { email: administratorEmail },\n\t\t\t\tsignal\n\t\t\t}\n\t\t);\n\n\t\treturn result.data.exists;\n\t}\n}\n","import { AgreementDocument } from \"company-dashboard/model/dashboard/company\";\nimport { IdentityService } from \"company-dashboard/services/identity\";\nimport { autoinject } from \"aurelia-framework\";\nimport { ApiClient } from \"shared/infrastructure\";\nimport { SignedDocument, UnsignedDocument } from \"..\";\n\n/**\n * Represents a service that manages the agreement document page in sign up.\n */\n@autoinject\nexport class AgreementDocumentsService\n{\n /**\n * Creates a new instance of the type.\n * @param apiClient The `ApiClient` instance.\n * @param identityService The `IdentityService` instance.\n */\n public constructor(apiClient: ApiClient, identityService: IdentityService)\n {\n this._apiClient = apiClient;\n this._identityService = identityService;\n }\n\n private readonly _apiClient: ApiClient;\n private readonly _identityService: IdentityService;\n\n /**\n * Get the agreement documents ready to be read by the administrator.\n * @param signal The abort signal to use, or undefined to use no abort signal.\n * @returns A promise that will be resolved with a list of agreement document data.\n */\n public async getAgreementDocuments(signal?: AbortSignal): Promise\n {\n const result = await this._apiClient.get(`/${this._identityService.identity.company?.id}/agreement-documents`,\n {\n signal\n });\n\n return result.data.documents.map(documentData => new AgreementDocument(documentData));\n }\n\n /**\n * Marks the agreements as having been read in the database.\n * @param signal The abort signal to use, or undefined to use no abort signal.\n */\n public async setDocumentsRead(signal?: AbortSignal): Promise\n {\n await this._apiClient.post(`/${this._identityService.identity.company?.id}/documents/read`,\n {\n body:\n {\n documentsRead: true\n },\n signal\n });\n }\n\n /**\n * @param signal The abort signal to use, or undefined to use no abort signal.\n */\n public async getDocumentToSign(signal?: AbortSignal): Promise<{ hasUnsignedDocuments: boolean, unsignedDocument?: UnsignedDocument }>\n {\n const result = await this._apiClient.get(`/${this._identityService.identity.company?.id}/documents/unsigned`,\n {\n signal\n });\n\n return {\n hasUnsignedDocuments: result.data.hasUnsignedDocuments,\n unsignedDocument: result.data.unsignedDocument != null ? new UnsignedDocument(result.data.unsignedDocument) : undefined\n }\n }\n\n /**\n * @param signal The abort signal to use, or undefined to use no abort signal.\n */\n public async getDocumentsSigningUrl(signal?: AbortSignal): Promise\n {\n const result = await this._apiClient.get(`/${this._identityService.identity.company?.id}/documents/signing-url`,\n {\n signal\n });\n\n return result.data.url;\n }\n\n /**\n * @param signal The abort signal to use, or undefined to use no abort signal.\n */\n public async setSignedDocuments(signal?: AbortSignal): Promise\n {\n await this._apiClient.post(`/${this._identityService.identity.company?.id}/documents/signed`,\n {\n signal\n });\n }\n\n /**\n * @param signal The abort signal to use, or undefined to use no abort signal.\n */\n public async signDocument(signedDocument: SignedDocument, signal?: AbortSignal): Promise\n {\n await this._apiClient.post(`/${this._identityService.identity.company?.id}/documents/sign`,\n {\n body: signedDocument.toJSON(),\n signal\n });\n }\n}\n","import clone from \"clone\";\nimport { DocumentSigningGroup } from \"..\";\n\nexport class SignedDocument\n{\n /**\n * Creates a new instance of the type.\n * @param data The response data from which the instance should be created.\n */\n public constructor(\n documentSigningGroup: DocumentSigningGroup,\n signedDocument: string)\n {\n this.signingGroup = documentSigningGroup;\n this.signedDocument = signedDocument;\n }\n\n public readonly signingGroup: DocumentSigningGroup;\n\n public readonly signedDocument: string;\n\n /**\n * Gets a clone of this instance, suitable for editing.\n */\n public clone(): any\n {\n return clone(this);\n }\n\n\t/**\n\t * Gets the data representing this instance.\n\t */\n\tpublic toJSON(): any\n\t{\n\t\treturn {\n signedDocument: this.signedDocument,\n signingGroup: this.signingGroup.value\n\t\t};\n\t}\n}\n","import clone from \"clone\";\nimport { DocumentSigningGroup } from \"..\";\n\nexport class UnsignedDocument\n{\n /**\n * Creates a new instance of the type.\n * @param data The response data from which the instance should be created.\n */\n public constructor(data: any)\n {\n this.documentSigningGroup = this.documentSigningGroupFromJSON(data.signingGroupNumber);\n this.currentSigningGroupNumber = data.currentSigningGroupNumber;\n this.totalSigningGroups = data.totalSigningGroups;\n this.agreementCompanyName = data.agreementCompanyName;\n this.signingGroupText = data.signingGroupText;\n }\n\n public readonly documentSigningGroup: DocumentSigningGroup;\n\n public readonly currentSigningGroupNumber: number;\n\n public readonly totalSigningGroups: number;\n\n public readonly agreementCompanyName: string;\n\n public readonly signingGroupText: string;\n\n /**\n * Create a new instance of this using JSON data\n */\n public documentSigningGroupFromJSON(value: number): DocumentSigningGroup\n {\n if (value === 1)\n {\n return new DocumentSigningGroup(\"velliv\");\n }\n else if (value === 2)\n {\n return new DocumentSigningGroup(\"grandhood\");\n }\n\n return new DocumentSigningGroup(\"non-signing-group\");\n }\n\n /**\n * Gets a clone of this instance, suitable for editing.\n */\n public clone(): any\n {\n return clone(this);\n }\n}\n","import { textCase } from \"shared/utilities\";\n\n/**\n * Represents the slug identifying a `DocumentSigningGroup`.\n * A document signing group is essentially a grouping of signed or unsigned documents.\n */\nexport type DocumentSigningGroupSlug = keyof typeof DocumentSigningGroup.values;\n\n/**\n * Represents the document singing group.\n */\nexport class DocumentSigningGroup\n{\n /**\n * Creates a new instance of the type.\n * @param slug The slug identifying the document signing group.\n */\n public constructor(slug: DocumentSigningGroupSlug)\n {\n this.slug = textCase(slug, \"pascal\", \"kebab\") as any;\n Object.assign(this, DocumentSigningGroup.values[this.slug]);\n }\n\n public slug: DocumentSigningGroupSlug;\n public name: string;\n public value: number;\n\n /**\n * Gets the data representing this instance.\n */\n public toJSON(): any\n {\n return this.value;\n }\n\n /**\n * The supported values.\n */\n public static readonly values =\n {\n \"velliv\":\n {\n name: \"Velliv\",\n value: 1\n },\n \"grandhood\":\n {\n name: \"Grandhood\",\n value: 2\n },\n \"non-signing-group\":\n {\n name: \"Non-signing group\",\n value: 0\n }\n };\n}\n","export { DeviceService } from \"./device-service\";\r\n","let nextId = 0;\r\n\r\nexport namespace Sequential\r\n{\r\n\t/**\r\n\t * Gets the next numeric sequential ID, starting from 0.\r\n\t * Note that this is only unique within the app session.\r\n\t * @returns The next sequential numeric ID.\r\n\t */\r\n\texport function next(): number\r\n\t{\r\n\t\treturn nextId++;\r\n\t}\r\n}\r\n","/**\r\n * Namespace providing methods for generating random alpha-numeric IDs.\r\n * Note that this relies on the `Crypto` API provided by the platform.\r\n */\r\nexport namespace AlphaNumeric\r\n{\r\n\t/**\r\n\t * Generates a random alpha-numeric ID.\r\n\t * @param length The desired length of the ID.\r\n\t * @returns A string representing the generated ID.\r\n\t */\r\n\texport function next(length: number): string\r\n\t{\r\n\t\tconst values = new Uint8Array(length / 2);\r\n\r\n\t\tcrypto.getRandomValues(values);\r\n\r\n\t\treturn Array.from(values, getHexCode).join(\"\");\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the HEX code for the specified integer value.\r\n\t * @param value The integer value, in the range [0, 255].\r\n\t * @returns The HEX code, in the range [00, ff].\r\n\t */\r\n\tfunction getHexCode(value: number): string\r\n\t{\r\n\t\treturn (`0${value.toString(16)}`).substr(-2);\r\n\t}\r\n}\r\n","import { textJoin } from \"./text-join\";\r\n\r\n/**\r\n * Represents the text case formats a text may be converted to or from.\r\n */\r\nexport type TextCase = \"space\" | \"upper\" | \"lower\" | \"sentence\" | \"title\" | \"pascal\" | \"camel\" | \"kebab\" | \"snake\";\r\n\r\n/**\r\n * Represents a function that formats and joins the specified strings using the rules of a specific text case.\r\n * @param strings The strings to join, which may be either words or whitespace.\r\n */\r\nexport type TextCaseFunc = (strings: string[], localized?: boolean, aggressive?: boolean) => string;\r\n\r\n/**\r\n * Provides functions that format and join strings using the rules of a text case.\r\n */\r\nexport namespace TextCaseFuncs\r\n{\r\n\t/**\r\n\t * Formats and joins the specified strings using 'space case' rules,\r\n\t * meaning that no changes will be made to the strings.\r\n\t * The strings will then be joined using a single space as separator, except if\r\n\t * the previous string is all whitespace, in which case no separator will be inserted.\r\n\t * @param strings The strings to join, which may be either words or whitespace.\r\n\t * @param localized True to use the rules of the current locale when upper-casing or lower-casing, otherwise false.\r\n\t * @returns The formatted and joined string.\r\n\t */\r\n\texport function spaceCase(strings: string[]): string\r\n\t{\r\n\t\treturn textJoin(strings, \" \");\r\n\t}\r\n\r\n\t/**\r\n\t * Formats and joins the specified strings using 'UPPER CASE' rules,\r\n\t * meaning that all characters will be upper-cased,\r\n\t * The strings will then be joined using a single space as separator, except if\r\n\t * the previous string is all whitespace, in which case no separator will be inserted.\r\n\t * @param strings The strings to join, which may be either a single string, words or whitespace.\r\n\t * @param localized True to use the rules of the current locale when upper-casing or lower-casing, otherwise false.\r\n\t * @returns The formatted and joined string.\r\n\t */\r\n\texport function upperCase(strings: string[], localized = false): string\r\n\t{\r\n\t\tif (localized)\r\n\t\t{\r\n\t\t\treturn textJoin(strings.map(s => s.toLocaleUpperCase()), \" \");\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn textJoin(strings.map(s => s.toUpperCase()), \" \");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Formats and joins the specified strings using 'lower case' rules,\r\n\t * meaning that all characters will be lower-cased.\r\n\t * The strings will then be joined using a single space as separator, except if\r\n\t * the previous string is all whitespace, in which case no separator will be inserted.\r\n\t * @param strings The strings to join, which may be either a single string, words or whitespace.\r\n\t * @param localized True to use the rules of the current locale when upper-casing or lower-casing, otherwise false.\r\n\t * @returns The formatted and joined string.\r\n\t */\r\n\texport function lowerCase(strings: string[], localized = false): string\r\n\t{\r\n\t\tif (localized)\r\n\t\t{\r\n\t\t\treturn textJoin(strings.map(s => s.toLocaleLowerCase()), \" \");\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn textJoin(strings.map(s => s.toLowerCase()), \" \");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Formats and joins the specified strings using 'Sentence case' rules,\r\n\t * meaning that the first letter of the first string will be upper-cased while all remaining characters will be either unchanged or lower-cased.\r\n\t * The strings will then be joined using a single space as separator, except if\r\n\t * the previous string is all whitespace, in which case no separator will be inserted.\r\n\t * @param strings The strings to join, which may be either a single string, words or whitespace.\r\n\t * @param localized True to use the rules of the current locale when upper-casing or lower-casing, otherwise false. The default is false.\r\n\t * @param aggressive True to both upper-case the first letter and lower-case the remaining characters, false to leave the remaining characters unchanged. The default is false.\r\n\t * @returns The formatted and joined string.\r\n\t */\r\n\texport function sentenceCase(strings: string[], localized = false, aggressive = false): string\r\n\t{\r\n\t\tif (aggressive)\r\n\t\t{\r\n\t\t\tconst first = strings.slice(0, 1).map(s => upperCase([s.charAt(0)], localized) + s.slice(1));\r\n\r\n\t\t\tconst rest = lowerCase(strings.slice(1), localized);\r\n\r\n\t\t\treturn textJoin(first.concat(rest), \" \");\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tconst first = strings.slice(0, 1).map(s => upperCase([s.charAt(0)], localized) + s.slice(1));\r\n\r\n\t\t\tconst rest = strings.slice(1);\r\n\r\n\t\t\treturn textJoin(first.concat(rest), \" \");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Formats and joins the specified strings using 'Title Case' rules,\r\n\t * meaning that the first letter of each string will be upper-cased while all remaining characters will be lower-cased.\r\n\t * The strings will then be joined using a single space as separator, except if\r\n\t * the previous string is all whitespace, in which case no separator will be inserted.\r\n\t * @param strings The strings to join, which may be either words or whitespace.\r\n\t * @param localized True to use the rules of the current locale when upper-casing or lower-casing, otherwise false.\r\n\t * @param aggressive True to both upper-case the first letter and lower-case the remaining characters, false to leave the remaining characters unchanged. The default is false.\r\n\t * @returns The formatted and joined string.\r\n\t */\r\n\texport function titleCase(strings: string[], localized = false, aggressive = false): string\r\n\t{\r\n\t\tif (aggressive)\r\n\t\t{\r\n\t\t\tconst all = strings.map(s => upperCase([s.charAt(0)], localized) + lowerCase([s.slice(1)], localized));\r\n\r\n\t\t\treturn textJoin(all, \" \");\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tconst all = strings.map(s => upperCase([s.charAt(0)], localized) + s.slice(1));\r\n\r\n\t\t\treturn textJoin(all, \" \");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Formats and joins the specified strings using 'PascalCase' rules,\r\n\t * meaning that the first letter of each string will be upper-cased while all remaining characters will be lower-cased.\r\n\t * The strings will then be joined.\r\n\t * @param strings The strings to join, which may be either words or whitespace.\r\n\t * @param localized True to use the rules of the current locale when upper-casing or lower-casing, otherwise false.\r\n\t * @returns The formatted and joined string.\r\n\t */\r\n\texport function pascalCase(strings: string[], localized = false): string\r\n\t{\r\n\t\tconst filtered = strings.filter(s => !/^\\s*$/.test(s));\r\n\r\n\t\treturn filtered.map(s => upperCase([s.charAt(0)], localized) + lowerCase([s.slice(1)], localized)).join(\"\");\r\n\t}\r\n\r\n\t/**\r\n\t * Formats and joins the specified strings using 'camelCase' rules,\r\n\t * meaning that the first letter of each string, except the first, will be upper-cased while all remaining characters of each will be lower-cased.\r\n\t * The strings will then be joined.\r\n\t * @param strings The strings to join, which may be either words or whitespace.\r\n\t * @param localized True to use the rules of the current locale when upper-casing or lower-casing, otherwise false.\r\n\t * @returns The formatted and joined string.\r\n\t */\r\n\texport function camelCase(strings: string[], localized = false): string\r\n\t{\r\n\t\tconst filtered = strings.filter(s => !/^\\s*$/.test(s));\r\n\r\n\t\tconst first = lowerCase(filtered.slice(0, 1), localized);\r\n\r\n\t\tconst rest = filtered.slice(1).map(s => upperCase([s.charAt(0)], localized) + lowerCase([s.slice(1)], localized));\r\n\r\n\t\treturn [first].concat(rest).join(\"\");\r\n\t}\r\n\r\n\t/**\r\n\t * Formats and joins the specified strings using 'kebab-case' rules,\r\n\t * meaning that each string will be lower cased.\r\n\t * The strings will then be joined using `-` as separator, except if the previous string is all whitespace,\r\n\t * in which case each of those whitespace characters will be replaced with the separator instead.\r\n\t * @param strings The strings to join, which may be either words or whitespace.\r\n\t * @param localized True to use the rules of the current locale when upper-casing or lower-casing, otherwise false.\r\n\t * @returns The formatted and joined string.\r\n\t */\r\n\texport function kebabCase(strings: string[], localized = false): string\r\n\t{\r\n\t\treturn textJoin(strings.map(s => lowerCase([s], localized), localized), \"-\");\r\n\t}\r\n\r\n\t/**\r\n\t * Formats and joins the specified strings using 'snake_case' rules,\r\n\t * meaning that each string will be lower cased.\r\n\t * The strings will then be joined using `_` as separator, except if the previous string is all whitespace,\r\n\t * in which case each of those whitespace characters will be replaced with the separator instead.\r\n\t * @param strings The strings to join, which may be either words or whitespace.\r\n\t * @param localized True to use the rules of the current locale when upper-casing or lower-casing, otherwise false.\r\n\t * @returns The formatted and joined string.\r\n\t */\r\n\texport function snakeCase(strings: string[], localized = false): string\r\n\t{\r\n\t\treturn textJoin(strings.map(s => lowerCase([s], localized), localized), \"_\");\r\n\t}\r\n}\r\n","const ua = navigator.userAgent;\r\n\r\nexport function ios(): boolean\r\n{\r\n\treturn !/\\blike\\b.*\\b(iPod|iPhone|iPad)\\b/.test(ua) && /\\b(iPod|iPhone|iPad)\\b/.test(ua) && !windowsMobile();\r\n}\r\n\r\nexport function macos(): boolean\r\n{\r\n\treturn !/\\blike\\b.*\\bMac OS\\b/.test(ua) && /\\bMac OS\\b/.test(ua) && !windowsMobile();\r\n}\r\n\r\nexport function android(): boolean\r\n{\r\n\treturn !/\\blike\\b.*\\bAndroid\\b/.test(ua) && /\\bAndroid\\b/.test(ua) && !windowsMobile();\r\n}\r\n\r\nexport function windows(): boolean\r\n{\r\n\treturn !/\\blike\\b.*\\bWindows\\b/.test(ua) && /\\bWindows\\b/.test(ua) && !windowsMobile();\r\n}\r\n\r\nexport function windowsMobile(): boolean\r\n{\r\n\treturn !/\\blike\\b.*\\b(IEMobile|Windows Phone)\\b/.test(ua) && /\\b(IEMobile|Windows Phone)\\b/.test(ua);\r\n}\r\n","/**\r\n * Returns true if `sessionStorage` is supported and writable, otherwise false.\r\n */\r\nexport function sessionStorage(): boolean\r\n{\r\n\ttry\r\n\t{\r\n\t\tconst key = \"__test__\";\r\n\t\twindow.sessionStorage.setItem(key, \"\");\r\n\t\twindow.sessionStorage.removeItem(key);\r\n\r\n\t\treturn true;\r\n\t}\r\n\tcatch (error)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\n/**\r\n * Returns true if `localStorage` is supported and writable, otherwise false.\r\n */\r\nexport function localStorage(): boolean\r\n{\r\n\ttry\r\n\t{\r\n\t\tconst key = \"__test__\";\r\n\t\twindow.localStorage.setItem(key, \"\");\r\n\t\twindow.localStorage.removeItem(key);\r\n\r\n\t\treturn true;\r\n\t}\r\n\tcatch (error)\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\n/**\r\n * Returns true if the user agent indicates it prefers a dark color scheme, otherwise false.\r\n */\r\nexport function darkMode(): boolean\r\n{\r\n\treturn window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\r\n}\r\n","import { computedFrom } from \"aurelia-binding\";\r\nimport { DateTime, DurationLikeObject } from \"luxon\";\r\nimport { textCase } from \"shared/utilities\";\r\nimport { DatePickerCustomElement } from \"../date-picker\";\r\n\r\n/**\r\n * Represents the model for the dates view.\r\n */\r\nexport class DatesModel\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param datePicker The `DatePickerCustomElement` owning the item.\r\n\t */\r\n\tpublic constructor(datePicker: DatePickerCustomElement)\r\n\t{\r\n\t\tthis._datePicker = datePicker;\r\n\t}\r\n\r\n\tprivate readonly _datePicker: DatePickerCustomElement;\r\n\r\n\t/**\r\n\t * The title to show.\r\n\t */\r\n\t@computedFrom(\"_datePicker.cursor\")\r\n\tpublic get title(): string\r\n\t{\r\n\t\treturn textCase([this._datePicker.cursor.toFormat(\"MMM yyyy\")], \"sentence\");\r\n\t}\r\n\r\n\t/**\r\n\t * The items to present.\r\n\t */\r\n\t@computedFrom(\"_datePicker.cursor\")\r\n\tpublic get items(): DateItem[]\r\n\t{\r\n\t\tconst items: DateItem[] = [];\r\n\r\n\t\tfor (let i = 0; i < 42; i++)\r\n\t\t{\r\n\t\t\tconst date = this._datePicker.cursor.startOf(\"month\").startOf(\"week\").plus({ days: i });\r\n\t\t\titems.push(new DateItem(this._datePicker, date));\r\n\t\t}\r\n\r\n\t\treturn items;\r\n\t}\r\n\r\n\t/**\r\n\t * True if today is outside the selectable range, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.cursor\", \"_datePicker.minValue\", \"_datePicker.maxValue\")\r\n\tpublic get isPreviousDisabled(): boolean\r\n\t{\r\n\t\tconst date = this._datePicker.cursor.startOf(\"month\").minus({ day: 1 });\r\n\t\tconst item = new DateItem(this._datePicker, date);\r\n\r\n\t\treturn item.isDisabled;\r\n\t}\r\n\r\n\t/**\r\n\t * True if today is outside the selectable range, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.cursor\", \"_datePicker.minValue\", \"_datePicker.maxValue\")\r\n\tpublic get isNextDisabled(): boolean\r\n\t{\r\n\t\tconst date = this._datePicker.cursor.startOf(\"month\").plus({ month: 1 });\r\n\t\tconst item = new DateItem(this._datePicker, date);\r\n\r\n\t\treturn item.isDisabled;\r\n\t}\r\n\r\n\t/**\r\n\t * True if today is outside the selectable range, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.today\", \"_datePicker.minValue\", \"_datePicker.maxValue\")\r\n\tpublic get isTodayDisabled(): boolean\r\n\t{\r\n\t\tconst item = new DateItem(this._datePicker, this._datePicker.today);\r\n\r\n\t\treturn item.isDisabled;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the `Previous` icon is clicked.\r\n\t * Navigates to the previous month.\r\n\t */\r\n\tpublic onPreviousClick(): void\r\n\t{\r\n\t\tthis._datePicker.cursor = this._datePicker.cursor.minus({ month: 1 });\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the `Next` icon is clicked.\r\n\t * Navigates to the next month.\r\n\t */\r\n\tpublic onNextClick(): void\r\n\t{\r\n\t\tthis._datePicker.cursor = this._datePicker.cursor.plus({ month: 1 });\r\n\t}\r\n\r\n\t/**\r\n\t * Called when an item is clicked.\r\n\t * Sets the `value` property to the date represented by the clicked item.\r\n\t * @param item The item being clicked.\r\n\t */\r\n\tpublic onItemClick(item: DateItem): void\r\n\t{\r\n\t\tif (!item.isDisabled)\r\n\t\t{\r\n\t\t\tthis._datePicker.changeValue(item.date, true);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the `Today` button is clicked.\r\n\t * Sets the `value` property to the date of today.\r\n\t */\r\n\tpublic onTodayClick(): void\r\n\t{\r\n\t\tthis._datePicker.changeValue(this._datePicker.today);\r\n\t\tthis._datePicker.cursor = this._datePicker.today;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed within the focused element.\r\n\t * Handles keyboard navigation within the view.\r\n\t * @param event The keyboard event.\r\n\t */\r\n\tpublic onKeyDown(event: KeyboardEvent): void\r\n\t{\r\n\t\tif (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (event.key === \"Enter\")\r\n\t\t{\r\n\t\t\tthis._datePicker.changeValue(this._datePicker.focusedValue, true);\r\n\t\t\tevent.preventDefault();\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet offset: DurationLikeObject | undefined;\r\n\r\n\t\tswitch (event.key)\r\n\t\t{\r\n\t\t\tcase \"PageUp\": offset = { month: -1 }; break;\r\n\t\t\tcase \"PageDown\": offset = { month: 1 }; break;\r\n\t\t\tcase \"ArrowUp\": offset = { day: -7 }; break;\r\n\t\t\tcase \"ArrowDown\": offset = { day: 7 }; break;\r\n\t\t\tcase \"ArrowLeft\": offset = { day: -1 }; break;\r\n\t\t\tcase \"ArrowRight\": offset = { day: 1 }; break;\r\n\t\t}\r\n\r\n\t\tif (offset != null)\r\n\t\t{\r\n\t\t\tconst value = (this._datePicker.focusedValue?.startOf(\"day\") || this._datePicker.today).plus(offset);\r\n\t\t\tconst item = new DateItem(this._datePicker, value);\r\n\r\n\t\t\tif (!item.isDisabled)\r\n\t\t\t{\r\n\t\t\t\tthis._datePicker.changeValue(value);\r\n\t\t\t}\r\n\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Represents an item in the date grid.\r\n */\r\nexport class DateItem\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param datePicker The `DatePickerCustomElement` owning the item.\r\n\t * @param date The date represented by the item.\r\n\t */\r\n\tpublic constructor(datePicker: DatePickerCustomElement, date: DateTime)\r\n\t{\r\n\t\tthis._datePicker = datePicker;\r\n\t\tthis.date = date;\r\n\t}\r\n\r\n\tprivate readonly _datePicker: DatePickerCustomElement;\r\n\r\n\t/**\r\n\t * The date represented by this item.\r\n\t */\r\n\tpublic readonly date: DateTime;\r\n\r\n\t/**\r\n\t * The value to display.\r\n\t */\r\n\t@computedFrom(\"date\")\r\n\tpublic get displayValue(): string\r\n\t{\r\n\t\treturn this.date.day.toString();\r\n\t}\r\n\r\n\t/**\r\n\t * True if the date matches the date of today, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.today\")\r\n\tpublic get isToday(): boolean\r\n\t{\r\n\t\treturn this.date.hasSame(this._datePicker.today, \"day\");\r\n\t}\r\n\r\n\t/**\r\n\t * True if the date matches the selected date, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.focusedValue\")\r\n\tpublic get isSelected(): boolean\r\n\t{\r\n\t\treturn this._datePicker.focusedValue != null && this.date.hasSame(this._datePicker.focusedValue, \"day\");\r\n\t}\r\n\r\n\t/**\r\n\t * True if the date is outside the month of the cursor, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.cursor\")\r\n\tpublic get isOutsideRange(): boolean\r\n\t{\r\n\t\treturn !this.date.hasSame(this._datePicker.cursor, \"month\");\r\n\t}\r\n\r\n\t/**\r\n\t * True if the date is disabled, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.minValue\", \"_datePicker.maxValue\", \"date\")\r\n\tpublic get isDisabled(): boolean\r\n\t{\r\n\t\treturn (\r\n\t\t\tthis._datePicker.minValue != null && this.date.startOf(\"day\").diff(this._datePicker.minValue.startOf(\"day\")).valueOf() < 0 ||\r\n\t\t\tthis._datePicker.maxValue != null && this.date.startOf(\"day\").diff(this._datePicker.maxValue.startOf(\"day\")).valueOf() > 0\r\n\t\t);\r\n\t}\r\n}\r\n","import { computedFrom } from \"aurelia-binding\";\r\nimport { DateTime, DurationLikeObject } from \"luxon\";\r\nimport { DatePickerCustomElement } from \"../date-picker\";\r\n\r\n/**\r\n * Represents the model for the months view.\r\n */\r\nexport class MonthsModel\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param datePicker The `DatePickerCustomElement` owning the item.\r\n\t */\r\n\tpublic constructor(datePicker: DatePickerCustomElement)\r\n\t{\r\n\t\tthis._datePicker = datePicker;\r\n\t}\r\n\r\n\tprivate readonly _datePicker: DatePickerCustomElement;\r\n\r\n\t/**\r\n\t * The title to show.\r\n\t */\r\n\t@computedFrom(\"_datePicker.cursor\")\r\n\tpublic get title(): string\r\n\t{\r\n\t\treturn this._datePicker.cursor.toFormat(\"yyyy\");\r\n\t}\r\n\r\n\t/**\r\n\t * The items to present.\r\n\t */\r\n\t@computedFrom(\"_datePicker.cursor\")\r\n\tpublic get items(): MonthItem[]\r\n\t{\r\n\t\tconst items: MonthItem[] = [];\r\n\r\n\t\tfor (let i = 0; i < 12; i++)\r\n\t\t{\r\n\t\t\tconst date = this._datePicker.cursor.startOf(\"year\").plus({ months: i });\r\n\t\t\titems.push(new MonthItem(this._datePicker, date));\r\n\t\t}\r\n\r\n\t\treturn items;\r\n\t}\r\n\r\n\t/**\r\n\t * True if today is outside the selectable range, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.cursor\", \"_datePicker.minValue\", \"_datePicker.maxValue\")\r\n\tpublic get isPreviousDisabled(): boolean\r\n\t{\r\n\t\tconst date = this._datePicker.cursor.startOf(\"year\").minus({ months: 1 });\r\n\t\tconst item = new MonthItem(this._datePicker, date);\r\n\r\n\t\treturn item.isDisabled;\r\n\t}\r\n\r\n\t/**\r\n\t * True if today is outside the selectable range, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.cursor\", \"_datePicker.minValue\", \"_datePicker.maxValue\")\r\n\tpublic get isNextDisabled(): boolean\r\n\t{\r\n\t\tconst date = this._datePicker.cursor.startOf(\"year\").plus({ year: 1 });\r\n\t\tconst item = new MonthItem(this._datePicker, date);\r\n\r\n\t\treturn item.isDisabled;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the `Previous` icon is clicked.\r\n\t * Navigates to the previous month.\r\n\t */\r\n\tpublic onPreviousClick(): void\r\n\t{\r\n\t\tthis._datePicker.cursor = this._datePicker.cursor.minus({ year: 1 });\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the `Next` icon is clicked.\r\n\t * Navigates to the next month.\r\n\t */\r\n\tpublic onNextClick(): void\r\n\t{\r\n\t\tthis._datePicker.cursor = this._datePicker.cursor.plus({ year: 1 });\r\n\t}\r\n\r\n\t/**\r\n\t * Called when an item is clicked.\r\n\t * Sets the `value` property to the date represented by the clicked item.\r\n\t * @param item The item being clicked.\r\n\t */\r\n\tpublic onItemClick(item: MonthItem): void\r\n\t{\r\n\t\tif (!item.isDisabled)\r\n\t\t{\r\n\t\t\tthis._datePicker.cursor = item.date;\r\n\t\t\tthis._datePicker.view = \"dates\";\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed within the focused element.\r\n\t * Handles keyboard navigation within the view.\r\n\t * @param event The keyboard event.\r\n\t */\r\n\tpublic onKeyDown(event: KeyboardEvent): void\r\n\t{\r\n\t\tif (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (event.key === \"Enter\")\r\n\t\t{\r\n\t\t\tif (this._datePicker.focusedValue != null)\r\n\t\t\t{\r\n\t\t\t\tthis._datePicker.view = \"dates\";\r\n\t\t\t}\r\n\r\n\t\t\tevent.preventDefault();\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet offset: DurationLikeObject | undefined;\r\n\r\n\t\tswitch (event.key)\r\n\t\t{\r\n\t\t\tcase \"PageUp\": offset = { year: -1 }; break;\r\n\t\t\tcase \"PageDown\": offset = { year: 1 }; break;\r\n\t\t\tcase \"ArrowUp\": offset = { month: -3 }; break;\r\n\t\t\tcase \"ArrowDown\": offset = { month: 3 }; break;\r\n\t\t\tcase \"ArrowLeft\": offset = { month: -1 }; break;\r\n\t\t\tcase \"ArrowRight\": offset = { month: 1 }; break;\r\n\t\t}\r\n\r\n\t\tif (offset != null)\r\n\t\t{\r\n\t\t\tconst value = (this._datePicker.focusedValue?.startOf(\"day\") || this._datePicker.today).plus(offset);\r\n\t\t\tconst item = new MonthItem(this._datePicker, value);\r\n\r\n\t\t\tif (!item.isDisabled)\r\n\t\t\t{\r\n\t\t\t\tthis._datePicker.changeValue(value);\r\n\t\t\t}\r\n\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Represents an item in the month grid.\r\n */\r\nclass MonthItem\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param datePicker The `DatePickerCustomElement` owning the item.\r\n\t * @param date The cursor date represented by the item.\r\n\t */\r\n\tpublic constructor(datePicker: DatePickerCustomElement, date: DateTime)\r\n\t{\r\n\t\tthis._datePicker = datePicker;\r\n\t\tthis.date = date;\r\n\t}\r\n\r\n\tprivate readonly _datePicker: DatePickerCustomElement;\r\n\r\n\t/**\r\n\t * The cursor date represented by this item.\r\n\t */\r\n\tpublic readonly date: DateTime;\r\n\r\n\t/**\r\n\t * The value to display.\r\n\t */\r\n\t@computedFrom(\"date\")\r\n\tpublic get displayValue(): string\r\n\t{\r\n\t\treturn this.date.toFormat(\"MMM\");\r\n\t}\r\n\r\n\t/**\r\n\t * True if the month matches the month of today, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.today\")\r\n\tpublic get isToday(): boolean\r\n\t{\r\n\t\treturn this.date.hasSame(this._datePicker.today, \"month\");\r\n\t}\r\n\r\n\t/**\r\n\t * True if the month matches the month of the selected date, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.focusedValue\")\r\n\tpublic get isSelected(): boolean\r\n\t{\r\n\t\treturn this._datePicker.focusedValue != null && this.date.hasSame(this._datePicker.focusedValue, \"month\");\r\n\t}\r\n\r\n\t/**\r\n\t * True if the month is outside the year of the cursor date, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.cursor\")\r\n\tpublic get isOutsideRange(): boolean\r\n\t{\r\n\t\treturn !this.date.hasSame(this._datePicker.cursor, \"year\");\r\n\t}\r\n\r\n\t/**\r\n\t * True if the month is disabled, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.minValue\", \"_datePicker.maxValue\", \"date\")\r\n\tpublic get isDisabled(): boolean\r\n\t{\r\n\t\treturn (\r\n\t\t\tthis._datePicker.minValue != null && this.date.startOf(\"month\").diff(this._datePicker.minValue.startOf(\"month\")).valueOf() < 0 ||\r\n\t\t\tthis._datePicker.maxValue != null && this.date.startOf(\"month\").diff(this._datePicker.maxValue.startOf(\"month\")).valueOf() > 0\r\n\t\t);\r\n\t}\r\n}\r\n","import { computedFrom } from \"aurelia-binding\";\r\nimport { DateTime, DurationLikeObject } from \"luxon\";\r\nimport { DatePickerCustomElement } from \"../date-picker\";\r\n\r\n/**\r\n * Represents the model for the years view.\r\n */\r\nexport class YearsModel\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param datePicker The `DatePickerCustomElement` owning the item.\r\n\t */\r\n\tpublic constructor(datePicker: DatePickerCustomElement)\r\n\t{\r\n\t\tthis._datePicker = datePicker;\r\n\t}\r\n\r\n\tprivate readonly _datePicker: DatePickerCustomElement;\r\n\r\n\t/**\r\n\t * The title to show.\r\n\t */\r\n\t@computedFrom(\"_datePicker.cursor\")\r\n\tpublic get title(): string\r\n\t{\r\n\t\tconst decadeStartYear = Math.floor(this._datePicker.cursor.year / 10) * 10;\r\n\r\n\t\treturn `${decadeStartYear} – ${decadeStartYear + 9}`;\r\n\t}\r\n\r\n\t/**\r\n\t * The items to present.\r\n\t */\r\n\t@computedFrom(\"_datePicker.cursor\")\r\n\tpublic get items(): YearItem[]\r\n\t{\r\n\t\tconst items: YearItem[] = [];\r\n\t\tconst startYear = Math.floor(this._datePicker.cursor.year / 10) * 10 - 1;\r\n\r\n\t\tfor (let i = 0; i < 12; i++)\r\n\t\t{\r\n\t\t\tconst date = this._datePicker.cursor.set({ year: startYear + i }).startOf(\"year\");\r\n\t\t\titems.push(new YearItem(this._datePicker, date));\r\n\t\t}\r\n\r\n\t\treturn items;\r\n\t}\r\n\r\n\t/**\r\n\t * True if today is outside the selectable range, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.cursor\", \"_datePicker.minValue\", \"_datePicker.maxValue\")\r\n\tpublic get isPreviousDisabled(): boolean\r\n\t{\r\n\t\tconst startYear = Math.floor(this._datePicker.cursor.year / 10) * 10 - 1;\r\n\t\tconst date = this._datePicker.cursor.set({ year: startYear }).startOf(\"year\");\r\n\t\tconst item = new YearItem(this._datePicker, date);\r\n\r\n\t\treturn item.isDisabled;\r\n\t}\r\n\r\n\t/**\r\n\t * True if today is outside the selectable range, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.cursor\", \"_datePicker.minValue\", \"_datePicker.maxValue\")\r\n\tpublic get isNextDisabled(): boolean\r\n\t{\r\n\t\tconst startYear = Math.floor(this._datePicker.cursor.year / 10) * 10 - 1;\r\n\t\tconst date = this._datePicker.cursor.set({ year: startYear + 11 }).startOf(\"year\");\r\n\t\tconst item = new YearItem(this._datePicker, date);\r\n\r\n\t\treturn item.isDisabled;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the `Previous` icon is clicked.\r\n\t * Navigates to the previous month.\r\n\t */\r\n\tpublic onPreviousClick(): void\r\n\t{\r\n\t\tthis._datePicker.cursor = this._datePicker.cursor.minus({ years: 10 });\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the `Next` icon is clicked.\r\n\t * Navigates to the next month.\r\n\t */\r\n\tpublic onNextClick(): void\r\n\t{\r\n\t\tthis._datePicker.cursor = this._datePicker.cursor.plus({ years: 10 });\r\n\t}\r\n\r\n\t/**\r\n\t * Called when an item is clicked.\r\n\t * Sets the `value` property to the date represented by the clicked item.\r\n\t * @param item The item being clicked.\r\n\t */\r\n\tpublic onItemClick(item: YearItem): void\r\n\t{\r\n\t\tif (!item.isDisabled)\r\n\t\t{\r\n\t\t\tthis._datePicker.cursor = item.date;\r\n\t\t\tthis._datePicker.view = \"months\";\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed within the focused element.\r\n\t * Handles keyboard navigation within the view.\r\n\t * @param event The keyboard event.\r\n\t */\r\n\tpublic onKeyDown(event: KeyboardEvent): void\r\n\t{\r\n\t\tif (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (event.key === \"Enter\")\r\n\t\t{\r\n\t\t\tif (this._datePicker.focusedValue != null)\r\n\t\t\t{\r\n\t\t\t\tthis._datePicker.view = \"months\";\r\n\t\t\t}\r\n\r\n\t\t\tevent.preventDefault();\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet offset: DurationLikeObject | undefined;\r\n\r\n\t\tswitch (event.key)\r\n\t\t{\r\n\t\t\tcase \"PageUp\": offset = { year: -10 }; break;\r\n\t\t\tcase \"PageDown\": offset = { year: 10 }; break;\r\n\t\t\tcase \"ArrowUp\": offset = { year: -3 }; break;\r\n\t\t\tcase \"ArrowDown\": offset = { year: 3 }; break;\r\n\t\t\tcase \"ArrowLeft\": offset = { year: -1 }; break;\r\n\t\t\tcase \"ArrowRight\": offset = { year: 1 }; break;\r\n\t\t}\r\n\r\n\t\tif (offset != null)\r\n\t\t{\r\n\t\t\tconst value = (this._datePicker.focusedValue?.startOf(\"day\") || this._datePicker.today).plus(offset);\r\n\t\t\tconst item = new YearItem(this._datePicker, value);\r\n\r\n\t\t\tif (!item.isDisabled)\r\n\t\t\t{\r\n\t\t\t\tthis._datePicker.changeValue(value);\r\n\t\t\t}\r\n\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Represents an item in the year grid.\r\n */\r\nclass YearItem\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param datePicker The `DatePickerCustomElement` owning the item.\r\n\t * @param date The cursor date represented by the item.\r\n\t */\r\n\tpublic constructor(datePicker: DatePickerCustomElement, date: DateTime)\r\n\t{\r\n\t\tthis._datePicker = datePicker;\r\n\t\tthis.date = date;\r\n\t}\r\n\r\n\tprivate readonly _datePicker: DatePickerCustomElement;\r\n\r\n\t/**\r\n\t * The cursor date represented by this item.\r\n\t */\r\n\tpublic readonly date: DateTime;\r\n\r\n\t/**\r\n\t * The value to display.\r\n\t */\r\n\t@computedFrom(\"date\")\r\n\tpublic get displayValue(): string\r\n\t{\r\n\t\treturn this.date.year.toString();\r\n\t}\r\n\r\n\t/**\r\n\t * True if the year matches the year of today, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.today\")\r\n\tpublic get isToday(): boolean\r\n\t{\r\n\t\treturn this.date.hasSame(this._datePicker.today, \"year\");\r\n\t}\r\n\r\n\t/**\r\n\t * True if the year matches the year of the selected date, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.focusedValue\")\r\n\tpublic get isSelected(): boolean\r\n\t{\r\n\t\treturn this._datePicker.focusedValue != null && this.date.hasSame(this._datePicker.focusedValue, \"year\");\r\n\t}\r\n\r\n\t/**\r\n\t * True if the year is outside the decade of the cursor date, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.cursor\")\r\n\tpublic get isOutsideRange(): boolean\r\n\t{\r\n\t\treturn (\r\n\t\t\tthis.date.year < Math.floor(this._datePicker.cursor.year / 10) * 10 ||\r\n\t\t\tthis.date.year > Math.floor(this._datePicker.cursor.year / 10) * 10 + 9\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * True if the year is disabled, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_datePicker.minValue\", \"_datePicker.maxValue\", \"date\")\r\n\tpublic get isDisabled(): boolean\r\n\t{\r\n\t\treturn (\r\n\t\t\tthis._datePicker.minValue != null && this.date.startOf(\"year\").diff(this._datePicker.minValue.startOf(\"year\")).valueOf() < 0 ||\r\n\t\t\tthis._datePicker.maxValue != null && this.date.startOf(\"year\").diff(this._datePicker.maxValue.startOf(\"year\")).valueOf() > 0\r\n\t\t);\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\nimport { PipelineStep, NavigationInstruction, Next, Redirect } from \"aurelia-router\";\nimport { ModalService } from \"shared/framework\";\nimport { SignUpEmployeeFlow } from \"./modals/sign-up-employee-flow/sign-up-employee-flow\";\nimport { IdentityService } from \"./services/identity\";\nimport { EventAggregator } from \"aurelia-event-aggregator\";\n\n/**\n * Represents a router pipeline step that determines whether the user is authenticated.\n * If the user is not authenticated this will result in a redirect to the login route.\n */\n @autoinject\nexport class AuthenticatePipelineStep implements PipelineStep\n{\n\t/**\n\t* Creates a new instance of the type.\n\t* @param identityService The `IdentityService` instance.\n\t*/\n\tpublic constructor(identityService: IdentityService, modalService: ModalService, eventAggregator: EventAggregator)\n\t{\n\t\tthis._identityService = identityService;\n\t\tthis._modalService = modalService;\n\t\tthis._eventAggregator = eventAggregator;\n\t}\n\n\tprivate readonly _identityService: IdentityService;\n\tprivate readonly _modalService: ModalService;\n\tprivate readonly _eventAggregator: EventAggregator;\n\n\tprivate timeout: any;\n\n\t/**\n\t* Called by the router when this step should execute.\n\t* @param navigationInstruction The current navigation instruction.\n\t* @param next A callback to indicate when pipeline processing should advance to the next step or be aborted.\n\t* @returns A promise that will be resolved when this step is complete.\n\t*/\n\tpublic async run(navigationInstruction: NavigationInstruction, next: Next): Promise\n\t{\n\t\tclearTimeout(this.timeout);\n\n\t\tif (\n\t\t\tnavigationInstruction.config.name !== \"log-in\" &&\n\t\t\t!navigationInstruction.params.childRoute.includes(\"tilmeld-firma\") &&\n\t\t\t!navigationInstruction.params.childRoute.includes(\"aftaledokumenter/opret-adgangskode\"))\n\t\t{\n\t\t\tif (!this._identityService.identity.authenticated)\n\t\t\t{\n\t\t\t\treturn next.cancel(new Redirect(\"log-ind\", { replace: true }));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (this._identityService.identity.company?.documentsSigned === false)\n\t\t\t\t{\n\t\t\t\t\tif (navigationInstruction.config.name !== \"sign-up\")\n\t\t\t\t\t{\n\t\t\t\t\t\treturn next.cancel(new Redirect(\"tilmeld/aftaledokumenter\", { replace: true }));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (navigationInstruction.config.name === \"sign-up\")\n\t\t\t\t\t{\n\t\t\t\t\t\treturn next.cancel(new Redirect(\"dashboard/medarbejdere\", { replace: true }));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// Activate timer to show the modal to prompt the user to sign up their first employee\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis._identityService.identity.company?.employeesInvited === false &&\n\t\t\t\t\t\t\t!this._identityService.identity.company?.firstEmployeePrompted)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthis.signUpFirstEmployee();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn next();\n\t}\n\n\tprotected async signUpFirstEmployee(): Promise\n\t{\n\t\tthis.timeout = setTimeout(\n\t\t\tasync () => {\n\t\t\t\tif (this._modalService.modals.length === 1)\n\t\t\t\t{\n\t\t\t\t\tawait this._modalService.modals[0].promise;\n\t\t\t\t\tclearTimeout(this.timeout);\n\t\t\t\t\tthis.signUpFirstEmployee();\n\t\t\t\t}\n\t\t\t\telse if (this._modalService.modals.length === 0)\n\t\t\t\t{\n\t\t\t\t\tawait this._modalService.open(SignUpEmployeeFlow, { employeeFlow: \"add-employee\", firstEmployee: true }).promise;\n\n\t\t\t\t\tthis._eventAggregator.publish(\"sign:up:employee:flow\");\n\t\t\t\t\tthis._identityService.identity.company!.firstEmployeePrompted = true;\n\t\t\t\t}\n\t\t\t},\n\t\t\t2000\n\t\t)\n\t}\n}\n","export class ModuleActivateStartedEvent\n{\n\tpublic constructor(\n\t\tmoduleName: string | undefined)\n\t{\n\t\tthis.moduleName = moduleName ?? \"\";\n\t}\n\n\tpublic readonly moduleName: string;\n}\n","export * from \"./services/administrator-exists-service\";\n","export * from \"./entities/agreement-document\";\nexport * from \"./entities/company-detailed\";\nexport * from \"./entities/payroll-system-response\";\nexport * from \"./services/company-service\";\nexport * from \"./services/administrator-service\";\nexport * from \"./services/payroll-system-service\";\n","import api from \"!../../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/postcss-loader/src/index.js??ref--5-2!../../../../../../node_modules/sass-loader/dist/cjs.js??ref--5-3!./empty-value.scss\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/postcss-loader/src/index.js??ref--5-2!../../../../../../node_modules/sass-loader/dist/cjs.js??ref--5-3!./scroll.scss\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/postcss-loader/src/index.js??ref--5-2!../../../../../../node_modules/sass-loader/dist/cjs.js??ref--5-3!./modal-href.scss\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/postcss-loader/src/index.js??ref--5-2!../../../../../../node_modules/sass-loader/dist/cjs.js??ref--5-3!./page-href.scss\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/postcss-loader/src/index.js??ref--5-2!../../../../../node_modules/sass-loader/dist/cjs.js??ref--5-3!./validator.scss\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","var map = {\n\t\"./grandhood/styles/index.scss\": [\n\t\t645,\n\t\t4\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 526;\nmodule.exports = webpackAsyncContext;","import { Container, autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\r\nimport { ValidationCustomAttribute } from \"./validation\";\r\nimport { ValidationTrigger, ValidationReason } from \"./validation-trigger\";\r\n\r\nimport \"./validator.scss\";\r\n\r\n/**\r\n * Represents a validator, associated with a validation.\r\n *\r\n * This interface represents the public API of a validator, and\r\n * should be used as the type for any references to a validator\r\n * attribute instance.\r\n */\r\nexport interface IValidator\r\n{\r\n\t/**\r\n\t * True to enable this validation, false to disable this validation,\r\n\t * or undefined to inherit the enabled state from the parent validation.\r\n\t *\r\n\t * If no parent validation exists, the computed default is true.\r\n\t *\r\n\t * Note that if the parent validation is disabled, this validator will\r\n\t * be disabled too, regardless of the value of this property.\r\n\t */\r\n\tenabled: boolean | undefined;\r\n\r\n\t/**\r\n\t * True to validate on trigger events, false to not validate on trigger\r\n\t * events, or undefined to inherit the active state from the parent validation.\r\n\t *\r\n\t * If no parent validation exists, the computed default is null.\r\n\t *\r\n\t * Note that if the parent validation is inactive, this validator will\r\n\t * be inactive too, regardless of the value of this property.\r\n\t */\r\n\tactive: boolean | undefined;\r\n\r\n\t/**\r\n\t * The trigger to use for this validator, or undefined to\r\n\t * inherit the trigger from the parent validation.\r\n\t *\r\n\t * If no parent validation exists, the computed default is `input`.\r\n\t */\r\n\ttrigger: ValidationTrigger | undefined;\r\n\r\n\t/**\r\n\t * True if validation failed, false if validation succeeded,\r\n\t * or undefined if this validator is computed as disabled,\r\n\t * or if validation has not yet run.\r\n\t */\r\n\tinvalid: boolean | undefined;\r\n\r\n\t/**\r\n\t * Called by the validation when this validator should run.\r\n\t * @param reason The reason for the validation run.\r\n\t * @returns A promise that will be resolved with true if validation\r\n\t * succeeded, otherwise false.\r\n\t */\r\n\tvalidate(trigger: ValidationTrigger): Promise;\r\n\r\n\t/**\r\n\t * Resets this validator to the default validity state.\r\n\t */\r\n\treset(): void;\r\n}\r\n\r\n/**\r\n * Represents a base class from which all validator implementation must inherit.\r\n * Validators are custom elements that represent input validation requirements,\r\n * encapsulating the validation logic and the rendering of validation messages.\r\n */\r\n@autoinject\r\nexport abstract class Validator implements IValidator\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param container The `Container` instance associated with the component.\r\n\t */\r\n\tpublic constructor(container: Container)\r\n\t{\r\n\t\tthis.element = container.get(Element) as HTMLElement;\r\n\t}\r\n\r\n\t/**\r\n\t * The element representing the component.\r\n\t */\r\n\tprotected readonly element: HTMLElement;\r\n\r\n\t/**\r\n\t * The validation to which this validator belongs,\r\n\t * or undefined if not associated with any validation.\r\n\t */\r\n\tprotected validation: ValidationCustomAttribute | undefined;\r\n\r\n\t/**\r\n\t * True to enable this validator, false to disable this validator,\r\n\t * or undefined to inherit the enabled state from the parent validation.\r\n\t *\r\n\t * If no parent validation exists, the computed default is true.\r\n\t *\r\n\t * Note that if the parent validation is disabled, this validator will\r\n\t * be disabled too, regardless of the value of this property.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic enabled: boolean | undefined;\r\n\r\n\t/**\r\n\t * True to validate on trigger events, false to not validate on trigger\r\n\t * events, or undefined to inherit the active state from the parent validation.\r\n\t *\r\n\t * If no parent validation exists, the computed default is null.\r\n\t *\r\n\t * Note that if the parent validation is inactive, this validator will\r\n\t * be inactive too, regardless of the value of this property.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic active: boolean | undefined;\r\n\r\n\t/**\r\n\t * The trigger to use for this validation, or undefined to\r\n\t * inherit the trigger from the parent validation.\r\n\t *\r\n\t * If no parent validation exists, the computed default is `input`.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic trigger: ValidationTrigger | undefined;\r\n\r\n\t/**\r\n\t * True if validation failed, false if validation succeeded,\r\n\t * or undefined if this validator is computed as disabled,\r\n\t * or if validation has not yet run.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.fromView })\r\n\tpublic invalid: boolean | undefined;\r\n\r\n\t/**\r\n\t * The enabled state specified for this validator, or inherited from the parent validation.\r\n\t * If no enabled state is specified and no parent validation exists, the default is true.\r\n\t */\r\n\t@computedFrom(\"enabled\", \"validation.computedEnabled\")\r\n\tpublic get computedEnabled(): boolean\r\n\t{\r\n\t\tif (this.validation != null)\r\n\t\t{\r\n\t\t\tif (!this.validation.computedEnabled)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.enabled !== undefined)\r\n\t\t\t{\r\n\t\t\t\treturn this.enabled;\r\n\t\t\t}\r\n\r\n\t\t\treturn this.validation.computedEnabled;\r\n\t\t}\r\n\r\n\t\tif (this.enabled !== undefined)\r\n\t\t{\r\n\t\t\treturn this.enabled;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * The active state specified for this validation, or inherited from the parent validation.\r\n\t * If no active state is specified and no parent validation exists, the default is true.\r\n\t */\r\n\t@computedFrom(\"active\", \"validation.computedActive\")\r\n\tpublic get computedActive(): boolean\r\n\t{\r\n\t\tif (this.validation != null)\r\n\t\t{\r\n\t\t\tif (this.validation.computedActive === false)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.active !== undefined)\r\n\t\t\t{\r\n\t\t\t\treturn this.active;\r\n\t\t\t}\r\n\r\n\t\t\treturn !!this.validation.computedActive;\r\n\t\t}\r\n\r\n\t\tif (this.active !== undefined)\r\n\t\t{\r\n\t\t\treturn this.active;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * The trigger specified for this validator, or inherited from the parent validation.\r\n\t * If no trigger is specified and no parent validation exists, the default is `input`.\r\n\t */\r\n\t@computedFrom(\"trigger\", \"validation.computedTrigger\")\r\n\tpublic get computedTrigger(): ValidationTrigger\r\n\t{\r\n\t\tif (this.trigger != null)\r\n\t\t{\r\n\t\t\treturn this.trigger;\r\n\t\t}\r\n\r\n\t\tif (this.validation != null)\r\n\t\t{\r\n\t\t\treturn this.validation.computedTrigger;\r\n\t\t}\r\n\r\n\t\treturn \"input\";\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t * Attaches this validator to its parent validation, adds trigger event listeners,\r\n\t * and if this validation is computed as enabled and active, runs it immediately.\r\n\t * @returns A promise that will be resolved immediately, or when validation completes.\r\n\t */\r\n\tpublic async attached(): Promise\r\n\t{\r\n\t\t// Try to get the validation to which this validator belongs.\r\n\r\n\t\tlet parentElement = this.element.parentElement as any;\r\n\r\n\t\twhile (this.validation == null && parentElement != null)\r\n\t\t{\r\n\t\t\tthis.validation = parentElement.au?.validation?.viewModel;\r\n\t\t\tparentElement = parentElement.parentElement;\r\n\t\t}\r\n\r\n\t\t// Attach to the parent validation.\r\n\t\tif (this.validation != null)\r\n\t\t{\r\n\t\t\tthis.validation.attachValidator(this);\r\n\t\t}\r\n\r\n\t\t// If enabled and active, validate immediately.\r\n\t\tif (this.computedEnabled && this.computedActive)\r\n\t\t{\r\n\t\t\tawait this.validate(\"attached\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is detached.\r\n\t * Detaches this validator from its parent validation.\r\n\t */\r\n\tpublic detached(): void\r\n\t{\r\n\t\tif (this.validation != null)\r\n\t\t{\r\n\t\t\tthis.validation.detachValidator(this);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the validation when this validator should run.\r\n\t * @param reason The for the validation run.\r\n\t * @returns A promise that will be resolved with true if validation succeeded, otherwise false.\r\n\t */\r\n\tpublic abstract validate(reason?: ValidationReason): Promise;\r\n\r\n\t/**\r\n\t * Resets this validator to the default validity state, then updates the ancestor validations.\r\n\t */\r\n\tpublic reset(): void\r\n\t{\r\n\t\tthis.invalid = undefined;\r\n\r\n\t\tif (this.validation != null)\r\n\t\t{\r\n\t\t\tthis.validation.update();\r\n\t\t}\r\n\r\n\t\t// Note:\r\n\t\t// Changing the validity state will trigger the necessary tree update.\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `enabled` property changes.\r\n\t * Ensures the validator is reset if the value changes to false, and run\r\n\t * if the value changes to true and the `enabled` trigger is specified.\r\n\t */\r\n\tprotected enabledChanged(): void\r\n\t{\r\n\t\tif (this.enabled)\r\n\t\t{\r\n\t\t\tif (this.computedEnabled && this.computedActive)\r\n\t\t\t{\r\n\t\t\t\tthis.validate(\"enabled\");\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.reset();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `invalid` property changes.\r\n\t * Calls `update` on the validation to which this validator belongs,\r\n\t * thereby propagating the change up the tree.\r\n\t */\r\n\tprotected invalidChanged(): void\r\n\t{\r\n\t\tif (this.validation)\r\n\t\t{\r\n\t\t\tthis.validation.update();\r\n\t\t}\r\n\t}\r\n}\r\n","import { IApiClientSettings, ICookieOptions, CorrelationHeaderInterceptor } from \"shared/infrastructure\";\r\nimport locales from \"./locales.json\";\r\nimport currencies from \"./currencies.json\";\r\nimport themes from \"./themes.json\";\r\n\r\n/**\r\n * Represents the settings related to infrastructure, framework and environment.\r\n */\r\nexport default\r\n{\r\n\t/**\r\n\t * Settings for the app.\r\n\t */\r\n\tapp:\r\n\t{\r\n\t\t/**\r\n\t\t * The locales supported by the app.\r\n\t\t */\r\n\t\tlocales,\r\n\r\n\t\t/**\r\n\t\t * The currencies supported by the app.\r\n\t\t */\r\n\t\tcurrencies,\r\n\r\n\t\t/**\r\n\t\t * The themes supported by the app.\r\n\t\t */\r\n\t\tthemes,\r\n\r\n\t\t/**\r\n\t\t * The slug identifying the default theme.\r\n\t\t */\r\n\t\tdefaultThemeSlug: \"grandhood\",\r\n\r\n\t\t/**\r\n\t\t * The code identifying the default currency.\r\n\t\t */\r\n\t\tdefaultCurrencyCode: \"DKK\",\r\n\r\n\t\t/**\r\n\t\t * The time in milliseconds before a toast, by default, disappears.\r\n\t\t */\r\n\t\tdefaultToastTimeout: 10000\r\n\t},\r\n\r\n\t/**\r\n\t * Settings for the infrastructure.\r\n\t */\r\n\tinfrastructure:\r\n\t{\r\n\t\t/**\r\n\t\t * Settings related to cookies.\r\n\t\t */\r\n\t\tcookies:\r\n\t\t{\r\n\t\t\tpath: \"/\"\r\n\r\n\t\t} as ICookieOptions,\r\n\r\n\t\t/**\r\n\t\t * Settings related to the API client.\r\n\t\t */\r\n\t\tapi:\r\n\t\t{\r\n\t\t\tdefaults:\r\n\t\t\t{\r\n\t\t\t\theaders:\r\n\t\t\t\t{\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tcipher: \"svrmZIDJCKab+o8n-h7wTR6l4XO1Qz95PHMp3BFNiqeYGdEAUx0_SckLVufy2jtgW\",\r\n\t\t\tobfuscate: ENVIRONMENT.obfuscate,\r\n\t\t\tendpointUrlPattern: `${ENVIRONMENT.apiBaseUrl}{path}`,\r\n\t\t\tendpointSettings:\r\n\t\t\t{\r\n\t\t\t\t\"\": { version: \"1\", obfuscate: false }\r\n\t\t\t},\r\n\t\t\tinterceptors:\r\n\t\t\t[\r\n\t\t\t\tnew CorrelationHeaderInterceptor(\"x-correlation\")\r\n\t\t\t]\r\n\r\n\t\t} as IApiClientSettings\r\n\t}\r\n};\r\n","export * from \"./base-64/base-64\";\r\nexport * from \"./group-items/group-items\";\r\nexport * from \"./decorators/once\";\r\nexport * from \"./event-manager/event-manager\";\r\nexport * from \"./id/id\";\r\nexport * from \"./math/math\";\r\nexport * from \"./operation/operation\";\r\nexport * from \"./promise-controller/promise-controller\";\r\nexport * from \"./replace-items/replace-items\";\r\nexport * from \"./text\";\r\nexport * from \"./timing/debounce\";\r\nexport * from \"./timing/delay\";\r\nexport * from \"./timing/throttle\";\r\nexport * from \"./pick-and-upload-file/pick-and-upload-file\";\r\n","export * from \"./errors/abort-error\";\r\nexport * from \"./general/disposable\";\r\nexport * from \"./general/map-object\";\r\nexport * from \"./general/paging\";\r\nexport * from \"./general/sorting\";\r\nexport * from \"./general/type\";\r\nexport * from \"./tree\";\r\nexport * from \"./values/currency-value\";\r\nexport * from \"./values/date-time-range\";\r\nexport * from \"./values/phone-number\";\r\nexport * from \"./values/time-of-day\";\r\nexport * from \"./values/time-range\";\r\n","// This file represents an entry point that is separate from the rest of the app, responsible\r\n// for initializing the Sentry error logging service, so it is ready before the app starts.\r\n\r\nimport * as Sentry from \"@sentry/browser\";\r\nimport * as Integrations from \"@sentry/integrations\";\r\n\r\n// Store a reference to an object with the original console methods on the window.\r\n// This allows the logging infrastructure of the app to log things without triggering Sentry.\r\n(window as any)._console = { ...console };\r\n\r\nif (ENVIRONMENT.integrations.sentry != null)\r\n{\r\n\t// Initialize Sentry.\r\n\tSentry.init(\r\n\t{\r\n\t\tdsn: ENVIRONMENT.integrations.sentry.dsn,\r\n\r\n\t\t// Associate entries with the current environment.\r\n\t\tenvironment: ENVIRONMENT.name,\r\n\r\n\t\t// Associate entries with the current release, if any.\r\n\t\trelease: ENVIRONMENT.commit ? ENVIRONMENT.commit : undefined,\r\n\r\n\t\t// Set the sampling rate for traces.\r\n\t\ttracesSampleRate: ENVIRONMENT.integrations.sentry.samplingRate,\r\n\r\n\t\t// Set if debugging information should be outputted to console\r\n\t\tdebug: false,\r\n\r\n\t\t// Configure integrations.\r\n\t\tintegrations:\r\n\t\t[\r\n\t\t\t// Capture errors and warnings logged to the console.\r\n\t\t\t// This is needed to ensure we capture all errors, including those from `aurelia-bootstrapper`.\r\n\t\t\tnew Integrations.CaptureConsole({ levels: [\"error\", \"warning\"] }),\r\n\t\t],\r\n\r\n\t\t// Attach stack traces to all entries, regardless of their level.\r\n\t\tattachStacktrace: true,\r\n\r\n\t\t// Process the entry before it is sent.\r\n\t\tbeforeSend: (event, hint) =>\r\n\t\t{\r\n\t\t\t// Discard irrelevant frames from the stack trace.\r\n\t\t\tif (event.stacktrace != null && event.stacktrace.frames != null)\r\n\t\t\t{\r\n\t\t\t\tconst filteredFrames = event.stacktrace.frames\r\n\t\t\t\t\t.filter(f => !f.filename ||\r\n\t\t\t\t\t!(\r\n\t\t\t\t\t\tf.filename.includes(\"/node_modules/@sentry/\") ||\r\n\t\t\t\t\t\tf.filename.includes(\"/src/shared/infrastructure/logging/\"))\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\tif (filteredFrames.length > 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tevent.stacktrace.frames = filteredFrames;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn event;\r\n\t\t}\r\n\t});\r\n\r\n\t// Add tags that should be attached to all entries.\r\n\tSentry.setTags(\r\n\t{\r\n\t\t\"platform\": ENVIRONMENT.platform,\r\n\t\t\"locale\": ENVIRONMENT.locale,\r\n\t\t\"environment\": ENVIRONMENT.name\r\n\t});\r\n\r\n\t// Store a reference to Sentry on the window.\r\n\t// This allows the logging infrastructure of the app to use Sentry in a loosely coupled way.\r\n\t(window as any).Sentry = Sentry;\r\n}\r\n","import { RouteConfig, NavigationInstruction } from \"aurelia-router\";\nimport { Container } from 'aurelia-framework';\nimport { EventAggregator } from \"aurelia-event-aggregator\";\nimport { Operation } from \"shared/utilities\";\nimport { ModuleActivateFinishedEvent } from \"shared/infrastructure/events/modules/activate-finished-event\";\nimport { ModuleActivateStartedEvent } from \"shared/infrastructure/events/modules/activate-started-event\";\n\n/**\n * Base for all aurelia modules in the application\n */\nexport abstract class BaseModule\n{\n\tprotected constructor()\n\t{\n\t\tthis._eventAggregator = Container.instance.get(EventAggregator);\n\t}\n\n\tprivate readonly _eventAggregator: EventAggregator;\n\n\t/**\n\t * The most recent update operation\n\t */\n\tprotected updateOperation: Operation;\n\n\t/**\n\t * Custom activation of the module, when\n\t * activated by the framework.\n\t */\n\tprotected abstract doActivate(params: any, routeConfig: RouteConfig, navigationInstruction: NavigationInstruction): void;\n\n\t/**\n\t * Called by the framework when the module is activated.\n\t * @returns A promise that will be resolved, when the module is activated.\n\t */\n\tpublic activate(params: any, routeConfig: RouteConfig, navigationInstruction: NavigationInstruction): void\n\t{\n\t\tthis._eventAggregator.publish(\"grandhood:module:activate:started\", new ModuleActivateStartedEvent(routeConfig.name));\n\n\t\tthis.doActivate(params, routeConfig, navigationInstruction);\n\n\t\tif (this.updateOperation != null)\n\t\t{\n\t\t\tthis.updateOperation\n\t\t\t\t.promise\n\t\t\t\t.finally(() =>\n\t\t\t\t{\n\t\t\t\t\tif (this.updateOperation.error)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._eventAggregator.publish(\"grandhood:module:activate:finished\", new ModuleActivateFinishedEvent(routeConfig.name, \"error\", this.updateOperation.error));\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.updateOperation.aborted)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._eventAggregator.publish(\"grandhood:module:activate:finished\", new ModuleActivateFinishedEvent(routeConfig.name, \"aborted\"));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._eventAggregator.publish(\"grandhood:module:activate:finished\", new ModuleActivateFinishedEvent(routeConfig.name, \"success\"));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis._eventAggregator.publish(\"grandhood:module:activate:finished\", new ModuleActivateFinishedEvent(routeConfig.name, \"success\"));\n\t\t}\n\t}\n}\n","/**\r\n * Joins the specified strings using the specified separator, except if the previous string is all whitespace,\r\n * in which case each of those whitespace characters will be replaced with the separator instead.\r\n * @param strings The strings to join, which may be either words or whitespace.\r\n * @param separator The separator to use.\r\n * @returns The joined string.\r\n */\r\nexport function textJoin(strings: string[], separator: string): string\r\n{\r\n\tconst joined: string[] = [];\r\n\r\n\tstrings.reduce((hasSpaceBefore, s, i) =>\r\n\t{\r\n\t\tconst isWhitespace = /^\\s*$/.test(s);\r\n\r\n\t\tif (!hasSpaceBefore && !isWhitespace)\r\n\t\t{\r\n\t\t\tjoined.push(separator);\r\n\t\t}\r\n\r\n\t\tjoined.push(isWhitespace ? separator.repeat(s.length) : s);\r\n\r\n\t\treturn isWhitespace;\r\n\t},\r\n\ttrue);\r\n\r\n\treturn joined.join(\"\");\r\n}\r\n","export * from \"./toast\";\r\nexport * from \"./toast-service\";\r\nexport * from \"./toast-close-reason\";\r\n","export * from \"./entities/payroll-system\";\n","export * from \"./services/agreement-documents\";\nexport * from \"./entities/signed-document\";\nexport * from \"./entities/unsigned-document\";\nexport * from \"./entities/signing-group\";\n","import { AbortError } from \"shared/types\";\r\n\r\n/**\r\n * The HTTP status codes that represent transient errors.\r\n */\r\nexport const transientHttpStatusCodes = [408, 502, 503, 504] as ReadonlyArray;\r\n\r\n/**\r\n * The HTTP status codes that represent a missing or deleted resource.\r\n */\r\nexport const missingHttpStatusCodes = [404, 410] as ReadonlyArray;\r\n\r\n/**\r\n * Represents the error thrown when the request is intentionally aborted.\r\n */\r\nexport class ApiAbortError extends AbortError\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param request The request sent to the server.\r\n\t * @param message The message describing the error.\r\n\t */\r\n\tpublic constructor(request: Request, message?: string)\r\n\t{\r\n\t\tsuper(message || `Request type '${request.method}' for '${request.url}' was aborted.`);\r\n\r\n\t\t// Required to ensure a correct prototype chain.\r\n\t\t// See: https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n\t\tObject.setPrototypeOf(this, ApiAbortError.prototype);\r\n\r\n\t\tthis.request = request;\r\n\t}\r\n\r\n\t/**\r\n\t * The request that was aborted.\r\n\t */\r\n\tpublic readonly request: Request;\r\n}\r\n\r\n/**\r\n * Represents the error thrown when the request fails, or when the response\r\n * received from the endpoint indicate that an error occurred.\r\n */\r\nexport class ApiError extends Error\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param transient True if the error is a transient error, otherwise false.\r\n\t * @param request The request sent to the server.\r\n\t * @param response The response received from the server.\r\n\t * @param message The message describing the error.\r\n\t * @param data The deserialized response body, if available.\r\n\t */\r\n\tpublic constructor(transient: boolean, request: Request, response?: Response, message?: string, data?: any)\r\n\t{\r\n\t\tsuper(message ||\r\n\t\t(\r\n\t\t\tresponse != null ?\r\n\t\t\t\t`Request of type '${request.method}' for '${request.url}' failed with status code ${response.status}${response.statusText ? ` (${response.statusText})` : \"\"}.` :\r\n\t\t\t\t`Request type '${request.method}' for '${request.url}' failed.`\r\n\t\t));\r\n\r\n\t\t// Required to ensure a correct prototype chain.\r\n\t\t// See: https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n\t\tObject.setPrototypeOf(this, ApiError.prototype);\r\n\r\n\t\tthis.name = \"ApiError\";\r\n\t\tthis.transient = transient;\r\n\t\tthis.request = request;\r\n\t\tthis.response = response;\r\n\t\tthis.data = data;\r\n\t}\r\n\r\n\t/**\r\n\t * True if the error is a transient error, otherwise false.\r\n\t * Transient errors include e.g. DNS lookup failures, gateway\r\n\t * timeouts, server unavailability, etc.\r\n\t */\r\n\tpublic readonly transient: boolean;\r\n\r\n\t/**\r\n\t * The request sent to the server.\r\n\t */\r\n\tpublic readonly request: Request;\r\n\r\n\t/**\r\n\t * The response received from the server.\r\n\t */\r\n\tpublic readonly response: Response | undefined;\r\n\r\n\t/**\r\n\t * The deserialized response body, if available.\r\n\t */\r\n\tpublic readonly data: TData;\r\n}\r\n\r\n/**\r\n * Represents the error thrown when the request fails, or when the response\r\n * received from the endpoint indicate that an error occurred and it was\r\n * caused by something internally at the origin and not by the request.\r\n */\r\nexport class ApiOriginError extends ApiError\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param transient True if the error is a transient error, otherwise false.\r\n\t * @param request The request sent to the server.\r\n\t * @param response The response received from the server.\r\n\t * @param message The message describing the error.\r\n\t * @param data The deserialized response body, if available.\r\n\t */\r\n\tpublic constructor(transient: boolean, request: Request, response: Response, message?: string, data?: any)\r\n\t{\r\n\t\tif (data === undefined)\r\n\t\t{\r\n\t\t\tdata = { status: response.status, type: `https://httpstatuses.com/${response.status}` };\r\n\t\t}\r\n\r\n\t\tsuper(transient, request, response, message, data);\r\n\r\n\t\t// Required to ensure a correct prototype chain.\r\n\t\t// See: https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n\t\tObject.setPrototypeOf(this, ApiOriginError.prototype);\r\n\t}\r\n\r\n\t/**\r\n\t * The response received from the server.\r\n\t */\r\n\tpublic readonly response: Response;\r\n\r\n\t/**\r\n\t * The deserialized response body, describing the problem that\r\n\t * occurred at the origin server.\r\n\t */\r\n\tpublic readonly data: IApiProblem;\r\n}\r\n\r\n/**\r\n * Represents the body of a response received from an endpoint,\r\n * when the response indicate that an error occurred.\r\n *\r\n * This conforms to the RFC-7807 specification for the body of\r\n * a response with content type `application/problem+json`.\r\n * See: https://datatracker.ietf.org/doc/rfc7807\r\n */\r\nexport interface IApiProblem\r\n{\r\n\t/**\r\n\t * The HTTP status code generated by the origin server for this\r\n\t * occurrence of the problem.\r\n\t */\r\n\treadonly status: number;\r\n\r\n\t/**\r\n\t * A URI reference that identifies the problem type.\r\n\t * It may or may not yield further information if dereferenced.\r\n\t */\r\n\treadonly type: string;\r\n\r\n\t/**\r\n\t * A short, human-readable summary of the problem type,\r\n\t * localized for the locale specified in the request.\r\n\t */\r\n\treadonly title: string | undefined;\r\n\r\n\t/**\r\n\t * A human-readable explanation specific to this occurrence of the problem,\r\n\t * localized for the locale specified in the request.\r\n\t */\r\n\treadonly detail: string | undefined;\r\n\r\n\t/**\r\n\t * A URI reference that identifies the specific occurrence of the problem.\r\n\t * It may or may not yield further information if dereferenced.\r\n\t */\r\n\treadonly instance: string | undefined;\r\n\r\n\t/**\r\n\t * Additional properties specific to the problem type.\r\n\t */\r\n\treadonly [key: string]: any;\r\n}\r\n\r\n/**\r\n * Represents the error thrown when the request fails, or when the response\r\n * received from the endpoint indicate that an error occurred caused by\r\n * the request not passing validation on the server.\r\n */\r\nexport class ApiValidationError extends ApiOriginError\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param transient True if the error is a transient error, otherwise false.\r\n\t * @param request The request sent to the server.\r\n\t * @param response The response received from the server.\r\n\t * @param message The message describing the error.\r\n\t * @param data The deserialized response body, if available.\r\n\t */\r\n\tpublic constructor(transient: boolean, request: Request, response: Response, message?: string, data?: any)\r\n\t{\r\n\t\tlet validationErrorMessage = message;\r\n\r\n\t\tif(data != null)\r\n\t\t{\r\n\t\t\tconst validationErrorData: IApiValidationProblem = data;\r\n\t\t\tif(validationErrorData?.errors != null && Object.values(validationErrorData.errors).length != 0)\r\n\t\t\t{\r\n\t\t\t\tvalidationErrorMessage = Object\r\n\t\t\t\t\t.values(validationErrorData.errors)\r\n\t\t\t\t\t.flat()\r\n\t\t\t\t\t.map(error => error[error.length-1] == \".\"\r\n\t\t\t\t\t\t? error.slice(0, -1)\r\n\t\t\t\t\t\t: error\r\n\t\t\t\t\t)\r\n\t\t\t\t\t.join(\", \");\r\n\t\t\t}\r\n\t\t\telse if(validationErrorData?.title != null)\r\n\t\t\t{\r\n\t\t\t\tvalidationErrorMessage = validationErrorData.title;\r\n\t\t\t}\r\n\t\t\telse if(validationErrorData?.detail != null)\r\n\t\t\t{\r\n\t\t\t\tvalidationErrorMessage = validationErrorData.detail;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsuper(transient, request, response, validationErrorMessage, data);\r\n\r\n\t\t// Required to ensure a correct prototype chain.\r\n\t\t// See: https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n\t\tObject.setPrototypeOf(this, ApiValidationError.prototype);\r\n\t}\r\n\r\n\t/**\r\n\t * The deserialized response body, describing the validation\r\n\t * problem that occurred at the origin server.\r\n\t */\r\n\tpublic readonly data: IApiValidationProblem;\r\n}\r\n\r\n/**\r\n * Represents the body of a response received from an endpoint,\r\n * when the response indicate that validation errors occurred.\r\n *\r\n * This conforms to the RFC-7807 specification for the body of\r\n * a response with content type `application/problem+json`.\r\n * See: https://datatracker.ietf.org/doc/rfc7807\r\n *\r\n * Note that this extends the problem details with properties\r\n * that are specific to validation in ASP.NET Core.\r\n * See: https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.validationproblemdetails\r\n */\r\nexport interface IApiValidationProblem extends IApiProblem\r\n{\r\n\t/**\r\n\t * The validation errors that occurred, represented by an object mapping\r\n\t * property names to the errors messages associated with the property,\r\n\t * localized for the locale specified in the request.\r\n\t */\r\n\treadonly errors: { [key: string]: string[] };\r\n}\r\n","import { PLATFORM, autoinject, bindable, bindingMode } from \"aurelia-framework\";\nimport { Router, RouterConfiguration } from \"aurelia-router\";\nimport { ModalService, ToastService } from \"shared/framework\";\nimport { setPrerenderStatusCode } from \"shared/infrastructure\";\nimport { AuthenticatePipelineStep } from \"./authenticate-pipeline-step\";\n\n/**\n * Represents the app module.\n */\n@autoinject\nexport class AppModule\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param toastService The `ToastService` instance.\n\t * @param modalService The `ModalService` instance.\n\t * @param router The `Router` instance.\n\t */\n\tpublic constructor(toastService: ToastService, modalService: ModalService, router: Router)\n\t{\n\t\tthis._modalService = modalService;\n\t\tthis._toastService = toastService;\n\t\tthis._router = router;\n\n\t\tthis.configureToasts();\n\t\tthis.configureModals();\n\t}\n\n\t/**\n\t * The `ToastService` instance.\n\t */\n\tprotected readonly _toastService: ToastService;\n\n\t/**\n\t * The `ModalService` instance.\n\t */\n\tprotected readonly _modalService: ModalService;\n\n\t/**\n\t * The `Router` instance.\n\t */\n\tprotected readonly _router: Router;\n\n\t/**\n\t * Whether or not the menu is open\n\t */\n\t@bindable({ defaultBindingMode: bindingMode.twoWay })\n\tprotected menuOpen: boolean = false;\n\n\t/**\n\t * Called to configure the modals for the app.\n\t */\n\tpublic configureModals(): void\n\t{\n\t\tconst modalConfigs =\n\t\t[\n\t\t\t{\n\t\t\t\tname: \"sign-up-employee-flow\",\n\t\t\t\tmoduleId: PLATFORM.moduleName(\"company-dashboard/modals/sign-up-employee-flow/sign-up-employee-flow\")\n\t\t\t}\n\t\t];\n\n\t\t// Configure the modals.\n\t\tmodalConfigs.forEach(config => this._modalService.register(config.name, config.moduleId));\n\t}\n\n\t/**\n\t * Called to configure the toasts for the app.\n\t */\n\tpublic configureToasts(): void\n\t{\n\t\tconst toastConfigs =\n\t\t[\n\t\t\t{\n\t\t\t\tname: \"error\",\n\t\t\t\tmoduleId: PLATFORM.moduleName(\"company-dashboard/toasts/error/error\")\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"success\",\n\t\t\t\tmoduleId: PLATFORM.moduleName(\"company-dashboard/toasts/success/success\")\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"neutral\",\n\t\t\t\tmoduleId: PLATFORM.moduleName(\"company-dashboard/toasts/neutral/neutral\")\n\t\t\t}\n\t\t];\n\n\t\t// Configure the toasts.\n\t\ttoastConfigs.forEach(config => this._toastService.register(config.name, config.moduleId));\n\t}\n\n\t/**\n\t * Called to configure the router for the module.\n\t * @param config The router configuration associated with the module.\n\t * @param router The router associated with the module.\n\t */\n\tpublic configureRouter(config: RouterConfiguration, router: Router): void\n\t{\n\t\tconst routeConfigs =\n\t\t[\n\t\t\t{\n\t\t\t\tname: \"dashboard\",\n\t\t\t\troute: \"dashboard\",\n\t\t\t\tmoduleId: PLATFORM.moduleName(\"./modules/dashboard/dashboard\"),\n\t\t\t\ttitle: \"Dashboard\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"sign-up\",\n\t\t\t\troute: \"tilmeld\",\n\t\t\t\tmoduleId: PLATFORM.moduleName(\"./modules/sign-up/sign-up\"),\n\t\t\t\ttitle: \"Tilmeld\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"log-in\",\n\t\t\t\troute: [ \"log-ind\", \"log-ind/:modal\" ],\n\t\t\t\tmoduleId: PLATFORM.moduleName(\"./modules/log-in/log-in\"),\n\t\t\t\ttitle: \"Log ind\",\n\t\t\t},\n\n\t\t\t...\n\t\t\tENVIRONMENT.name === \"development\" || ENVIRONMENT.name === \"test\" ?\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tname: \"design\",\n\t\t\t\t\troute: \"design\",\n\t\t\t\t\tmoduleId: PLATFORM.moduleName(\"./modules/_design/design\"),\n\t\t\t\t\ttitle: \"Design\"\n\t\t\t\t}\n\t\t\t] : []\n\t\t];\n\n\t\t// Configure the routes.\n\t\tconfig.map(routeConfigs);\n\n\t\t// Map unknown routes.\n\t\tconfig.mapUnknownRoutes(() =>\n\t\t{\n\t\t\t// Set the status code that should be returned to crawlers.\n\t\t\tsetPrerenderStatusCode(404);\n\n\t\t\t// Present the `unknown` page.\n\t\t\treturn {\n\t\t\t\tname: \"default\",\n\t\t\t\troute: \"\",\n\t\t\t\tredirect: \"dashboard\"\n\t\t\t};\n\t\t});\n\n\t\t// Add a router pipeline step that checks whether the user is authenticate to access the route.\n\t\tconfig.addPipelineStep(\"authorize\", AuthenticatePipelineStep);\n\n\t\t// Configure history usage.\n\t\tconfig.options.pushState = ENVIRONMENT.pushState;\n\n\t\t// Configure title generation.\n\t\tconfig.title = document.title;\n\t\trouter.titleSeparator = \" — \";\n\t\trouter.transformTitle = title => [\"List\"].includes(title) ? \"\" : title;\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"main,.app-container,router-view{display:flex;flex-grow:1;min-width:0;height:100%;background-color:var(--palette-color-background)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/app.scss\"],\"names\":[],\"mappings\":\"AAEA,gCAKC,YAAA,CAGA,WAAA,CAGA,WAAA,CAGA,WAAA,CACA,gDAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\nmain,\\n.app-container,\\nrouter-view\\n{\\n\\t// Use horizontal flex layout.\\n\\tdisplay: flex;\\n\\n\\t// Fill the available space.\\n\\tflex-grow: 1;\\n\\n\\t// Allow the element to shrink.\\n\\tmin-width: 0;\\n\\n\\t// Fill the available height.\\n\\theight: 100%;\\n\\tbackground-color: var(--palette-color-background);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { IdentityService } from \"company-dashboard/services/identity\";\nimport { autoinject, computedFrom, bindable, bindingMode } from \"aurelia-framework\";\nimport { Router, NavModel } from \"aurelia-router\";\nimport { ThemeService } from \"shared/framework\";\n\n/**\n * Represents a menu of the side of the page.\n */\n@autoinject\nexport class AppSideMenu\n{\n public constructor(router: Router, themeService: ThemeService, identityService: IdentityService)\n {\n this._identityService = identityService;\n this._router = router;\n this._themeService = themeService;\n }\n\n private readonly _identityService: IdentityService;\n private readonly _router: Router;\n protected readonly _themeService: ThemeService;\n\n protected currentParentRoute: string | undefined;\n\n /**\n * Whether or not the mobile menu is open\n */\n @bindable({ defaultBindingMode: bindingMode.twoWay })\n protected mobileOpen: boolean;\n\n @computedFrom(\"_router.currentInstruction\")\n protected get navModels(): NavModel[]\n {\n const instructions = this._router.currentInstruction.getAllInstructions();\n const childRouter = instructions[instructions.length - 1].router;\n\n this.currentParentRoute = this._router.currentInstruction.config.name;\n\n return childRouter.navigation;\n }\n\n protected get activeNavIndex(): number | undefined\n {\n return this.navModels.findIndex(navModel => navModel.isActive);\n }\n\n protected logOut(): void\n {\n this._identityService.identity.logout();\n this._router.navigate(\"log-ind\");\n }\n\n /**\n * Ensures that the menu closes after a navigation click on mobile platforms\n */\n public onNavClick(): void\n {\n this.mobileOpen = false;\n }\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"app-side-menu{width:var(--side-menu-width);min-width:320rem}app-side-menu .menu-dialog{height:100%;min-width:320rem;width:var(--side-menu-width);background-color:var(--palette-color-neutral-lighter);padding:calc(84rem + var(--layout-top-menu-height)) 0 48rem;display:flex;flex-direction:column;justify-content:space-between;overflow:overlay}@media(max-width: 1080px){app-side-menu{--side-menu-width: 0;min-width:0}app-side-menu .menu-dialog{position:fixed;padding:0 0 28rem;z-index:var(--z-index-modal);transition:opacity var(--animation-duration-medium);width:100%;opacity:0;pointer-events:none;background-color:var(--palette-color-whitepoint)}app-side-menu.--active .menu-dialog{opacity:1;pointer-events:auto;pointer-events:initial}}@media(min-width: 801px)and (max-width: 1080px){app-side-menu .menu-dialog{position:fixed;right:0;padding:0 40rem 48rem;transition:opacity var(--animation-duration-medium),transform var(--animation-duration-medium);opacity:0;transform:translateX(var(--side-menu-width));box-shadow:var(--shadow-modal);z-index:var(--z-index-modal)}app-side-menu.--active .menu-dialog{opacity:1;pointer-events:auto;pointer-events:initial;transform:translateX(0)}app-side-menu.--active .backdrop{opacity:1;pointer-events:auto;pointer-events:initial}app-side-menu .backdrop{position:fixed;top:0;bottom:0;left:0;right:0;z-index:var(--z-index-backdrop);background:var(--modal-backdrop-color);opacity:0;pointer-events:none;transition:opacity var(--animation-duration-medium)}}app-side-menu .--bold{font-weight:300}app-side-menu .divider{width:100%;border-bottom:var(--input-border-width) solid var(--palette-color-neutral-lightest)}app-side-menu .nav-container{text-decoration:none}app-side-menu .nav-container .nav-heading{align-items:center;justify-content:space-between;padding:20rem var(--app-grid-margin) 0}app-side-menu .nav-container .nav-title{height:var(--layout-top-menu-height);align-items:center;justify-content:space-between}app-side-menu .nav-container .nav-link{text-decoration:none;align-items:center;color:var(--surface-nav-link-surface-text-color);height:40rem;position:relative;transition:color var(--animation-duration-short);font-weight:200;font-size:var(--font-large-font-size);padding:0 var(--app-grid-margin)}app-side-menu .nav-container .nav-link:before{content:\\\"\\\";position:absolute;top:0;bottom:0;left:0;border-left:var(--border-width-thick) solid transparent;transition:border-color var(--animation-duration-short)}app-side-menu .nav-container .nav-link:not(:last-child){margin-bottom:16rem}app-side-menu .nav-container .nav-link.--active{font-weight:300}app-side-menu .nav-container .nav-link.--active:before{border-left-color:var(--palette-color-primary)}app-side-menu .nav-container .nav-link icon{margin-right:8rem}app-side-menu .nav-container .nav-container{align-items:center;color:var(--surface-nav-link-surface-text-color);cursor:initial;font-weight:200;padding:0 var(--app-grid-margin);position:relative;transition:color var(--animation-duration-short)}app-side-menu .nav-container .nav-container:not(:last-child){margin-bottom:24rem}app-side-menu .nav-container .nav-container:not(:last-child) .sign-up-icon{position:relative}app-side-menu .nav-container .nav-container:not(:last-child) .sign-up-icon:after{content:\\\"\\\";height:30rem;width:2rem;position:absolute;top:100%;left:10rem;background-image:linear-gradient(var(--palette-color-neutral) 33%, transparent 0%);background-position:right;background-size:2rem 4rem;background-repeat:repeat-y}app-side-menu .nav-container .nav-container.--active,app-side-menu .nav-container .nav-container.--completed{font-weight:300}app-side-menu .nav-container .nav-container.--active .sign-up-nav-title,app-side-menu .nav-container .nav-container.--completed .sign-up-nav-title{color:var(--surface-text-color)}app-side-menu .nav-container .nav-container.--active .sign-up-icon,app-side-menu .nav-container .nav-container.--completed .sign-up-icon{background-color:var(--palette-color-primary-light);border-color:var(--palette-color-primary-light);color:#fff}app-side-menu .nav-container .nav-container .sign-up-nav-title{color:var(--palette-color-neutral)}app-side-menu .nav-container .nav-container .sign-up-icon{height:24rem;width:24rem;border-radius:50%;background-color:transparent;display:flex;align-items:center;justify-content:center;border:var(--border-width-thin) solid var(--palette-color-neutral);color:var(--palette-color-neutral)}app-side-menu .menu-footer{padding:0 var(--app-grid-margin)}app-side-menu .menu-footer a{text-decoration:none}app-side-menu .mobile-menu-item{display:flex;align-items:center;color:inherit}app-side-menu .tip-person-container{align-items:center}app-side-menu .tip-person-image{height:56rem;width:56rem;border-radius:50%;-o-object-fit:cover;object-fit:cover;-o-object-position:0 10%;object-position:0 10%}app-side-menu .tip-person-name{font-size:18rem;line-height:25rem}app-side-menu .tip-person-title{font-size:14rem;line-height:20rem;color:var(--palette-color-neutral)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/components/app-side-menu/app-side-menu.scss\"],\"names\":[],\"mappings\":\"AAEA,cAGE,4BAAA,CACA,gBAAA,CAEA,2BAEE,WAAA,CACA,gBAAA,CACA,4BAAA,CACA,qDAAA,CACA,2DAAA,CACA,YAAA,CACA,qBAAA,CACA,6BAAA,CACA,gBAAA,CAGF,0BAnBF,cAqBI,oBAAA,CACA,WAAA,CAEA,2BAEE,cAAA,CACA,iBAAA,CACA,4BAAA,CACA,mDAAA,CACA,UAAA,CACA,SAAA,CACA,mBAAA,CACA,gDAAA,CAKA,oCAEE,SAAA,CACA,mBAAA,CACA,sBAAA,CAAA,CAKN,gDAEE,2BAEE,cAAA,CACA,OAAA,CACA,qBAAA,CACA,8FAAA,CACA,SAAA,CACA,4CAAA,CACA,8BAAA,CACA,4BAAA,CAKA,oCAEE,SAAA,CACA,mBAAA,CACA,sBAAA,CACA,uBAAA,CAGF,iCAEE,SAAA,CACA,mBAAA,CACA,sBAAA,CAIJ,wBAEE,cAAA,CACA,KAAA,CACA,QAAA,CACA,MAAA,CACA,OAAA,CACA,+BAAA,CACA,sCAAA,CACA,SAAA,CACA,mBAAA,CACA,mDAAA,CAAA,CAIJ,sBAEE,eAAA,CAGF,uBAEE,UAAA,CACA,mFAAA,CAGF,6BAEE,oBAAA,CAEA,0CAEE,kBAAA,CACA,6BAAA,CACA,sCAAA,CAGF,wCAEE,oCAAA,CACA,kBAAA,CACA,6BAAA,CAGF,uCAEE,oBAAA,CACA,kBAAA,CACA,gDAAA,CACA,YAAA,CACA,iBAAA,CAGA,gDAAA,CACA,eAAA,CACA,qCAAA,CACA,gCAAA,CAEA,8CAEE,UAAA,CACA,iBAAA,CACA,KAAA,CACA,QAAA,CACA,MAAA,CACA,uDAAA,CACA,uDAAA,CAGF,wDAEE,mBAAA,CAGF,gDAEE,eAAA,CAEA,uDAEE,8CAAA,CAIJ,4CAEE,iBAAA,CAIJ,4CAEE,kBAAA,CACA,gDAAA,CACA,cAAA,CACA,eAAA,CACA,gCAAA,CACA,iBAAA,CAGA,gDAAA,CAEA,6DAEE,mBAAA,CAEA,2EAEE,iBAAA,CAEA,iFAEE,UAAA,CACA,YAAA,CACA,UAAA,CACA,iBAAA,CACA,QAAA,CACA,UAAA,CACA,kFAAA,CACA,yBAAA,CACA,yBAAA,CACA,0BAAA,CAKN,6GAEE,eAAA,CAEA,mJAEE,+BAAA,CAGF,yIAEE,mDAAA,CACA,+CAAA,CACA,UAAA,CAIJ,+DAEE,kCAAA,CAGF,0DAEE,YAAA,CACA,WAAA,CACA,iBAAA,CACA,4BAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,kEAAA,CACA,kCAAA,CAKN,2BAEE,gCAAA,CAEA,6BAEE,oBAAA,CAIJ,gCAEE,YAAA,CACA,kBAAA,CACA,aAAA,CAKA,oCAEE,kBAAA,CAEF,gCAEE,YAAA,CACA,WAAA,CACA,iBAAA,CACA,mBAAA,CAAA,gBAAA,CACA,wBAAA,CAAA,qBAAA,CAEF,+BAEE,eAAA,CACA,iBAAA,CAEF,gCAEE,eAAA,CACA,iBAAA,CACA,kCAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\napp-side-menu\\n{\\n // display: contents;\\n width: var(--side-menu-width);\\n min-width: 320rem;\\n\\n .menu-dialog\\n {\\n height: 100%;\\n min-width: 320rem;\\n width: var(--side-menu-width);\\n background-color: var(--palette-color-neutral-lighter);\\n padding: calc(84rem + var(--layout-top-menu-height)) 0 48rem;\\n display: flex;\\n flex-direction: column;\\n justify-content: space-between;\\n overflow: overlay;\\n }\\n\\n @media ($media-small-max)\\n {\\n --side-menu-width: 0;\\n min-width: 0;\\n\\n .menu-dialog\\n {\\n position: fixed;\\n padding: 0 0 28rem;\\n z-index: var(--z-index-modal);\\n transition: opacity var(--animation-duration-medium);\\n width: 100%;\\n opacity: 0;\\n pointer-events: none;\\n background-color: var(--palette-color-whitepoint);\\n }\\n\\n &.--active\\n {\\n .menu-dialog\\n {\\n opacity: 1;\\n pointer-events: auto;\\n pointer-events: initial;\\n }\\n }\\n }\\n\\n @media ($media-small)\\n {\\n .menu-dialog\\n {\\n position: fixed;\\n right: 0;\\n padding: 0 40rem 48rem;\\n transition: opacity var(--animation-duration-medium), transform var(--animation-duration-medium);\\n opacity: 0;\\n transform: translateX(var(--side-menu-width));\\n box-shadow: var(--shadow-modal);\\n z-index: var(--z-index-modal);\\n }\\n\\n &.--active\\n {\\n .menu-dialog\\n {\\n opacity: 1;\\n pointer-events: auto;\\n pointer-events: initial;\\n transform: translateX(0);\\n }\\n\\n .backdrop\\n {\\n opacity: 1;\\n pointer-events: auto;\\n pointer-events: initial;\\n }\\n }\\n\\n .backdrop\\n {\\n position: fixed;\\n top: 0;\\n bottom: 0;\\n left: 0;\\n right: 0;\\n z-index: var(--z-index-backdrop);\\n background: var(--modal-backdrop-color);\\n opacity: 0;\\n pointer-events: none;\\n transition: opacity var(--animation-duration-medium);\\n }\\n }\\n\\n .--bold\\n {\\n font-weight: 300;\\n }\\n\\n .divider\\n {\\n width: 100%;\\n border-bottom: var(--input-border-width) solid var(--palette-color-neutral-lightest);\\n }\\n\\n .nav-container\\n {\\n text-decoration: none;\\n\\n .nav-heading\\n {\\n align-items: center;\\n justify-content: space-between;\\n padding: 20rem var(--app-grid-margin) 0;\\n }\\n\\n .nav-title\\n {\\n height: var(--layout-top-menu-height);\\n align-items: center;\\n justify-content: space-between;\\n }\\n\\n .nav-link\\n {\\n text-decoration: none;\\n align-items: center;\\n color: var(--surface-nav-link-surface-text-color);\\n height: 40rem;\\n position: relative;\\n\\n // Animate the hover effect.\\n transition: color var(--animation-duration-short);\\n font-weight: 200;\\n font-size: var(--font-large-font-size);\\n padding: 0 var(--app-grid-margin);\\n\\n &:before\\n {\\n content: \\\"\\\";\\n position: absolute;\\n top: 0;\\n bottom: 0;\\n left: 0;\\n border-left: var(--border-width-thick) solid transparent;\\n transition: border-color var(--animation-duration-short);\\n }\\n\\n &:not(:last-child)\\n {\\n margin-bottom: 16rem;\\n }\\n\\n &.--active\\n {\\n font-weight: 300;\\n\\n &:before\\n {\\n border-left-color: var(--palette-color-primary);\\n }\\n }\\n\\n icon\\n {\\n margin-right: 8rem;\\n }\\n }\\n\\n .nav-container\\n {\\n align-items: center;\\n color: var(--surface-nav-link-surface-text-color);\\n cursor: initial;\\n font-weight: 200;\\n padding: 0 var(--app-grid-margin);\\n position: relative;\\n\\n // Animate the hover effect.\\n transition: color var(--animation-duration-short);\\n\\n &:not(:last-child)\\n {\\n margin-bottom: 24rem;\\n\\n .sign-up-icon\\n {\\n position: relative;\\n\\n &:after\\n {\\n content: \\\"\\\";\\n height: 30rem;\\n width: 2rem;\\n position: absolute;\\n top: 100%;\\n left: 10rem;\\n background-image: linear-gradient(var(--palette-color-neutral) 33%, transparent 0%);\\n background-position: right;\\n background-size: 2rem 4rem;\\n background-repeat: repeat-y;\\n }\\n }\\n }\\n\\n &.--active, &.--completed\\n {\\n font-weight: 300;\\n\\n .sign-up-nav-title\\n {\\n color: var(--surface-text-color);\\n }\\n\\n .sign-up-icon\\n {\\n background-color: var(--palette-color-primary-light);\\n border-color: var(--palette-color-primary-light);\\n color: white;\\n }\\n }\\n\\n .sign-up-nav-title\\n {\\n color: var(--palette-color-neutral);\\n }\\n\\n .sign-up-icon\\n {\\n height: 24rem;\\n width: 24rem;\\n border-radius: 50%;\\n background-color: transparent;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n border: var(--border-width-thin) solid var(--palette-color-neutral);\\n color: var(--palette-color-neutral);\\n }\\n }\\n }\\n\\n .menu-footer\\n {\\n padding: 0 var(--app-grid-margin);\\n\\n a\\n {\\n text-decoration: none;\\n }\\n }\\n\\n .mobile-menu-item\\n {\\n display: flex;\\n align-items: center;\\n color: inherit;\\n }\\n\\n .tip-person\\n {\\n &-container\\n {\\n align-items: center;\\n }\\n &-image\\n {\\n height: 56rem;\\n width: 56rem;\\n border-radius: 50%;\\n object-fit: cover;\\n object-position: 0 10%;\\n }\\n &-name\\n {\\n font-size: 18rem;\\n line-height: 25rem;\\n }\\n &-title\\n {\\n font-size: 14rem;\\n line-height: 20rem;\\n color: var(--palette-color-neutral);\\n }\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { IdentityService } from \"company-dashboard/services/identity\";\nimport { autoinject, bindable, bindingMode } from \"aurelia-framework\";\nimport { ModalService, ThemeService } from \"shared/framework\";\nimport { Router } from \"aurelia-router\";\nimport { SignUpEmployeeFlow } from \"company-dashboard/modals/sign-up-employee-flow/sign-up-employee-flow\";\nimport { ChangeCompany } from \"company-dashboard/modals/change-company/change-company\";\n\n/**\n * Represents a menu at the top of the page.\n */\n@autoinject\nexport class AppTopMenu\n{\n\tpublic constructor(\n\t\tidentityService: IdentityService,\n\t\tthemeService: ThemeService,\n\t\tmodalService: ModalService,\n\t\trouter: Router)\n\t{\n\t\tthis._identityService = identityService;\n\t\tthis._router = router;\n\t\tthis._themeService = themeService;\n\t\tthis._modalService = modalService;\n\t}\n\n\tprotected readonly _identityService: IdentityService;\n\tprotected readonly _router: Router;\n\tprotected readonly _themeService: ThemeService;\n\tprotected readonly _modalService: ModalService;\n\n\t/**\n\t * Whether or not the menu should be open (works on small devices)\n\t */\n\t@bindable({ defaultBindingMode: bindingMode.twoWay })\n\tprotected menuOpen: boolean;\n\n\tprotected profileMenu: any;\n\n\tprotected async onSignUpEmployeeClick(): Promise\n\t{\n\t\tthis.profileMenu.open = false;\n\t\tawait this._modalService.open(SignUpEmployeeFlow, { employeeFlow: \"add-employee\" }).promise;\n\n\t\tthis._router.navigate(\"medarbejdere\");\n\t}\n\n\tprotected async onChangeCompanyClick(): Promise\n\t{\n\t\tthis.profileMenu.open = false;\n\t\tawait this._modalService.open(ChangeCompany).promise;\n\n\t\tlocation.reload();\n\t}\n\n\tprotected logOut(): void\n\t{\n\t\tthis._identityService.identity.logout();\n\t\tthis._router.navigate(\"log-ind\");\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"app-top-menu{position:fixed;top:0;left:0;right:0;height:var(--layout-top-menu-height);z-index:var(--z-index-fixed);padding:0 32rem;display:flex;align-items:center;justify-content:space-between}@media(max-width: 800px){app-top-menu{padding:0 20rem;border-bottom:var(--input-border-width) solid var(--palette-color-neutral-lightest)}}app-top-menu .app-logo{width:155rem}@media(max-width: 800px){app-top-menu .app-logo{width:113rem}}app-top-menu .left-menu-container{align-items:center}@media(max-width: 800px){app-top-menu .left-menu-container{display:none}}app-top-menu .left-menu-container .menu-trigger-tablet{display:none}@media(min-width: 801px)and (max-width: 1080px){app-top-menu .left-menu-container .menu-trigger-tablet{display:block}}app-top-menu .left-menu-container .help-menu-container{cursor:pointer;position:relative;z-index:var(--z-index-dropdown)}app-top-menu .left-menu-container .help-menu-container .mdc-list-item{padding:0 22rem;font-weight:200}app-top-menu .left-menu-container .help-menu-container .mdc-list-item a{color:inherit}app-top-menu .left-menu-container .help-menu-container .mdc-list-item .menu-item-container{display:flex;align-items:center}app-top-menu .left-menu-container .administrator-menu-container{align-items:center;cursor:pointer;position:relative;z-index:var(--z-index-dropdown)}app-top-menu .left-menu-container .administrator-menu-container.--disabled{pointer-events:none;opacity:var(--opacity-disabled)}app-top-menu .left-menu-container .administrator-menu-container .administrator-menu-trigger{display:flex;align-items:center;justify-content:center;height:48rem;width:48rem;border-radius:50%;background-color:var(--palette-color-neutral-light);color:var(--palette-color-primary-darkest)}app-top-menu .left-menu-container .administrator-menu-container .administrator-menu{padding-top:0;padding-bottom:12rem;width:260rem}app-top-menu .left-menu-container .administrator-menu-container .administrator-menu .nem-id-information{color:var(--palette-color-neutral-dark);height:40rem;align-items:center;justify-content:space-between;background-color:var(--palette-color-neutral-light);padding:0 22rem;font-size:14rem}app-top-menu .left-menu-container .administrator-menu-container .administrator-menu .nem-id-information>div{align-items:center}app-top-menu .left-menu-container .administrator-menu-container .administrator-menu .nem-id-information>div .icon-check-small{width:16rem}app-top-menu .left-menu-container .administrator-menu-container .administrator-menu .nem-id-information .icon-nem-id-black{width:52rem}app-top-menu .left-menu-container .administrator-menu-container .administrator-menu .administrator-information{padding:16rem 22rem 0}app-top-menu .left-menu-container .administrator-menu-container .administrator-menu .administrator-information .user-title{font-size:14rem;line-height:18rem;color:var(--palette-color-neutral)}app-top-menu .left-menu-container .administrator-menu-container .administrator-menu .administrator-information .company-name{font-size:14rem;line-height:18rem;color:var(--palette-color-neutral)}app-top-menu .left-menu-container .administrator-menu-container .administrator-menu .mdc-list-item{padding:0 22rem;font-weight:200}app-top-menu .left-menu-container .administrator-menu-container .administrator-menu .divider{margin:12rem 22rem;width:calc(100% - 24rem * 2);border-bottom:var(--input-border-width) solid var(--palette-color-neutral-lightest)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/components/app-top-menu/app-top-menu.scss\"],\"names\":[],\"mappings\":\"AAEA,aAEE,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,oCAAA,CACA,4BAAA,CACA,eAAA,CACA,YAAA,CACA,kBAAA,CACA,6BAAA,CAEA,yBAbF,aAeI,eAAA,CACA,mFAAA,CAAA,CAGF,uBAEE,YAAA,CAEA,yBAJF,uBAMI,YAAA,CAAA,CAIJ,kCAEE,kBAAA,CAEA,yBAJF,kCAMI,YAAA,CAAA,CAGF,uDAEE,YAAA,CAEA,gDAJF,uDAMI,aAAA,CAAA,CAIJ,uDAEE,cAAA,CACA,iBAAA,CACA,+BAAA,CAEA,sEAEE,eAAA,CACA,eAAA,CAEA,wEAEE,aAAA,CAGF,2FAEE,YAAA,CACA,kBAAA,CAKN,gEAEE,kBAAA,CACA,cAAA,CACA,iBAAA,CACA,+BAAA,CAEA,2EAEE,mBAAA,CACA,+BAAA,CAGF,4FAEE,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,YAAA,CACA,WAAA,CACA,iBAAA,CACA,mDAAA,CACA,0CAAA,CAGF,oFAEE,aAAA,CACA,oBAAA,CACA,YAAA,CAEA,wGAEE,uCAAA,CACA,YAAA,CACA,kBAAA,CACA,6BAAA,CACA,mDAAA,CACA,eAAA,CACA,eAAA,CAEA,4GAEE,kBAAA,CAEA,8HAEE,WAAA,CAIJ,2HAEE,WAAA,CAIJ,+GAEE,qBAAA,CAEA,2HAEE,eAAA,CACA,iBAAA,CACA,kCAAA,CAGF,6HAEE,eAAA,CACA,iBAAA,CACA,kCAAA,CAIJ,mGAEE,eAAA,CACA,eAAA,CAGF,6FAEE,kBAAA,CACA,4BAAA,CACA,mFAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\napp-top-menu\\n{\\n position: fixed;\\n top: 0;\\n left: 0;\\n right: 0;\\n height: var(--layout-top-menu-height);\\n z-index: var(--z-index-fixed);\\n padding: 0 32rem;\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n\\n @media ($media-smaller-max)\\n {\\n padding: 0 20rem;\\n border-bottom: var(--input-border-width) solid var(--palette-color-neutral-lightest);\\n }\\n\\n .app-logo\\n {\\n width: 155rem;\\n\\n @media ($media-smaller-max)\\n {\\n width: 113rem;\\n }\\n }\\n\\n .left-menu-container\\n {\\n align-items: center;\\n\\n @media ($media-smaller-max)\\n {\\n display: none;\\n }\\n\\n .menu-trigger-tablet\\n {\\n display: none;\\n\\n @media ($media-small)\\n {\\n display: block;\\n }\\n }\\n\\n .help-menu-container\\n {\\n cursor: pointer;\\n position: relative;\\n z-index: var(--z-index-dropdown);\\n\\n .mdc-list-item\\n {\\n padding: 0 22rem;\\n font-weight: 200;\\n\\n a\\n {\\n color: inherit;\\n }\\n\\n .menu-item-container\\n {\\n display: flex;\\n align-items: center;\\n }\\n }\\n }\\n\\n .administrator-menu-container\\n {\\n align-items: center;\\n cursor: pointer;\\n position: relative;\\n z-index: var(--z-index-dropdown);\\n\\n &.--disabled\\n {\\n pointer-events: none;\\n opacity: var(--opacity-disabled);\\n }\\n\\n .administrator-menu-trigger\\n {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n height: 48rem;\\n width: 48rem;\\n border-radius: 50%;\\n background-color: var(--palette-color-neutral-light);\\n color: var(--palette-color-primary-darkest);\\n }\\n\\n .administrator-menu\\n {\\n padding-top: 0;\\n padding-bottom: 12rem;\\n width: 260rem;\\n\\n .nem-id-information\\n {\\n color: var(--palette-color-neutral-dark);\\n height: 40rem;\\n align-items: center;\\n justify-content: space-between;\\n background-color: var(--palette-color-neutral-light);\\n padding: 0 22rem;\\n font-size: 14rem;\\n\\n > div\\n {\\n align-items: center;\\n\\n .icon-check-small\\n {\\n width: 16rem;\\n }\\n }\\n\\n .icon-nem-id-black\\n {\\n width: 52rem;\\n }\\n }\\n\\n .administrator-information\\n {\\n padding: 16rem 22rem 0;\\n\\n .user-title\\n {\\n font-size: 14rem;\\n line-height: 18rem;\\n color: var(--palette-color-neutral);\\n }\\n\\n .company-name\\n {\\n font-size: 14rem;\\n line-height: 18rem;\\n color: var(--palette-color-neutral);\\n }\\n }\\n\\n .mdc-list-item\\n {\\n padding: 0 22rem;\\n font-weight: 200;\\n }\\n\\n .divider\\n {\\n margin: 12rem 22rem;\\n width: calc(100% - 24rem * 2);\\n border-bottom: var(--input-border-width) solid var(--palette-color-neutral-lightest);\\n }\\n }\\n }\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable } from \"aurelia-framework\";\n\n/**\n * Represents the main cta element on a page\n */\n@autoinject\nexport class PageCta\n{\n public constructor()\n {\n this.disabled = false;\n }\n\n @bindable\n public onClick: () => void;\n\n @bindable\n public disabled: boolean;\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@media(max-width: 800px){page-cta{position:fixed;bottom:0;left:0;width:100%;padding:16rem 0;display:flex;justify-content:center;background-color:#fff;box-shadow:2rem -2rem 4rem rgba(0,0,0,.1);z-index:var(--z-index-fixed)}page-cta[class^=margin]{margin:0}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/components/page-cta/page-cta.scss\"],\"names\":[],\"mappings\":\"AAIE,yBAFF,SAII,cAAA,CACA,QAAA,CACA,MAAA,CACA,UAAA,CACA,eAAA,CACA,YAAA,CACA,sBAAA,CACA,qBAAA,CACA,yCAAA,CACA,4BAAA,CAEA,wBAEE,QAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\npage-cta\\n{\\n @media ($media-smaller-max)\\n {\\n position: fixed;\\n bottom: 0;\\n left: 0;\\n width: 100%;\\n padding: 16rem 0;\\n display: flex;\\n justify-content: center;\\n background-color: white;\\n box-shadow: 2rem -2rem 4rem rgba(0, 0, 0, 0.1);\\n z-index: var(--z-index-fixed);\\n\\n &[class^=\\\"margin\\\"]\\n {\\n margin: 0;\\n }\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable } from \"aurelia-framework\";\n\n@autoinject\nexport class UpdateSalaryInformation\n{\n\t@bindable\n public updating: boolean;\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"update-salary-information{display:flex;cursor:pointer}update-salary-information.--updating{cursor:initial;pointer-events:none}update-salary-information.--updating icon{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}update-salary-information icon{margin-right:4rem}@-webkit-keyframes rotating{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}@keyframes rotating{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/components/update-salary-information/update-salary-information.scss\"],\"names\":[],\"mappings\":\"AAAA,0BAEC,YAAA,CACA,cAAA,CAEA,qCAEC,cAAA,CACA,mBAAA,CAEA,0CAEC,6CAAA,CAAA,qCAAA,CAIF,+BAEC,iBAAA,CAIF,4BACE,KACE,sBAAA,CAEF,GACE,wBAAA,CAAA,CALJ,oBACE,KACE,sBAAA,CAEF,GACE,wBAAA,CAAA\",\"sourcesContent\":[\"update-salary-information\\n{\\n\\tdisplay: flex;\\n\\tcursor: pointer;\\n\\n\\t&.--updating\\n\\t{\\n\\t\\tcursor: initial;\\n\\t\\tpointer-events: none;\\n\\n\\t\\ticon\\n\\t\\t{\\n\\t\\t\\tanimation: rotating 2s linear infinite;\\n\\t\\t}\\n\\t}\\n\\n\\ticon\\n\\t{\\n\\t\\tmargin-right: 4rem;\\n\\t}\\n}\\n\\n@keyframes rotating {\\n from {\\n transform: rotate(0deg);\\n }\\n to {\\n transform: rotate(360deg);\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\nimport { CompanyInitial, IdentityService } from \"company-dashboard/services/identity\";\nimport { ModalService, ToastService } from \"shared/framework\";\n\n@autoinject\nexport class ChangeCompany\n{\n public constructor(\n\t\tidentityService: IdentityService,\n\t\tmodalService: ModalService,\n\t\ttoastService: ToastService,)\n {\n\t\tthis._identityService = identityService;\n\t\tthis._modalService = modalService;\n\t\tthis._toastService = toastService;\n }\n\n\tprotected readonly _identityService: IdentityService;\n\tprivate readonly _modalService: ModalService;\n\tprivate readonly _toastService: ToastService;\n\n\tprotected chosenCompany: CompanyInitial;\n\n\tprotected async changeCompany(): Promise\n\t{\n\t\tif (this.chosenCompany == null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\ttry\n\t\t{\n\t\t\tawait this._identityService.identity.switchCompany(this.chosenCompany.id);\n\n\t\t\tawait this._modalService.closeAll(\"cancel\");\n\t\t}\n\t\tcatch (error: any)\n\t\t{\n\t\t\tthis._toastService.open(\n\t\t\t\t\"error\",\n\t\t\t\t{\n\t\t\t\t\t\"message\": \"Hov, vi kunne ikke skifte virksomhed\"\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t}\n\n\tprotected async onCloseClick(): Promise\n\t{\n\t\tawait this._modalService.closeAll(\"cancel\");\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\nimport { autoinject } from \"aurelia-framework\";\n\n@autoinject\nexport class Carousel\n{\n constructor() {}\n\n protected carouselContainer: HTMLDivElement;\n\n protected sliderFrame: HTMLDivElement;\n\n protected slides: HTMLCollection;\n\n protected currentSlideIndex: number = 0;\n\n attached(): void\n\t{\n this.initialize();\n }\n\n detached(): void\n\t{}\n\n protected get slideWidth(): number\n {\n return this.carouselContainer.offsetWidth;\n }\n\n private initialize(): void\n {\n this.slides = this.sliderFrame.children;\n this.onSlideChange();\n }\n\n protected onNextClick(): void\n {\n if (this.currentSlideIndex < this.slides.length - 1)\n {\n this.currentSlideIndex++;\n this.onSlideChange();\n }\n }\n\n protected onPreviousClick(): void\n {\n if (this.currentSlideIndex > 0)\n {\n this.currentSlideIndex--;\n this.onSlideChange();\n }\n }\n\n public onSlideChange(): number\n {\n return this.currentSlideIndex + 1;\n }\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"carousel{display:flex;flex:1;position:relative}carousel .carousel-container{position:relative;height:100%;width:100%;overflow:hidden}carousel .carousel-container .slider-container{height:100%;display:flex;transform:translateX(0);transition:transform 150ms;position:relative}carousel .carousel-container .slider-container img{height:100%;width:auto}@media(max-width: 800px){carousel .carousel-container .slider-container img{height:auto;width:100%}}carousel .logo-container{position:absolute;top:0;left:0;margin:40rem;z-index:2}carousel .navigation-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;padding:16rem}carousel .navigation-container .navigation-button{height:32rem;width:32rem;cursor:pointer}carousel .navigation-container .navigation-button.--right{margin-left:auto}carousel .indicator-container{position:absolute;bottom:150rem;left:0;width:100%;display:flex;align-items:center;justify-content:center}@media(max-width: 800px){carousel .indicator-container{bottom:104rem}}carousel .indicator-container .indicator{height:4rem;width:12rem;background-color:var(--palette-color-blackpoint);border-radius:8rem;-webkit-backdrop-filter:blur(8rem);backdrop-filter:blur(8rem);opacity:.15;transition:width 150ms;cursor:pointer}carousel .indicator-container .indicator:not(:last-child){margin-right:8rem}carousel .indicator-container .indicator.--active{background-color:#fff;width:24rem;-webkit-backdrop-filter:unset;backdrop-filter:unset;opacity:1}carousel .description-container{position:absolute;bottom:0;left:0;display:flex;flex-wrap:nowrap;transform:translateX(0);transition:transform 150ms;align-items:flex-end}carousel .description-container [slot=description]{display:contents}carousel .description-container [slot=description]>*{padding:0 40rem 32rem;color:#fff;width:472rem}@media(max-width: 800px){carousel .description-container [slot=description]>*{padding:0 16rem 16rem;width:100vw;height:auto}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modals/connect-to-payroll-system/connect-to-salary/components/carousel/carousel.scss\"],\"names\":[],\"mappings\":\"AAEA,SAEC,YAAA,CACA,MAAA,CACA,iBAAA,CAEA,6BAEC,iBAAA,CACA,WAAA,CACA,UAAA,CACA,eAAA,CAEA,+CAEC,WAAA,CACA,YAAA,CACA,uBAAA,CACA,0BAAA,CACA,iBAAA,CAEA,mDAEC,WAAA,CACA,UAAA,CAEA,yBALD,mDAOE,WAAA,CACA,UAAA,CAAA,CAMJ,yBAEC,iBAAA,CACA,KAAA,CACA,MAAA,CACA,YAAA,CACA,SAAA,CAGD,+BAEC,iBAAA,CACA,KAAA,CACA,OAAA,CACA,QAAA,CACA,MAAA,CACA,YAAA,CACA,kBAAA,CACA,aAAA,CAEA,kDAEC,YAAA,CACA,WAAA,CACA,cAAA,CAEA,0DAEC,gBAAA,CAKH,8BAEC,iBAAA,CACA,aAAA,CACA,MAAA,CACA,UAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CAEA,yBAVD,8BAYE,aAAA,CAAA,CAGD,yCAEC,WAAA,CACA,WAAA,CACA,gDAAA,CACA,kBAAA,CACA,kCAAA,CAAA,0BAAA,CACA,WAAA,CACA,sBAAA,CACA,cAAA,CAEA,0DAEC,iBAAA,CAGD,kDAEC,qBAAA,CACA,WAAA,CACA,6BAAA,CAAA,qBAAA,CACA,SAAA,CAKH,gCAEC,iBAAA,CACA,QAAA,CACA,MAAA,CACA,YAAA,CACA,gBAAA,CACA,uBAAA,CACA,0BAAA,CACA,oBAAA,CAEA,mDAEC,gBAAA,CAEA,qDAEC,qBAAA,CACA,UAAA,CACA,YAAA,CAEA,yBAND,qDAQE,qBAAA,CACA,WAAA,CACA,WAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\ncarousel\\n{\\n\\tdisplay: flex;\\n\\tflex: 1;\\n\\tposition: relative;\\n\\n\\t.carousel-container\\n\\t{\\n\\t\\tposition: relative;\\n\\t\\theight: 100%;\\n\\t\\twidth: 100%;\\n\\t\\toverflow: hidden;\\n\\n\\t\\t.slider-container\\n\\t\\t{\\n\\t\\t\\theight: 100%;\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\ttransform: translateX(0);\\n\\t\\t\\ttransition: transform 150ms;\\n\\t\\t\\tposition: relative;\\n\\n\\t\\t\\timg\\n\\t\\t\\t{\\n\\t\\t\\t\\theight: 100%;\\n\\t\\t\\t\\twidth: auto;\\n\\n\\t\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\theight: auto;\\n\\t\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t.logo-container\\n\\t{\\n\\t\\tposition: absolute;\\n\\t\\ttop: 0;\\n\\t\\tleft: 0;\\n\\t\\tmargin: 40rem;\\n\\t\\tz-index: 2;\\n\\t}\\n\\n\\t.navigation-container\\n\\t{\\n\\t\\tposition: absolute;\\n\\t\\ttop: 0;\\n\\t\\tright: 0;\\n\\t\\tbottom: 0;\\n\\t\\tleft: 0;\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: center;\\n\\t\\tpadding: 16rem;\\n\\n\\t\\t.navigation-button\\n\\t\\t{\\n\\t\\t\\theight: 32rem;\\n\\t\\t\\twidth: 32rem;\\n\\t\\t\\tcursor: pointer;\\n\\n\\t\\t\\t&.--right\\n\\t\\t\\t{\\n\\t\\t\\t\\tmargin-left: auto;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t.indicator-container\\n\\t{\\n\\t\\tposition: absolute;\\n\\t\\tbottom: 150rem;\\n\\t\\tleft: 0;\\n\\t\\twidth: 100%;\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: center;\\n\\t\\tjustify-content: center;\\n\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\tbottom: 104rem;\\n\\t\\t}\\n\\n\\t\\t.indicator\\n\\t\\t{\\n\\t\\t\\theight: 4rem;\\n\\t\\t\\twidth: 12rem;\\n\\t\\t\\tbackground-color: var(--palette-color-blackpoint);\\n\\t\\t\\tborder-radius: 8rem;\\n\\t\\t\\tbackdrop-filter: blur(8rem);\\n\\t\\t\\topacity: .15;\\n\\t\\t\\ttransition: width 150ms;\\n\\t\\t\\tcursor: pointer;\\n\\n\\t\\t\\t&:not(:last-child)\\n\\t\\t\\t{\\n\\t\\t\\t\\tmargin-right: 8rem;\\n\\t\\t\\t}\\n\\n\\t\\t\\t&.--active\\n\\t\\t\\t{\\n\\t\\t\\t\\tbackground-color: white;\\n\\t\\t\\t\\twidth: 24rem;\\n\\t\\t\\t\\tbackdrop-filter: unset;\\n\\t\\t\\t\\topacity: 1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t.description-container\\n\\t{\\n\\t\\tposition: absolute;\\n\\t\\tbottom: 0;\\n\\t\\tleft: 0;\\n\\t\\tdisplay: flex;\\n\\t\\tflex-wrap: nowrap;\\n\\t\\ttransform: translateX(0);\\n\\t\\ttransition: transform 150ms;\\n\\t\\talign-items: flex-end;\\n\\n\\t\\t[slot=\\\"description\\\"]\\n\\t\\t{\\n\\t\\t\\tdisplay: contents;\\n\\n\\t\\t\\t> *\\n\\t\\t\\t{\\n\\t\\t\\t\\tpadding: 0 40rem 32rem;\\n\\t\\t\\t\\tcolor: white;\\n\\t\\t\\t\\twidth: 472rem;\\n\\n\\t\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tpadding: 0 16rem 16rem;\\n\\t\\t\\t\\t\\twidth: 100vw;\\n\\t\\t\\t\\t\\theight: auto;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\nimport { PayrollSystemService } from \"company-dashboard/model/dashboard/company\";\nimport { PayrollSystem } from \"company-dashboard/model/dashboard/shared\";\nimport { IValidation, ModalService, ThemeService, ToastService } from \"shared/framework\";\nimport { Operation } from \"shared/utilities\";\n\n@autoinject\nexport class ConnectToSalary\n{\n public constructor(themeService: ThemeService, modalService: ModalService, toastService: ToastService, payrollSystemService: PayrollSystemService)\n {\n this.themeService = themeService;\n\t\tthis._modalService = modalService;\n\t\tthis._toastService = toastService;\n\t\tthis._payrollSystemService = payrollSystemService;\n }\n\n protected readonly themeService: ThemeService;\n\tprivate readonly _modalService: ModalService;\n\tprivate readonly _toastService: ToastService;\n\tprivate readonly _payrollSystemService: PayrollSystemService;\n\n\tprotected salaryKey?: string;\n\n\tprotected salaryKeyInvalid: boolean = false;\n\n\tprotected connectedToSalary: boolean;\n\n\tprotected operation: Operation;\n\n\tprotected validation: IValidation;\n\n\tprotected async addSalaryApiToken(): Promise\n\t{\n\t\tif (!await this.validation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.operation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\t// Hardcoded to start with\n\t\t\t\tconst salaryPayrollSystem = new PayrollSystem(\"salary\");\n\n\t\t\t\tawait this._payrollSystemService.addPayrollSystemApiToken(this.salaryKey!, salaryPayrollSystem, signal);\n\n\t\t\t\tthis.connectedToSalary = true;\n\n\t\t\t\tawait this._modalService.closeAll(\"cancel\");\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tif (error.response.status === 400)\n\t\t\t\t{\n\t\t\t\t\tthis.salaryKeyInvalid = true;\n\t\t\t\t\tthis.validation.active = true;\n\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"message\": \"Hov, den nøgle ser ikke rigtig ud. Kontroller at den er korrekt og prøv igen.\"\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"message\": error.message\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tprotected async onCloseClick(): Promise\n\t{\n\t\tif (this.connectedToSalary)\n\t\t{\n\t\t\tthis._toastService.open(\n\t\t\t\t\"success\",\n\t\t\t\t{\n\t\t\t\t\tbody: \"Dit Grandhood Dashboard er blevet forbundet med Salary. \"\n\t\t\t\t}\n\t\t\t)\n\t\t}\n\t\tawait this._modalService.closeAll(\"cancel\");\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-dialog[name=connect-to-salary]{display:flex}modal-dialog[name=connect-to-salary] carousel{width:472rem}@media(max-width: 800px){modal-dialog[name=connect-to-salary] carousel{width:100%;height:auto}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modals/connect-to-payroll-system/connect-to-salary/connect-to-salary.scss\"],\"names\":[],\"mappings\":\"AAEA,qCAEC,YAAA,CAEA,8CAEC,YAAA,CAEA,yBAJD,8CAME,UAAA,CACA,WAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\nmodal-dialog[name=\\\"connect-to-salary\\\"]\\n{\\n\\tdisplay: flex;\\n\\n\\tcarousel\\n\\t{\\n\\t\\twidth: 472rem;\\n\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\theight: auto;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\nimport { PayrollSystemService } from \"company-dashboard/model/dashboard/company\";\nimport { ModalService, ThemeService, ToastService } from \"shared/framework\";\nimport { Operation } from \"shared/utilities\";\n\n@autoinject\nexport class ConnectToZenegy {\n public constructor(themeService: ThemeService, modalService: ModalService, toastService: ToastService, payrollSystemService: PayrollSystemService) {\n this.themeService = themeService;\n this.modalService = modalService;\n this._toastService = toastService;\n this._payrollSystemService = payrollSystemService;\n }\n\n protected readonly modalService: ModalService;\n protected readonly themeService: ThemeService;\n private readonly _toastService: ToastService;\n private readonly _payrollSystemService: PayrollSystemService;\n\n protected zenegyAutorizationUrl?: string;\n\n protected operation: Operation;\n\n /**\n * Called by the framework when the modal is activated.\n */\n public async activate(): Promise {\n await this.getZenegyConnectionUrl();\n }\n\n protected redirectToZenegy(): void {\n location.assign(this.zenegyAutorizationUrl!);\n }\n\n protected async getZenegyConnectionUrl(): Promise {\n // Create and execute the operation\n this.operation = new Operation(async signal => {\n try {\n const response = await this._payrollSystemService.getZenegyAuthorizationUrl(signal);\n\n this.zenegyAutorizationUrl = response;\n }\n catch (error: any) {\n if (error.response.status === 400) {\n this._toastService.open(\n \"error\",\n {\n \"message\": \"Vi kunne deværre ikke få en nøgle fra Zenegy.\"\n }\n );\n }\n else {\n this._toastService.open(\n \"error\",\n {\n \"message\": error.message\n }\n );\n }\n }\n })\n }\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-dialog[name=connect-to-zenegy]{display:flex;height:720rem}@media(max-width: 800px){modal-dialog[name=connect-to-zenegy] modal-image{width:100%;height:auto}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modals/connect-to-payroll-system/connect-to-zenegy/connect-to-zenegy.scss\"],\"names\":[],\"mappings\":\"AAEA,qCAEC,YAAA,CACA,aAAA,CAKC,yBAHD,iDAKE,UAAA,CACA,WAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\nmodal-dialog[name=\\\"connect-to-zenegy\\\"]\\n{\\n\\tdisplay: flex;\\n\\theight: 720rem;\\n\\n\\tmodal-image\\n\\t{\\n\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\theight: auto;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable } from \"aurelia-framework\";\nimport { ModalService } from \"shared/framework\";\n\n@autoinject\nexport class FirstEmployee\n{\n\tpublic constructor(modalService: ModalService)\n\t{\n\t\tthis._modalService = modalService;\n\t}\n\tprotected readonly _modalService: ModalService;\n\n @bindable\n public onNextClick: () => void;\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\nimport { IValidation, ModalService, ToastService } from \"shared/framework\";\nimport { IdentityService } from \"company-dashboard/services/identity\";\nimport { EmployeeSignUp, EmployeeService } from \"company-dashboard/model/dashboard/employee\";\nimport { Operation } from \"shared/utilities\";\nimport { DateTime } from \"luxon\";\n\n@autoinject\nexport class PersonalInformation\n{\n\tpublic constructor(\n\t\tidentityService: IdentityService,\n\t\temployeeService: EmployeeService,\n\t\tmodalService: ModalService,\n\t\ttoastService: ToastService)\n\t{\n\t\tthis.identityService = identityService;\n\t\tthis._employeeService = employeeService;\n\t\tthis._modalService = modalService;\n\t\tthis._toastService = toastService;\n\t}\n\n\tprivate readonly _employeeService: EmployeeService;\n\tprivate readonly _toastService: ToastService;\n\tprivate readonly _modalService: ModalService;\n\tprotected readonly identityService: IdentityService;\n\n\tprotected operation: Operation;\n\n\tprotected validation: IValidation;\n\n\t@bindable({ defaultBindingMode: bindingMode.toView })\n\tprotected state: \"add\" | \"edit\";\n\n\t@bindable({ defaultBindingMode: bindingMode.twoWay })\n\tprotected employee: EmployeeSignUp;\n\n\t@bindable\n\tprotected onNext: () => void;\n\n\t@bindable\n\tprotected onCloseClick: () => void;\n\n\tprotected firstLoad: boolean = true;\n\n\tprotected async employeeChanged(newValue: EmployeeSignUp): Promise\n\t{\n\t\tif (this.firstLoad)\n\t\t{\n\t\t\tif (newValue.id != null)\n\t\t\t{\n\t\t\t\tawait this.getPersonalInformation();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tawait this.getSignUpEmployeeInformation();\n\t\t\t}\n\t\t\tthis.firstLoad = false;\n\t\t}\n\t}\n\n\t@computedFrom(\"employee.personalInformation.socialSecurityNumber\")\n\tprotected get socialSecurityNumberValid(): \"too-young\" | \"not-valid\" | \"valid\"\n\t{\n\t\tif (this.employee?.personalInformation.socialSecurityNumber == null || this.employee.personalInformation.socialSecurityNumber.length !== 10)\n\t\t{\n\t\t\treturn \"not-valid\";\n\t\t}\n\n\t\tconst birthDay: number = Number(this.employee.personalInformation.socialSecurityNumber.substring(0, 2));\n\t\tconst birthMonth: number = Number(this.employee.personalInformation.socialSecurityNumber.substring(2, 4));\n\t\tlet birthYear: number = Number(this.employee.personalInformation.socialSecurityNumber.substring(4, 6));\n\t\tif (birthYear >= 40)\n\t\t{\n\t\t\tbirthYear += 1900;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbirthYear += 2000;\n\t\t}\n\t\tconst birthDate = DateTime.local(birthYear, birthMonth, birthDay);\n\n\t\tif (!birthDate.isValid)\n\t\t{\n\t\t\treturn \"not-valid\";\n\t\t}\n\n\t\tif (birthDate.diffNow(\"years\").years > -18)\n\t\t{\n\t\t\treturn \"too-young\";\n\t\t}\n\n\t\treturn \"valid\";\n\t}\n\n\tprotected async getPersonalInformation(): Promise\n\t{\n\t\tif (this.operation != null)\n\t\t{\n\t\t\tthis.operation.abort();\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.operation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\t// Fetch the data\n\t\t\t\tconst result = await this._employeeService.getPersonalInformation(\n\t\t\t\t\tthis.employee.id,\n\t\t\t\t\tsignal\n\t\t\t\t);\n\n\t\t\t\tthis.employee = result;\n\n\t\t\t\tif (this.employee.fromPayrollSystem)\n\t\t\t\t{\n\t\t\t\t\tthis.validation.active = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"message\": `An error occurred.\\n${error.message.toString()}`\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t}\n\n\tprotected async getSignUpEmployeeInformation(): Promise\n\t{\n\t\tif (this.operation != null)\n\t\t{\n\t\t\tthis.operation.abort();\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.operation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\t// Fetch the data\n\t\t\t\tconst result = await this._employeeService.getSignUpEmployeeData(signal);\n\n\t\t\t\tthis.employee = result;\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"message\": `An error occurred.\\n${error.message.toString()}`\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t}\n\n\tprotected async onUpdatePersonalInformation(): Promise\n\t{\n\t\tthis.validation.active = true;\n\n\t\tif (!await this.validation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.operation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tthis.employee.capitalizeNames();\n\n\t\t\t\tawait this._employeeService.updatePersonalInformation(this.employee, signal);\n\n\t\t\t\t// this.updateEmployeesPage = true;\n\n\t\t\t\tawait this._modalService.closeAll(\"cancel\");\n\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"success\",\n\t\t\t\t\t{\n\t\t\t\t\t\theading: `Oplysninger for ${this.employee.personalInformation.firstName} er blevet ændret.`\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"message\": error.message\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t})\n\t}\n\n\tprotected async onNextClick(): Promise\n\t{\n\t\tthis.validation.active = true;\n\n\t\tif (!await this.validation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tthis.onNext();\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","import { autoinject, bindable, bindingMode } from \"aurelia-framework\";\nimport { IValidation, ModalService, ToastService } from \"shared/framework\";\nimport { IdentityService } from \"company-dashboard/services/identity\";\nimport { EmployeeSignUp, EmployeeService } from \"company-dashboard/model/dashboard/employee\";\nimport { Operation } from \"shared/utilities\";\n\n@autoinject\nexport class PlaceOfResidence\n{\n\tpublic constructor(\n\t\tidentityService: IdentityService,\n\t\temployeeService: EmployeeService,\n\t\tmodalService: ModalService,\n\t\ttoastService: ToastService)\n\t{\n\t\tthis.identityService = identityService;\n\t\tthis._employeeService = employeeService;\n\t\tthis._modalService = modalService;\n\t\tthis._toastService = toastService;\n\t}\n\n\tprivate readonly _employeeService: EmployeeService;\n\tprivate readonly _toastService: ToastService;\n\tprivate readonly _modalService: ModalService;\n\tprotected readonly identityService: IdentityService;\n\n\tprotected operation: Operation;\n\n\tprotected validation: IValidation;\n\n\t@bindable({ defaultBindingMode: bindingMode.toView })\n\tprotected state: \"add\" | \"edit\";\n\n\t@bindable({ defaultBindingMode: bindingMode.twoWay })\n\tprotected employee: EmployeeSignUp;\n\n\t@bindable\n\tprotected onNext: () => void;\n\n\t@bindable\n\tprotected onBackClick: () => void;\n\n\t@bindable\n\tprotected onCloseClick: () => void;\n\n\tprotected firstLoad: boolean = true;\n\n\tprotected async employeeChanged(newValue: EmployeeSignUp): Promise\n\t{\n\t\tif (this.firstLoad)\n\t\t{\n\t\t\tif (newValue.id != null)\n\t\t\t{\n\t\t\t\tawait this.getAddressInformation();\n\t\t\t}\n\t\t\tthis.firstLoad = false;\n\t\t}\n\t}\n\n\tprotected async getAddressInformation(): Promise\n\t{\n\t\tif (this.operation != null)\n\t\t{\n\t\t\tthis.operation.abort();\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.operation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\t// Fetch the data\n\t\t\t\tconst result = await this._employeeService.getAddressInformation(\n\t\t\t\t\tthis.employee.id,\n\t\t\t\t\tsignal\n\t\t\t\t);\n\n\t\t\t\tthis.employee = result;\n\n\t\t\t\tif (this.employee.fromPayrollSystem)\n\t\t\t\t{\n\t\t\t\t\tthis.validation.active = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"message\": `An error occurred.\\n${error.message.toString()}`\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t}\n\n\tprotected async onUpdateAddressInformation(): Promise\n\t{\n\t\tthis.validation.active = true;\n\n\t\tif (!await this.validation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.operation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait this._employeeService.updateAddressInformation(this.employee, signal);\n\n\t\t\t\tawait this._modalService.closeAll(\"cancel\");\n\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"success\",\n\t\t\t\t\t{\n\t\t\t\t\t\theading: `Oplysninger for ${this.employee.personalInformation.firstName} er blevet ændret.`\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"message\": error.message\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t})\n\t}\n\n\tprotected async onNextClick(): Promise\n\t{\n\t\tthis.validation.active = true;\n\n\t\tif (!await this.validation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tthis.onNext();\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","import { autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\nimport { IValidation, ModalService, ToastService } from \"shared/framework\";\nimport { IdentityService } from \"company-dashboard/services/identity\";\nimport { EmployeeSignUp, EmployeeService, EmploymentType } from \"company-dashboard/model/dashboard/employee\";\nimport { Operation } from \"shared/utilities\";\nimport { DateTime } from \"luxon\";\n\n@autoinject\nexport class SalaryAndPension\n{\n\tpublic constructor(\n\t\tidentityService: IdentityService,\n\t\temployeeService: EmployeeService,\n\t\tmodalService: ModalService,\n\t\ttoastService: ToastService)\n\t{\n\t\tthis.identityService = identityService;\n\t\tthis._employeeService = employeeService;\n\t\tthis._modalService = modalService;\n\t\tthis._toastService = toastService;\n\t}\n\n\tprivate readonly _employeeService: EmployeeService;\n\tprivate readonly _toastService: ToastService;\n\tprivate readonly _modalService: ModalService;\n\tprotected readonly identityService: IdentityService;\n\n\tprotected operation: Operation;\n\n\tprotected validation: IValidation;\n\n\t@bindable({ defaultBindingMode: bindingMode.toView })\n\tprotected state: \"add\" | \"edit\";\n\n\t@bindable({ defaultBindingMode: bindingMode.twoWay })\n\tprotected employee: EmployeeSignUp;\n\n\t@bindable({ defaultBindingMode: bindingMode.twoWay })\n\tprotected employeeIsLocked: boolean;\n\n\tprotected readonly employmentTypes = [ new EmploymentType(\"employee\"), new EmploymentType(\"owner\") ];\n\n\t@bindable\n\tprotected onNext: () => void;\n\n\t@bindable\n\tprotected onBackClick: () => void;\n\n\t@bindable\n\tprotected onCloseClick: () => void;\n\n\tprotected firstLoad: boolean = true;\n\n\tprotected async employeeChanged(newValue: EmployeeSignUp): Promise\n\t{\n\t\tif (this.firstLoad)\n\t\t{\n\t\t\tif (newValue.id != null)\n\t\t\t{\n\t\t\t\tawait this.getCompensationInformation();\n\t\t\t}\n\t\t\tthis.firstLoad = false;\n\t\t}\n\t}\n\n\t@computedFrom(\"employee.companyAgreementStartDate\")\n\tprotected get minimumValidDateOfMandatoryStart(): DateTime | undefined\n\t{\n\t\tif(this.employee?.companyAgreementStartDate == null ||\n\t\t\t!this.employee.companyAgreementStartDate.isValid)\n\t\t{\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst today = DateTime.local();\n\t\tconst currentMonth = today.set({ day: 1 }).startOf(\"day\");\n\t\tconst agreementStartDate = this.employee.companyAgreementStartDate;\n\n\t\treturn currentMonth < agreementStartDate\n\t\t\t? agreementStartDate\n\t\t\t: currentMonth;\n\t}\n\n\tprotected async getCompensationInformation(): Promise\n\t{\n\t\tif (this.operation != null)\n\t\t{\n\t\t\tthis.operation.abort();\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.operation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\t// Fetch the data\n\t\t\t\tthis.employee = await this._employeeService.getCompensationInformation(\n\t\t\t\t\tthis.employee.id,\n\t\t\t\t\tsignal\n\t\t\t\t);\n\n\t\t\t\tthis.employeeIsLocked = \n\t\t\t\t\tthis.employee.compensationInformation.monthlySalaryLocked && \n\t\t\t\t\tthis.employee.compensationInformation.employmentTypeLocked &&\n\t\t\t\t\tthis.employee.compensationInformation.mandatoryPolicyStartDateLocked &&\n\t\t\t\t\tthis.employee.compensationInformation.employeeGroupLocked &&\n\t\t\t\t\tthis.employee.compensationInformation.subsidiaryLocked;\n\n\t\t\t\tif (this.employee.fromPayrollSystem)\n\t\t\t\t{\n\t\t\t\t\tthis.validation.active = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"message\": `An error occurred.\\n${error.message.toString()}`\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t}\n\n\tprotected async updateCompensationInformation(): Promise\n\t{\n\t\tthis.validation.active = true;\n\n\t\tif (!await this.validation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.operation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait this._employeeService.updateCompensationInformation(this.employee, signal);\n\n\t\t\t\tawait this._modalService.closeAll(\"cancel\");\n\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"success\",\n\t\t\t\t\t{\n\t\t\t\t\t\theading: `Oplysninger for ${this.employee.personalInformation.firstName} er blevet ændret.`\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"message\": error.message\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t})\n\t}\n\n\tprotected async signUpEmployee(): Promise\n\t{\n\t\tthis.validation.active = true;\n\n\t\tif (!await this.validation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.operation != null)\n\t\t{\n\t\t\tthis.operation.abort();\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.operation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait this._employeeService.signUpEmployee(this.employee, signal);\n\n\t\t\t\tthis.onNext();\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"message\": error.message\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t})\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","import { EmployeeSignUp, EmploymentType } from \"company-dashboard/model/dashboard/employee\";\nimport { autoinject, bindable, bindingMode } from \"aurelia-framework\";\nimport { ModalService, ToastService } from \"shared/framework\";\nimport { Operation } from \"shared/utilities\";\nimport { IdentityService } from \"company-dashboard/services/identity\";\n\n@autoinject\nexport class SignUpEmployee\n{\n\tpublic constructor(\n\t\ttoastService: ToastService,\n\t\tmodalService: ModalService,\n\t\tidentityService: IdentityService)\n\t{\n\t\tthis._toastService = toastService;\n\t\tthis._modalService = modalService;\n\t\tthis._identityService = identityService;\n\t}\n\n\tprivate readonly _toastService: ToastService;\n\tprivate readonly _modalService: ModalService;\n\tprivate readonly _identityService: IdentityService;\n\n\tprotected pensionStructureOperation: Operation;\n\n\t@bindable({ defaultBindingMode: bindingMode.twoWay })\n\tprotected employee: EmployeeSignUp;\n\n\t@bindable({ defaultBindingMode: bindingMode.toView })\n\tprotected flow: \"add-employee\" | \"place-of-residence\" | \"personal-information\" | \"salary-and-pension\";\n\n\t@bindable({ defaultBindingMode: bindingMode.toView })\n\tprotected employeeFirstName: string | undefined;\n\n\t@bindable({ defaultBindingMode: bindingMode.toView })\n\tprotected employeeId: number | undefined;\n\n\tprotected state: \"personal-information\" | \"place-of-residence\" | \"salary-and-pension\" | \"administrator-help\";\n\n\t@bindable\n\tprotected updateEmployeesPage: boolean = false;\n\n\tprotected attached(): void\n\t{\n\t\tif (this.employeeId != null)\n\t\t{\n\t\t\tthis.employee = new EmployeeSignUp({ id: this.employeeId, personalInformation: { firstName: this.employeeFirstName } });\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.employee = new EmployeeSignUp({});\n\t\t}\n\t}\n\n\tpublic flowChanged(newValue: \"add-employee\" | \"personal-information\" | \"place-of-residence\" | \"salary-and-pension\"): void\n\t{\n\t\tif (newValue === \"salary-and-pension\" || newValue === \"place-of-residence\")\n\t\t{\n\t\t\tthis.state = newValue;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.state = \"personal-information\";\n\t\t}\n\t}\n\n\tprotected async onCloseClick(): Promise\n\t{\n\t\tif (this.updateEmployeesPage)\n\t\t{\n\t\t\tthis._toastService.open(\n\t\t\t\t\"success\",\n\t\t\t\t{\n\t\t\t\t\theading: this.employee.personalInformation.firstName,\n\t\t\t\t\tbody: \"blev tilmeldt og vil modtage en mail med instrukser.\"\n\t\t\t\t}\n\t\t\t)\n\t\t}\n\t\tawait this._modalService.closeAll(\"cancel\");\n\t}\n\n\tprotected async onNext(): Promise\n\t{\n\t\tif (this.state === \"personal-information\")\n\t\t{\n\t\t\tthis.employee.capitalizeNames();\n\n\t\t\tif (this._identityService.identity.company?.hasMandatoryPlan)\n\t\t\t{\n\t\t\t\tthis.state = \"place-of-residence\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!this.employee.ownersTaxedPrivately)\n\t\t\t\t{\n\t\t\t\t\tthis.employee.compensationInformation.employmentType = new EmploymentType(\"employee\");\n\t\t\t\t}\n\n\t\t\t\tthis.state = \"salary-and-pension\";\n\t\t\t}\n\t\t}\n\t\telse if (this.state === \"place-of-residence\")\n\t\t{\n\t\t\tif (!this.employee.ownersTaxedPrivately)\n\t\t\t{\n\t\t\t\tthis.employee.compensationInformation.employmentType = new EmploymentType(\"employee\");\n\t\t\t}\n\n\t\t\tthis.state = \"salary-and-pension\";\n\t\t}\n\t\telse if (this.state === \"salary-and-pension\")\n\t\t{\n\t\t\tthis.updateEmployeesPage = true;\n\n\t\t\tif (this.flow === \"add-employee\")\n\t\t\t{\n\t\t\t\tthis.state = \"administrator-help\";\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected onBackClick(): void\n\t{\n\t\tif (this.state === \"place-of-residence\")\n\t\t{\n\t\t\tthis.state = \"personal-information\";\n\t\t}\n\t\telse if (this.state === \"salary-and-pension\")\n\t\t{\n\t\t\tif (this._identityService.identity.company?.hasMandatoryPlan)\n\t\t\t{\n\t\t\t\tthis.state = \"place-of-residence\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.state = \"personal-information\";\n\t\t\t}\n\t\t}\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"sign-up-employee .--bold{font-weight:300}sign-up-employee .modal-content{min-height:730rem;max-height:100%}@media(max-width: 800px){sign-up-employee .modal-content{width:100%}}sign-up-employee .modal-content modal-header::before{width:100%}sign-up-employee .modal-content modal-header .--neutral{color:var(--palette-color-neutral-dark)}@media(max-width: 800px){sign-up-employee .modal-content modal-footer{flex-direction:column-reverse}sign-up-employee .modal-content modal-footer>button{margin:0}sign-up-employee .modal-content modal-footer>button:not(:last-child){margin-top:16rem}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modals/sign-up-employee-flow/components/sign-up-employee/sign-up-employee.scss\"],\"names\":[],\"mappings\":\"AAIC,yBAEC,eAAA,CAGD,gCAEC,iBAAA,CACA,eAAA,CAEA,yBALD,gCAOE,UAAA,CAAA,CAKA,qDAEC,UAAA,CAGD,wDAEC,uCAAA,CAUD,yBAFD,6CAIE,6BAAA,CAEA,oDAEC,QAAA,CAEA,qEAEC,gBAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\nsign-up-employee\\n{\\n\\t.--bold\\n\\t{\\n\\t\\tfont-weight: 300;\\n\\t}\\n\\n\\t.modal-content\\n\\t{\\n\\t\\tmin-height: 730rem;\\n\\t\\tmax-height: 100%;\\n\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\twidth: 100%;\\n\\t\\t}\\n\\n\\t\\tmodal-header\\n\\t\\t{\\n\\t\\t\\t&::before\\n\\t\\t\\t{\\n\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t}\\n\\n\\t\\t\\t.--neutral\\n\\t\\t\\t{\\n\\t\\t\\t\\tcolor: var(--palette-color-neutral-dark);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tmodal-section\\n\\t\\t{\\n\\t\\t}\\n\\n\\t\\tmodal-footer\\n\\t\\t{\\n\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t{\\n\\t\\t\\t\\tflex-direction: column-reverse;\\n\\n\\t\\t\\t\\t> button\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tmargin: 0;\\n\\n\\t\\t\\t\\t\\t&:not(:last-child)\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\tmargin-top: 16rem;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { EmployeeSignUp } from \"company-dashboard/model/dashboard/employee\";\nimport { autoinject, bindable, bindingMode } from \"aurelia-framework\";\nimport { ThemeService } from \"shared/framework\";\nimport { Modal } from \"shared/framework/services/modal\";\nimport { Operation } from \"shared/utilities\";\n\n@autoinject\nexport class SignUpEmployeeFlow\n{\n\tpublic constructor(\n\t\tmodal: Modal,\n\t\tthemeService: ThemeService)\n\t{\n\t\tthis._modal = modal;\n\t\tthis._themeService = themeService;\n\t}\n\n\tprivate readonly _modal: Modal;\n\tprotected readonly _themeService: ThemeService;\n\n\tprotected getEmployeeOperation: Operation;\n\n\tprotected pensionStructureOperation: Operation;\n\n\t@bindable({ defaultBindingMode: bindingMode.toView })\n\tprotected updateEmployeesPage: boolean = false;\n\n\t@bindable\n\tprotected model: {\n\t\temployeeFlow: \"add-employee\" | \"place-of-residence\" | \"personal-information\" | \"salary-and-pension\" | undefined,\n\t\tfirstEmployee?: boolean\n\t\temployeeId?: number,\n\t\temployeeFirstName?: string\n\t};\n\n\t@bindable({ defaultBindingMode: bindingMode.fromView })\n\tprotected state: \"add-employee\" | \"place-of-residence\" | \"personal-information\" | \"salary-and-pension\" | \"first-employee\";\n\n\tprotected get imageUrl(): string\n\t{\n\t\tif (this.state === \"add-employee\")\n\t\t{\n\t\t\tif (!this.updateEmployeesPage)\n\t\t\t{\n\t\t\t\treturn `/resources/themes/${this._themeService.theme.slug}/images/looking-at-grandhood-app.jpg`;\n\t\t\t}\n\t\t\telse if (this.updateEmployeesPage)\n\t\t\t{\n\t\t\t\treturn `/resources/themes/${this._themeService.theme.slug}/images/employee-signed-up.jpg`;\n\t\t\t}\n\t\t}\n\t\telse if (this.state === \"first-employee\" || this.state === \"personal-information\" || \"place-of-residence\" || this.state === \"salary-and-pension\")\n\t\t{\n\t\t\treturn `/resources/themes/${this._themeService.theme.slug}/images/grandhood-app-core-experience.jpg`;\n\t\t}\n\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Called by the framework when the modal is activated.\n\t * @param model The model to use for the modal.\n\t */\n\tpublic async activate(\n\t\tmodel: {\n\t\t\temployeeFlow: \"add-employee\" | \"place-of-residence\" | \"personal-information\" | \"salary-and-pension\" | undefined,\n\t\t\tfirstEmployee?: boolean,\n\t\t\temployeeId?: number,\n\t\t\temployeeFirstName?: string\n\t\t}): Promise\n\t{\n\t\tthis.model = model;\n\n\t\t// Edit employee\n\t\tif (model.employeeId != null)\n\t\t{\n\t\t\tif (\n\t\t\t\tmodel.employeeFlow === \"personal-information\" ||\n\t\t\t\tmodel.employeeFlow === \"place-of-residence\" ||\n\t\t\t\tmodel.employeeFlow === \"salary-and-pension\")\n\t\t\t{\n\t\t\t\tthis.state = model.employeeFlow;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (model.firstEmployee)\n\t\t\t{\n\t\t\t\tthis.state = \"first-employee\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.state = \"add-employee\";\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic deactivate(): EmployeeSignUp | undefined\n\t{\n\t\treturn undefined;\n\t}\n\n\tprotected async onNextClick(): Promise\n\t{\n\t\tif (this.state === \"first-employee\")\n\t\t{\n\t\t\tthis.state = \"add-employee\";\n\t\t}\n\t}\n\n\tprotected async onCloseClick(): Promise\n\t{\n\t\tawait this._modal.close();\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, PLATFORM } from \"aurelia-framework\";\nimport { RouterConfiguration, Router } from \"aurelia-router\";\n\n/**\n * Represents the module.\n */\n@autoinject\nexport class DashboardModule\n{\n\tpublic configureRouter(config: RouterConfiguration, router: Router): void\n\t{\n\t\tlet routeConfig = [\n\t\t\t{\n\t\t\t\tname: \"default\",\n\t\t\t\troute: \"\",\n\t\t\t\tredirect: \"medarbejdere\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"employees\",\n\t\t\t\troute: \"medarbejdere\",\n\t\t\t\tmoduleId: PLATFORM.moduleName(\"./modules/employees/employees\"),\n\t\t\t\ttitle: \"Medarbejdere\",\n\t\t\t\tnav: true,\n\t\t\t\ticon: \"people\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"company\",\n\t\t\t\troute: \"virksomheden\",\n\t\t\t\tmoduleId: PLATFORM.moduleName(\"./modules/company/company\"),\n\t\t\t\ttitle: \"Virksomheden\",\n\t\t\t\tnav: true,\n\t\t\t\ticon: \"building\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"payroll-system\",\n\t\t\t\troute: [ \"loensystem\", \"loensystem/:payrollSystem\" ],\n\t\t\t\tmoduleId: PLATFORM.moduleName(\"./modules/payroll-system/payroll-system\"),\n\t\t\t\ttitle: \"Lønsystem\",\n\t\t\t\tnav: true,\n\t\t\t\ticon: \"document\"\n\t\t\t}\n\t\t]\n\n\t\tconfig.map(routeConfig);\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","import { autoinject, bindable, bindingMode } from \"aurelia-framework\";\nimport { AdministratorSimple } from \"company-dashboard/services/identity\";\nimport { ToastService } from \"shared/framework\";\nimport { BaseModule } from \"shared/framework/components/base-module/base-module\";\nimport { Operation } from \"shared/utilities\";\nimport { ModalService } from \"shared/framework\";\nimport { AddAdministrator } from \"./modals/add-administrator/add-administrator\";\nimport { AgreementDocument, CompanyDetailed, CompanyService } from \"company-dashboard/model/dashboard/company\";\nimport { AgreementDocumentService } from \"company-dashboard/model/dashboard/company/services/agreement-document-service\";\n\n/**\n * Represents the module.\n */\n@autoinject\nexport class CompanyModule extends BaseModule\n{\n\t/**\n\t * Creates a new instance of the type.\n\t */\n\tpublic constructor(companyService: CompanyService, agreementDocumentService: AgreementDocumentService, toastService: ToastService, modalService: ModalService)\n\t{\n\t\tsuper();\n\n\t\tthis._companyService = companyService;\n\t\tthis._agreementDocumentService = agreementDocumentService;\n\t\tthis._toastService = toastService;\n\t\tthis._modalService = modalService;\n\n\t\tthis._contructed = true;\n\t}\n\n\tprivate readonly _companyService: CompanyService;\n\tprivate readonly _agreementDocumentService: AgreementDocumentService;\n\tprivate readonly _toastService: ToastService;\n\tprivate readonly _modalService: ModalService;\n\tprivate readonly _contructed;\n\n\tprotected failed: boolean = false;\n\n\t@bindable({ defaultBindingMode: bindingMode.toView })\n\tprotected updatePage: boolean;\n\n\t/**\n\t * The items to represent in the table\n\t */\n\tprotected company: CompanyDetailed | undefined;\n\n\t/**\n\t * The items to represent in the list of agreement documents\n\t */\n\tprotected agreementDocuments: AgreementDocument[] | undefined;\n\n\t/**\n\t * The items to represent in the list of administrators\n\t */\n\tprotected administrators: AdministratorSimple[] | undefined;\n\n\t/**\n\t * The most recent update operation\n\t */\n\tprotected updateOperation: Operation;\n\n\tprotected updatePageChanged(newValue: boolean): void\n\t{\n\t\tif (newValue)\n\t\t{\n\t\t\tthis.update();\n\t\t\tthis.updatePage = false;\n\t\t}\n\t}\n\n\tprotected async addAdministrator(): Promise\n\t{\n\t\tthis.updatePage = await this._modalService.open(AddAdministrator).promise;\n\t}\n\n\tprotected async readDocument(s3Key: string): Promise\n\t{\n\t\tlet blob = await this._agreementDocumentService.getAgreementDocument(s3Key);\n\n\t\tlet anchor = document.createElement(\"a\");\n\t\tanchor.href = URL.createObjectURL(blob);\n\t\tanchor.download = s3Key;\n\t\tdocument.body.appendChild(anchor);\n\t\tanchor.click();\n\t\tdocument.body.removeChild(anchor);\n\t\tURL.revokeObjectURL(anchor.href);\n\t}\n\n\t/**\n\t * Called by the framework when the module is activated.\n\t * @returns A promise that will be resolved, when the module is activated.\n\t */\n\tpublic doActivate(): void\n\t{\n\t\tthis.update();\n\t}\n\n\t/**\n\t * Updates the page by fetching the latest data.\n\t */\n\tprotected update(): void\n\t{\n\t\t// Returns if the object is not contructed.\n\t\t// This is needed because the `observable` decorator called the change handler when the\n\t\t// initial property value is set, which happens before the constructor is called\n\t\tif (!this._contructed)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.updateOperation != null)\n\t\t{\n\t\t\tthis.updateOperation.abort();\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.updateOperation = new Operation(async signal =>\n\t\t{\n\t\t\tthis.failed = false;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\t// Fetch the data\n\t\t\t\tconst result = await this._companyService.getCompanyInformations(signal);\n\n\t\t\t\tthis.administrators = result.administrators;\n\t\t\t\tthis.company = result.companyInformation;\n\t\t\t\tthis.agreementDocuments = result.agreementDocuments;\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tthis.failed = true;\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"message\": error.message\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"page[name=company] .--neutral{color:var(--palette-color-neutral)}page[name=company] .agreement-document-container{max-width:680rem}@media(max-width: 800px){page[name=company] .agreement-document-container>*{align-self:flex-start}}page[name=company] .agreement-document-container a{padding-left:12rem;margin-left:auto;white-space:nowrap;text-decoration:none;display:flex;align-items:center}page[name=company] .administrator-container{max-width:512rem;align-items:center}page[name=company] .administrator-container .administrator-icon{height:48rem;width:48rem;border-radius:50%;border:var(--border-width-thin) solid var(--palette-color-neutral);color:var(--palette-color-primary-darkest);display:flex;justify-content:center;align-items:center}page[name=company] .administrator-container .administrator-icon b{line-height:1}page[name=company] .administrator-container administrator-menu{margin-left:auto}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/dashboard/modules/company/company.scss\"],\"names\":[],\"mappings\":\"AAIC,8BAEC,kCAAA,CAGD,iDAEC,gBAAA,CAIC,yBAFD,mDAIE,qBAAA,CAAA,CAGF,mDAEC,kBAAA,CACA,gBAAA,CACA,kBAAA,CACA,oBAAA,CACA,YAAA,CACA,kBAAA,CAIF,4CAEC,gBAAA,CACA,kBAAA,CAKA,gEAEC,YAAA,CACA,WAAA,CACA,iBAAA,CACA,kEAAA,CACA,0CAAA,CACA,YAAA,CACA,sBAAA,CACA,kBAAA,CAEA,kEAEC,aAAA,CAIF,+DAEC,gBAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\npage[name=\\\"company\\\"]\\n{\\n\\t.--neutral\\n\\t{\\n\\t\\tcolor: var(--palette-color-neutral);\\n\\t}\\n\\n\\t.agreement-document-container\\n\\t{\\n\\t\\tmax-width: 680rem;\\n\\n\\t\\t> *\\n\\t\\t{\\n\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t{\\n\\t\\t\\t\\talign-self: flex-start;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\ta\\n\\t\\t{\\n\\t\\t\\tpadding-left: 12rem;\\n\\t\\t\\tmargin-left: auto;\\n\\t\\t\\twhite-space: nowrap;\\n\\t\\t\\ttext-decoration: none;\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\talign-items: center;\\n\\t\\t}\\n\\t}\\n\\n\\t.administrator-container\\n\\t{\\n\\t\\tmax-width: 512rem;\\n\\t\\talign-items: center;\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t}\\n\\n\\t\\t.administrator-icon\\n\\t\\t{\\n\\t\\t\\theight: 48rem;\\n\\t\\t\\twidth: 48rem;\\n\\t\\t\\tborder-radius: 50%;\\n\\t\\t\\tborder: var(--border-width-thin) solid var(--palette-color-neutral);\\n\\t\\t\\tcolor: var(--palette-color-primary-darkest);\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\tjustify-content: center;\\n\\t\\t\\talign-items: center;\\n\\n\\t\\t\\tb\\n\\t\\t\\t{\\n\\t\\t\\t\\tline-height: 1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tadministrator-menu\\n\\t\\t{\\n\\t\\t\\tmargin-left: auto;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode } from \"aurelia-framework\";\nimport { ModalService } from \"shared/framework\";\nimport { DeactivateAdministrator } from \"../../modals/deactivate-administrator/deactivate-administrator\";\n\n@autoinject\nexport class AdministratorMenu\n{\n\tprivate readonly _modalService: ModalService;\n\n\t@bindable\n\tadministratorId: number;\n\t@bindable\n\tadministratorFirstName: string;\n\n\t@bindable({ defaultBindingMode: bindingMode.fromView })\n\tprotected updatePage: boolean;\n\n\tpublic constructor(modalService: ModalService)\n\t{\n\t\tthis._modalService = modalService;\n\t}\n\n\tprotected async deactivateAdministrator(): Promise\n\t{\n\t\tlet updated = await this._modalService.open(DeactivateAdministrator, { administratorId: this.administratorId, administratorFirstName: this.administratorFirstName }).promise;\n\t\tif (updated)\n\t\t{\n\t\t\tthis.updatePage = !this.updatePage;\n\t\t}\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"administrator-menu{z-index:var(--z-index-fixed);display:flex;align-items:center}administrator-menu .administrator-menu-container{cursor:pointer;position:relative}administrator-menu .administrator-menu-container .mdc-list-item{padding:0 22rem;font-weight:200}administrator-menu .administrator-menu-container .mdc-list-item a{color:inherit}administrator-menu .administrator-menu-container .mdc-list-item .menu-item-container{display:flex;align-items:center}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/dashboard/modules/company/components/administrator-menu/administrator-menu.scss\"],\"names\":[],\"mappings\":\"AAEA,mBAEC,4BAAA,CACA,YAAA,CACA,kBAAA,CAEA,iDACC,cAAA,CACA,iBAAA,CAEA,gEAEC,eAAA,CACA,eAAA,CAEA,kEAEC,aAAA,CAGD,qFAEC,YAAA,CACA,kBAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\nadministrator-menu\\n{\\n\\tz-index: var(--z-index-fixed);\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\n\\t.administrator-menu-container {\\n\\t\\tcursor: pointer;\\n\\t\\tposition: relative;\\n\\n\\t\\t.mdc-list-item\\n\\t\\t{\\n\\t\\t\\tpadding: 0 22rem;\\n\\t\\t\\tfont-weight: 200;\\n\\n\\t\\t\\ta\\n\\t\\t\\t{\\n\\t\\t\\t\\tcolor: inherit;\\n\\t\\t\\t}\\n\\n\\t\\t\\t.menu-item-container\\n\\t\\t\\t{\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\talign-items: center;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { AdministratorService } from \"company-dashboard/model/dashboard/company/services/administrator-service\";\nimport { autoinject } from \"aurelia-framework\";\nimport { IValidation, ToastService } from \"shared/framework\";\nimport { Modal } from \"shared/framework/services/modal\";\nimport { Operation } from \"shared/utilities\";\nimport { bindable } from \"aurelia-typed-observable-plugin\";\n\n@autoinject\nexport class AddAdministrator\n{\n\tprivate readonly _modal: Modal;\n\tprivate readonly _administratorService: AdministratorService;\n\tprivate readonly _toastService: ToastService;\n\n\tpublic constructor(modal: Modal, administratorService: AdministratorService, toastService: ToastService)\n\t{\n\t\tthis._modal = modal;\n\t\tthis._administratorService = administratorService;\n\t\tthis._toastService = toastService;\n\t}\n\n\tprotected validation: IValidation;\n\n\t@bindable\n\tprotected administratorAdded = false;\n\n\tprotected firstName: string;\n\tprotected lastName: string;\n\tprotected email: string;\n\n\tprotected updateOperation: Operation;\n\n\tpublic deactivate(): boolean\n\t{\n\t\t\treturn this.administratorAdded;\n\t}\n\n\tprotected async onCloseClick(): Promise\n\t{\n\t\tawait this._modal.close();\n\t}\n\n\tprotected async onAddAdministrator(): Promise\n\t{\n\t\tthis.validation.active = true;\n\n\t\tif (!await this.validation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.updateOperation != null)\n\t\t{\n\t\t\tthis.updateOperation.abort();\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.updateOperation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait this._administratorService.addAdministrator(this.firstName, this.lastName, this.email, signal);\n\n\t\t\t\tthis.administratorAdded = true;\n\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"success\",\n\t\t\t\t\t{\n\t\t\t\t\t\theading: this.firstName,\n\t\t\t\t\t\tbody: \"blev tilføjet som administrator.\"\n\t\t\t\t\t}\n\t\t\t\t)\n\n\t\t\t\tawait this._modal.close();\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tif ([400, 401, 403].includes(error.response.status))\n\t\t\t\t{\n\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"message\": \"Administratoren kunne ikke blive tilføjet.\"\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"message\": \"Vi har tekniske problemer lige nu. Skriv på support@grandhood.dk hvis problemet bliver ved.\"\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconsole.log(\"An error occurred.\\n\", error, signal);\n\t\t\t}\n\t\t})\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { AdministratorService } from \"company-dashboard/model/dashboard/company\";\nimport { autoinject } from \"aurelia-framework\";\nimport { ToastService } from \"shared/framework\";\nimport { Modal } from \"shared/framework/services/modal\";\nimport { Operation } from \"shared/utilities\";\n\n@autoinject\nexport class DeactivateAdministrator\n{\n\tprivate readonly _modal: Modal;\n\tprivate readonly _administratorService: AdministratorService;\n\tprivate readonly _toastService: ToastService;\n\n\tpublic constructor(\n\t\tmodal: Modal,\n\t\temployeeService: AdministratorService,\n\t\ttoastService: ToastService)\n\t{\n\t\tthis._modal = modal;\n\t\tthis._administratorService = employeeService;\n\t\tthis._toastService = toastService;\n\t}\n\n\tprotected model: { administratorId: number, administratorFirstName: string };\n\tprotected deactivateOperation: Operation;\n\tprotected administratorDeactivated: boolean = false;\n\n\tpublic activate(model: { administratorId: number, administratorFirstName: string }): void\n\t{\n\t\tthis.model = model;\n\t}\n\n\tpublic deactivate(): boolean\n\t{\n\t\treturn this.administratorDeactivated;\n\t}\n\n\tprotected async onCloseClick(): Promise\n\t{\n\t\tawait this._modal.close();\n\t}\n\n\tprotected async onDeactivateClick(): Promise\n\t{\n\t\tthis.deactivateOperation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait this._administratorService.deactivateAdministrator(this.model.administratorId);\n\n\t\t\t\tthis.administratorDeactivated = true;\n\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"neutral\",\n\t\t\t\t\t{\n\t\t\t\t\t\theading: this.model.administratorFirstName,\n\t\t\t\t\t\tbody: \"blev deaktiveret som administrator.\",\n\t\t\t\t\t\ticon: \"person--negative\"\n\t\t\t\t\t}\n\t\t\t\t)\n\n\t\t\t\tthis._modal.close();\n\t\t\t} catch (error: any)\n\t\t\t{\n\t\t\t\tif ([400, 401, 403].includes(error.response.status))\n\t\t\t\t{\n\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"message\": \"Administratoren kunne ikke blive deaktiveret.\"\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"message\": \"Vi har tekniske problemer lige nu. Skriv på support@grandhood.dk hvis problemet bliver ved.\"\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconsole.log(\"An error occurred.\\n\", error, signal);\n\t\t\t}\n\t\t})\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-dialog[name=deactivate-administrator] modal-footer{align-items:flex-start}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/dashboard/modules/company/modals/deactivate-administrator/deactivate-administrator.scss\"],\"names\":[],\"mappings\":\"AAEC,yDAEC,sBAAA\",\"sourcesContent\":[\"modal-dialog[name=\\\"deactivate-administrator\\\"]\\n{\\n\\tmodal-footer\\n\\t{\\n\\t\\talign-items: flex-start;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { SignUpEmployeeFlow } from \"company-dashboard/modals/sign-up-employee-flow/sign-up-employee-flow\";\nimport { autoinject, bindable, bindingMode } from \"aurelia-framework\";\nimport { ModalService } from \"shared/framework\";\nimport { DeactivateEmployee } from \"../../modals/deactivate-employee/deactivate-employee\";\nimport { IdentityService } from \"company-dashboard/services/identity\";\n\n@autoinject\nexport class EmployeeMenu\n{\n\tpublic constructor(modalService: ModalService, identityService: IdentityService)\n\t{\n\t\tthis._modalService = modalService;\n\t\tthis.identityService = identityService;\n\t}\n\n\tprotected readonly identityService: IdentityService;\n\tprivate readonly _modalService: ModalService;\n\n\t@bindable\n\temployeeId: number | undefined;\n\t@bindable\n\temployeeFirstName: string;\n\t@bindable\n\temployeeIsActive: boolean;\n\t@bindable\n\temployeeMissingPersonalInformation: boolean;\n\t@bindable\n\temployeeMissingAddressInformation: boolean;\n\t@bindable\n\temployeeMissingCompensationInformation: boolean;\n\n\t@bindable({ defaultBindingMode: bindingMode.fromView })\n\tprotected updatePage: boolean = false;\n\n\tprotected async deactivateEmployee(): Promise\n\t{\n\t\tif(this.employeeId == null)\n\t\t{\n\t\t\t// Employee that has no employee id cannot be deactivated\n\t\t\treturn;\n\t\t}\n\n\t\tconst updated = await this._modalService.open(DeactivateEmployee, { employeeId: this.employeeId, employeeFirstName: this.employeeFirstName }).promise;\n\n\t\tif (updated)\n\t\t{\n\t\t\tthis.updatePage = true;\n\t\t}\n\t}\n\n\tprotected async onEditEmployeeClick(flow: \"personal-information\" | \"salary-and-pension\" | \"place-of-residence\"): Promise\n\t{\n\t\tawait this._modalService.open(SignUpEmployeeFlow, { employeeFlow: flow, employeeId: this.employeeId, employeeFirstName: this.employeeFirstName }).promise;\n\n\t\tthis.updatePage = true;\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"employee-menu{display:flex;align-items:center}employee-menu .employee-menu-container{cursor:pointer;position:relative}employee-menu .employee-menu-container .mdc-list-item{padding:0 22rem;font-weight:200}employee-menu .employee-menu-container .mdc-list-item a{color:inherit}employee-menu .employee-menu-container .mdc-list-item .menu-item-container{display:flex;align-items:center}employee-menu .--error .mdc-list-item__content{position:relative;overflow:visible}employee-menu .--error .mdc-list-item__content:before{content:\\\"\\\";height:8rem;width:8rem;background-color:var(--palette-color-negative);border-radius:50%;position:absolute;right:100%;opacity:1 !important;top:calc(50% - 4rem);margin-right:6rem}@media(max-width: 800px){employee-menu .--error .mdc-list-item__content:before{height:8rem;width:8rem;margin-right:6rem}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/dashboard/modules/employees/components/employee-menu/employee-menu.scss\"],\"names\":[],\"mappings\":\"AAEA,cAEC,YAAA,CACA,kBAAA,CAEA,uCACC,cAAA,CACA,iBAAA,CAEA,sDAEC,eAAA,CACA,eAAA,CAEA,wDAEC,aAAA,CAGD,2EAEC,YAAA,CACA,kBAAA,CAOF,+CAEC,iBAAA,CACA,gBAAA,CAEA,sDAEC,UAAA,CACA,WAAA,CACA,UAAA,CACA,8CAAA,CACA,iBAAA,CACA,iBAAA,CACA,UAAA,CACA,oBAAA,CACA,oBAAA,CACA,iBAAA,CAEA,yBAbD,sDAeE,WAAA,CACA,UAAA,CACA,iBAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\nemployee-menu\\n{\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\n\\t.employee-menu-container {\\n\\t\\tcursor: pointer;\\n\\t\\tposition: relative;\\n\\n\\t\\t.mdc-list-item\\n\\t\\t{\\n\\t\\t\\tpadding: 0 22rem;\\n\\t\\t\\tfont-weight: 200;\\n\\n\\t\\t\\ta\\n\\t\\t\\t{\\n\\t\\t\\t\\tcolor: inherit;\\n\\t\\t\\t}\\n\\n\\t\\t\\t.menu-item-container\\n\\t\\t\\t{\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\talign-items: center;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t.--error\\n\\t{\\n\\t\\t.mdc-list-item__content\\n\\t\\t{\\n\\t\\t\\tposition: relative;\\n\\t\\t\\toverflow: visible;\\n\\n\\t\\t\\t&:before\\n\\t\\t\\t{\\n\\t\\t\\t\\tcontent: \\\"\\\";\\n\\t\\t\\t\\theight: 8rem;\\n\\t\\t\\t\\twidth: 8rem;\\n\\t\\t\\t\\tbackground-color: var(--palette-color-negative);\\n\\t\\t\\t\\tborder-radius: 50%;\\n\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\tright: 100%;\\n\\t\\t\\t\\topacity: 1 !important;\\n\\t\\t\\t\\ttop: calc(50% - 4rem);\\n\\t\\t\\t\\tmargin-right: 6rem;\\n\\n\\t\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\theight: 8rem;\\n\\t\\t\\t\\t\\twidth: 8rem;\\n\\t\\t\\t\\t\\tmargin-right: 6rem;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { EmployeeSimple, EmployeeService } from \"company-dashboard/model/dashboard/employee\";\nimport { DateTime } from \"luxon\";\nimport { autoinject, computedFrom, bindingMode, bindable } from \"aurelia-framework\";\nimport { ModalService, ThemeService, ToastService } from \"shared/framework\";\nimport { BaseModule } from \"shared/framework/components/base-module/base-module\";\nimport { Operation } from \"shared/utilities\";\nimport { SignUpHelp } from \"./modals/sign-up-help/sign-up-help\";\nimport { MissingAddressInformationHelp as MissingInformationHelp } from \"./modals/missing-information-help/missing-information-help\";\nimport { IdentityService } from \"company-dashboard/services/identity\";\nimport { SignUpEmployeeFlow } from \"company-dashboard/modals/sign-up-employee-flow/sign-up-employee-flow\";\nimport { EventAggregator } from \"aurelia-event-aggregator\";\nimport { ConnectToSalary } from \"company-dashboard/modals/connect-to-payroll-system/connect-to-salary/connect-to-salary\";\nimport { ConnectToZenegy } from \"company-dashboard/modals/connect-to-payroll-system/connect-to-zenegy/connect-to-zenegy\";\nimport { PayrollSystem } from \"company-dashboard/model/dashboard/shared\";\n\n/**\n * Represents the module.\n */\n@autoinject\nexport class EmployeesModule extends BaseModule\n{\n\t/**\n\t * Creates a new instance of the type.\n\t */\n\tpublic constructor(\n\t\temployeeService: EmployeeService,\n\t\tidentityService: IdentityService,\n\t\ttoastService: ToastService,\n\t\tmodalService: ModalService,\n\t\tthemeService: ThemeService,\n\t\teventAggregator: EventAggregator)\n\t{\n\t\tsuper();\n\n\t\tthis._employeeService = employeeService;\n\t\tthis.identityService = identityService;\n\t\tthis._toastService = toastService;\n\t\tthis._modalService = modalService;\n\t\tthis.themeService = themeService;\n\t\tthis._aureliaEventAggregator = eventAggregator;\n\t\tthis._contructed = true;\n\t}\n\n\tprotected readonly identityService: IdentityService;\n\tprotected readonly themeService: ThemeService;\n\tprivate readonly _employeeService: EmployeeService;\n\tprivate readonly _toastService: ToastService;\n\tprivate readonly _modalService: ModalService;\n\tprivate readonly _aureliaEventAggregator: EventAggregator;\n\tprivate readonly _contructed;\n\n\t@bindable({ defaultBindingMode: bindingMode.toView })\n\tprotected updatePage: boolean;\n\n\t/**\n\t * The salary system connected to\n\t */\n\t protected payrollSystem: PayrollSystem = new PayrollSystem(\"unknown\");\n\n\t/**\n\t * The items to represent in the table\n\t */\n\tprotected employees: EmployeeSimple[] | undefined;\n\n\t/**\n\t * True if initial loading failed\n\t */\n\tprotected failed: boolean = false;\n\n\t/**\n\t * Called by the framework when the module is activated.\n\t */\n\tpublic doActivate(): void\n\t{\n\t\tthis.update();\n\n\t\tif (\n\t\t\twindow.localStorage.key(window.localStorage.length - 1) === \"nulstil-adgangskode\" ||\n\t\t\twindow.localStorage.key(window.localStorage.length - 1) === \"ny-administrator\")\n\t\t{\n\t\t\tthis._toastService.open(\n\t\t\t\t\"success\",\n\t\t\t\t{\n\t\t\t\t\theading: \"Din adgangskode er nu ændret.\"\n\t\t\t\t}\n\t\t\t)\n\t\t}\n\n\t\tthis._aureliaEventAggregator.subscribe(\n\t\t\t\"sign:up:employee:flow\",\n\t\t\t() => {\n\t\t\t\tif (!this.updateOperation.pending)\n\t\t\t\t{\n\t\t\t\t\tthis.update();\n\t\t\t\t}\n\t\t\t}\n\t\t)\n\t}\n\n\tprotected updatePageChanged(newValue: boolean): void\n\t{\n\t\tif (newValue)\n\t\t{\n\t\t\tthis.update();\n\t\t}\n\t}\n\n\tprotected get now(): DateTime\n\t{\n\t\treturn DateTime.now();\n\t}\n\n\tprotected get connectedToPayrollSystem(): boolean\n\t{\n\t\treturn this.payrollSystem.slug !== \"none\" && this.payrollSystem.slug !== \"unknown\";\n\t}\n\n\t@computedFrom(\"employees\")\n\tprotected get signedUpWarning(): boolean\n\t{\n\t\t// If information is missing, then the warning about employees not finishing onboarding is not shown\n\t\treturn this.employees == null || this.missingInformationError\n\t\t\t? false\n\t\t\t: this.employees.filter(employee => employee.status.slug === \"signed-up\" || employee.status.slug === \"in-onboarding\").length > 0;\n\t}\n\n\t@computedFrom(\"employees\")\n\tprotected get missingInformationError(): boolean\n\t{\n\t\treturn this.employees == null\n\t\t\t? false\n\t\t\t: this.employees.filter(employee => employee.missingPersonalInformation || employee.missingAddressInformation || employee.missingCompensationInformation).length > 0;\n\t}\n\n\t/**\n\t * Sorts the current list of employees\n\t * @returns a sorted list of employees or undefined, if there is no data\n\t */\n\t@computedFrom(\"employees\")\n\tprotected get sortedEmployees(): EmployeeSimple[] | undefined\n\t{\n\t\treturn this.employees?.sort((a: EmployeeSimple, b: EmployeeSimple) =>\n\t\t{\n\t\t\t// Deactivated must be furthest down the list, if any\n\t\t\tif (a.status.slug === \"deactivated\" && b.status.slug !== \"deactivated\")\n\t\t\t{\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif (a.status.slug !== \"deactivated\" && b.status.slug === \"deactivated\")\n\t\t\t{\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Not invited employees must be furthest down the list (before deactivated if shown)\n\t\t\tif (a.status.slug === \"not-invited\" && b.status.slug !== \"not-invited\")\n\t\t\t{\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif (a.status.slug !== \"not-invited\" && b.status.slug === \"not-invited\")\n\t\t\t{\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// If two employees have same status, then their order depends on other information\n\t\t\tif(a.status.slug === \"signed-up\" && b.status.slug === \"signed-up\")\n\t\t\t{\n\t\t\t\tif(a.missingPersonalInformation || a.missingAddressInformation || a.missingCompensationInformation)\n\t\t\t\t{\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif(b.missingPersonalInformation || b.missingAddressInformation || b.missingCompensationInformation)\n\t\t\t\t{\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(a.status.slug === \"signed-up\" && b.status.slug !== \"signed-up\")\n\t\t\t{\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif(a.status.slug !== \"signed-up\" && b.status.slug === \"signed-up\")\n\t\t\t{\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// An employee that is in onboarding must be higher on the list compared\n\t\t\t// to an employee that is onboarded\n\t\t\tif (a.status.slug === \"in-onboarding\" && b.status.slug === \"onboarded\")\n\t\t\t{\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a.status.slug === \"onboarded\" && b.status.slug === \"in-onboarding\")\n\t\t\t{\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t})\n\t}\n\n\tprotected async onSignUpWarningClick(): Promise\n\t{\n\t\tawait this._modalService.open(SignUpHelp).promise;\n\t}\n\n\tprotected async onMissingInformationErrorClick(): Promise\n\t{\n\t\tawait this._modalService.open(MissingInformationHelp).promise;\n\t}\n\n\tprotected async onSignUpEmployeeClick(): Promise\n\t{\n\t\tawait this._modalService.open(SignUpEmployeeFlow, { employeeFlow: \"add-employee\" }).promise;\n\n\t\tthis.update();\n\t}\n\n\tprotected async openConnectToSalaryModal(): Promise\n\t{\n\t\tawait this._modalService.open(ConnectToSalary).promise;\n\n\t\tthis.update();\n\t}\n\n\tprotected async openConnectToZenegyModal(): Promise\n\t{\n\t\tawait this._modalService.open(ConnectToZenegy).promise;\n\n\t\tthis.update();\n\t}\n\n\t/**\n\t * Updates the page by fetching the latest data.\n\t */\n\tprotected update(): void\n\t{\n\t\t// Returns if the object is not contructed.\n\t\t// This is needed because the `observable` decorator called the change handler when the\n\t\t// initial property value is set, which happens before the constructor is called\n\t\tif (!this._contructed)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.updateOperation != null)\n\t\t{\n\t\t\tthis.updateOperation.abort();\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.updateOperation = new Operation(async signal =>\n\t\t{\n\t\t\tthis.failed = false;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\t// Fetch the data\n\t\t\t\tconst result = await this._employeeService.getEmployees(signal);\n\n\t\t\t\tthis.payrollSystem = result.payrollSystem;\n\t\t\t\tthis.employees = result.employees;\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tthis.failed = true;\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"message\": error.message\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"page[name=employees] .title-container{align-items:center;justify-content:space-between}page[name=employees] .--bold{font-weight:300}page[name=employees] .last-updated-wrapper{display:flex}@media(max-width: 800px){page[name=employees] .last-updated-wrapper{flex-direction:column;align-items:flex-start}}page[name=employees] .signed-up-employee-warning{padding:24rem 60rem 24rem 24rem;background-color:var(--palette-color-attention-light);align-items:center;cursor:pointer}@media(max-width: 800px){page[name=employees] .signed-up-employee-warning{padding:12rem}}page[name=employees] .signed-up-employee-warning icon:first-of-type{font-size:56rem}@media(max-width: 800px){page[name=employees] .signed-up-employee-warning icon:first-of-type{font-size:38rem}}page[name=employees] .signed-up-employee-warning icon:last-of-type{margin-left:auto}page[name=employees] .signed-up-employee-error{padding:24rem 60rem 24rem 24rem;background-color:var(--palette-color-negative-light);align-items:center;cursor:pointer}@media(max-width: 800px){page[name=employees] .signed-up-employee-error{padding:12rem}}page[name=employees] .signed-up-employee-error icon:first-of-type{font-size:56rem}@media(max-width: 800px){page[name=employees] .signed-up-employee-error icon:first-of-type{font-size:38rem}}page[name=employees] .signed-up-employee-error icon:last-of-type{margin-left:auto}page[name=employees] .salary-connection-lost{padding:24rem 60rem 24rem 24rem;background-color:var(--palette-color-negative-light);align-items:center;cursor:pointer}@media(max-width: 800px){page[name=employees] .salary-connection-lost{padding:12rem}}page[name=employees] .salary-connection-lost>icon:first-of-type{font-size:56rem}@media(max-width: 800px){page[name=employees] .salary-connection-lost>icon:first-of-type{font-size:38rem}}page[name=employees] .salary-promotion{display:flex;justify-content:space-between;margin-top:104rem}@media(max-width: 800px){page[name=employees] .salary-promotion{flex-direction:column-reverse;justify-content:space-between;margin-top:40rem}}page[name=employees] .salary-promotion>*{width:45%}@media(max-width: 800px){page[name=employees] .salary-promotion>*{width:100%}page[name=employees] .salary-promotion>*:first-child{margin-top:16rem}}page[name=employees] .salary-promotion .payroll-system-button-container{align-items:flex-end}@media(max-width: 800px){page[name=employees] .salary-promotion .payroll-system-button-container{flex-direction:column;align-items:center}page[name=employees] .salary-promotion .payroll-system-button-container>*{display:flex;flex-direction:column;align-items:center}page[name=employees] .salary-promotion .payroll-system-button-container>*:first-child{margin-right:0;margin-bottom:18rem}}page[name=employees] .salary-promotion .payroll-system-button-container .logo-container{height:40rem;display:flex;align-items:center}page[name=employees] .salary-promotion .payroll-system-button-container .logo-container:first-child{margin-bottom:8rem}page[name=employees] .salary-promotion .payroll-system-button-container .salary-logo{height:40rem;width:auto}@media(max-width: 800px){page[name=employees] .salary-promotion .payroll-system-button-container .salary-logo{height:28rem}}page[name=employees] .salary-promotion .payroll-system-button-container .zenegy-logo{height:24rem;width:auto}@media(max-width: 800px){page[name=employees] .salary-promotion .payroll-system-button-container .zenegy-logo{height:18rem}}page[name=employees] .salary-promotion .--inactive{color:var(--palette-color-neutral)}page[name=employees] data-table{--data-table-columns: min-content 1.5fr 1fr 1.2fr 1.2fr 1.4fr min-content}@media(max-width: 800px){page[name=employees] data-table{--data-table-columns: min-content 1fr min-content}}page[name=employees] data-table .data-table-row.--warning data-table-cell:first-child{overflow:visible}page[name=employees] data-table .data-table-row.--warning data-table-cell:first-child:before{content:\\\"\\\";height:12rem;width:12rem;background-color:var(--palette-color-attention);border-radius:50%;position:absolute;right:100%;top:calc(50% - 6rem);margin-right:8rem}@media(max-width: 800px){page[name=employees] data-table .data-table-row.--warning data-table-cell:first-child:before{height:8rem;width:8rem;margin-right:6rem}}page[name=employees] data-table .data-table-row.--error data-table-cell:first-child{overflow:visible}page[name=employees] data-table .data-table-row.--error data-table-cell:first-child:before{content:\\\"\\\";height:12rem;width:12rem;background-color:var(--palette-color-negative);border-radius:50%;position:absolute;right:100%;top:calc(50% - 6rem);margin-right:8rem}@media(max-width: 800px){page[name=employees] data-table .data-table-row.--error data-table-cell:first-child:before{height:8rem;width:8rem;margin-right:6rem}}page[name=employees] data-table .data-table-row data-table-cell.--icon{overflow:visible}page[name=employees] data-table .data-table-row data-table-cell .status-container{display:flex}page[name=employees] data-table .data-table-row data-table-cell .status-container .employee-status{align-items:center}page[name=employees] data-table .data-table-row data-table-cell .status-container .status-icon{font-size:16rem;margin-top:6rem;margin-bottom:auto}page[name=employees] data-table .data-table-row data-table-cell .status-container .--neutral{color:var(--palette-color-neutral)}page[name=employees] data-table .data-table-row.--inactive data-table-cell{opacity:var(--opacity-disabled);background-color:transparent}page[name=employees] data-table .data-table-row.--inactive data-table-cell .employee-icon{background-color:transparent;border-color:var(--surface-neutral-text-color);color:var(--input-surface-text-color)}page[name=employees] data-table .data-table-row.--not-invited data-table-cell{opacity:var(--opacity-disabled)}page[name=employees] data-table .data-table-row.--not-invited data-table-cell .employee-icon{background-color:transparent;border-color:var(--surface-neutral-text-color);color:var(--input-surface-text-color)}page[name=employees] data-table .data-table-row .employee-icon{height:48rem;width:48rem;border-radius:50%;border:var(--border-width-thin) solid var(--palette-color-neutral);display:flex;justify-content:center;align-items:center}page[name=employees] data-table .data-table-row .employee-icon b{line-height:1}page[name=employees] button{align-self:flex-start}@-webkit-keyframes rotating{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}@keyframes rotating{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/dashboard/modules/employees/employees.scss\"],\"names\":[],\"mappings\":\"AAIC,sCAEC,kBAAA,CACA,6BAAA,CAGD,6BAEG,eAAA,CAGH,2CAEC,YAAA,CAEA,yBAJD,2CAME,qBAAA,CACA,sBAAA,CAAA,CAIF,iDAEC,+BAAA,CACA,qDAAA,CACA,kBAAA,CACA,cAAA,CAEA,yBAPD,iDASE,aAAA,CAAA,CAGD,oEAEC,eAAA,CAEA,yBAJD,oEAME,eAAA,CAAA,CAIF,mEAEC,gBAAA,CAIF,+CAEC,+BAAA,CACA,oDAAA,CACA,kBAAA,CACA,cAAA,CAEA,yBAPD,+CASE,aAAA,CAAA,CAGD,kEAEC,eAAA,CAEA,yBAJD,kEAME,eAAA,CAAA,CAIF,iEAEC,gBAAA,CAIF,6CAEC,+BAAA,CACA,oDAAA,CACA,kBAAA,CACA,cAAA,CAEA,yBAPD,6CASE,aAAA,CAAA,CAGD,gEAEC,eAAA,CAEA,yBAJD,gEAME,eAAA,CAAA,CAKH,uCAEC,YAAA,CACA,6BAAA,CACA,iBAAA,CAEA,yBAND,uCAQE,6BAAA,CACA,6BAAA,CACA,gBAAA,CAAA,CAGD,yCAEC,SAAA,CAEA,yBAJD,yCAME,UAAA,CAEA,qDAEC,gBAAA,CAAA,CAGF,wEAEA,oBAAA,CAEA,yBAJA,wEAMC,qBAAA,CACA,kBAAA,CAEA,0EAEC,YAAA,CACA,qBAAA,CACA,kBAAA,CAEA,sFAEC,cAAA,CACA,mBAAA,CAAA,CAKH,wFAEC,YAAA,CACA,YAAA,CACA,kBAAA,CAEA,oGAEC,kBAAA,CAIF,qFAEC,YAAA,CACA,UAAA,CAEA,yBALD,qFAOE,YAAA,CAAA,CAIF,qFAEC,YAAA,CACA,UAAA,CAEA,yBALD,qFAOE,YAAA,CAAA,CAKH,mDAEC,kCAAA,CAIF,gCAEC,yEAAA,CAEA,yBAJD,gCAME,iDAAA,CAAA,CASE,sFAEC,gBAAA,CAEA,6FAEC,UAAA,CACA,YAAA,CACA,WAAA,CACA,+CAAA,CACA,iBAAA,CACA,iBAAA,CACA,UAAA,CACA,oBAAA,CACA,iBAAA,CAEA,yBAZD,6FAcE,WAAA,CACA,UAAA,CACA,iBAAA,CAAA,CAWH,oFAEC,gBAAA,CAEA,2FAEC,UAAA,CACA,YAAA,CACA,WAAA,CACA,8CAAA,CACA,iBAAA,CACA,iBAAA,CACA,UAAA,CACA,oBAAA,CACA,iBAAA,CAEA,yBAZD,2FAcE,WAAA,CACA,UAAA,CACA,iBAAA,CAAA,CASJ,uEAEC,gBAAA,CAGD,kFAEC,YAAA,CAEA,mGAEC,kBAAA,CAGD,+FAEC,eAAA,CACA,eAAA,CACA,kBAAA,CAGD,6FAEC,kCAAA,CAOF,2EAEC,+BAAA,CACA,4BAAA,CAIC,0FAEC,4BAAA,CACA,8CAAA,CACA,qCAAA,CAQH,8EAEC,+BAAA,CAIC,6FAEC,4BAAA,CACA,8CAAA,CACA,qCAAA,CAQH,+DAEC,YAAA,CACA,WAAA,CACA,iBAAA,CACA,kEAAA,CACA,YAAA,CACA,sBAAA,CACA,kBAAA,CAEA,iEAEC,aAAA,CAOL,4BAEC,qBAAA,CAIF,4BACE,KACE,sBAAA,CAEF,GACE,wBAAA,CAAA,CALJ,oBACE,KACE,sBAAA,CAEF,GACE,wBAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\npage[name=\\\"employees\\\"]\\n{\\n\\t.title-container\\n\\t{\\n\\t\\talign-items: center;\\n\\t\\tjustify-content: space-between;\\n\\t}\\n\\n\\t.--bold\\n {\\n font-weight: 300;\\n }\\n\\n\\t.last-updated-wrapper\\n\\t{\\n\\t\\tdisplay: flex;\\n\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\tflex-direction: column;\\n\\t\\t\\talign-items: flex-start;\\n\\t\\t}\\n\\t}\\n\\n\\t.signed-up-employee-warning\\n\\t{\\n\\t\\tpadding: 24rem 60rem 24rem 24rem;\\n\\t\\tbackground-color: var(--palette-color-attention-light);\\n\\t\\talign-items: center;\\n\\t\\tcursor: pointer;\\n\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\tpadding: 12rem;\\n\\t\\t}\\n\\n\\t\\ticon:first-of-type\\n\\t\\t{\\n\\t\\t\\tfont-size: 56rem;\\n\\n\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t{\\n\\t\\t\\t\\tfont-size: 38rem;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\ticon:last-of-type\\n\\t\\t{\\n\\t\\t\\tmargin-left: auto;\\n\\t\\t}\\n\\t}\\n\\n\\t.signed-up-employee-error\\n\\t{\\n\\t\\tpadding: 24rem 60rem 24rem 24rem;\\n\\t\\tbackground-color: var(--palette-color-negative-light);\\n\\t\\talign-items: center;\\n\\t\\tcursor: pointer;\\n\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\tpadding: 12rem;\\n\\t\\t}\\n\\n\\t\\ticon:first-of-type\\n\\t\\t{\\n\\t\\t\\tfont-size: 56rem;\\n\\n\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t{\\n\\t\\t\\t\\tfont-size: 38rem;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\ticon:last-of-type\\n\\t\\t{\\n\\t\\t\\tmargin-left: auto;\\n\\t\\t}\\n\\t}\\n\\n\\t.salary-connection-lost\\n\\t{\\n\\t\\tpadding: 24rem 60rem 24rem 24rem;\\n\\t\\tbackground-color: var(--palette-color-negative-light);\\n\\t\\talign-items: center;\\n\\t\\tcursor: pointer;\\n\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\tpadding: 12rem;\\n\\t\\t}\\n\\n\\t\\t> icon:first-of-type\\n\\t\\t{\\n\\t\\t\\tfont-size: 56rem;\\n\\n\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t{\\n\\t\\t\\t\\tfont-size: 38rem;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t.salary-promotion\\n\\t{\\n\\t\\tdisplay: flex;\\n\\t\\tjustify-content: space-between;\\n\\t\\tmargin-top: 104rem;\\n\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\tflex-direction: column-reverse;\\n\\t\\t\\tjustify-content: space-between;\\n\\t\\t\\tmargin-top: 40rem;\\n\\t\\t}\\n\\n\\t\\t> *\\n\\t\\t{\\n\\t\\t\\twidth: 45%;\\n\\n\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t{\\n\\t\\t\\t\\twidth: 100%;\\n\\n\\t\\t\\t\\t&:first-child\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tmargin-top: 16rem;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}.payroll-system-button-container\\n\\t\\t{\\n\\t\\t\\talign-items: flex-end;\\n\\n\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t{\\n\\t\\t\\t\\tflex-direction: column;\\n\\t\\t\\t\\talign-items: center;\\n\\n\\t\\t\\t\\t> *\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\t\\tflex-direction: column;\\n\\t\\t\\t\\t\\talign-items: center;\\n\\n\\t\\t\\t\\t\\t&:first-child\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\tmargin-right: 0;\\n\\t\\t\\t\\t\\t\\tmargin-bottom: 18rem;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t.logo-container\\n\\t\\t\\t{\\n\\t\\t\\t\\theight: 40rem;\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\talign-items: center;\\n\\n\\t\\t\\t\\t&:first-child\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tmargin-bottom: 8rem;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t.salary-logo\\n\\t\\t\\t{\\n\\t\\t\\t\\theight: 40rem;\\n\\t\\t\\t\\twidth: auto;\\n\\n\\t\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\theight: 28rem;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t.zenegy-logo\\n\\t\\t\\t{\\n\\t\\t\\t\\theight: 24rem;\\n\\t\\t\\t\\twidth: auto;\\n\\n\\t\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\theight: 18rem;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.--inactive\\n\\t\\t{\\n\\t\\t\\tcolor: var(--palette-color-neutral)\\n\\t\\t}\\n\\t}\\n\\n\\tdata-table\\n\\t{\\n\\t\\t--data-table-columns: min-content 1.5fr 1fr 1.2fr 1.2fr 1.4fr min-content;\\n\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\t--data-table-columns: min-content 1fr min-content;\\n\\t\\t}\\n\\n\\t\\t.data-table-row\\n\\t\\t{\\n\\t\\t\\t&.--warning\\n\\t\\t\\t{\\n\\t\\t\\t\\tdata-table-cell\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t&:first-child\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\toverflow: visible;\\n\\n\\t\\t\\t\\t\\t\\t&:before\\n\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\tcontent: \\\"\\\";\\n\\t\\t\\t\\t\\t\\t\\theight: 12rem;\\n\\t\\t\\t\\t\\t\\t\\twidth: 12rem;\\n\\t\\t\\t\\t\\t\\t\\tbackground-color: var(--palette-color-attention);\\n\\t\\t\\t\\t\\t\\t\\tborder-radius: 50%;\\n\\t\\t\\t\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\t\\t\\t\\tright: 100%;\\n\\t\\t\\t\\t\\t\\t\\ttop: calc(50% - 6rem);\\n\\t\\t\\t\\t\\t\\t\\tmargin-right: 8rem;\\n\\n\\t\\t\\t\\t\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\t\\theight: 8rem;\\n\\t\\t\\t\\t\\t\\t\\t\\twidth: 8rem;\\n\\t\\t\\t\\t\\t\\t\\t\\tmargin-right: 6rem;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t&.--error\\n\\t\\t\\t{\\n\\t\\t\\t\\tdata-table-cell\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t&:first-child\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\toverflow: visible;\\n\\n\\t\\t\\t\\t\\t\\t&:before\\n\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\tcontent: \\\"\\\";\\n\\t\\t\\t\\t\\t\\t\\theight: 12rem;\\n\\t\\t\\t\\t\\t\\t\\twidth: 12rem;\\n\\t\\t\\t\\t\\t\\t\\tbackground-color: var(--palette-color-negative);\\n\\t\\t\\t\\t\\t\\t\\tborder-radius: 50%;\\n\\t\\t\\t\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\t\\t\\t\\tright: 100%;\\n\\t\\t\\t\\t\\t\\t\\ttop: calc(50% - 6rem);\\n\\t\\t\\t\\t\\t\\t\\tmargin-right: 8rem;\\n\\n\\t\\t\\t\\t\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\t\\theight: 8rem;\\n\\t\\t\\t\\t\\t\\t\\t\\twidth: 8rem;\\n\\t\\t\\t\\t\\t\\t\\t\\tmargin-right: 6rem;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tdata-table-cell\\n\\t\\t\\t{\\n\\t\\t\\t\\t&.--icon\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\toverflow: visible;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t.status-container\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tdisplay: flex;\\n\\n\\t\\t\\t\\t\\t.employee-status\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\talign-items: center;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t.status-icon\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\tfont-size: 16rem;\\n\\t\\t\\t\\t\\t\\tmargin-top: 6rem;\\n\\t\\t\\t\\t\\t\\tmargin-bottom: auto;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t.--neutral\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\tcolor: var(--palette-color-neutral)\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t&.--inactive\\n\\t\\t\\t{\\n\\t\\t\\t\\tdata-table-cell\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\topacity: var(--opacity-disabled);\\n\\t\\t\\t\\t\\tbackground-color: transparent;\\n\\n\\t\\t\\t\\t\\t.employee\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t&-icon\\n\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\tbackground-color: transparent;\\n\\t\\t\\t\\t\\t\\t\\tborder-color: var(--surface-neutral-text-color);\\n\\t\\t\\t\\t\\t\\t\\tcolor: var(--input-surface-text-color);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t&.--not-invited\\n\\t\\t\\t{\\n\\t\\t\\t\\tdata-table-cell\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\topacity: var(--opacity-disabled);\\n\\n\\t\\t\\t\\t\\t.employee\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t&-icon\\n\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\tbackground-color: transparent;\\n\\t\\t\\t\\t\\t\\t\\tborder-color: var(--surface-neutral-text-color);\\n\\t\\t\\t\\t\\t\\t\\tcolor: var(--input-surface-text-color);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t.employee\\n\\t\\t\\t{\\n\\t\\t\\t\\t&-icon\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\theight: 48rem;\\n\\t\\t\\t\\t\\twidth: 48rem;\\n\\t\\t\\t\\t\\tborder-radius: 50%;\\n\\t\\t\\t\\t\\tborder: var(--border-width-thin) solid var(--palette-color-neutral);\\n\\t\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\t\\tjustify-content: center;\\n\\t\\t\\t\\t\\talign-items: center;\\n\\n\\t\\t\\t\\t\\tb\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\tline-height: 1;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tbutton\\n\\t{\\n\\t\\talign-self: flex-start;\\n\\t}\\n}\\n\\n@keyframes rotating {\\n from {\\n transform: rotate(0deg);\\n }\\n to {\\n transform: rotate(360deg);\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { EmployeeService } from \"company-dashboard/model/dashboard/employee\";\nimport { autoinject } from \"aurelia-framework\";\nimport { IValidation, ToastService } from \"shared/framework\";\nimport { Modal } from \"shared/framework/services/modal\";\nimport { Operation } from \"shared/utilities\";\nimport { DateTime } from \"luxon\";\n\n@autoinject\nexport class DeactivateEmployee\n{\n\tprivate readonly _modal: Modal;\n\tprivate readonly _employeeService: EmployeeService;\n\tprivate readonly _toastService: ToastService;\n\n\tpublic constructor(\n\t\tmodal: Modal,\n\t\temployeeService: EmployeeService,\n\t\ttoastService: ToastService)\n\t{\n\t\tthis._modal = modal;\n\t\tthis._employeeService = employeeService;\n\t\tthis._toastService = toastService;\n\t}\n\n\tprotected validation: IValidation;\n\n\tprotected model: { employeeId: number, employeeFirstName: string };\n\n\tprotected deactivateOperation: Operation;\n\n\tprotected employeeDeactivated: boolean = false;\n\n\tprotected endDate: DateTime = DateTime.local().endOf(\"month\");\n\n\tpublic activate(model: { employeeId: number, employeeFirstName: string }): void\n\t{\n\t\tthis.model = model;\n\t}\n\n\tpublic deactivate(): boolean\n\t{\n\t\treturn this.employeeDeactivated;\n\t}\n\n\tprotected get minimumValidEndDate(): DateTime\n\t{\n\t\tconst today = DateTime.local();\n\n\t\treturn today.set({ day: 1 }).startOf(\"day\");\n\t}\n\n\tprotected async onCloseClick(): Promise\n\t{\n\t\tawait this._modal.close();\n\t}\n\n\tprotected async onDeactivateClick(): Promise\n\t{\n\t\tthis.validation.active = true;\n\n\t\tif (!await this.validation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tthis.deactivateOperation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait this._employeeService.deactivateEmployee(this.model.employeeId, this.endDate);\n\n\t\t\t\tthis.employeeDeactivated = true;\n\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"neutral\",\n\t\t\t\t\t{\n\t\t\t\t\t\theading: this.model.employeeFirstName,\n\t\t\t\t\t\tbody: `bliver deaktiveret fra pensionsordningen den ${this.endDate.toFormat(\"dd. LLLL.\", { locale: \"da\" })}`,\n\t\t\t\t\t\ticon: \"person--negative\"\n\t\t\t\t\t}\n\t\t\t\t)\n\n\t\t\t\tthis._modal.close();\n\t\t\t} catch (error: any)\n\t\t\t{\n\t\t\t\tif ([400, 401, 403].includes(error.response.status))\n\t\t\t\t{\n\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"message\": \"Medarbejderen kunne ikke blive deaktiveret.\"\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"message\": \"Vi har tekniske problemer lige nu. Skriv på support@grandhood.dk hvis problemet bliver ved.\"\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconsole.log(\"An error occurred.\\n\", error, signal);\n\t\t\t}\n\t\t})\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-dialog[name=deactivate-employee] modal-footer{align-items:flex-start}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/dashboard/modules/employees/modals/deactivate-employee/deactivate-employee.scss\"],\"names\":[],\"mappings\":\"AAEC,oDAEC,sBAAA\",\"sourcesContent\":[\"modal-dialog[name=\\\"deactivate-employee\\\"]\\n{\\n\\tmodal-footer\\n\\t{\\n\\t\\talign-items: flex-start;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\nimport { Modal } from \"shared/framework/services/modal\";\n\n@autoinject\nexport class MissingAddressInformationHelp\n{\n\tpublic constructor(modal: Modal)\n\t{\n\t\tthis._modal = modal;\n\t}\n\n\tprivate readonly _modal: Modal;\n\n\t/**\n\t * Called when the cancel button is clicked.\n\t */\n\tprotected async onCloseClick(): Promise\n\t{\n\t\tawait this._modal.close();\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-dialog[name=missing-address-information-help] modal-footer{align-items:flex-start}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/dashboard/modules/employees/modals/missing-information-help/missing-information-help.scss\"],\"names\":[],\"mappings\":\"AAEC,iEAEC,sBAAA\",\"sourcesContent\":[\"modal-dialog[name=\\\"missing-address-information-help\\\"]\\n{\\n\\tmodal-footer\\n\\t{\\n\\t\\talign-items: flex-start;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\nimport { Modal } from \"shared/framework/services/modal\";\n\n@autoinject\nexport class SignUpHelp\n{\n\tpublic constructor(modal: Modal)\n\t{\n\t\tthis._modal = modal;\n\t}\n\n\tprivate readonly _modal: Modal;\n\n\t/**\n\t * Called when the cancel button is clicked.\n\t */\n\tprotected async onCloseClick(): Promise\n\t{\n\t\tawait this._modal.close();\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-dialog[name=sign-up-help] modal-footer{align-items:flex-start}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/dashboard/modules/employees/modals/sign-up-help/sign-up-help.scss\"],\"names\":[],\"mappings\":\"AAEC,6CAEC,sBAAA\",\"sourcesContent\":[\"modal-dialog[name=\\\"sign-up-help\\\"]\\n{\\n\\tmodal-footer\\n\\t{\\n\\t\\talign-items: flex-start;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\nimport { PayrollSystemConnection, PayrollSystemService } from \"company-dashboard/model/dashboard/company\";\nimport { PayrollSystem } from \"company-dashboard/model/dashboard/shared\";\nimport { ModalService, ThemeService, ToastService } from \"shared/framework\";\nimport { Operation } from \"shared/utilities\";\n\n@autoinject\nexport class DisconnectFromPayrollSystem\n{\n public constructor(themeService: ThemeService, modalService: ModalService, toastService: ToastService, payrollSystemService: PayrollSystemService)\n {\n this.themeService = themeService;\n\t\tthis._modalService = modalService;\n\t\tthis._toastService = toastService;\n\t\tthis._payrollSystemService = payrollSystemService;\n }\n\n protected readonly themeService: ThemeService;\n\tprivate readonly _modalService: ModalService;\n\tprivate readonly _toastService: ToastService;\n\tprivate readonly _payrollSystemService: PayrollSystemService;\n\n\tprotected disconnectedFromPayrollSystem: boolean = false;\n\n\tprotected connection: PayrollSystemConnection;\n\n\tprotected payrollSystem: PayrollSystem;\n\n\tprotected operation: Operation;\n\n\t/**\n\t * Called by the framework when the modal is activated.\n\t */\n\tpublic async activate(model: { connection: PayrollSystemConnection, payrollSystem: PayrollSystem }): Promise\n\t{\n\t\tthis.connection = model.connection;\n\t\tthis.payrollSystem = model.payrollSystem;\n\t}\n\n\tpublic deactivate(): boolean\n\t{\n\t\treturn this.disconnectedFromPayrollSystem;\n\t}\n\n\tprotected async disconnectFromPayrollSystem(): Promise\n\t{\n\t\t// Create and execute the operation\n\t\tthis.operation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait this._payrollSystemService.removePayrollSystemApiToken(this.connection, signal);\n\n\t\t\t\tthis.disconnectedFromPayrollSystem = true;\n\n\t\t\t\tthis.onCloseClick();\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"message\": error.message\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t})\n\t}\n\n\tprotected async onCloseClick(): Promise\n\t{\n\t\tif (this.disconnectedFromPayrollSystem)\n\t\t{\n\t\t\tthis._toastService.open(\n\t\t\t\t\"success\",\n\t\t\t\t{\n\t\t\t\t\tbody: \"Lønsystem integration er blevet fjernet fra dit Grandhood Dashboard. \"\n\t\t\t\t}\n\t\t\t)\n\t\t}\n\t\tawait this._modalService.closeAll(\"cancel\");\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","import { autoinject, bindable } from \"aurelia-framework\";\nimport { ConnectToSalary } from \"company-dashboard/modals/connect-to-payroll-system/connect-to-salary/connect-to-salary\";\nimport { ConnectToZenegy } from \"company-dashboard/modals/connect-to-payroll-system/connect-to-zenegy/connect-to-zenegy\";\nimport { PayrollSystemConnection, PayrollSystemResponse, PayrollSystemService } from \"company-dashboard/model/dashboard/company\";\nimport { PayrollSystem } from \"company-dashboard/model/dashboard/shared\";\nimport { ModalService, ThemeService, ToastService } from \"shared/framework\";\nimport { BaseModule } from \"shared/framework/components/base-module/base-module\";\nimport { Operation } from \"shared/utilities\";\nimport { DisconnectFromPayrollSystem } from \"./modals/disconnect-from-payroll-system/disconnect-from-payroll-system\";\n\ninterface PayrollSystemParams {\n payrollSystem: \"zenegy\" | undefined;\n code: string | undefined;\n}\n\n/**\n * Represents the module.\n */\n@autoinject\nexport class PayrollSystemModule extends BaseModule {\n /**\n * Creates a new instance of the type.\n */\n public constructor(themeService: ThemeService, modalService: ModalService, toastService: ToastService, payrollSystemService: PayrollSystemService) {\n super();\n\n this.themeService = themeService;\n this._modalService = modalService;\n this._toastService = toastService;\n this._payrollSystemService = payrollSystemService;\n }\n\n protected readonly themeService: ThemeService;\n private readonly _modalService: ModalService;\n private readonly _toastService: ToastService;\n private readonly _payrollSystemService: PayrollSystemService;\n\n protected failed: boolean = false;\n\n @bindable\n protected payrollSystemInformation: PayrollSystemResponse;\n\n /**\n * The most recent update operation\n */\n protected updateOperation: Operation;\n\n /**\n * Called by the framework when the module is activated.\n * @returns A promise that will be resolved, when the module is activated.\n */\n public async doActivate(params: PayrollSystemParams): Promise {\n this.resetData();\n\n if (params.payrollSystem === \"zenegy\" && params.code != null) {\n try {\n await this._payrollSystemService.addPayrollSystemApiToken(\n params.code,\n new PayrollSystem(\"zenegy\")\n )\n }\n catch (error: any) {\n this._toastService.open(\n \"error\",\n {\n \"message\": \"Nøglen kunne ikke tilføjes.\"\n }\n );\n }\n }\n\n await this.update();\n }\n\n protected resetData(): void {\n this.payrollSystemInformation = new PayrollSystemResponse({ payrollSystem: 1, connections: [] });\n }\n\n protected async openConnectToSalaryModal(): Promise {\n await this._modalService.open(ConnectToSalary).promise;\n\n this.update();\n }\n\n protected async openConnectToZenegyModal(): Promise {\n await this._modalService.open(ConnectToZenegy).promise;\n }\n\n protected async openDisconnectFromPayrollSystemModal(connection: PayrollSystemConnection): Promise {\n const disconnectedFromPayrollSystem = await this._modalService.open(DisconnectFromPayrollSystem, { connection: connection, payrollSystem: this.payrollSystemInformation.payrollSystem }).promise;\n\n if (disconnectedFromPayrollSystem) {\n this.update();\n }\n }\n\n /**\n * Updates the page by fetching the latest data.\n */\n protected async update(): Promise {\n if (this.updateOperation != null) {\n this.updateOperation.abort();\n }\n\n // Create and execute the operation\n this.updateOperation = new Operation(async signal => {\n this.failed = false;\n\n try {\n // Fetch the data\n const result = await this._payrollSystemService.getPayrollSystemInformation(signal);\n\n this.payrollSystemInformation = result;\n }\n catch (error: any) {\n console.log(error, error.message);\n }\n })\n }\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"page[name=payroll-system] .content-wrapper{width:650rem}page[name=payroll-system] .--inactive{color:var(--palette-color-neutral)}page[name=payroll-system] .payroll-system-promotion{padding:56rem 88rem 48rem 48rem;position:relative;border:var(--border-width-thin) solid var(--palette-color-neutral)}@media(max-width: 800px){page[name=payroll-system] .payroll-system-promotion{padding:48rem 24rem 16rem}}page[name=payroll-system] .payroll-system-promotion .payroll-system-button-container{align-items:flex-end}@media(max-width: 800px){page[name=payroll-system] .payroll-system-promotion .payroll-system-button-container{flex-direction:column;align-items:center}page[name=payroll-system] .payroll-system-promotion .payroll-system-button-container>*{display:flex;flex-direction:column;align-items:center}page[name=payroll-system] .payroll-system-promotion .payroll-system-button-container>*:first-child{margin-right:0;margin-bottom:18rem}}page[name=payroll-system] .payroll-system-promotion .payroll-system-button-container .logo-container{height:40rem;display:flex;align-items:center}page[name=payroll-system] .payroll-system-promotion .payroll-system-button-container .logo-container:first-child{margin-bottom:8rem}page[name=payroll-system] .payroll-system-promotion .payroll-system-button-container .salary-logo{height:40rem;width:auto}@media(max-width: 800px){page[name=payroll-system] .payroll-system-promotion .payroll-system-button-container .salary-logo{height:28rem}}page[name=payroll-system] .payroll-system-promotion .payroll-system-button-container .zenegy-logo{height:24rem;width:auto}@media(max-width: 800px){page[name=payroll-system] .payroll-system-promotion .payroll-system-button-container .zenegy-logo{height:18rem}}page[name=payroll-system] .payroll-system-promotion .--inactive{opacity:var(--opacity-disabled)}page[name=payroll-system] .payroll-system-connected{padding:24rem 24rem 32rem;border:var(--border-width-thin) solid var(--palette-color-neutral)}@media(max-width: 800px){page[name=payroll-system] .payroll-system-connected{padding:16rem 16rem 24rem}}page[name=payroll-system] .payroll-system-connected .promotion-logo{width:auto}page[name=payroll-system] .payroll-system-connected .promotion-logo.--zenegy{height:32rem}page[name=payroll-system] .payroll-system-connected .promotion-logo.--salary{height:64rem}@media(max-width: 800px){page[name=payroll-system] .payroll-system-connected .promotion-logo{height:48rem;margin-bottom:32rem}}page[name=payroll-system] .payroll-system-connected .top-section,page[name=payroll-system] .payroll-system-connected .bottom-section{display:flex;flex-direction:row;align-items:center;justify-content:space-between}@media(max-width: 800px){page[name=payroll-system] .payroll-system-connected .top-section,page[name=payroll-system] .payroll-system-connected .bottom-section{flex-direction:column;align-items:flex-start}}page[name=payroll-system] .payroll-system-connected .connection-information{text-align:right}@media(max-width: 800px){page[name=payroll-system] .payroll-system-connected .connection-information{width:100%;text-align:initial;display:flex;justify-content:space-between}}page[name=payroll-system] .payroll-system-connected .connection-information.--connected .connection-indicator:before{background-color:var(--palette-color-positive)}page[name=payroll-system] .payroll-system-connected .connection-information .connection-indicator{display:flex;flex-direction:row;align-items:center;justify-content:flex-end}page[name=payroll-system] .payroll-system-connected .connection-information .connection-indicator:before{content:\\\"\\\";height:8rem;width:8rem;border-radius:50%;background-color:var(--palette-color-negative);margin-right:8rem}page[name=payroll-system] .connect-company-from-zenegy{display:flex;align-items:center;justify-content:space-between;padding:36rem 0}page[name=payroll-system] .list-container>div{display:flex;align-items:flex-start}page[name=payroll-system] .list-container>div>span:first-child{margin-right:8rem}page[name=payroll-system] .highlighted-area{padding:24rem;background-color:var(--palette-color-neutral-light)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/dashboard/modules/payroll-system/payroll-system.scss\"],\"names\":[],\"mappings\":\"AAIC,2CAEC,YAAA,CAGD,sCAEC,kCAAA,CAGD,oDAEC,+BAAA,CACA,iBAAA,CACA,kEAAA,CAEA,yBAND,oDAQE,yBAAA,CAAA,CAGD,qFAEC,oBAAA,CAEA,yBAJD,qFAME,qBAAA,CACA,kBAAA,CAEA,uFAEC,YAAA,CACA,qBAAA,CACA,kBAAA,CAEA,mGAEC,cAAA,CACA,mBAAA,CAAA,CAKH,qGAEC,YAAA,CACA,YAAA,CACA,kBAAA,CAEA,iHAEC,kBAAA,CAIF,kGAEC,YAAA,CACA,UAAA,CAEA,yBALD,kGAOE,YAAA,CAAA,CAIF,kGAEC,YAAA,CACA,UAAA,CAEA,yBALD,kGAOE,YAAA,CAAA,CAKH,gEAEC,+BAAA,CAIF,oDAEC,yBAAA,CACA,kEAAA,CAEA,yBALD,oDAOE,yBAAA,CAAA,CAGD,oEAEC,UAAA,CAEA,6EAEC,YAAA,CAGD,6EAEC,YAAA,CAGD,yBAdD,oEAgBE,YAAA,CACA,mBAAA,CAAA,CAIF,qIAEC,YAAA,CACA,kBAAA,CACA,kBAAA,CACA,6BAAA,CAEA,yBAPD,qIASE,qBAAA,CACA,sBAAA,CAAA,CAIF,4EAEC,gBAAA,CAEA,yBAJD,4EAME,UAAA,CACA,kBAAA,CACA,YAAA,CACA,6BAAA,CAAA,CAOC,qHAEC,8CAAA,CAKH,kGAEC,YAAA,CACA,kBAAA,CACA,kBAAA,CACA,wBAAA,CAEA,yGAEC,UAAA,CACA,WAAA,CACA,UAAA,CACA,iBAAA,CACA,8CAAA,CACA,iBAAA,CAMJ,uDAEC,YAAA,CACA,kBAAA,CACA,6BAAA,CACA,eAAA,CAKA,8CAEC,YAAA,CACA,sBAAA,CAIC,+DAEC,iBAAA,CAMJ,4CAEC,aAAA,CACA,mDAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\npage[name=\\\"payroll-system\\\"]\\n{\\n\\t.content-wrapper\\n\\t{\\n\\t\\twidth: 650rem;\\n\\t}\\n\\n\\t.--inactive\\n\\t{\\n\\t\\tcolor: var(--palette-color-neutral);\\n\\t}\\n\\n\\t.payroll-system-promotion\\n\\t{\\n\\t\\tpadding: 56rem 88rem 48rem 48rem;\\n\\t\\tposition: relative;\\n\\t\\tborder: var(--border-width-thin) solid var(--palette-color-neutral);\\n\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\tpadding: 48rem 24rem 16rem;\\n\\t\\t}\\n\\n\\t\\t.payroll-system-button-container\\n\\t\\t{\\n\\t\\t\\talign-items: flex-end;\\n\\n\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t{\\n\\t\\t\\t\\tflex-direction: column;\\n\\t\\t\\t\\talign-items: center;\\n\\n\\t\\t\\t\\t> *\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\t\\tflex-direction: column;\\n\\t\\t\\t\\t\\talign-items: center;\\n\\n\\t\\t\\t\\t\\t&:first-child\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\tmargin-right: 0;\\n\\t\\t\\t\\t\\t\\tmargin-bottom: 18rem;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t.logo-container\\n\\t\\t\\t{\\n\\t\\t\\t\\theight: 40rem;\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\talign-items: center;\\n\\n\\t\\t\\t\\t&:first-child\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tmargin-bottom: 8rem;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t.salary-logo\\n\\t\\t\\t{\\n\\t\\t\\t\\theight: 40rem;\\n\\t\\t\\t\\twidth: auto;\\n\\n\\t\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\theight: 28rem;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t.zenegy-logo\\n\\t\\t\\t{\\n\\t\\t\\t\\theight: 24rem;\\n\\t\\t\\t\\twidth: auto;\\n\\n\\t\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\theight: 18rem;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.--inactive\\n\\t\\t{\\n\\t\\t\\topacity: var(--opacity-disabled);\\n\\t\\t}\\n\\t}\\n\\n\\t.payroll-system-connected\\n\\t{\\n\\t\\tpadding: 24rem 24rem 32rem;\\n\\t\\tborder: var(--border-width-thin) solid var(--palette-color-neutral);\\n\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\tpadding: 16rem 16rem 24rem;\\n\\t\\t}\\n\\n\\t\\t.promotion-logo\\n\\t\\t{\\n\\t\\t\\twidth: auto;\\n\\n\\t\\t\\t&.--zenegy\\n\\t\\t\\t{\\n\\t\\t\\t\\theight: 32rem;\\n\\t\\t\\t}\\n\\n\\t\\t\\t&.--salary\\n\\t\\t\\t{\\n\\t\\t\\t\\theight: 64rem;\\n\\t\\t\\t}\\n\\n\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t{\\n\\t\\t\\t\\theight: 48rem;\\n\\t\\t\\t\\tmargin-bottom: 32rem;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.top-section, .bottom-section\\n\\t\\t{\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\tflex-direction: row;\\n\\t\\t\\talign-items: center;\\n\\t\\t\\tjustify-content: space-between;\\n\\n\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t{\\n\\t\\t\\t\\tflex-direction: column;\\n\\t\\t\\t\\talign-items: flex-start;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t.connection-information\\n\\t\\t{\\n\\t\\t\\ttext-align: right;\\n\\n\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t{\\n\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t\\ttext-align: initial;\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\tjustify-content: space-between;\\n\\t\\t\\t}\\n\\n\\t\\t\\t&.--connected\\n\\t\\t\\t{\\n\\t\\t\\t\\t.connection-indicator\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t&:before\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\tbackground-color: var(--palette-color-positive);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t.connection-indicator\\n\\t\\t\\t{\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\tflex-direction: row;\\n\\t\\t\\t\\talign-items: center;\\n\\t\\t\\t\\tjustify-content: flex-end;\\n\\n\\t\\t\\t\\t&:before\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tcontent: \\\"\\\";\\n\\t\\t\\t\\t\\theight: 8rem;\\n\\t\\t\\t\\t\\twidth: 8rem;\\n\\t\\t\\t\\t\\tborder-radius: 50%;\\n\\t\\t\\t\\t\\tbackground-color: var(--palette-color-negative);\\n\\t\\t\\t\\t\\tmargin-right: 8rem;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t.connect-company-from-zenegy\\n\\t{\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: center;\\n\\t\\tjustify-content: space-between;\\n\\t\\tpadding: 36rem 0;\\n\\t}\\n\\n\\t.list-container\\n\\t{\\n\\t\\t> div\\n\\t\\t{\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\talign-items: flex-start;\\n\\n\\t\\t\\t> span\\n\\t\\t\\t{\\n\\t\\t\\t\\t&:first-child\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tmargin-right: 8rem;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t.highlighted-area\\n\\t{\\n\\t\\tpadding: 24rem;\\n\\t\\tbackground-color: var(--palette-color-neutral-light);\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { IdentityService } from \"company-dashboard/services/identity\";\nimport { Router } from \"aurelia-router\";\nimport { autoinject } from \"aurelia-framework\";\nimport { Operation } from \"shared/utilities\";\nimport { ToastService, ModalService, IValidation } from \"shared/framework\";\nimport { ForgotPassword } from \"./modals/forgot-password/forgot-password\";\nimport { ResetPassword } from \"./modals/reset-password/reset-password\";\nimport { AcceptInvitation } from \"./modals/accept-invitation/accept-invitation\";\nimport { BaseModule } from \"shared/framework/components/base-module/base-module\";\n\ninterface LogInParams\n{\n\tmodal: \"glemt-adgangskode\" | \"nulstil-adgangskode\" | \"ny-administrator\" | undefined;\n\ttoken: string | undefined;\n\tid: string | undefined;\n}\n\n/**\n * Represents the module.\n */\n@autoinject\nexport class LogInModule extends BaseModule\n{\n\t/**\n\t * Creates a new instance of the type.\n\t */\n\tpublic constructor(\n\t\tidentityService: IdentityService,\n\t\ttoastService: ToastService,\n\t\tmodalService: ModalService,\n\t\trouter: Router)\n\t{\n\t\tsuper();\n\n\t\tthis._identityService = identityService;\n\t\tthis._identityService.unauthenticate();\n\t\tthis._toastService = toastService;\n\t\tthis._modalService = modalService;\n\n\t\tthis._router = router;\n\t\tthis._contructed = true;\n\t}\n\n\tprivate readonly _identityService: IdentityService;\n\tprivate readonly _toastService: ToastService;\n\tprivate readonly _modalService: ModalService;\n\tprivate readonly _router: Router;\n\tprivate readonly _contructed;\n\n\t/**\n\t * The validation for the form.\n\t */\n\tprotected validation: IValidation;\n\n\t/**\n\t * The email of the user\n\t */\n\tprotected email: string;\n\n\t/**\n\t * The password of the user\n\t */\n\tprotected password: string;\n\n\t/**\n\t * The most recent update operation\n\t */\n\tprotected updateOperation: Operation;\n\n\t/**\n\t * Updates the page by fetching the latest data.\n\t */\n\tpublic async onForgotPasswordClick(): Promise\n\t{\n\t\tthis._router.navigate(\"log-ind/glemt-adgangskode\");\n\t}\n\n\t/**\n\t * Called by the framework when the module is activated.\n\t */\n\tpublic async doActivate(params: LogInParams): Promise\n\t{\n\t\tthis._modalService.closeAll(\"navigation\");\n\n\t\tif (params.modal === \"glemt-adgangskode\")\n\t\t{\n\t\t\tawait this._modalService.open(ForgotPassword).promise;\n\t\t\tthis._router.navigate(\"log-ind\");\n\t\t}\n\t\telse if (\n\t\t\tparams.modal === \"nulstil-adgangskode\" &&\n\t\t\tparams.token != null &&\n\t\t\tparams.id != null)\n\t\t{\n\t\t\tlet passwordReset = await this._modalService.open(ResetPassword, { token: params.token, id: params.id }).promise;\n\n\t\t\tif (!passwordReset)\n\t\t\t{\n\t\t\t\tthis._router.navigate(\"log-ind\");\n\t\t\t}\n\t\t}\n\t\telse if (\n\t\t\tparams.modal === \"ny-administrator\" &&\n\t\t\tparams.token != null &&\n\t\t\tparams.id != null)\n\t\t{\n\t\t\tlet adminSignUpPasswordReset = await this._modalService.open(AcceptInvitation, { token: params.token, id: params.id }).promise;\n\n\t\t\tif (!adminSignUpPasswordReset)\n\t\t\t{\n\t\t\t\tthis._router.navigate(\"log-ind\");\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected async logIn(): Promise\n\t{\n\t\t// Returns if the object is not contructed.\n\t\t// This is needed because the `observable` decorator called the change handler when the\n\t\t// initial property value is set, which happens before the constructor is called\n\t\tif (!this._contructed)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tthis.validation.active = true;\n\n\t\tif (!await this.validation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.updateOperation != null)\n\t\t{\n\t\t\tthis.updateOperation.abort();\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.updateOperation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait this._identityService.logIn(this.email, this.password, signal);\n\n\t\t\t\tawait this._identityService.initial();\n\n\t\t\t\tthis._router.navigate(\"medarbejdere\");\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tif ([401, 403].includes(error.response.status))\n\t\t\t\t{\n\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"message\": \"Vi kunne ikke genkende mail eller adgangskode. Har du glemt din adgangskode?\"\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"message\": \"Vi har tekniske problemer lige nu. Skriv på support@grandhood.dk hvis problemet bliver ved.\"\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tconsole.log(\"An error occurred.\\n\", error, signal);\n\t\t\t}\n\t\t})\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"page[name=log-in] .content-wrapper{align-items:center}page[name=log-in] .content-wrapper .wrapper{display:flex;flex-direction:column;width:512rem;max-width:100%}page[name=log-in] .content-wrapper .wrapper button{align-self:flex-start}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/log-in/log-in.scss\"],\"names\":[],\"mappings\":\"AAKC,mCAEC,kBAAA,CAEA,4CAEC,YAAA,CACA,qBAAA,CACA,YAAA,CACA,cAAA,CAEA,mDAEC,qBAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\npage[name=\\\"log-in\\\"]\\n{\\n\\n\\t.content-wrapper\\n\\t{\\n\\t\\talign-items: center;\\n\\n\\t\\t.wrapper\\n\\t\\t{\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\tflex-direction: column;\\n\\t\\t\\twidth: 512rem;\\n\\t\\t\\tmax-width: 100%;\\n\\n\\t\\t\\tbutton\\n\\t\\t\\t{\\n\\t\\t\\t\\talign-self: flex-start;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { IdentityService } from \"company-dashboard/services/identity\";\nimport { Router } from \"aurelia-router\";\nimport { autoinject } from \"aurelia-framework\";\nimport { IValidation, ToastService } from \"shared/framework\";\nimport { Modal } from \"shared/framework/services/modal\";\nimport { Operation } from \"shared/utilities\";\nimport { AdministratorService } from \"company-dashboard/model/dashboard/company\";\n\n@autoinject\nexport class AcceptInvitation\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param modal The `Modal` instance representing the modal.\n\t * @param administratorService The `AdministratorService` instance.\n\t * @param identityService The `IdentityService` instance.\n\t * @param toastService The `ToastService` instance.\n\t */\n\tpublic constructor(modal: Modal, administratorService: AdministratorService, identityService: IdentityService, toastService: ToastService, router: Router)\n\t{\n\t\tthis._modal = modal;\n\t\tthis._administratorService = administratorService;\n\t\tthis._identityService = identityService;\n\t\tthis._toastService = toastService;\n\t\tthis._router = router;\n\t}\n\n\tprivate readonly _modal: Modal;\n\tprivate readonly _administratorService: AdministratorService;\n\tprivate readonly _identityService: IdentityService;\n\tprivate readonly _toastService: ToastService;\n\tprivate readonly _router: Router;\n\tprivate passwordReset = false;\n\n\tprotected validation: IValidation;\n\n\t/**\n\t * The new password of the user\n\t */\n\tprotected password: string;\n\n\t/**\n\t * The confirmed password\n\t */\n\tprotected confirmPassword: string;\n\n\t/**\n\t * If the user consents to receive marketing information\n\t */\n\tprotected receiveMarketingInformation: boolean = false;\n\n\t/**\n\t * The most recent update operation\n\t */\n\tprotected operation: Operation;\n\n\t/**\n\t * The model for the modal.\n\t */\n\tprotected model: { token: string, id: string };\n\n\t/**\n\t * Called by the framework when the modal is activated.\n\t * @param model The model to use for the modal.\n\t */\n\tpublic activate(model: { token: string, id: string }): void\n\t{\n\t\tthis.model = model;\n\t}\n\n\t/**\n\t * Called by the framework when the modal is deactivated.\n\t * @returns True if the password has been reset.\n\t */\n\tpublic deactivate(): boolean\n\t{\n\t\treturn this.passwordReset;\n\t}\n\n\t/**\n\t * Check if the password is 8 characters long\n\t * contains atleast a number, and letters\n\t */\n\tprotected get passwordValid(): boolean\n\t{\n\t\tif (this.password == null)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.password.length < 8)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!/\\d/.test(this.password))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!isNaN(Number(this.password)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Called when the cancel button is clicked.\n\t */\n\tprotected async onCloseClick(): Promise\n\t{\n\t\tawait this._modal.close();\n\t}\n\n\t/**\n\t * Updates the page by fetching the latest data.\n\t */\n\tprotected async onResetPassword(): Promise\n\t{\n\t\tthis.validation.active = true;\n\n\t\tif (!await this.validation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.operation != null)\n\t\t{\n\t\t\tthis.operation.abort();\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.operation = new Operation(async signal => {\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait this._administratorService.acceptInvite(this.password, this.confirmPassword, this.model.token, this.model.id, this.receiveMarketingInformation, signal);\n\n\t\t\t\tthis.passwordReset = true;\n\n\t\t\t\tawait this._identityService.initial();\n\n\t\t\t\tawait this._modal.close();\n\t\t\t\tthis._router.navigate(\"medarbejdere\", { replace: true });\n\t\t\t}\n\t\t\tcatch (error)\n\t\t\t{\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"error\": error\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { IdentityService } from \"company-dashboard/services/identity\";\nimport { autoinject } from \"aurelia-framework\";\nimport { IValidation, ToastService } from \"shared/framework\";\nimport { Modal } from \"shared/framework/services/modal\";\nimport { Operation } from \"shared/utilities\";\n\n@autoinject\nexport class ForgotPassword\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param modal The `Modal` instance representing the modal.\n\t * @param identityService The `IdentityService` instance.\n\t * @param toastService The `ToastService` instance.\n\t */\n\tpublic constructor(modal: Modal, identityService: IdentityService, toastService: ToastService)\n\t{\n\t\tthis._modal = modal;\n\t\tthis._identityService = identityService;\n\t\tthis._toastService = toastService;\n\t}\n\n\tprivate readonly _modal: Modal;\n\tprivate readonly _identityService: IdentityService;\n\tprivate readonly _toastService: ToastService;\n\n\t/**\n\t * The validation for the modal.\n\t */\n\tprotected validation: IValidation;\n\n\t/**\n\t* The email of the user\n\t*/\n\tprotected email: string;\n\n\t/**\n\t* The most recent update operation\n\t*/\n\tprotected updateOperation: Operation;\n\n\t/**\n\t* Whether or not the operation has been finished\n\t*/\n\tprotected operationFinished: boolean;\n\n\t/**\n\t * Called when the cancel button is clicked.\n\t */\n\tprotected async onCloseClick(): Promise\n\t{\n\t\tawait this._modal.close();\n\t}\n\n\t/**\n\t * Updates the page by fetching the latest data.\n\t */\n\tprotected async resetPassword(): Promise\n\t{\n\t\tthis.validation.active = true;\n\n\t\tif (!await this.validation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.updateOperation != null)\n\t\t{\n\t\t\tthis.updateOperation.abort();\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.updateOperation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait this._identityService.forgotPassword(this.email, signal);\n\n\t\t\t\tthis.operationFinished = true;\n\t\t\t}\n\t\t\tcatch (error)\n\t\t\t{\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"error\": error\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { IdentityService } from \"company-dashboard/services/identity\";\nimport { Router } from \"aurelia-router\";\nimport { autoinject } from \"aurelia-framework\";\nimport { IValidation, ToastService } from \"shared/framework\";\nimport { Modal } from \"shared/framework/services/modal\";\nimport { Operation } from \"shared/utilities\";\n\n@autoinject\nexport class ResetPassword\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param modal The `Modal` instance representing the modal.\n\t * @param identityService The `IdentityService` instance.\n\t * @param toastService The `ToastService` instance.\n\t */\n\tpublic constructor(modal: Modal, identityService: IdentityService, toastService: ToastService, router: Router)\n\t{\n\t\tthis._modal = modal;\n\t\tthis._identityService = identityService;\n\t\tthis._toastService = toastService;\n\t\tthis._router = router;\n\t}\n\n\tprivate readonly _modal: Modal;\n\tprivate readonly _identityService: IdentityService;\n\tprivate readonly _toastService: ToastService;\n\tprivate readonly _router: Router;\n\tprivate passwordReset = false;\n\n\t/**\n\t * The validation for the modal.\n\t */\n\tprotected validation: IValidation;\n\n\t/**\n\t* The new password of the user\n\t*/\n\tprotected password: string;\n\n\t/**\n\t* The confirmed password\n\t*/\n\tprotected confirmPassword: string;\n\n\t/**\n\t* The most recent update operation\n\t*/\n\tprotected updateOperation: Operation;\n\n\t/**\n\t * The model for the modal.\n\t */\n\tprotected model: { token: string, id: string };\n\n\t/**\n\t * Called by the framework when the modal is activated.\n\t * @param model The model to use for the modal.\n\t */\n\tpublic activate(model: { token: string, id: string }): void\n\t{\n\t\tthis.model = model;\n\t}\n\n\t/**\n\t * Called by the framework when the modal is deactivated.\n\t * @returns True if the password has been reset.\n\t */\n\tpublic deactivate(): boolean\n\t{\n\t\treturn this.passwordReset;\n\t}\n\n\t/**\n\t * Check if the password is 8 characters long\n\t * contains atleast a number, and letters\n\t */\n\tprotected get passwordValid(): boolean\n\t{\n\t\tif (this.password == null)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.password.length < 8)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!/\\d/.test(this.password))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!isNaN(Number(this.password)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Called when the cancel button is clicked.\n\t */\n\tprotected async onCloseClick(): Promise\n\t{\n\t\tawait this._modal.close();\n\t}\n\n\t/**\n\t * Updates the page by fetching the latest data.\n\t */\n\tprotected async onResetPassword(): Promise\n\t{\n\t\tthis.validation.active = true;\n\n\t\tif (!await this.validation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.updateOperation != null)\n\t\t{\n\t\t\tthis.updateOperation.abort();\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.updateOperation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait this._identityService.resetPassword(this.password, this.confirmPassword, this.model.token, this.model.id , signal);\n\n\t\t\t\tthis.passwordReset = true;\n\n\t\t\t\tawait this._identityService.initial();\n\n\t\t\t\tawait this._modal.close();\n\t\t\t\tthis._router.navigate(\"medarbejdere\", { replace: true });\n\t\t\t}\n\t\t\tcatch (error)\n\t\t\t{\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"error\": error\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { AgreementDocument } from \"company-dashboard/model/dashboard/company\";\nimport { Router, Redirect } from \"aurelia-router\";\nimport { AgreementDocumentService } from \"company-dashboard/model/dashboard/company/services/agreement-document-service\";\nimport { AgreementDocumentsService } from \"company-dashboard/model/sign-up/agreement-documents\";\nimport { autoinject, } from \"aurelia-framework\";\nimport { ModalService, ToastService } from \"shared/framework\";\nimport { BaseModule } from \"shared/framework/components/base-module/base-module\";\nimport { Operation } from \"shared/utilities\";\nimport { IdentityService } from \"company-dashboard/services/identity\";\n\n// REUSING THE SAME MODAL FOR THE EXISTING AGREEMENT DOCUMENTS, SO THAT WE DO NOT COPY CODE.\n// ALSO THIS JUST NEEDS TO BE MOVED, WHEN THE CURRENT AGREEMENT DOCUMENTS PAGE RETIRES OR RATHER\n// THE CODE IN HERE MUST BE MOVED TO THE CURRENT AGREEMENT DOCUMENTS PAGE\nimport { AdminSignUpFromBroker } from \"../agreement-documents/modals/admin-sign-up-from-broker/admin-sign-up-from-broker\";\n\ninterface AgreementDocumentsParams\n{\n\tmodal: \"opret-adgangskode\" | undefined;\n\ttoken: string | undefined;\n\tid: string | undefined;\n}\n\n@autoinject\nexport class AgreementDocumentsModule extends BaseModule\n{\n\tpublic constructor(\n\t\tagreementDocumentsService: AgreementDocumentsService,\n\t\tagreementDocumentService: AgreementDocumentService,\n\t\ttoastService: ToastService,\n\t\tmodalService: ModalService,\n\t\tidentityService: IdentityService,\n\t\trouter: Router)\n\t{\n\t\tsuper();\n\n\t\tthis._agreementDocumentsService = agreementDocumentsService;\n\t\tthis._agreementDocumentService = agreementDocumentService;\n\t\tthis._toastService = toastService;\n\t\tthis._modalService = modalService;\n\t\tthis._identityService = identityService;\n\t\tthis._router = router;\n\n\t\tthis._contructed = true;\n\t}\n\n\tprivate readonly _agreementDocumentsService: AgreementDocumentsService;\n\tprivate readonly _agreementDocumentService: AgreementDocumentService;\n\tprivate readonly _toastService: ToastService;\n\tprivate readonly _modalService: ModalService;\n\tprivate readonly _identityService: IdentityService;\n\tprivate readonly _router: Router;\n\tprivate readonly _contructed;\n\n\tprotected failed: boolean = false;\n\n\t/**\n\t * The items to represent in the list of agreement documents\n\t */\n\tprotected agreementDocuments: AgreementDocument[] | undefined;\n\n\t/**\n\t * The most recent update operation\n\t */\n\tprotected updateOperation: Operation;\n\n\tprotected documentToSignOperation: Operation;\n\n\tprotected async onReadDocumentClick(s3Key: string): Promise\n\t{\n\t\tlet blob = await this._agreementDocumentService.getAgreementDocument(s3Key);\n\n\t\tlet anchor = document.createElement(\"a\");\n\t\tanchor.href = URL.createObjectURL(blob);\n\t\tanchor.download = s3Key;\n\t\tdocument.body.appendChild(anchor);\n\t\tanchor.click();\n\t\tdocument.body.removeChild(anchor);\n\t\tURL.revokeObjectURL(anchor.href);\n\t}\n\n\t/**\n\t * Called by the framework when the module is activated.\n\t * @returns A promise that will be resolved, when the module is activated.\n\t */\n\tpublic async doActivate(params: AgreementDocumentsParams): Promise\n\t{\n\t\tthis._modalService.closeAll(\"navigation\");\n\n\t\tif (\n\t\t\tparams.modal === \"opret-adgangskode\" &&\n\t\t\t(params.token == null || params.id == null))\n\t\t{\n\t\t\tnew Redirect(\"log-ind\", { replace: true });\n\t\t}\n\t\telse if (\n\t\t\tparams.modal === \"opret-adgangskode\" &&\n\t\t\tparams.token != null &&\n\t\t\tparams.id != null)\n\t\t{\n\t\t\tthis._identityService.unauthenticate();\n\t\t\tconst passwordDidReset = await this._modalService.open(AdminSignUpFromBroker, { token: params.token, id: params.id }).promise;\n\n\t\t\tif (passwordDidReset)\n\t\t\t{\n\t\t\t\tawait this._identityService.initial();\n\t\t\t\tthis._router.navigate(\"aftaledokumenter\", { replace: true });\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.update();\n\t\t}\n\t}\n\n\tprotected async onNextClick(): Promise\n\t{\n\t\tthis.failed = false;\n\n\t\tawait this._agreementDocumentsService.setDocumentsRead();\n\n\t\tif (this.documentToSignOperation != null)\n\t\t{\n\t\t\tthis.documentToSignOperation.abort();\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.documentToSignOperation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\t// Fetch the data\n\t\t\t\tconst signingUrl = await this._agreementDocumentsService.getDocumentsSigningUrl(signal);\n\n\t\t\t\tthis._router.navigate(signingUrl);\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tthis.failed = true;\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"message\": error.message\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t}\n\n\t/**\n\t * Updates the page by fetching the latest data.\n\t */\n\tprotected update(): void\n\t{\n\t\t// Returns if the object is not contructed.\n\t\t// This is needed because the `observable` decorator called the change handler when the\n\t\t// initial property value is set, which happens before the constructor is called\n\t\tif (!this._contructed)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.updateOperation != null)\n\t\t{\n\t\t\tthis.updateOperation.abort();\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.updateOperation = new Operation(async signal =>\n\t\t{\n\t\t\tthis.failed = false;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\t// Fetch the data\n\t\t\t\tconst result = await this._agreementDocumentsService.getAgreementDocuments(signal);\n\n\t\t\t\tthis.agreementDocuments = result;\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tthis.failed = true;\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"message\": error.message\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"page[name=agreement-documents] .text-container,page[name=agreement-documents] .form-container{max-width:550rem}page[name=agreement-documents] .text-container .agreement-document-container,page[name=agreement-documents] .form-container .agreement-document-container{max-width:512rem}@media(max-width: 800px){page[name=agreement-documents] .text-container .agreement-document-container>*,page[name=agreement-documents] .form-container .agreement-document-container>*{align-self:flex-start}}page[name=agreement-documents] .text-container .agreement-document-container a,page[name=agreement-documents] .form-container .agreement-document-container a{padding-left:12rem;margin-left:auto;white-space:nowrap;text-decoration:none;display:flex;align-items:center}@media(max-width: 800px){page[name=agreement-documents] button{width:100%}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/sign-up/modules/agreement-documents-mitid/agreement-documents-mitid.scss\"],\"names\":[],\"mappings\":\"AAIC,8FAEC,gBAAA,CAGA,0JAEC,gBAAA,CAIC,yBAFD,8JAIE,qBAAA,CAAA,CAGF,8JAEC,kBAAA,CACA,gBAAA,CACA,kBAAA,CACA,oBAAA,CACA,YAAA,CACA,kBAAA,CAOF,yBAFD,sCAIE,UAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\npage[name=\\\"agreement-documents\\\"]\\n{\\n\\t.text-container, .form-container\\n\\t{\\n\\t\\tmax-width: 550rem;\\n\\n\\n\\t\\t.agreement-document-container\\n\\t\\t{\\n\\t\\t\\tmax-width: 512rem;\\n\\n\\t\\t\\t> *\\n\\t\\t\\t{\\n\\t\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\talign-self: flex-start;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\ta\\n\\t\\t\\t{\\n\\t\\t\\t\\tpadding-left: 12rem;\\n\\t\\t\\t\\tmargin-left: auto;\\n\\t\\t\\t\\twhite-space: nowrap;\\n\\t\\t\\t\\ttext-decoration: none;\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\talign-items: center;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tbutton\\n\\t{\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\twidth: 100%;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { Router } from \"aurelia-router\";\nimport { AgreementDocumentsService } from \"company-dashboard/model/sign-up/agreement-documents\";\nimport { autoinject, } from \"aurelia-framework\";\nimport { BaseModule } from \"shared/framework/components/base-module/base-module\";\nimport { Operation } from \"shared/utilities\";\n\n@autoinject\nexport class AgreementDocumentsSignedModule extends BaseModule\n{\n\tpublic constructor(\n\t\tagreementDocumentsService: AgreementDocumentsService,\n\t\trouter: Router)\n\t{\n\t\tsuper();\n\n\t\tthis._agreementDocumentsService = agreementDocumentsService;\n\t\tthis._router = router;\n\t}\n\n\tprivate readonly _agreementDocumentsService: AgreementDocumentsService;\n\tprivate readonly _router: Router;\n\n\tprotected failed: boolean = false;\n\n\t/**\n\t * The most recent update operation\n\t */\n\tprotected updateOperation: Operation;\n\n\t/**\n\t * Called by the framework when the module is activated.\n\t * @returns A promise that will be resolved, when the module is activated.\n\t */\n\tpublic async doActivate(): Promise\n\t{\n\t\tawait this._agreementDocumentsService.setSignedDocuments();\n\n\t\tthis._router.navigate(\"dit-dashboard\");\n\n\t\treturn;\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"page[name=agreement-documents] .text-container,page[name=agreement-documents] .form-container{max-width:550rem}page[name=agreement-documents] .text-container .agreement-document-container,page[name=agreement-documents] .form-container .agreement-document-container{max-width:512rem}@media(max-width: 800px){page[name=agreement-documents] .text-container .agreement-document-container>*,page[name=agreement-documents] .form-container .agreement-document-container>*{align-self:flex-start}}page[name=agreement-documents] .text-container .agreement-document-container a,page[name=agreement-documents] .form-container .agreement-document-container a{padding-left:12rem;margin-left:auto;white-space:nowrap;text-decoration:none;display:flex;align-items:center}@media(max-width: 800px){page[name=agreement-documents] button{width:100%}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/sign-up/modules/agreement-documents-signed/agreement-documents-signed.scss\"],\"names\":[],\"mappings\":\"AAIC,8FAEC,gBAAA,CAGA,0JAEC,gBAAA,CAIC,yBAFD,8JAIE,qBAAA,CAAA,CAGF,8JAEC,kBAAA,CACA,gBAAA,CACA,kBAAA,CACA,oBAAA,CACA,YAAA,CACA,kBAAA,CAOF,yBAFD,sCAIE,UAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\npage[name=\\\"agreement-documents\\\"]\\n{\\n\\t.text-container, .form-container\\n\\t{\\n\\t\\tmax-width: 550rem;\\n\\n\\n\\t\\t.agreement-document-container\\n\\t\\t{\\n\\t\\t\\tmax-width: 512rem;\\n\\n\\t\\t\\t> *\\n\\t\\t\\t{\\n\\t\\t\\t\\t@media ($media-smaller-max)\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\talign-self: flex-start;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\ta\\n\\t\\t\\t{\\n\\t\\t\\t\\tpadding-left: 12rem;\\n\\t\\t\\t\\tmargin-left: auto;\\n\\t\\t\\t\\twhite-space: nowrap;\\n\\t\\t\\t\\ttext-decoration: none;\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\talign-items: center;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tbutton\\n\\t{\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\twidth: 100%;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { IdentityService } from \"company-dashboard/services/identity\";\nimport { autoinject } from \"aurelia-framework\";\nimport { IValidation, ThemeService, ToastService } from \"shared/framework\";\nimport { Modal } from \"shared/framework/services/modal\";\nimport { Operation } from \"shared/utilities\";\n\n@autoinject\nexport class AdminSignUpFromBroker\n{\n\n\tpublic constructor(\n\t\tmodal: Modal,\n\t\tidentityService: IdentityService,\n\t\ttoastService: ToastService,\n\t\tthemseService: ThemeService)\n\t{\n\t\tthis._modal = modal;\n\t\tthis._identityService = identityService;\n\t\tthis._toastService = toastService;\n\t\tthis.themeService = themseService;\n\t}\n\n\tprivate readonly _modal: Modal;\n\tprivate readonly _identityService: IdentityService;\n\tprivate readonly _toastService: ToastService;\n\tprotected readonly themeService: ThemeService;\n\tprivate passwordReset = false;\n\n\t/**\n\t * The validation for the modal.\n\t */\n\tprotected validation: IValidation;\n\n\tprotected receiveMarketingInformation: boolean = false;\n\n\tprotected password: string;\n\n\tprotected confirmPassword: string;\n\n\tprotected updateOperation: Operation;\n\n\tprotected model: { token: string, id: string };\n\n\t/**\n\t * Called by the framework when the modal is activated.\n\t * @param model The model to use for the modal.\n\t */\n\tpublic activate(model: { token: string, id: string }): void\n\t{\n\t\tthis.model = model;\n\t}\n\n\t/**\n\t * Called by the framework when the modal is deactivated.\n\t * @returns True if the password has been reset.\n\t */\n\tpublic deactivate(): boolean\n\t{\n\t\treturn this.passwordReset;\n\t}\n\n\t/**\n\t * Check if the password is 8 characters long\n\t * contains atleast a number, and letters\n\t */\n\tprotected get passwordValid(): boolean\n\t{\n\t\tif (this.password == null)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.password.length < 8)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!/\\d/.test(this.password))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!isNaN(Number(this.password)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprotected async onResetPassword(): Promise\n\t{\n\t\tthis.validation.active = true;\n\n\t\tif (!await this.validation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.updateOperation != null)\n\t\t{\n\t\t\tthis.updateOperation.abort();\n\t\t}\n\n\t\tthis.updateOperation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait this._identityService.claimCompany(this.password, this.confirmPassword, this.model.token, this.model.id, this.receiveMarketingInformation, signal);\n\t\t\t\tthis.passwordReset = true;\n\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"success\",\n\t\t\t\t\t{\n\t\t\t\t\t\theading: \"Din adgangskode er nu oprettet.\"\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tawait this._modal.close();\n\t\t\t}\n\t\t\tcatch (error)\n\t\t\t{\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"error\": error\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { CompanyTypeahead, SignUpCompanyService } from \"company-dashboard/model/sign-up/sign-up-company\";\nimport { autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\nimport { LabelPosition, AutocompleteHint, ItemPickerCustomElement } from \"shared/framework\";\nimport { Operation } from \"shared/utilities\";\n\n/**\n * Custom element representing an input for picking a company.\n */\n@autoinject\nexport class CompanyInputCustomElement\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param element The element representing the component.\n\t */\n\tpublic constructor(element: Element, signUpCompanyService: SignUpCompanyService)\n\t{\n\t\tthis._element = element as HTMLElement;\n\t\tthis._signUpCompanyService = signUpCompanyService;\n\t}\n\n\tprivate readonly _element: HTMLElement;\n\tprivate readonly _signUpCompanyService: SignUpCompanyService;\n\n\t/**\n\t * The most recent fetch operation.\n\t */\n\tprotected fetchOperation: Operation;\n\n\t/**\n\t * The element representing the input.\n\t */\n\tprotected inputElement: HTMLElement;\n\n\t/**\n\t * The element representing the toggle icon.\n\t */\n\tprotected toggleElement: HTMLElement;\n\n\t/**\n\t * The value entered by the user, or undefined.\n\t */\n\tprotected enteredValue: string | undefined;\n\n\t/**\n\t * The view model for the item picker.\n\t */\n\tprotected itemPicker: ItemPickerCustomElement;\n\n\t/**\n\t * Gets the items that match the entered company.\n\t */\n\tprotected items: CompanyTypeahead[] = [];\n\n\tprotected searchDelayTimer: any;\n\n\t/**\n\t * Gets the input value.\n\t */\n\t@computedFrom(\"open\", \"enteredValue\", \"focusedValue\", \"value\")\n\tprotected get inputValue(): string\n\t{\n\t\t// If the user entered a value, return that.\n\t\tif (this.enteredValue != null)\n\t\t{\n\t\t\treturn this.enteredValue;\n\t\t}\n\n\t\tif (this.open)\n\t\t{\n\t\t\t// If open with a focused value, format and return that.\n\t\t\tif (this.focusedValue != null)\n\t\t\t{\n\t\t\t\treturn this.focusedValue.name.trim().replace(/\\s+/g, \" \");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// If closed with a comitted value, format and return that.\n\t\t\tif (this.value != null)\n\t\t\t{\n\t\t\t\treturn this.value.name.trim().replace(/\\s+/g, \" \");\n\t\t\t}\n\t\t}\n\n\t\t// The input is empty.\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Sets the input value.\n\t */\n\tprotected set inputValue(value: string)\n\t{\n\t\t// Store the value entered by the user.\n\t\tthis.enteredValue = value;\n\n\t\t// Clear the focused value when the input value changes.\n\t\tthis.focusedValue = undefined;\n\n\t\ttry\n\t\t{\n\t\t\t// Fetch companies matching the input value.\n\t\t\tthis.fetchItems(value);\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\t// TODO: Show an error.\n\t\t\tthis.items = [];\n\t\t}\n\t}\n\n\t/**\n\t * The position of the label, or undefined to show no label.\n\t */\n\t@bindable({ defaultValue: undefined })\n\tpublic label: LabelPosition | undefined;\n\n\t/**\n\t * The company picked by the user, or undefined if no companies has been picked.\n\t */\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\n\tpublic value: CompanyTypeahead | undefined;\n\n\t/**\n\t * The company that is focused, but not yet picked, or undefined if no company has been focused.\n\t */\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\n\tpublic focusedValue: CompanyTypeahead | undefined;\n\n\t/**\n\t * True to show the `None` option, otherwise false.\n\t */\n\t@bindable({ defaultValue: true })\n\tpublic none: boolean;\n\n\t/**\n\t * True if the dropdown is open, otherwise false.\n\t */\n\t@bindable({ defaultValue: false, defaultBindingMode: bindingMode.fromView })\n\tpublic open: boolean;\n\n\t/**\n\t * True if the input is disabled, otherwise false.\n\t */\n\t@bindable({ defaultValue: false })\n\tpublic disabled: boolean;\n\n\t/**\n\t * True if the input is readonly, otherwise false.\n\t */\n\t@bindable({ defaultValue: false })\n\tpublic readonly: boolean;\n\n\t/**\n\t * The autocomplete mode to use,\n\t * or undefined to use the default behavior.\n\t */\n\t@bindable({ defaultValue: \"off\" })\n\tpublic autocomplete: AutocompleteHint;\n\n\t/**\n\t * True to select the contents when the input is focused, otherwise false.\n\t */\n\t@bindable({ defaultValue: false })\n\tpublic autoselect: boolean;\n\n\t/**\n\t * True to use `fixed` positioning for the dropdown, otherwise false.\n\t * This may be needed if the dropdown is placed within a container that\n\t * hides overflowing content, but note that it has a performance cost.\n\t */\n\t@bindable({ defaultValue: false })\n\tpublic fixed: boolean;\n\n\t/**\n\t * Opens the dropdown and optionally focuses the input element.\n\t * @param focusInput True to focus the input element, otherwise false.\n\t */\n\tprotected openDropdown(focusInput: boolean): void\n\t{\n\t\tthis.open = true;\n\t\tthis.focusedValue = this.value;\n\n\t\tsetTimeout(() => this.itemPicker?.scrollToFocusedValue(), 100);\n\n\t\tif (focusInput)\n\t\t{\n\t\t\tsetTimeout(() => this.inputElement.focus());\n\t\t}\n\n\t\tif (this.value != null)\n\t\t{\n\t\t\tthis.fetchItems(this.value.name);\n\t\t}\n\t}\n\n\t/**\n\t * Closes the dropdown and optionally focuses the toggle icon.\n\t * Also reverts the focused value if no value was picked.\n\t * @param focusToggle True to focus the toggle icon, otherwise false.\n\t * @param pick True if the user picked a value, otherwise false.\n\t */\n\tprotected closeDropdown(focusToggle: boolean, pick = false): void\n\t{\n\t\t// Abort any existing operation.\n\t\tif (this.fetchOperation != null)\n\t\t{\n\t\t\tthis.fetchOperation.abort();\n\t\t}\n\n\t\tthis.open = false;\n\n\t\tif (pick && this.focusedValue !== this.value)\n\t\t{\n\t\t\tthis.value = this.focusedValue;\n\n\t\t\tif (this.value !== null)\n\t\t\t{\n\t\t\t\tthis.enteredValue = undefined;\n\t\t\t\tthis.items = [];\n\t\t\t}\n\n\t\t\t// Dispatch the `input` event to indicate that the comitted value, has changed.\n\t\t\tthis._element.dispatchEvent(new CustomEvent(\"input\", { bubbles: true, detail: { value: this.value } }));\n\n\t\t\t// Dispatch the `change` event to indicate that the comitted value, has changed.\n\t\t\tthis._element.dispatchEvent(new CustomEvent(\"change\", { bubbles: true, detail: { value: this.value } }));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.focusedValue = this.value;\n\t\t\tthis.enteredValue = undefined;\n\t\t\tthis.items = [];\n\t\t}\n\n\t\tif (focusToggle)\n\t\t{\n\t\t\tthis.toggleElement.focus();\n\t\t}\n\t}\n\n\t/**\n\t * Called when the toggle icon or the input element is clicked.\n\t * Toggles the dropdown between its open and closed state, focusing either the input element or toggle icon.\n\t */\n\tprotected toggleDropdown(): void\n\t{\n\t\tif (this.open)\n\t\t{\n\t\t\tthis.closeDropdown(true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.openDropdown(true);\n\t\t}\n\t}\n\n\t/**\n\t * Called when the input element is clicked.\n\t * Opens the dropdown and focuses the input element.\n\t * @param event The mouse event.\n\t * @returns True to continue.\n\t */\n\tprotected onInputMouseDown(event: MouseEvent): boolean\n\t{\n\t\tif (!event.defaultPrevented && !this.open)\n\t\t{\n\t\t\tthis.openDropdown(true);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Called when a key is pressed within the input element.\n\t * Prevents the user from entering some invalid values.\n\t * @param event The keyboard event.\n\t */\n\tprotected onInputKeyDown(event: KeyboardEvent): boolean\n\t{\n\t\tif (event.defaultPrevented)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Called when a `mousedown` event occurs on the dropdown.\n\t * Prevents default for the event, so it won't cause unwanted effects in ancestor elements.\n\t * @returns False to prevent default.\n\t */\n\tprotected onDropdownMouseDown(): boolean\n\t{\n\t\treturn false;\n\t}\n\n\t/**\n\t * Called when the input, or an element within the input, receives focus.\n\t * Opens the dropdown if the focused element is not the toggle icon.\n\t * @param event The focus event.\n\t */\n\tprotected onInputFocusIn(event: FocusEvent): void\n\t{\n\t\tif (event.target !== this.toggleElement && !this.open)\n\t\t{\n\t\t\tthis.openDropdown(false);\n\t\t}\n\t}\n\n\t/**\n\t * Called when the input, or an element within the input, looses focus.\n\t * Ensures the state is reset, even if the dropdown is not visible.\n\t * @param event The focus event.\n\t */\n\tprotected onInputFocusOut(event: FocusEvent): void\n\t{\n\t\tif (!event.defaultPrevented && this.open && !this.inputValue)\n\t\t{\n\t\t\tthis.closeDropdown(false, true);\n\t\t}\n\t}\n\n\t/**\n\t * Called when a `change` event is triggered on the input.\n\t * Prevents the event from bubbling further, as this input dispatches its own event.\n\t * @param event The change event.\n\t */\n\tprotected onInputChange(event: Event): void\n\t{\n\t\tevent.stopPropagation();\n\t}\n\n\t/**\n\t * Called by the framework when the `value` property changes.\n\t * Ensures the focused value matches the new value.\n\t */\n\tprotected valueChanged(): void\n\t{\n\t\tthis.focusedValue = this.value;\n\t}\n\n\t/**\n\t * Fetches the items matching the specified query.\n\t * @param query The query for which items should be fetched.\n\t */\n\tprivate fetchItems(query: string): void\n\t{\n\t\t// Abort any existing operation.\n\t\tif (this.fetchOperation != null)\n\t\t{\n\t\t\tthis.fetchOperation.abort();\n\t\t}\n\n\t\tclearTimeout(this.searchDelayTimer);\n\n\t\tif (query.length >= 3)\n\t\t{\n\t\t\t// Create and execute the operation\n\t\t\tthis.fetchOperation = new Operation(async signal =>\n\t\t\t{\n\t\t\t\tthis.searchDelayTimer = setTimeout(async () =>\n\t\t\t\t\t{\n\t\t\t\t\t\ttry\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (signal.aborted) // If aborted, then we do nothing\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis.items = await this._signUpCompanyService.searchForCompany(query, signal);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (error: any)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconsole.log(\"An error occurred.\\n\", error, signal);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t300\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"company-input{display:block}company-input>text-input>.input-control>.input-control-inner .input-input{padding-right:0 !important}company-input>text-input>.input-control>dropdown{display:flex}company-input>text-input>.input-control>dropdown item-picker{flex-grow:1}company-input>text-input>.input-control>dropdown item{display:flex;align-items:center}company-input>text-input>.input-control>dropdown item .secondary-value{color:var(--palette-color-neutral)}company-input>text-input>.input-control>[slot=after]>dropdown-icon,company-input>text-input>.input-control>[slot=after]>busy-indicator{padding:var(--input-padding)}company-input>text-input>.input-control>[slot=after]>busy-indicator{position:absolute;top:var(--input-border-width);bottom:var(--input-border-width);background:var(--input-surface-color)}company-input>text-input>.input-control>[slot=after]>busy-indicator .busy-indicator{width:1.286em;height:1.286em;opacity:var(--opacity-faded-more)}company-input>text-input>.input-control>[slot=after]>busy-indicator .busy-indicator div{border-width:2rem}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/sign-up/modules/sign-up-company/components/company-input/company-input.scss\"],\"names\":[],\"mappings\":\"AAAA,cAEC,aAAA,CAME,0EAGC,0BAAA,CAGD,iDAGC,YAAA,CAEA,6DAGC,WAAA,CAGD,sDAGC,YAAA,CACA,kBAAA,CAEA,uEAEC,kCAAA,CAOF,uIAIC,4BAAA,CAGD,oEAGC,iBAAA,CACA,6BAAA,CACA,gCAAA,CAGA,qCAAA,CAEA,oFAGC,aAAA,CACA,cAAA,CAGA,iCAAA,CAEA,wFAGC,iBAAA\",\"sourcesContent\":[\"company-input\\n{\\n\\tdisplay: block;\\n\\n\\t> text-input\\n\\t{\\n\\t\\t> .input-control\\n\\t\\t{\\n\\t\\t\\t> .input-control-inner .input-input\\n\\t\\t\\t{\\n\\t\\t\\t\\t// Remove padding at the end closest to the toggle icon.\\n\\t\\t\\t\\tpadding-right: 0 !important;\\n\\t\\t\\t}\\n\\n\\t\\t\\t> dropdown\\n\\t\\t\\t{\\n\\t\\t\\t\\t// Needed for scrolling to work.\\n\\t\\t\\t\\tdisplay: flex;\\n\\n\\t\\t\\t\\titem-picker\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t// Expand to fill the available width.\\n\\t\\t\\t\\t\\tflex-grow: 1;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\titem\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t// Use horizontal flex layout.\\n\\t\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\t\\talign-items: center;\\n\\n\\t\\t\\t\\t\\t.secondary-value\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\tcolor: var(--palette-color-neutral);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t> [slot=\\\"after\\\"]\\n\\t\\t\\t{\\n\\t\\t\\t\\t> dropdown-icon,\\n\\t\\t\\t\\t> busy-indicator\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t// Apply input padding.\\n\\t\\t\\t\\t\\tpadding: var(--input-padding);\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t> busy-indicator\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t// Position on top of the dropdown-icon.\\n\\t\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\t\\ttop: var(--input-border-width);\\n\\t\\t\\t\\t\\tbottom: var(--input-border-width);\\n\\n\\t\\t\\t\\t\\t// Apply the input surface color, so the indicator covers the dropdown-icon.\\n\\t\\t\\t\\t\\tbackground: var(--input-surface-color);\\n\\n\\t\\t\\t\\t\\t.busy-indicator\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t// Set the size of the indicator to match the size of the dropdown-icon.\\n\\t\\t\\t\\t\\t\\twidth: 1.286em;\\n\\t\\t\\t\\t\\t\\theight: 1.286em;\\n\\n\\t\\t\\t\\t\\t\\t// Set opacity to ensure reasonable contrast.\\n\\t\\t\\t\\t\\t\\topacity: var(--opacity-faded-more);\\n\\n\\t\\t\\t\\t\\t\\tdiv\\n\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\t// Set the stroke width of the indicator.\\n\\t\\t\\t\\t\\t\\t\\tborder-width: 2rem;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { Router } from \"aurelia-router\";\nimport { IdentityService } from \"company-dashboard/services/identity\";\nimport { autoinject } from \"aurelia-framework\";\nimport { ToastService } from \"shared/framework\";\nimport { Modal } from \"shared/framework/services/modal\";\nimport { Operation } from \"shared/utilities\";\n\n@autoinject\nexport class AdministratorAlreadyExists\n{\n\tpublic constructor(\n modal: Modal,\n identityService: IdentityService,\n toastService: ToastService,\n router: Router)\n\t{\n\t\tthis._modal = modal;\n\t\tthis._identityService = identityService;\n\t\tthis._toastService = toastService;\n\t\tthis._router = router;\n\t}\n\n\tprivate readonly _modal: Modal;\n\tprivate readonly _identityService: IdentityService;\n\tprivate readonly _toastService: ToastService;\n private readonly _router: Router;\n\n\tprotected password: string;\n\n\tprotected updateOperation: Operation;\n\n\tprotected model: { email: string };\n\n\t/**\n\t * Called by the framework when the modal is activated.\n\t * @param model The model to use for the modal.\n\t */\n\tpublic activate(model: { email: string }): void\n\t{\n\t\tthis.model = model;\n\t}\n\n\t/**\n\t * Called by the framework when the modal is deactivated.\n\t */\n\tpublic deactivate(): void\n\t{\n\n\t}\n\n\tprotected logIn(): void\n\t{\n\t\tif (this.updateOperation != null)\n\t\t{\n\t\t\tthis.updateOperation.abort();\n\t\t}\n\n\t\tif (\n\t\t\tthis.password == null ||\n\t\t\tthis.password === \"\")\n\t\t{\n\t\t\tthis._toastService.open(\n\t\t\t\t\"error\",\n\t\t\t\t{\n\t\t\t\t\t\"message\": \"Angiv en adgangskode.\"\n\t\t\t\t}\n\t\t\t);\n\n\t\t\treturn;\n\t\t}\n\n\t\tthis.updateOperation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait this._identityService.logIn(this.model.email, this.password, signal);\n\n\t\t\t\tawait this._identityService.initial();\n\n await this._modal.close();\n\n this._router.navigate(\"medarbejdere\");\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tif ([401, 403].includes(error.response.status))\n\t\t\t\t{\n\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"message\": \"Vi kunne ikke genkende adgangskoden. Har du glemt din adgangskode?\"\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"message\": \"Vi har tekniske problemer lige nu. Skriv på support@grandhood.dk hvis problemet bliver ved.\"\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tconsole.log(\"An error occurred.\\n\", error, signal);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Redirects the customer to the forgot password modal\n\t */\n public async onForgotPasswordClick(): Promise\n {\n this._router.navigate(\"log-ind/glemt-adgangskode\");\n }\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-dialog[name=administrator-already-exists] modal-footer{flex-direction:column;align-items:flex-start}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/sign-up/modules/sign-up-company/modals/administrator-already-exists/administrator-already-exists.scss\"],\"names\":[],\"mappings\":\"AAIE,6DAEE,qBAAA,CACA,sBAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\nmodal-dialog[name=\\\"administrator-already-exists\\\"]\\n{\\n modal-footer\\n {\\n flex-direction: column;\\n align-items: flex-start;\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import * as Sentry from \"@sentry/browser\";\nimport { AdministratorSimple, IdentityService } from \"company-dashboard/services/identity\";\nimport { Router } from \"aurelia-router\";\nimport { autoinject, bindable } from \"aurelia-framework\";\nimport { IValidation, ModalService, ToastService } from \"shared/framework\";\nimport { BaseModule } from \"shared/framework/components/base-module/base-module\";\nimport { ApiValidationError } from \"shared/infrastructure\";\nimport { Operation } from \"shared/utilities\";\nimport { AdministratorExistsService } from \"company-dashboard/model/sign-up/administrator-exists\";\nimport { AdministratorAlreadyExists } from \"./modals/administrator-already-exists/administrator-already-exists\";\nimport { SignUpCompanyService, Administrator, Company, CompanyTypeahead } from \"company-dashboard/model/sign-up/sign-up-company\";\n\n/**\n * Represents the module.\n */\n@autoinject\nexport class SignUpCompanyModule extends BaseModule\n{\n\tpublic constructor(\n\t\ttoastService: ToastService,\n\t\tmodalService: ModalService,\n\t\tidentityService: IdentityService,\n\t\tsignUpCompanyService: SignUpCompanyService,\n\t\tadministratorExistsService: AdministratorExistsService,\n\t\trouter: Router)\n\t{\n\t\tsuper();\n\n\t\tthis._toastService = toastService;\n\t\tthis._modalService = modalService;\n\t\tthis._identityService = identityService;\n\t\tthis._identityService.unauthenticate();\n\t\tthis._signUpCompanyService = signUpCompanyService;\n\t\tthis._administratorExistsService = administratorExistsService;\n\t\tthis._router = router;\n\t}\n\n\tprivate readonly _toastService: ToastService;\n\tprivate readonly _modalService: ModalService;\n\tprivate readonly _identityService: IdentityService;\n\tprivate readonly _signUpCompanyService: SignUpCompanyService;\n\tprivate readonly _administratorExistsService: AdministratorExistsService\n\tprivate readonly _router: Router;\n\n\tprotected administratorInformationValidation: IValidation;\n\n\tprotected companyInformationValidation: IValidation;\n\n\tprotected companySearchOperation: Operation;\n\n\tprotected currentForm: \"administrator-information\" | \"company-information\" = \"administrator-information\";\n\n\tprotected passwordVisible: boolean = false;\n\n\tprotected administrator: Administrator = new Administrator();\n\n\tprotected company: Company = new Company();\n\n @bindable\n\tprotected companySelected: CompanyTypeahead | undefined;\n\n\tpublic doActivate(): void\n\t{}\n\n\tprotected warnProductionGrandhoodEmployee(): void\n\t{\n\t\tif (ENVIRONMENT.name === \"production\" && this.administrator.email.includes(\"@grandhood.dk\"))\n\t\t{\n\t\t\talert(\"ER DU SIKKER PÅ AT DU GERNE VIL BRUGE DEN EMAIL I PRODUKTION?\");\n\t\t}\n\t}\n\n\t/**\n\t * Check if the password is 8 characters long\n\t * contains atleast a number, and letters\n\t */\n\tprotected get passwordValid(): boolean\n\t{\n\t\tif (this.administrator.password == null)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.administrator.password.length < 8)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!/\\d/.test(this.administrator.password))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!isNaN(Number(this.administrator.password)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprotected onSearchInputFocus(lookupMenu: any): void\n\t{\n\t\tlookupMenu.open = true;\n\t}\n\n\tprotected async onContinueToCompanyInformationClick(): Promise\n\t{\n\t\tthis.administratorInformationValidation.active = true;\n\n\t\tif (!await this.administratorInformationValidation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.updateOperation != null)\n\t\t{\n\t\t\tthis.updateOperation.abort();\n\t\t}\n\n\t\tthis.updateOperation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tconst exists = await this._administratorExistsService.exists(this.administrator.email, signal);\n\t\t\t\tif(exists)\n\t\t\t\t{\n\t\t\t\t\tawait this._modalService.open(AdministratorAlreadyExists, { email: this.administrator.email }).promise;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis._identityService.identity.administrator = new AdministratorSimple({ ...this.administrator })\n\n\t\t\t\t\tthis.currentForm = \"company-information\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch(error: any)\n\t\t\t{\n\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\"error\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"message\": \"Vi har tekniske problemer lige nu. Skriv på support@grandhood.dk hvis problemet bliver ved.\"\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected async onSignUpCompany(): Promise\n\t{\n\t\tthis.companyInformationValidation.active = true;\n\n\t\tif (!await this.companyInformationValidation.validate())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.updateOperation != null)\n\t\t{\n\t\t\tthis.updateOperation.abort();\n\t\t}\n\n\t\t// Create and execute the operation\n\t\tthis.updateOperation = new Operation(async signal =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait this._signUpCompanyService.signUpCompany(this.company.mergeQueriedCompany(this.companySelected!), this.administrator, signal);\n\n\t\t\t\tawait this._identityService.initial();\n\n\t\t\t\tthis._router.navigate(\"aftaledokumenter\", { replace: true });\n\t\t\t}\n\t\t\tcatch (error: any)\n\t\t\t{\n\t\t\t\tif(error instanceof ApiValidationError)\n\t\t\t\t{\n\t\t\t\t\tif(error.data.title == \"Company structure is unsupported.\")\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"message\": \"Vi understøtter desværre ikke din virksomhedsstruktur. Kontakt os gerne for mere information.\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\telse if(error.data.title == \"Company branch is unsupported.\")\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"message\": \"Vi understøtter desværre ikke branchen som din virksomhed er i. Kontakt os gerne for mere information.\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\telse if(error.data.title == \"Company already exists with provided CVR number.\")\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"message\": \"Din virksomhed er allerede i vores system. Har du eller en kollega tidligere være forbi os? Kontakt os gerne for mere information.\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\telse if(error.data.title == \"One or more validation errors occurred.\")\n\t\t\t\t\t{\n\t\t\t\t\t\t// The error is not expected as the Frontend should handle\n\t\t\t\t\t\t// all validation errors regarding the input provided.\n\t\t\t\t\t\t// This is a catch to ensure a friendly error message to\n\t\t\t\t\t\t// the user, but the error is logged as to notify that\n\t\t\t\t\t\t// a change needs to be made in the Frontend.\n\t\t\t\t\t\tSentry.captureException(error);\n\n\t\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"message\": \"En eller flere af felterne mangler at blive udfyldt.\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// The error is not expected, but was not seen as\n\t\t\t\t\t\t// an error from the Backend. So the error is\n\t\t\t\t\t\t// logged to Sentry from the Frontend.\n\t\t\t\t\t\tSentry.captureException(error);\n\n\t\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"message\": \"Vi har tekniske problemer lige nu. Skriv på support@grandhood.dk hvis problemet bliver ved.\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif ([401, 403].includes(error.response.status))\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"message\": \"Vi kunne ikke genkende mail eller adgangskode. Har du glemt din adgangskode?\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._toastService.open(\n\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"message\": \"Vi har tekniske problemer lige nu. Skriv på support@grandhood.dk hvis problemet bliver ved.\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log(\"An error occurred.\\n\", error, signal);\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"page[name=sign-up-company] .text-container,page[name=sign-up-company] .form-container{max-width:550rem}page[name=sign-up-company] .policy-container{display:flex;flex-direction:column}@media(max-width: 800px){page[name=sign-up-company] button{width:100%}}page[name=sign-up-company] .button-container{display:flex}@media(max-width: 800px){page[name=sign-up-company] .button-container{flex-direction:column-reverse}page[name=sign-up-company] .button-container button{margin:0}page[name=sign-up-company] .button-container button:not(:last-child){margin-top:16rem}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/sign-up/modules/sign-up-company/sign-up-company.scss\"],\"names\":[],\"mappings\":\"AAIC,sFAEC,gBAAA,CAGD,6CAEC,YAAA,CACA,qBAAA,CAKA,yBAFD,kCAIE,UAAA,CAAA,CAIF,6CAEC,YAAA,CAEA,yBAJD,6CAME,6BAAA,CAEA,oDAEC,QAAA,CAEA,qEAEC,gBAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\npage[name=\\\"sign-up-company\\\"]\\n{\\n\\t.text-container, .form-container\\n\\t{\\n\\t\\tmax-width: 550rem;\\n\\t}\\n\\n\\t.policy-container\\n\\t{\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\t}\\n\\n\\tbutton\\n\\t{\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\twidth: 100%;\\n\\t\\t}\\n\\t}\\n\\n\\t.button-container\\n\\t{\\n\\t\\tdisplay: flex;\\n\\n\\t\\t@media ($media-smaller-max)\\n\\t\\t{\\n\\t\\t\\tflex-direction: column-reverse;\\n\\n\\t\\t\\tbutton\\n\\t\\t\\t{\\n\\t\\t\\t\\tmargin: 0;\\n\\n\\t\\t\\t\\t&:not(:last-child)\\n\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\tmargin-top: 16rem;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { IdentityService } from \"company-dashboard/services/identity\";\nimport { autoinject } from \"aurelia-framework\";\nimport { Router } from \"aurelia-router\";\nimport { Operation } from \"shared/utilities\";\nimport { ToastService } from \"shared/framework\";\nimport { BaseModule } from \"shared/framework/components/base-module/base-module\";\n\n/**\n * Represents the module.\n */\n@autoinject\nexport class YourDashboardModule extends BaseModule\n{\n\tconstructor(\n\t\tidentityService: IdentityService,\n\t\ttoastService: ToastService,\n\t\trouter: Router)\n\t{\n\t\tsuper()\n\n\t\tthis._identityService = identityService;\n\t\tthis._toastService = toastService;\n\t\tthis._router = router;\n\t\tthis._contructed = true;\n\t}\n\n\tprivate readonly _identityService: IdentityService;\n\tprivate readonly _toastService: ToastService;\n\tprivate readonly _router: Router;\n\tprivate readonly _contructed: boolean;\n\n\tprivate timeout: any;\n\n\tdoActivate(): void\n\t{\n\t\tthis.update();\n\t}\n\n\tdeactivate()\n\t{\n\t\tclearTimeout(this.timeout);\n\t}\n\n/**\n\t * Updates the page by fetching the latest data.\n\t */\n protected update(): void\n {\n\t// Returns if the object is not contructed.\n\t// This is needed because the `observable` decorator called the change handler when the\n\t// initial property value is set, which happens before the constructor is called\n\tif (!this._contructed)\n\t{\n\t\treturn;\n\t}\n\n\tif (this.updateOperation != null)\n\t{\n\t\tthis.updateOperation.abort();\n\t}\n\n\t// Create and execute the operation\n\tthis.updateOperation = new Operation(async signal =>\n\t{\n\t\ttry\n\t\t{\n\t\t\t// Fetch the data\n\t\t\tawait this._identityService.initial(signal);\n\n\t\t\tthis.timeout = setTimeout(\n\t\t\t\t() => this._router.navigate(\"medarbejdere\"),\n\t\t\t\t2500\n\t\t\t)\n\t\t}\n\t\tcatch (error: any)\n\t\t{\n\t\t\tthis._toastService.open(\n\t\t\t\t\"error\",\n\t\t\t\t{\n\t\t\t\t\t\"message\": error.message\n\t\t\t\t}\n\t\t\t)\n\t\t}\n\t});\n }\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, PLATFORM } from \"aurelia-framework\";\nimport { RouterConfiguration, Router } from \"aurelia-router\";\n/**\n * Represents the module.\n */\n@autoinject\nexport class SignUpModule\n{\n\t/**\n\t * Called to configure the router for the module.\n\t * @param config The router configuration associated with the module.\n\t * @param router The router associated with the module.\n\t */\n\tpublic configureRouter(config: RouterConfiguration, router: Router): void\n\t{\n\t\tconfig.map(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tname: \"default\",\n\t\t\t\t\troute: \"\",\n\t\t\t\t\tredirect: \"tilmeld-firma\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"sign-up-company\",\n\t\t\t\t\troute: \"tilmeld-firma\",\n\t\t\t\t\tmoduleId: PLATFORM.moduleName(\"./modules/sign-up-company/sign-up-company\"),\n\t\t\t\t\ttitle: \"Tilmeld firma\",\n\t\t\t\t\tnav: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// It is important this entry is before \"agreement-documents\" as this entry's route\n\t\t\t\t\t// is part of the others route. It is kept separate for now as the \"agreement-documents\"\n\t\t\t\t\t// uses the old signing solution and I did not want to have to change the redirect url\n\t\t\t\t\t// in the backend later by adding '*-mitid' to this one.\n\t\t\t\t\tname: \"agreement-documents-signed\",\n\t\t\t\t\troute: [\"aftaledokumenter/underskrevet\", \"aftaledokumenter/underskrevet/:modal\"],\n\t\t\t\t\tmoduleId: PLATFORM.moduleName(\"./modules/agreement-documents-signed/agreement-documents-signed\"),\n\t\t\t\t\ttitle: \"Underskrevet aftaledokumenter\",\n\t\t\t\t\tnav: false,\n\t\t\t\t},\n\t\t\t\t// { // TODO: Delete this and clean up the code to match the solution\n\t\t\t\t// \tname: \"agreement-documents-mitid\",\n\t\t\t\t// \troute: [\"aftaledokumenter-mitid\", \"aftaledokumenter-mitid/:modal\"],\n\t\t\t\t// \tmoduleId: PLATFORM.moduleName(\"./modules/agreement-documents-mitid/agreement-documents-mitid\"),\n\t\t\t\t// \ttitle: \"Aftaledokumenter\",\n\t\t\t\t// \tnav: false,\n\t\t\t\t// },\n\t\t\t\t{\n\t\t\t\t\tname: \"agreement-documents\",\n\t\t\t\t\troute: [\"aftaledokumenter\", \"aftaledokumenter/:modal\"],\n\t\t\t\t\tmoduleId: PLATFORM.moduleName(\"./modules/agreement-documents-mitid/agreement-documents-mitid\"),\n\t\t\t\t\ttitle: \"Aftaledokumenter\",\n\t\t\t\t\tnav: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"your-dashboard\",\n\t\t\t\t\troute: \"dit-dashboard\",\n\t\t\t\t\tmoduleId: PLATFORM.moduleName(\"./modules/your-dashboard/your-dashboard\"),\n\t\t\t\t\ttitle: \"Dit dashboard\",\n\t\t\t\t\tnav: true,\n\t\t\t\t}\n\t\t\t]\n\t\t);\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"page[name=sign-up-company] mdc-icon{transition:opacity var(--animation-duration-medium)}page[name=sign-up-company] mdc-icon:not(.--active){opacity:.4}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/modules/sign-up/sign-up.scss\"],\"names\":[],\"mappings\":\"AAEC,oCAEC,mDAAA,CAEA,mDAEC,UAAA\",\"sourcesContent\":[\"page[name=\\\"sign-up-company\\\"]\\n{\\n\\tmdc-icon\\n\\t{\\n\\t\\ttransition: opacity var(--animation-duration-medium);\\n\\n\\t\\t&:not(.--active)\\n\\t\\t{\\n\\t\\t\\topacity: .4;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\nimport { Toast } from \"shared/framework\";\nimport { MapObject } from \"shared/types\";\nimport settings from \"resources/settings\";\n\n/**\n * Represents the model for a toast that notifies the user that an error has occurred.\n */\nexport interface IErrorToastModel\n{\n\t/**\n\t * The message to show, or undefined if no message exists.\n\t */\n\tmessage?: string;\n\n\t/**\n\t * The error to show, or undefined if no error exists.\n\t */\n\terror?: Error | string;\n\n\t/**\n\t * The context associated with the error, or undefined if no error exists.\n\t */\n\tcontext?: MapObject;\n\n\t/**\n\t * The time in milliseconds before the the toast is hidden,\n\t * null to never hide the toast, or undefined to use the default.\n\t */\n\ttimeout?: number | null;\n}\n\n/**\n * Represents a toast that notifies the user that an error has occurred.\n */\n@autoinject\nexport class ErrorToast\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param toast The `Toast` instance representing the toast.\n\t */\n\tpublic constructor(toast: Toast)\n\t{\n\t\tthis._toast = toast;\n\t}\n\n\tprivate readonly _toast: Toast;\n\tprivate _closeTimeouthandle: any;\n\n\t/**\n\t * The model to for the toast.\n\t */\n\tprotected model: IErrorToastModel;\n\n\t/**\n\t * The error message.\n\t */\n\tprotected errorMessage: string;\n\n\t/**\n\t * The error name\n\t */\n\tprotected errorName: string;\n\n\t/**\n\t * The error stack trace\n\t */\n\tprotected errorStack: string;\n\n\t/**\n\t * Called by the framework when the toast is activated.\n\t * @param model The model to use for the toast.\n\t */\n\tpublic activate(model: IErrorToastModel): void\n\t{\n\t\t// Sets the model for the toast.\n\t\tthis.model = model;\n\n\t\tif (this.model.error instanceof Error)\n\t\t{\n\t\t\t// Get the name of the error.\n\t\t\tthis.errorName = this.model.error.name.trim();\n\n\t\t\t// Get the error message, stripping out the name, if present.\n\t\t\tthis.errorMessage = this.model.error.message.trim();\n\n\t\t\t// Get the error stack, stripping out the name and message, if present.\n\n\t\t\tlet errorStack = this.model.error.stack || this.model.error.toString();\n\n\t\t\tif (errorStack.startsWith(this.errorName))\n\t\t\t{\n\t\t\t\terrorStack = errorStack.substring(this.errorName.length).replace(/^(\\s*[:@]\\s*)/, \"\");\n\t\t\t}\n\n\t\t\tif (errorStack.startsWith(this.errorMessage))\n\t\t\t{\n\t\t\t\terrorStack = errorStack.substring(this.errorMessage.length);\n\t\t\t}\n\n\t\t\tthis.errorStack = errorStack.trim().split(\"\\n\").map(line => ` ${line.trim()}`).join(\"\\n\");\n\t\t}\n\t\telse if (this.model.error != null)\n\t\t{\n\t\t\tthis.errorMessage = this.model.error.toString();\n\t\t}\n\n\t\t// Schedule the toast to close automatically.\n\t\tif (this.model.timeout !== null)\n\t\t{\n\t\t\tthis._closeTimeouthandle = setTimeout(() => this._toast.close(), this.model.timeout ?? settings.app.defaultToastTimeout);\n\t\t}\n\t}\n\n\t/**\n\t * Called when a mousedown event occurs within the toast.\n\t */\n\tprotected cancelScheduledClose(): boolean\n\t{\n\t\t// Prevents the toast from closing automatically.\n\t\tclearTimeout(this._closeTimeouthandle);\n\n\t\treturn true;\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\nimport { AppRouter } from \"aurelia-router\";\nimport { Toast, ToastCloseReason } from \"shared/framework\";\nimport settings from \"resources/settings\";\n\n/**\n * Represents the model for a toast that notifies the user of a success.\n */\nexport interface IInfoToastModel\n{\n\t/**\n\t * The heading text to show.\n\t */\n\theading: string;\n\n\t/**\n\t * The body text to show, or undefined to show no body text.\n\t */\n\tbody: string;\n\n\t/**\n\t * The details to show, or undefined to show no details section.\n\t */\n\tdetails: string;\n\n\t/**\n\t * Name of a custom icon used for the toast\n\t */\n\ticon: string;\n\n\t/**\n\t * The time in milliseconds before the the toast is hidden,\n\t * null to never hide the toast, or undefined to use the default.\n\t */\n\ttimeout?: number | null;\n\n\t/**\n\t * The URL associated with the toast, if any.\n\t */\n\turl?: string;\n}\n\n/**\n * Represents a toast that notifies the user of an event or new info.\n */\n@autoinject\nexport class NeutralToast\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param toast The `Toast` instance representing the toast.\n\t * @param router The `AppRouter` instance\n\t */\n\tpublic constructor(toast: Toast, router: AppRouter)\n\t{\n\t\tthis._toast = toast;\n\t\tthis._router = router;\n\t}\n\n\tprivate readonly _toast: Toast;\n\tprivate readonly _router: AppRouter;\n\tprivate _closeTimeouthandle: any;\n\n\t/**\n\t * The model to for the toast.\n\t */\n\tprotected model: IInfoToastModel;\n\n\t/**\n\t * Called by the framework when the toast is activated.\n\t * @param model The model to use for the toast.\n\t */\n\tpublic activate(model: IInfoToastModel): void\n\t{\n\t\t// Sets the model for the toast.\n\t\tthis.model = model;\n\n\t\t// Schedule the toast to close automatically.\n\t\tif (this.model.timeout !== null)\n\t\t{\n\t\t\tthis._closeTimeouthandle = setTimeout(() => this._toast.close(), this.model.timeout ?? settings.app.defaultToastTimeout);\n\t\t}\n\t}\n\n\t/**\n\t * Called by the framework when the toast is deactivated.\n\t * @param reason The reason for closing the modal.\n\t * @returns True if the user clicked the notification, otherwise false.\n\t */\n\tpublic deactivate(reason?: ToastCloseReason): boolean\n\t{\n\t\tif (reason === \"click\")\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Called when a mousedown event occurs within the toast.\n\t */\n\tprotected cancelScheduledClose(): boolean\n\t{\n\t\t// Prevents the toast from closing automatically.\n\t\tclearTimeout(this._closeTimeouthandle);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Called when a click event occurs within the toast.\n\t * Closes the toast, and navigates to the URL associated with the notification, if specified.\n\t * @param event The mouse event.\n\t */\n\tprotected onClick(event: MouseEvent): void\n\t{\n\t\tif (event.defaultPrevented)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Closes the toast immediately.\n\t\tthis._toast.close(\"click\");\n\n\t\t// Navigate to the URL associated with the notification, if specified.\n\t\tif (this.model.url)\n\t\t{\n\t\t\tthis._router.navigate(this.model.url);\n\t\t}\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"toast[name=neutral].--clickable{cursor:pointer}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/toasts/neutral/neutral.scss\"],\"names\":[],\"mappings\":\"AAEC,gCAEC,cAAA\",\"sourcesContent\":[\"toast[name=\\\"neutral\\\"]\\n{\\n\\t&.--clickable\\n\\t{\\n\\t\\tcursor: pointer;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\nimport { AppRouter } from \"aurelia-router\";\nimport { Toast, ToastCloseReason } from \"shared/framework\";\nimport settings from \"resources/settings\";\n\n/**\n * Represents the model for a toast that notifies the user of a success.\n */\nexport interface IInfoToastModel\n{\n\t/**\n\t * The heading text to show.\n\t */\n\theading: string;\n\n\t/**\n\t * The body text to show, or undefined to show no body text.\n\t */\n\tbody: string;\n\n\t/**\n\t * The details to show, or undefined to show no details section.\n\t */\n\tdetails: string;\n\n\t/**\n\t * The time in milliseconds before the the toast is hidden,\n\t * null to never hide the toast, or undefined to use the default.\n\t */\n\ttimeout?: number | null;\n\n\t/**\n\t * The URL associated with the toast, if any.\n\t */\n\turl?: string;\n}\n\n/**\n * Represents a toast that notifies the user of an event or new info.\n */\n@autoinject\nexport class SuccessToast\n{\n\t/**\n\t * Creates a new instance of the type.\n\t * @param toast The `Toast` instance representing the toast.\n\t * @param router The `AppRouter` instance\n\t */\n\tpublic constructor(toast: Toast, router: AppRouter)\n\t{\n\t\tthis._toast = toast;\n\t\tthis._router = router;\n\t}\n\n\tprivate readonly _toast: Toast;\n\tprivate readonly _router: AppRouter;\n\tprivate _closeTimeouthandle: any;\n\n\t/**\n\t * The model to for the toast.\n\t */\n\tprotected model: IInfoToastModel;\n\n\t/**\n\t * Called by the framework when the toast is activated.\n\t * @param model The model to use for the toast.\n\t */\n\tpublic activate(model: IInfoToastModel): void\n\t{\n\t\t// Sets the model for the toast.\n\t\tthis.model = model;\n\n\t\t// Schedule the toast to close automatically.\n\t\tif (this.model.timeout !== null)\n\t\t{\n\t\t\tthis._closeTimeouthandle = setTimeout(() => this._toast.close(), this.model.timeout ?? settings.app.defaultToastTimeout);\n\t\t}\n\t}\n\n\t/**\n\t * Called by the framework when the toast is deactivated.\n\t * @param reason The reason for closing the modal.\n\t * @returns True if the user clicked the notification, otherwise false.\n\t */\n\tpublic deactivate(reason?: ToastCloseReason): boolean\n\t{\n\t\tif (reason === \"click\")\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Called when a mousedown event occurs within the toast.\n\t */\n\tprotected cancelScheduledClose(): boolean\n\t{\n\t\t// Prevents the toast from closing automatically.\n\t\tclearTimeout(this._closeTimeouthandle);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Called when a click event occurs within the toast.\n\t * Closes the toast, and navigates to the URL associated with the notification, if specified.\n\t * @param event The mouse event.\n\t */\n\tprotected onClick(event: MouseEvent): void\n\t{\n\t\tif (event.defaultPrevented)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Closes the toast immediately.\n\t\tthis._toast.close(\"click\");\n\n\t\t// Navigate to the URL associated with the notification, if specified.\n\t\tif (this.model.url)\n\t\t{\n\t\t\tthis._router.navigate(this.model.url);\n\t\t}\n\t}\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"toast[name=sucess].--clickable{cursor:pointer}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/company-dashboard/toasts/success/success.scss\"],\"names\":[],\"mappings\":\"AAEC,+BAEC,cAAA\",\"sourcesContent\":[\"toast[name=\\\"sucess\\\"]\\n{\\n\\t&.--clickable\\n\\t{\\n\\t\\tcursor: pointer;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Load and apply polyfills.\r\nimport \"inert-polyfill\";\r\n\r\n// Configure and start the app.\r\n\r\nimport { PLATFORM, Aurelia, Container, LogManager } from \"aurelia-framework\";\r\nimport { Settings as LuxonSettings } from \"luxon\";\r\nimport { LogAppender, Cookies, ApiClient, setPrerenderStatusCode } from \"shared/infrastructure\";\r\nimport { LocaleService, Locale, CurrencyService, Currency } from \"shared/localization\";\r\nimport { ThemeService, ITheme } from \"shared/framework\";\r\nimport settings from \"resources/settings\";\r\n\r\n/**\r\n * The entry point of the app, called by the Aurelia bootstrapper.\r\n * @param aurelia The `Aurelia` instance.\r\n */\r\nexport async function configure(aurelia: Aurelia): Promise\r\n{\r\n\tconsole.group(\"Configuration\");\r\n\r\n\t// Configure the log manager.\r\n\tLogManager.addAppender(new LogAppender());\r\n\tLogManager.setLevel(ENVIRONMENT.debug ? LogManager.logLevel.debug : LogManager.logLevel.warn);\r\n\r\n\t// Configure the framework.\r\n\taurelia.use\r\n\t\t.standardConfiguration();\r\n\r\n\taurelia\r\n\t\t.use\r\n\t\t// all packages\r\n\t\t.plugin(PLATFORM.moduleName('@aurelia-mdc-web/all'))\r\n\t\t.plugin(PLATFORM.moduleName(\"aurelia-validation\"));\r\n\r\n\t// Add plugins.\r\n\taurelia.use\r\n\t\t.plugin(PLATFORM.moduleName(\"aurelia-animator-css\"));\r\n\r\n\t// Add features.\r\n\taurelia.use\r\n\t\t.feature(PLATFORM.moduleName(\"shared/infrastructure/index\"))\r\n\t\t.feature(PLATFORM.moduleName(\"shared/localization/index\"))\r\n\t\t.feature(PLATFORM.moduleName(\"shared/framework/index\"));\r\n\r\n\t// Register global resources.\r\n\taurelia.use.globalResources(\r\n\t[\r\n\r\n\t]);\r\n\r\n\t// Add task that will run after all plugins and features have been loaded.\r\n\taurelia.use.postTask(async () =>\r\n\t{\r\n\r\n\t\t// Configure features.\r\n\r\n\t\tconst cookies = aurelia.container.get(Cookies);\r\n\t\tcookies.configure(settings.infrastructure.cookies);\r\n\r\n\t\tconst apiClient = aurelia.container.get(ApiClient);\r\n\t\tapiClient.configure(settings.infrastructure.api);\r\n\r\n\t\tconst localeService = aurelia.container.get(LocaleService);\r\n\t\tlocaleService.configure(settings.app.locales, setLocale);\r\n\t\tawait localeService.setLocale(getLocaleCode());\r\n\r\n\t\tconst currencyService = aurelia.container.get(CurrencyService);\r\n\t\tcurrencyService.configure(settings.app.currencies, setCurrency);\r\n\t\tawait currencyService.setCurrency(getCurrencyCode());\r\n\r\n\t\tconst themeService = aurelia.container.get(ThemeService);\r\n\t\tthemeService.configure(settings.app.themes, setTheme);\r\n\t\tawait themeService.setTheme(getThemeSlug());\r\n\r\n\t\t// Execute network requests concurrently.\r\n\t\tawait Promise.all(\r\n\t\t[\r\n\t\t\tasync () =>\r\n\t\t\t{\r\n\t\t\t\t// Import style resources.\r\n\t\t\t\tawait import(\"resources/styles/index.scss\" as any);\r\n\t\t\t\tawait import(`resources/themes/${themeService.theme.slug}/styles/index.scss`);\r\n\t\t\t},\r\n\t\t\tasync () =>\r\n\t\t\t{\r\n\t\t\t\t// Import icon resources.\r\n\t\t\t\tawait import(\"resources/icons\");\r\n\t\t\t},\r\n\t\t\tasync () =>\r\n\t\t\t{\r\n\t\t\t\t// Attempt to reauthenticate using a token stored on the device.\r\n\t\t\t\tconst identity = await import(`${ENVIRONMENT.srcBasePath}/services/identity`);\r\n\t\t\t\tconst identityService = aurelia.container.get(identity.IdentityService);\r\n\t\t\t\tawait identityService.startSession();\r\n\t\t\t}\r\n\t\t]\r\n\t\t.map(f => f()));\r\n\t});\r\n\r\n\t// Start the framework.\r\n\tawait aurelia.start();\r\n\r\n\tconsole.info(\"Configuration completed\");\r\n\tconsole.groupEnd();\r\n\r\n\t// Set the root component and compose the app.\r\n\tawait aurelia.setRoot(PLATFORM.moduleName(`${ENVIRONMENT.srcBasePath}/app`));\r\n\r\n\t// TODO: The value we set here should depend on whether the page actually rendered successfully.\r\n\t// Set the status code that should be returned to crawlers.\r\n\tsetPrerenderStatusCode(200);\r\n}\r\n\r\n/**\r\n * Gets the locale code stored on the device, or the default.\r\n * @return The locale code to use.\r\n */\r\nfunction getLocaleCode(): string\r\n{\r\n\treturn ENVIRONMENT.locale;\r\n}\r\n\r\n/**\r\n * Called when the locale changes.\r\n * This stores the locale code in a cookie and reloads the app.\r\n * @param newLocale The new locale being set.\r\n * @param oldLocale The old locale, or undefined if not previously set.\r\n * @returns A promise that never resolves, as the page is about to reload.\r\n */\r\nasync function setLocale(newLocale: Locale, oldLocale: Locale): Promise\r\n{\r\n\t// If this is a user-initiated change, set the `locale` cookie and reload the app.\r\n\tif (oldLocale != null)\r\n\t{\r\n\t\tconst cookies = Container.instance.get(Cookies);\r\n\r\n\t\tcookies.set(\"locale\", newLocale.code);\r\n\r\n\t\tlocation.reload();\r\n\r\n\t\t// The app is reloading, so return a promise that will never be resolved.\r\n\t\treturn new Promise(() => undefined);\r\n\t}\r\n\r\n\t// Set the default locale to use for the `luxon` package.\r\n\tLuxonSettings.defaultLocale = newLocale.code;\r\n\r\n\t// Set the `locale` header to use for the `ApiClient`.\r\n\tsettings.infrastructure.api.defaults!.headers![\"x-locale\"] = newLocale.code;\r\n}\r\n\r\n/**\r\n * Gets the code identifying the currency to use, or the default.\r\n * This may be stored on the device or specified using the `currency` query parameter.\r\n * @return The code identifying the currency to use.\r\n */\r\nfunction getCurrencyCode(): string\r\n{\r\n\tconst url = new URL(location.href);\r\n\tconst cookies = Container.instance.get(Cookies);\r\n\r\n\t// Try to get the currency from the URL.\r\n\t// This is intended as an override to be used for testing.\r\n\tlet currencyCode = url.searchParams.get(\"currency\") || undefined;\r\n\r\n\t// Try to get the currency from the cookie.\r\n\t// This should be set by the server based on the domain,\r\n\t// or by the client if the currency is changed by the user.\r\n\tif (!currencyCode)\r\n\t{\r\n\t\tcurrencyCode = cookies.get(\"currency\");\r\n\t}\r\n\r\n\t// If a currency was specified, verify that it exists.\r\n\tif (currencyCode)\r\n\t{\r\n\t\tconst currencyService = Container.instance.get(CurrencyService);\r\n\r\n\t\ttry\r\n\t\t{\r\n\t\t\tcurrencyService.getCurrency(currencyCode);\r\n\t\t}\r\n\t\tcatch\r\n\t\t{\r\n\t\t\tconsole.warn(`The currency '${currencyCode}' is not supported.`);\r\n\t\t\tcurrencyCode = undefined;\r\n\t\t}\r\n\t}\r\n\r\n\t// Return the slug identifying the specified currency, or the default.\r\n\treturn currencyCode || settings.app.defaultCurrencyCode;\r\n}\r\n\r\n/**\r\n * Called when the currency changes.\r\n * This stores the currency code in a cookie.\r\n * @param newCurrency The new currency being set.\r\n * @param oldCurrency The old currency, or undefined if not previously set.\r\n */\r\nfunction setCurrency(newCurrency: Currency, oldCurrency: Currency): void\r\n{\r\n\t// If this is a user-initiated change, set the `currency` cookie.\r\n\tif (oldCurrency != null)\r\n\t{\r\n\t\tconst cookies = Container.instance.get(Cookies);\r\n\r\n\t\tcookies.set(\"currency\", newCurrency.code);\r\n\t}\r\n\r\n\t// Set the `currency` header to use for the `ApiClient`.\r\n\tsettings.infrastructure.api.defaults!.headers![\"x-currency\"] = newCurrency.code;\r\n}\r\n\r\n/**\r\n * Gets the slug identifying the theme to use, or the default.\r\n * This may be stored on the device or specified using the `theme` query parameter.\r\n * @return The slug identigying the theme to use.\r\n */\r\nfunction getThemeSlug(): string\r\n{\r\n\tconst url = new URL(location.href);\r\n\tconst cookies = Container.instance.get(Cookies);\r\n\r\n\t// Try to get the theme from the URL.\r\n\t// This is intended as an override to be used for testing.\r\n\tlet themeSlug = url.searchParams.get(\"theme\") || undefined;\r\n\r\n\t// Try to get the theme from the cookie.\r\n\t// This should be set by the server based on the domain,\r\n\t// or by the client if the theme is changed by the user.\r\n\tif (!themeSlug)\r\n\t{\r\n\t\tthemeSlug = cookies.get(\"theme\");\r\n\t}\r\n\r\n\t// If a theme was specified, verify that it exists.\r\n\tif (themeSlug)\r\n\t{\r\n\t\tconst themeService = Container.instance.get(ThemeService);\r\n\r\n\t\ttry\r\n\t\t{\r\n\t\t\tthemeService.getTheme(themeSlug);\r\n\t\t}\r\n\t\tcatch\r\n\t\t{\r\n\t\t\tconsole.warn(`The theme '${themeSlug}' is not supported.`);\r\n\t\t\tthemeSlug = undefined;\r\n\t\t}\r\n\t}\r\n\r\n\t// Return the slug identifying the specified theme, or the default.\r\n\treturn themeSlug || settings.app.defaultThemeSlug;\r\n}\r\n\r\n/**\r\n * Called when the theme changes.\r\n * If the theme was changed, this stores the theme slug in a cookie and reloads the app.\r\n * @param newTheme The new theme being set.\r\n * @param oldTheme The old theme, or undefined if not previously set.\r\n * @returns A promise that never resolves, as the page is about to reload.\r\n */\r\nasync function setTheme(newTheme: ITheme, oldTheme: ITheme | undefined): Promise\r\n{\r\n\t// If this is a user-initiated change, set the `theme` cookie and reload the app.\r\n\tif (oldTheme != null)\r\n\t{\r\n\t\tconst cookies = Container.instance.get(Cookies);\r\n\r\n\t\tcookies.set(\"theme\", newTheme.slug);\r\n\r\n\t\tlocation.reload();\r\n\r\n\t\t// The app is reloading, so return a promise that will never be resolved.\r\n\t\treturn new Promise(() => undefined);\r\n\t}\r\n}\r\n","import { autoinject, bindable } from \"aurelia-framework\";\r\nimport { IExtendedFocusOptions } from \"shared/framework/services/focus\";\r\n\r\n/**\r\n * Custom attribute that focuses the element to which it is applied.\r\n */\r\n@autoinject\r\nexport class AutofocusCustomAttribute\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element to which this attribute is applied.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tthis._element = element as HTMLElement | SVGElement;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement | SVGElement;\r\n\r\n\t/**\r\n\t * True or an empty string to enable autofocus, otherwise false.\r\n\t * The default is true.\r\n\t */\r\n\t@bindable({ primaryProperty: true, defaultValue: true })\r\n\tpublic enabled: boolean | \"\";\r\n\r\n\t/**\r\n\t * True to make the focus visible, false to make it invisible,\r\n\t * or undefined to keep the current visibility.\r\n\t * The default is undefined.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic visible: boolean | undefined;\r\n\r\n\t/**\r\n\t * The delay before the element is focused, or undefined to focus the element immediately.\r\n\t * The default is undefined.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic delay: number | undefined;\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\t// Delay focusing the element, to prevent conflicts with the `trap-focus` attribute,\r\n\t\t// which if applied will also attempt to focus an element after a timeout.\r\n\t\tsetTimeout(() => setTimeout(() =>\r\n\t\t{\r\n\t\t\tif (this.enabled === true || this.enabled === \"\")\r\n\t\t\t{\r\n\t\t\t\tconst customFocusOptions: IExtendedFocusOptions =\r\n\t\t\t\t{\r\n\t\t\t\t\tfocusVisible: this.visible\r\n\t\t\t\t};\r\n\r\n\t\t\t\tthis._element.focus(customFocusOptions);\r\n\t\t\t}\r\n\r\n\t\t}), this.delay);\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `enabled` property changes.\r\n\t * Focuses the element if the property changed to true.\r\n\t */\r\n\tprotected enabledChanged(): void\r\n\t{\r\n\t\tif (this.enabled === true)\r\n\t\t{\r\n\t\t\tconst customFocusOptions: IExtendedFocusOptions =\r\n\t\t\t{\r\n\t\t\t\tfocusVisible: this.visible\r\n\t\t\t};\r\n\r\n\t\t\tthis._element.focus(customFocusOptions);\r\n\t\t}\r\n\t}\r\n}\r\n","import { autoinject, customAttribute, bindable, bindingMode } from \"aurelia-framework\";\r\nimport { EmptyCustomAttribute } from \"../empty/empty\";\r\n\r\nimport \"./empty-value.scss\";\r\n\r\n/**\r\n * Custom attribute that determines whether the element is empty, and shows a placeholder if it is.\r\n * Note that non-visual elements are ignored, and by default, whitespace is ignored too.\r\n */\r\n@autoinject\r\n@customAttribute(\"empty-value\")\r\nexport class EmptyValueCustomAttribute extends EmptyCustomAttribute\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element to which the attribute is applied.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tsuper(element);\r\n\t}\r\n\r\n\t/**\r\n\t * The name of the attribute.\r\n\t */\r\n\tprotected attributeName = \"empty-value\";\r\n\r\n\t/**\r\n\t * True if the element is empty, otherwise false.\r\n\t */\r\n\t@bindable({ primaryProperty: true, defaultBindingMode: bindingMode.fromView })\r\n\tpublic value: boolean;\r\n\r\n\t/**\r\n\t * True to ignore whitespace, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true, changeHandler: \"onContentChanged\" })\r\n\tpublic ignoreWhitespace: boolean;\r\n}\r\n","import { autoinject, bindable, bindingMode } from \"aurelia-framework\";\r\n\r\n/**\r\n * Custom attribute that determines whether the element is empty.\r\n * Note that non-visual elements are ignored, and by default, whitespace is ignored too.\r\n */\r\n@autoinject\r\nexport class EmptyCustomAttribute\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element to which the attribute is applied.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement;\r\n\tprivate readonly _childListMutationObserver = new MutationObserver(mutations => this.onChildListChanged(mutations));\r\n\tprivate readonly _textNodeMutationObserver = new MutationObserver(mutations => this.onContentChanged());\r\n\r\n\t/**\r\n\t * True if the element is empty, otherwise false.\r\n\t */\r\n\t@bindable({ primaryProperty: true, defaultBindingMode: bindingMode.fromView })\r\n\tpublic value: boolean;\r\n\r\n\t/**\r\n\t * True to ignore whitespace, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true, changeHandler: \"onContentChanged\" })\r\n\tpublic ignoreWhitespace: boolean;\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\tthis._childListMutationObserver.observe(this._element, { childList: true, characterData: true });\r\n\r\n\t\tthis.onContentChanged();\r\n\r\n\t\tthis._element.childNodes.forEach(node =>\r\n\t\t{\r\n\t\t\tif (node.nodeType === 3)\r\n\t\t\t{\r\n\t\t\t\tthis._textNodeMutationObserver.observe(node, { characterData: true });\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is detached.\r\n\t */\r\n\tpublic detached(): void\r\n\t{\r\n\t\tthis._childListMutationObserver.disconnect();\r\n\t\tthis._textNodeMutationObserver.disconnect();\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the text in a child node of the element changes.\r\n\t */\r\n\tprivate onContentChanged(): void\r\n\t{\r\n\t\tconst innerText = this.ignoreWhitespace\r\n\t\t\t? this._element.innerText.trim()\r\n\t\t\t: this._element.innerText;\r\n\r\n\t\tthis.value = !(Array.from(this._element.children).some(e => e.nodeType !== 8) || innerText !== \"\");\r\n\r\n\t\tthis._element.setAttribute(\"empty\", this.value.toString());\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the child list of the element changes.\r\n\t * @param mutations The mutation records.\r\n\t */\r\n\tprivate onChildListChanged(mutations: MutationRecord[]): void\r\n\t{\r\n\t\tthis.onContentChanged();\r\n\r\n\t\tfor (const mutation of mutations)\r\n\t\t{\r\n\t\t\tmutation.removedNodes.forEach(node =>\r\n\t\t\t{\r\n\t\t\t\tif (node.nodeType === 3)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis._textNodeMutationObserver.disconnect();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfor (const mutation of mutations)\r\n\t\t{\r\n\t\t\tmutation.addedNodes.forEach(node =>\r\n\t\t\t{\r\n\t\t\t\tif (node.nodeType === 3)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis._textNodeMutationObserver.observe(node, { characterData: true });\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n}\r\n","import { autoinject, bindable } from \"aurelia-framework\";\r\nimport { tabbable } from \"tabbable\";\r\n\r\n/**\r\n * Custom attribute that forwards focus to the specified element, or to the first\r\n * focusable element, within the element to which this attribute is applied.\r\n */\r\n@autoinject\r\nexport class ForwardFocusCustomAttribute\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element to which this attribute is applied.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement;\r\n\r\n\t/**\r\n\t * True or an empty string to enable focus forwarding, otherwise false.\r\n\t * The default is true.\r\n\t */\r\n\t@bindable({ primaryProperty: true, defaultValue: true })\r\n\tpublic enabled: boolean | \"\";\r\n\r\n\t/**\r\n\t * The element to which focus should be forwarded, or undefined to forward focus to\r\n\t * the first focusable element, within the element to which this attribute is applied.\r\n\t */\r\n\t@bindable\r\n\tpublic target: HTMLElement | SVGElement | undefined;\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\tconst originalFocusFunc = this._element.focus.bind(this._element);\r\n\r\n\t\t// Intercept and forward programmatic focus, if possible.\r\n\t\tthis._element.focus = (options: any) =>\r\n\t\t{\r\n\t\t\tif (this.enabled || this.enabled === \"\")\r\n\t\t\t{\r\n\t\t\t\tconst nextElement = this.target || tabbable(this._element)[0];\r\n\r\n\t\t\t\tif (nextElement)\r\n\t\t\t\t{\r\n\t\t\t\t\tnextElement.focus(options);\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\toriginalFocusFunc(options);\r\n\t\t};\r\n\r\n\t\t// Forward non-programmatic focus, if possible.\r\n\t\tthis._element.addEventListener(\"focus\", (event: FocusEvent) =>\r\n\t\t{\r\n\t\t\tif (this.enabled || this.enabled === \"\")\r\n\t\t\t{\r\n\t\t\t\tconst nextElement = this.target || tabbable(this._element)[0];\r\n\r\n\t\t\t\tif (nextElement)\r\n\t\t\t\t{\r\n\t\t\t\t\tnextElement.focus();\r\n\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n","import { autoinject, bindable } from \"aurelia-framework\";\r\nimport { CssAnimator } from \"aurelia-animator-css\";\r\n\r\n/**\r\n * Custom attribute that detects when the element enters and leaves the viewport,\r\n * and applies class names accordingly. Use this to e.g. animate elements in as they\r\n * enter the viewport.\r\n *\r\n * @example\r\n *\r\n * // Apply the `reveal` animation when the element enters the viewport.\r\n *
...
\r\n */\r\n@autoinject\r\nexport class IntersectionCustomAttribute\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element representing the component.\r\n\t * @param cssAnimator The `CssAnimator` instance.\r\n\t */\r\n\tpublic constructor(element: Element, cssAnimator: CssAnimator)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\t\tthis._cssAnimator = cssAnimator;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement;\r\n\tprivate readonly _cssAnimator: CssAnimator;\r\n\tprivate _IntersectionObserver: IntersectionObserver;\r\n\r\n\t/**\r\n\t * The ancestor element to use as the viewport, or undefined to use the browser viewport.\r\n\t */\r\n\t@bindable\r\n\tpublic root: Element | undefined;\r\n\r\n\t/**\r\n\t * The margin around the root. This accepts values similar to the CSS `margin` property,\r\n\t * e.g. `10px 20px 30px 40px` (top, right, bottom, left). The values must be in `px` or `%`.\r\n\t * This set of values serves to grow or shrink each side of the root element's bounding box\r\n\t * before computing intersections. The default is all zeros.\r\n\t */\r\n\t@bindable\r\n\tpublic rootMargin: string;\r\n\r\n\t/**\r\n\t * The fraction of the element that must enter the viewport, before the intersection to be detected.\r\n\t * The default is 0, meaning that the intersection is detected when the first pixel enters the viewport.\r\n\t */\r\n\t@bindable\r\n\tpublic threshold: number;\r\n\r\n\t/**\r\n\t * Called by the framework when the component is binding.\r\n\t */\r\n\tpublic bind(): void\r\n\t{\r\n\t\tif (this._element.classList.contains(\"au-animate\"))\r\n\t\t{\r\n\t\t\tthis._element.classList.add(\"au-enter\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\tthis.propertyChanged();\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is unbinding.\r\n\t */\r\n\tpublic unbind(): void\r\n\t{\r\n\t\tthis._IntersectionObserver.unobserve(this._element);\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when a property changes.\r\n\t * Creates, or re-creates, the intersection observer.\r\n\t */\r\n\tprotected propertyChanged(): void\r\n\t{\r\n\t\tthis._IntersectionObserver?.unobserve(this._element);\r\n\r\n\t\tconst options =\r\n\t\t{\r\n\t\t\troot: this.root,\r\n\t\t\trootMargin: this.rootMargin?.replace(/(\\d+)(\\s|$)/g, \"$1px$2\"),\r\n\t\t\tthreshold: this.threshold\r\n\t\t};\r\n\r\n\t\tthis._IntersectionObserver = new IntersectionObserver(([entry]) =>\r\n\t\t{\r\n\t\t\tif (entry.isIntersecting)\r\n\t\t\t{\r\n\t\t\t\tthis._element.classList.add(\"intersection-crossed\");\r\n\t\t\t}\r\n\r\n\t\t\tthis._element.classList.toggle(\"intersection-visible\", entry.isIntersecting);\r\n\r\n\t\t\tif (this._element.classList.contains(\"au-animate\"))\r\n\t\t\t{\r\n\t\t\t\tif (entry.isIntersecting)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis._cssAnimator.enter(this._element);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tthis._cssAnimator.leave(this._element);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}, options);\r\n\r\n\t\tthis._IntersectionObserver.observe(this._element);\r\n\t}\r\n}\r\n","import { autoinject, bindable } from \"aurelia-framework\";\r\n\r\n/**\r\n * Custom element that acts as a sentinel for infinite scrolling.\r\n */\r\n@autoinject\r\nexport class ScrollSentinelCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element to which the attribute is applied.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tthis._element = element as HTMLElement | SVGElement;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement | SVGElement;\r\n\tprivate _intersectionObserver: IntersectionObserver;\r\n\tprivate _pendingIntersects = 0;\r\n\r\n\t/**\r\n\t * The function to call when the sentinel is scrolled into view.\r\n\t * Note that if the function returns a promise, the sentinel will\r\n\t * remain in the `pending` state until the promise is settled.\r\n\t */\r\n\t@bindable\r\n\tpublic intersect: (() => any | Promise) | undefined;\r\n\r\n\t/**\r\n\t * True if the `intersect` function returned a promise, and that\r\n\t * promise is not yet settled, otherwise false.\r\n\t */\r\n\t@bindable\r\n\tpublic pending = false;\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\tthis._intersectionObserver = new IntersectionObserver(async entries =>\r\n\t\t{\r\n\t\t\tif (entries[0].intersectionRatio > 0 && this.intersect != null)\r\n\t\t\t{\r\n\t\t\t\ttry\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.pending = true;\r\n\t\t\t\t\tthis._pendingIntersects++;\r\n\r\n\t\t\t\t\tawait this.intersect();\r\n\t\t\t\t}\r\n\t\t\t\tfinally\r\n\t\t\t\t{\r\n\t\t\t\t\tthis._pendingIntersects--;\r\n\r\n\t\t\t\t\tif (this._pendingIntersects === 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis.pending = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis._intersectionObserver.observe(this._element);\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is detached.\r\n\t */\r\n\tpublic detached(): void\r\n\t{\r\n\t\tthis._intersectionObserver.disconnect();\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"scroll-sentinel{display:block}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/behaviors/scroll-sentinel/scroll-sentinel.scss\"],\"names\":[],\"mappings\":\"AAEA,gBAEC,aAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\nscroll-sentinel\\r\\n{\\r\\n\\tdisplay: block;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode } from \"aurelia-framework\";\r\nimport { EventManager } from \"shared/utilities\";\r\n\r\n// Load the CSS associated with this attribute.\r\nimport \"./scroll.scss\";\r\n\r\n/**\r\n * Represents the public interface for a `ScrollCustomAttribute`.\r\n */\r\nexport interface IScroll\r\n{\r\n\t/**\r\n\t * Resets the scroll position.\r\n\t * @param options The scroll options specifying the behavior.\r\n\t */\r\n\treset(options?: ScrollOptions): void;\r\n\r\n\t/**\r\n\t * Resets the scroll position.\r\n\t * @param options The scroll options specifying the offset and behavior.\r\n\t */\r\n\tscrollTo(options: ScrollToOptions): void;\r\n}\r\n\r\n/**\r\n * Custom attribute that makes the element to which it is applied scrollable.\r\n * Also provides support for fading out elements at the top of the scroll area.\r\n */\r\n@autoinject\r\nexport class ScrollCustomAttribute implements IScroll\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element to which the attribute is applied.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tthis._element = element as HTMLElement | SVGElement;\r\n\t\tthis._eventManager = new EventManager(this);\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement | SVGElement;\r\n\tprivate readonly _eventManager: EventManager;\r\n\r\n\t/**\r\n\t * The current scroll position of the element.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.twoWay })\r\n\tpublic position: undefined | ScrollToOptions &\r\n\t{\r\n\t\t/**\r\n\t\t * True if this position was created as a result of a scroll event, false or undefined\r\n\t\t * if the position represents a position to which the element should attempt to scroll.\r\n\t\t */\r\n\t\tinternal?: boolean;\r\n\t};\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\t// TODO: Why is this needed? It shouldn't be...\r\n\t\tthis._element.setAttribute(\"scroll\", \"\");\r\n\r\n\t\tlet fadeTargets: IFadeTarget[] = [];\r\n\t\tlet timeoutHandle: any;\r\n\t\tlet animationFrameHandle: any;\r\n\r\n\t\tthis._eventManager.addEventListener(this._element, \"scroll\", () =>\r\n\t\t{\r\n\t\t\t// Cancel any existing animation frame request.\r\n\t\t\tcancelAnimationFrame(animationFrameHandle);\r\n\r\n\t\t\t// Request an animation frame.\r\n\t\t\tanimationFrameHandle = requestAnimationFrame(() =>\r\n\t\t\t{\r\n\t\t\t\t// Get the scroll position only once, as it triggers layout.\r\n\t\t\t\t// We need to limit this to 0, as the offset may become negative due to scroll bouncing.\r\n\t\t\t\tconst scrollTop = Math.max(this._element.scrollTop, 0);\r\n\t\t\t\tconst scrollLeft = Math.max(this._element.scrollLeft, 0);\r\n\r\n\t\t\t\t// Only handle events that represent actual changes in the scroll position.\r\n\t\t\t\t// This is needed because the class changes may trigger unexpected scroll events.\r\n\t\t\t\tif (this.position == null || scrollTop !== this.position.top || scrollLeft !== this.position.left)\r\n\t\t\t\t{\r\n\t\t\t\t\t// Update the bindable scroll position.\r\n\t\t\t\t\tthis.position =\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// Preserve any existing scroll options.\r\n\t\t\t\t\t\t...this.position,\r\n\r\n\t\t\t\t\t\ttop: scrollTop,\r\n\t\t\t\t\t\tleft: scrollLeft,\r\n\r\n\t\t\t\t\t\tinternal: true\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// Is this the first scroll event in a sequence?\r\n\t\t\t\t\tif (timeoutHandle == null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (fadeTargets == null)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t// Get the fade targets immediately, as we otherwise have nothing to fade.\r\n\t\t\t\t\t\t\tfadeTargets = this.getFadeTargets();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t// Get the fade targets in an animation frame, so we can fade the already known targets immediately.\r\n\t\t\t\t\t\t\trequestAnimationFrame(() =>\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t// Get any elements that should be faded.\r\n\t\t\t\t\t\t\t\tfadeTargets = this.getFadeTargets();\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// Still scrolling, so the end of the sequence should be rescheduled.\r\n\t\t\t\t\t\tclearTimeout(timeoutHandle);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Fade elements relative to the scroll offset.\r\n\t\t\t\t\tfor (const fadeTarget of fadeTargets)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfadeTarget.element.style.opacity =\r\n\t\t\t\t\t\t\tMath.max(0, 1 - (scrollTop / fadeTarget.height) * fadeTarget.fadeFactor).toString();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Schedule the end of the sequernce.\r\n\t\t\t\t\ttimeoutHandle = setTimeout(() => timeoutHandle = undefined, 300);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tif (this.position)\r\n\t\t{\r\n\t\t\t// Scroll to the specified position.\r\n\t\t\tthis._element.scrollTo(this.position);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is detached.\r\n\t */\r\n\tpublic detached(): void\r\n\t{\r\n\t\t// Remove event listeners.\r\n\t\tthis._eventManager.removeEventListeners();\r\n\t}\r\n\r\n\t/**\r\n\t * Resets the scroll position.\r\n\t * @param options The scroll options specifying behavior.\r\n\t */\r\n\tpublic reset(options?: ScrollOptions): void\r\n\t{\r\n\t\tthis._element.scrollTo({ top: 0, left: 0, ...options });\r\n\t}\r\n\r\n\t/**\r\n\t * Scrolls to the specified position.\r\n\t * @param options The scroll options specifying the offset and behavior.\r\n\t */\r\n\tpublic scrollTo(options: ScrollToOptions): void\r\n\t{\r\n\t\tthis._element.scrollTo(options);\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `position` property changes.\r\n\t * Scrolls to the specified position.\r\n\t */\r\n\tprotected positionChanged(): void\r\n\t{\r\n\t\tif (this.position && !this.position.internal)\r\n\t\t{\r\n\t\t\tthis._element.scrollTo(this.position);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the fade targets.\r\n\t */\r\n\tprivate getFadeTargets(): IFadeTarget[]\r\n\t{\r\n\t\treturn Array.from(this._element.querySelectorAll(\"[scroll-fade]\")).map((element: HTMLElement | SVGElement) =>\r\n\t\t({\r\n\t\t\telement,\r\n\t\t\theight: element.getBoundingClientRect().height,\r\n\t\t\tfadeFactor: +(element.getAttribute(\"scroll-fade\") || ScrollCustomAttribute.fadeFactor)\r\n\t\t}));\r\n\t}\r\n\r\n\t/**\r\n\t * The default factor determining how quickly elements with the `scroll-fade`\r\n\t * attribute fade out as they leave the scrollport. This may be overridden by\r\n\t * specifying a value for the `scroll-fade` attribute.\r\n\t */\r\n\tpublic static fadeFactor = 1;\r\n}\r\n\r\n/**\r\n * Represents a reference to an element that should fade during scroll.\r\n */\r\ninterface IFadeTarget\r\n{\r\n\t/**\r\n\t * The element that should be faded.\r\n\t */\r\n\telement: HTMLElement | SVGElement;\r\n\r\n\t/**\r\n\t * The height of the element.\r\n\t */\r\n\theight: number;\r\n\r\n\t/**\r\n\t * The fade factor associated with the element.\r\n\t */\r\n\tfadeFactor: number;\r\n}\r\n","import { Container, autoinject } from \"aurelia-framework\";\r\n\r\n/**\r\n * Custom attribute that specifies the name of the surface to apply to the element.\r\n * At runtime, the name specified for this attribute will be resolved to a path,\r\n * composed of the name of this surface, and the names of any ancestor surfaces.\r\n * This allows nested surfaces to be styled in context of the their ancestors.\r\n */\r\n@autoinject\r\nexport class SurfaceCustomAttribute\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element to which the attribute is applied.\r\n\t * @param container The `Container` instance associated with the component.\r\n\t */\r\n\tpublic constructor(element: Element, container: Container)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\r\n\t\tif (container.parent.hasResolver(SurfaceCustomAttribute, true))\r\n\t\t{\r\n\t\t\tthis.parent = container.parent.get(SurfaceCustomAttribute);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement;\r\n\tprivate readonly _children = new Set();\r\n\r\n\t/**\r\n\t * The parent surface of this surface, or undefined if ths surface has no parent.\r\n\t */\r\n\tprotected readonly parent: SurfaceCustomAttribute | undefined;\r\n\r\n\t/**\r\n\t * The name of the surface to apply.\r\n\t */\r\n\tpublic value: string;\r\n\r\n\t/**\r\n\t * The path identifying this surface in context of its ancestor surfaces.\r\n\t */\r\n\tpublic get path(): string\r\n\t{\r\n\t\t// If a parent was found in the container hierarchy, use its path as the base path.\r\n\t\tif (this.parent != null)\r\n\t\t{\r\n\t\t\treturn `${this.parent.path}/${this.value}`;\r\n\t\t}\r\n\r\n\t\t// If no parent was found in the container hierarchy, walk up the DOM tree looking\r\n\t\t// for any `surface` attributes specified on elements outside the app root element.\r\n\t\t// If one is found, use its attribute value as the base path.\r\n\r\n\t\tlet parentElement = this._element.parentElement;\r\n\r\n\t\twhile (parentElement)\r\n\t\t{\r\n\t\t\tconst parentSurfaceName = parentElement.getAttribute(\"surface\");\r\n\r\n\t\t\tif (parentSurfaceName)\r\n\t\t\t{\r\n\t\t\t\treturn `${parentSurfaceName}/${this.value}`;\r\n\t\t\t}\r\n\r\n\t\t\tparentElement = parentElement.parentElement;\r\n\t\t}\r\n\r\n\t\t// If no parent was found, the path is the name of this surface.\r\n\t\treturn this.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\tif (this.parent != null)\r\n\t\t{\r\n\t\t\tthis.parent.attachChild(this);\r\n\t\t}\r\n\r\n\t\tthis.valueChanged();\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is detached.\r\n\t */\r\n\tpublic detached(): void\r\n\t{\r\n\t\tif (this.parent != null)\r\n\t\t{\r\n\t\t\tthis.parent.detachChild(this);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by a child surface when it is being attached.\r\n\t * Adds the child surface to the collection of child surfaces.\r\n\t */\r\n\tpublic attachChild(child: SurfaceCustomAttribute): void\r\n\t{\r\n\t\tthis._children.add(child);\r\n\t}\r\n\r\n\t/**\r\n\t * Called by a child surface when it is being detached.\r\n\t * Removes the child surface from the collection of child surfaces.\r\n\t */\r\n\tpublic detachChild(child: SurfaceCustomAttribute): void\r\n\t{\r\n\t\tthis._children.delete(child);\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `value` property changes.\r\n\t */\r\n\tprotected valueChanged(): void\r\n\t{\r\n\t\tthis._element.setAttribute(\"surface\", this.path);\r\n\r\n\t\tfor (const child of this._children)\r\n\t\t{\r\n\t\t\tchild.valueChanged();\r\n\t\t}\r\n\t}\r\n}\r\n","import { autoinject, bindable } from \"aurelia-framework\";\r\nimport { FocusTrap, createFocusTrap, Options, FocusTarget } from \"focus-trap\";\r\nimport { EventManager } from \"shared/utilities\";\r\n\r\n/**\r\n * Custom attribute that traps focus within the element to which it is applied.\r\n */\r\n@autoinject\r\nexport class TrapFocusCustomAttribute implements Options\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element to which this attribute is applied.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\t}\r\n\r\n\tprivate readonly _eventManager = new EventManager(this);\r\n\tprivate readonly _element: HTMLElement;\r\n\tprivate _focusTrap: FocusTrap;\r\n\tprivate _active = false;\r\n\r\n\t/**\r\n\t * True or an empty string to enable the focus trap, otherwise false.\r\n\t * The default is true.\r\n\t */\r\n\t@bindable({ primaryProperty: true, defaultValue: true })\r\n\tpublic enabled: boolean | \"\";\r\n\r\n\t/**\r\n\t * A function that will be called when the focus trap activates.\r\n\t */\r\n\t@bindable\r\n\tpublic onActivate: (() => void) | undefined;\r\n\r\n\t/**\r\n\t * A function that will be called when the focus trap deactivates.\r\n\t */\r\n\t@bindable\r\n\tpublic onDeactivate: (() => void) | undefined;\r\n\r\n\t/**\r\n\t * By default, when a focus trap is activated the first element in the\r\n\t * focus traps tab order will receive focus. With this option you can\r\n\t * specify a different element to receive that initial focus.\r\n\t */\r\n\t@bindable\r\n\tpublic initialFocus: FocusTarget | undefined;\r\n\r\n\t/**\r\n\t * By default, an error will be thrown if the focus trap contains no\r\n\t * elements in its tab order. With this option you can specify a\r\n\t * fallback element to programmatically receive focus if no other\r\n\t * tabbable elements are found. For example, you may want a modal\r\n\t * element to receive focus if none of its descendent elements are\r\n\t * tabbable. Make sure the fallback element has a negative `tabindex`\r\n\t * so it can be programmatically focused.\r\n\t */\r\n\t@bindable\r\n\tpublic fallbackFocus: FocusTarget | undefined;\r\n\r\n\t/**\r\n\t * True to, when the trap is disabled, return focus to the element\r\n\t * that had focus before activation, otherwise false. Note that if\r\n\t * disabled due to a click outside, focus remains on the click target.\r\n\t * The default is true.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic returnFocusOnDeactivate: boolean;\r\n\r\n\t/**\r\n\t * True to disable the trap when the user presses the `Escape` key,\r\n\t * false to do nothing.\r\n\t * The default is true.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic escapeDeactivates: boolean;\r\n\r\n\t/**\r\n\t * True to disable the trap when the user clicks outside the element,\r\n\t * and allow the click to be handled as it normally would. False to\r\n\t * intercept and block the click.\r\n\t * The default is true.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic clickOutsideDeactivates: boolean;\r\n\r\n\t/**\r\n\t * Called by the framework when the `enabled` property changes.\r\n\t */\r\n\tpublic enabledChanged(): void\r\n\t{\r\n\t\t// Return if not yet attached.\r\n\t\tif (this._focusTrap == null)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (this.enabled !== false)\r\n\t\t{\r\n\t\t\tthis._focusTrap.activate();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis._focusTrap.deactivate();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\tthis._focusTrap = createFocusTrap(this._element,\r\n\t\t{\r\n\t\t\tonActivate: this.onActivating.bind(this),\r\n\t\t\tonDeactivate: this.onDeactivating.bind(this),\r\n\t\t\tinitialFocus: this.initialFocus,\r\n\t\t\tfallbackFocus: this.fallbackFocus,\r\n\t\t\treturnFocusOnDeactivate: this.returnFocusOnDeactivate,\r\n\t\t\tescapeDeactivates: this.escapeDeactivates,\r\n\t\t\tclickOutsideDeactivates: this.clickOutsideDeactivates\r\n\t\t});\r\n\r\n\t\tif (this.enabled !== false)\r\n\t\t{\r\n\t\t\tthis._focusTrap.activate();\r\n\t\t}\r\n\r\n\t\tthis._eventManager.addEventListener(this._element, \"focusin\", this.onFocusIn.bind(this));\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is detached.\r\n\t */\r\n\tpublic detached(): void\r\n\t{\r\n\t\tthis._eventManager.removeEventListeners();\r\n\r\n\t\tthis._focusTrap.deactivate();\r\n\t}\r\n\r\n\t/**\r\n\t * Handler for the trap activation event.\r\n\t */\r\n\tprivate onActivating(): void\r\n\t{\r\n\t\tthis._active = true;\r\n\r\n\t\tif (this.onActivate != null)\r\n\t\t{\r\n\t\t\tthis.onActivate();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handler for the trap deactivation event.\r\n\t */\r\n\tprivate onDeactivating(): void\r\n\t{\r\n\t\tthis._active = false;\r\n\r\n\t\tif (this.onDeactivate != null)\r\n\t\t{\r\n\t\t\tthis.onDeactivate();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handler for the `focusin` event, which activate the focus trap when when the element,\r\n\t * or one of its decendents, receive focus.\r\n\t */\r\n\tprivate onFocusIn(): void\r\n\t{\r\n\t\tif (!this._active && this.enabled !== false)\r\n\t\t{\r\n\t\t\tthis._focusTrap.activate();\r\n\t\t}\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\n\r\n/**\r\n * Represents the skeleton of a card, which can\r\n * be used as a placeholder while loading.\r\n */\r\n@autoinject\r\nexport class CardSkeletonCustomElement\r\n{\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"card-skeleton{display:block;filter:brightness(99.75%);opacity:var(--card-skeleton-opacity, 1);width:var(--card-width);min-height:var(--card-height);border-radius:var(--border-radius-medium);background-size:200%;background-image:linear-gradient(105deg, var(--surface-color) 9%, var(--surface-transparent-color) 23%, var(--surface-transparent-color) 25%, var(--surface-color) 40%, var(--surface-color) 59%, var(--surface-transparent-color) 73%, var(--surface-transparent-color) 75%, var(--surface-color) 90%);-webkit-animation:card-skeleton ease infinite;animation:card-skeleton ease infinite;-webkit-animation-duration:var(--animation-duration-skeleton);animation-duration:var(--animation-duration-skeleton);-webkit-animation-delay:calc(var(--animation-duration-skeleton) / 3);animation-delay:calc(var(--animation-duration-skeleton) / 3)}@-webkit-keyframes card-skeleton{0%{background-position:0%}60%,100%{background-position:100%}}@keyframes card-skeleton{0%{background-position:0%}60%,100%{background-position:100%}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/cards/card-skeleton/card-skeleton.scss\"],\"names\":[],\"mappings\":\"AAEA,cAEC,aAAA,CAIA,yBAAA,CAGA,uCAAA,CAGA,uBAAA,CACA,6BAAA,CAGA,yCAAA,CAIA,oBAAA,CACA,uSAAA,CAYA,6CAAA,CAAA,qCAAA,CACA,6DAAA,CAAA,qDAAA,CACA,oEAAA,CAAA,4DAAA,CAGD,iCAEC,GAEC,sBAAA,CAGD,SAEC,wBAAA,CAAA,CATF,yBAEC,GAEC,sBAAA,CAGD,SAEC,wBAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ncard-skeleton\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\t// Darken the skeleton slightly, so its perceived\\r\\n\\t// brightness is closer to that of a card.\\r\\n\\tfilter: brightness(99.75%);\\r\\n\\r\\n\\t// Apply the card-skeleton opacity, or use the default.\\r\\n\\topacity: var(--card-skeleton-opacity, 1);\\r\\n\\r\\n\\t// Apply the card size set by the layout.\\r\\n\\twidth: var(--card-width);\\r\\n\\tmin-height: var(--card-height);\\r\\n\\r\\n\\t// Apply border.\\r\\n\\tborder-radius: var(--border-radius-medium);\\r\\n\\r\\n\\t// Apply animated background.\\r\\n\\r\\n\\tbackground-size: 200%;\\r\\n\\tbackground-image: linear-gradient(\\r\\n\\t\\t105deg,\\r\\n\\t\\tvar(--surface-color) 9%,\\r\\n\\t\\tvar(--surface-transparent-color) 23%,\\r\\n\\t\\tvar(--surface-transparent-color) 25%,\\r\\n\\t\\tvar(--surface-color) 40%,\\r\\n\\t\\tvar(--surface-color) 59%,\\r\\n\\t\\tvar(--surface-transparent-color) 73%,\\r\\n\\t\\tvar(--surface-transparent-color) 75%,\\r\\n\\t\\tvar(--surface-color) 90%\\r\\n\\t);\\r\\n\\r\\n\\tanimation: card-skeleton ease infinite;\\r\\n\\tanimation-duration: var(--animation-duration-skeleton);\\r\\n\\tanimation-delay: calc(var(--animation-duration-skeleton) / 3);\\r\\n}\\r\\n\\r\\n@keyframes card-skeleton\\r\\n{\\r\\n\\t0%\\r\\n\\t{\\r\\n\\t\\tbackground-position: 0%;\\r\\n\\t}\\r\\n\\r\\n\\t60%, 100%\\r\\n\\t{\\r\\n\\t\\tbackground-position: 100%;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable } from \"aurelia-framework\";\r\nimport { AccentColor } from \"resources/styles\";\r\n\r\n/**\r\n * Represents a card presenting content, which may be used either\r\n * independently or in a collection layout, such as a grid or list.\r\n */\r\n@autoinject\r\nexport class CardCustomElement\r\n{\r\n\t/**\r\n\t * The URL to navigate to when the card is clicked,\r\n\t * or undefined to do nothing.\r\n\t */\r\n\t@bindable\r\n\tpublic href: string | undefined;\r\n\r\n\t/**\r\n\t * The accent color to use for the edge of the card, an object representing\r\n\t * accent colors mapped to the percentage of the edge for which they should be used,\r\n\t * or undefined to show no edge.\r\n\t */\r\n\t@bindable\r\n\tpublic accent: AccentColor | Partial<{ [color in AccentColor]: number }> | undefined;\r\n\r\n\t/**\r\n\t * The browsing context in which the URL should load.\r\n\t */\r\n\t@bindable({ defaultValue: \"_self\" })\r\n\tpublic target: \"_blank\" | \"_parent\" | \"_self\" | \"_top\";\r\n\r\n\t/**\r\n\t * True if the card is active, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic active: boolean;\r\n\r\n\t/**\r\n\t * True if the card is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"card{display:flex;position:relative;width:var(--card-width, auto);min-height:var(--card-height, auto)}card[accent]{color:inherit}card[accent]:not([accent=none]){padding-left:var(--border-width-thick)}card[accent]:not([accent=none])>a{border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0}card[accent=neutral]>a>.card-edge{background:var(--palette-color-neutral)}card[accent=primary]>a>.card-edge{background:var(--palette-color-primary)}card[accent=info]>a>.card-edge{background:var(--palette-color-info)}card[accent=positive]>a>.card-edge{background:var(--palette-color-positive)}card[accent=attention]>a>.card-edge{background:var(--palette-color-attention)}card[accent=negative]>a>.card-edge{background:var(--palette-color-negative)}card[accent=none]>a>.card-edge{background:transparent}card.--disabled{opacity:var(--opacity-disabled)}card.--active>a{background:var(--surface-color--active);border-color:var(--border-color--active)}card.--non-clickable>a{cursor:default}card:not(.--active):not(.--non-clickable)>a:hover{border-color:var(--border-color--hover);background:var(--surface-color--hover)}card:not(.--active):not(.--non-clickable)>a:focus{border-color:var(--border-color--focus);background:var(--surface-color--focus)}card>a{flex-grow:1;min-width:0;display:flex;flex-direction:column;padding:var(--card-padding);border:var(--border-width-thin) solid;border-radius:var(--border-radius-medium);border-color:var(--border-color);background:var(--surface-color);color:var(--surface-text-color)}card>a>.card-edge{position:absolute;top:0;left:0;bottom:0;width:var(--border-width-thick);border-top-left-radius:var(--border-radius-medium);border-bottom-left-radius:var(--border-radius-medium)}card>a>footer{margin-top:auto}card>a>[slot=actions]{position:absolute;top:12rem;right:12rem;bottom:12rem;pointer-events:none}card>a>[slot=actions] icon{font-size:var(--font-larger-font-size)}card>a>[slot=actions]>*{pointer-events:all;display:block;margin-bottom:8rem;opacity:var(--opacity-faded-more);color:var(--surface-neutral-icon-color)}card>a>[slot=actions]>*:not(:disabled):hover,body.focus-visible card>a>[slot=actions]>*:not(:disabled):focus{opacity:var(--opacity-faded-more);color:var(--surface-icon-color--hover)}card>a>[slot=actions]>*.--active{color:var(--surface-icon-color--active)}card>a>[slot=actions]>*.--active:not(:disabled){opacity:var(--opacity-faded-less)}card.--animate>a{transition:background-color var(--animation-duration-medium),border-color var(--animation-duration-medium),color var(--animation-duration-medium)}card.--animate>a>.card-edge{transition:background-color var(--animation-duration-medium)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/cards/card/card.scss\"],\"names\":[],\"mappings\":\"AAEA,KAGC,YAAA,CAGA,iBAAA,CAGA,6BAAA,CACA,mCAAA,CAEA,aAGC,aAAA,CAEA,gCAEC,sCAAA,CAEA,kCAEC,wBAAA,CACA,2BAAA,CACA,mBAAA,CAQF,kCAGC,uCAAA,CAHD,kCAGC,uCAAA,CAHD,+BAGC,oCAAA,CAHD,mCAGC,wCAAA,CAHD,oCAGC,yCAAA,CAHD,mCAGC,wCAAA,CAKF,+BAGC,sBAAA,CAGD,gBAEC,+BAAA,CAGD,gBAEC,uCAAA,CACA,wCAAA,CAGD,uBAEC,cAAA,CAKA,kDAEC,uCAAA,CACA,sCAAA,CAGD,kDAEC,uCAAA,CACA,sCAAA,CAIF,OAGC,WAAA,CAGA,WAAA,CAGA,YAAA,CACA,qBAAA,CAGA,2BAAA,CAGA,qCAAA,CACA,yCAAA,CAGA,gCAAA,CACA,+BAAA,CACA,+BAAA,CAEA,kBAGC,iBAAA,CACA,KAAA,CACA,MAAA,CACA,QAAA,CAGA,+BAAA,CAGA,kDAAA,CACA,qDAAA,CAGD,cAGC,eAAA,CAGD,sBAGC,iBAAA,CACA,SAAA,CACA,WAAA,CACA,YAAA,CAGA,mBAAA,CAEA,2BAGC,sCAAA,CAGD,wBAGC,kBAAA,CAGA,aAAA,CACA,kBAAA,CAGA,iCAAA,CAGA,uCAAA,CAEA,6GAIC,iCAAA,CAGA,sCAAA,CAGD,iCASC,uCAAA,CAPA,gDAGC,iCAAA,CAWN,iBAGC,iJACC,CAID,4BAGC,4DAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ncard\\r\\n{\\r\\n\\t// Use horizontal flex layout.\\r\\n\\tdisplay: flex;\\r\\n\\r\\n\\t// Allow content to be positioned relative to this element.\\r\\n\\tposition: relative;\\r\\n\\r\\n\\t// Apply the card size set by the layout.\\r\\n\\twidth: var(--card-width, auto);\\r\\n\\tmin-height: var(--card-height, auto);\\r\\n\\r\\n\\t&[accent]\\r\\n\\t{\\r\\n\\t\\t// Ensure the accent only affects the edge, and not the content.\\r\\n\\t\\tcolor: inherit;\\r\\n\\r\\n\\t\\t&:not([accent=\\\"none\\\"])\\r\\n\\t\\t{\\r\\n\\t\\t\\tpadding-left: var(--border-width-thick);\\r\\n\\r\\n\\t\\t\\t> a\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tborder-top-left-radius: 0;\\r\\n\\t\\t\\t\\tborder-bottom-left-radius: 0;\\r\\n\\t\\t\\t\\tborder-left-width: 0;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t// Add accent color support.\\r\\n\\t@each $accent in $accents\\r\\n\\t{\\r\\n\\t\\t&[accent=\\\"#{$accent}\\\"] > a > .card-edge\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply the background color specified by the accent attribute.\\r\\n\\t\\t\\tbackground: var(--palette-color-#{$accent});\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t// Add support for the `none` accent.\\r\\n\\t&[accent=\\\"none\\\"] > a > .card-edge\\r\\n\\t{\\r\\n\\t\\t// Apply transparent background color.\\r\\n\\t\\tbackground: transparent;\\r\\n\\t}\\r\\n\\r\\n\\t&.--disabled\\r\\n\\t{\\r\\n\\t\\topacity: var(--opacity-disabled);\\r\\n\\t}\\r\\n\\r\\n\\t&.--active > a\\r\\n\\t{\\r\\n\\t\\tbackground: var(--surface-color--active);\\r\\n\\t\\tborder-color: var(--border-color--active);\\r\\n\\t}\\r\\n\\r\\n\\t&.--non-clickable > a\\r\\n\\t{\\r\\n\\t\\tcursor: default;\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--active):not(.--non-clickable) > a\\r\\n\\t{\\r\\n\\t\\t&:hover\\r\\n\\t\\t{\\r\\n\\t\\t\\tborder-color: var(--border-color--hover);\\r\\n\\t\\t\\tbackground: var(--surface-color--hover);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&:focus\\r\\n\\t\\t{\\r\\n\\t\\t\\tborder-color: var(--border-color--focus);\\r\\n\\t\\t\\tbackground: var(--surface-color--focus);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t> a\\r\\n\\t{\\r\\n\\t\\t// Fill the available space.\\r\\n\\t\\tflex-grow: 1;\\r\\n\\r\\n\\t\\t// Allow the element to shrink.\\r\\n\\t\\tmin-width: 0;\\r\\n\\r\\n\\t\\t// Use vertical flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\tflex-direction: column;\\r\\n\\r\\n\\t\\t// Apply default card padding.\\r\\n\\t\\tpadding: var(--card-padding);\\r\\n\\r\\n\\t\\t// Apply border.\\r\\n\\t\\tborder: var(--border-width-thin) solid;\\r\\n\\t\\tborder-radius: var(--border-radius-medium);\\r\\n\\r\\n\\t\\t// Apply surface style.\\r\\n\\t\\tborder-color: var(--border-color);\\r\\n\\t\\tbackground: var(--surface-color);\\r\\n\\t\\tcolor: var(--surface-text-color);\\r\\n\\r\\n\\t\\t> .card-edge\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Position along the left edge of the card.\\r\\n\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\ttop: 0;\\r\\n\\t\\t\\tleft: 0;\\r\\n\\t\\t\\tbottom: 0;\\r\\n\\r\\n\\t\\t\\t// Set the width of the edge.\\r\\n\\t\\t\\twidth: var(--border-width-thick);\\r\\n\\r\\n\\t\\t\\t// Set the border radius to match that of the card.\\r\\n\\t\\t\\tborder-top-left-radius: var(--border-radius-medium);\\r\\n\\t\\t\\tborder-bottom-left-radius: var(--border-radius-medium);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> footer\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Push the footer to the bottom by default.\\r\\n\\t\\t\\tmargin-top: auto;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> [slot=\\\"actions\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Position the action container along the right edge of the card.\\r\\n\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\ttop: 12rem;\\r\\n\\t\\t\\tright: 12rem;\\r\\n\\t\\t\\tbottom: 12rem;\\r\\n\\r\\n\\t\\t\\t// Disable pointer events so the container does not block clicks.\\r\\n\\t\\t\\tpointer-events: none;\\r\\n\\r\\n\\t\\t\\ticon\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Set the icon size.\\r\\n\\t\\t\\t\\tfont-size: var(--font-larger-font-size);\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t> *,\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Enable pointer events for each action.\\r\\n\\t\\t\\t\\tpointer-events: all;\\r\\n\\r\\n\\t\\t\\t\\t// Provide vertical layout for items.\\r\\n\\t\\t\\t\\tdisplay: block;\\r\\n\\t\\t\\t\\tmargin-bottom: 8rem;\\r\\n\\r\\n\\t\\t\\t\\t// Fade the items so they are barely visible.\\r\\n\\t\\t\\t\\topacity: var(--opacity-faded-more);\\r\\n\\r\\n\\t\\t\\t\\t// Apply surface style.\\r\\n\\t\\t\\t\\tcolor: var(--surface-neutral-icon-color);\\r\\n\\r\\n\\t\\t\\t\\t&:not(:disabled):hover,\\r\\n\\t\\t\\t\\tbody.focus-visible &:not(:disabled):focus\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\t// Highlight when hovered or focused.\\r\\n\\t\\t\\t\\t\\topacity: var(--opacity-faded-more);\\r\\n\\r\\n\\t\\t\\t\\t\\t// Apply surface style.\\r\\n\\t\\t\\t\\t\\tcolor: var(--surface-icon-color--hover);\\r\\n\\t\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t\\t&.--active\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\t&:not(:disabled)\\r\\n\\t\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\t\\t// Highlight when active.\\r\\n\\t\\t\\t\\t\\t\\topacity: var(--opacity-faded-less);\\r\\n\\t\\t\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t\\t\\t// Apply surface style.\\r\\n\\t\\t\\t\\t\\tcolor: var(--surface-icon-color--active);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\\r\\ncard.--animate > a\\r\\n{\\r\\n\\t// Animate color changes.\\r\\n\\ttransition:\\r\\n\\t\\tbackground-color var(--animation-duration-medium),\\r\\n\\t\\tborder-color var(--animation-duration-medium),\\r\\n\\t\\tcolor var(--animation-duration-medium);\\r\\n\\r\\n\\t> .card-edge\\r\\n\\t{\\r\\n\\t\\t// Animate color changes.\\r\\n\\t\\ttransition: background-color var(--animation-duration-medium);\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode } from \"aurelia-framework\";\r\nimport { Placement } from \"popper.js\";\r\nimport { ItemPickerCustomElement } from \"../../pickers/item-picker/item-picker\";\r\nimport { AccentColor } from \"resources/styles\";\r\n\r\n/**\r\n * Custom element representing an button for picking a single item from a list.\r\n */\r\n@autoinject\r\nexport class SelectButtonCustomElement\r\n{\r\n\t/**\r\n\t * The element representing the button.\r\n\t */\r\n\tprotected buttonElement: HTMLElement;\r\n\r\n\t/**\r\n\t * The view model for the item picker.\r\n\t */\r\n\tprotected itemPicker: ItemPickerCustomElement;\r\n\r\n\t/**\r\n\t * The value of the item that is focused, but not yet picked, or undefined if no item has been focused.\r\n\t */\r\n\t@bindable({ defaultValue: null, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic focusedValue: any | undefined;\r\n\r\n\t/**\r\n\t * True to show the `None` option, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic none: boolean;\r\n\r\n\t/**\r\n\t * True if the dropdown is open, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false, defaultBindingMode: bindingMode.fromView })\r\n\tpublic open: boolean;\r\n\r\n\t/**\r\n\t * True if the button is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * The appearance to use for the button.\r\n\t */\r\n\t@bindable({ defaultValue: \"none\" })\r\n\tpublic appearance: \"none\" | \"text\" | \"outline\" | \"solid\";\r\n\r\n\t/**\r\n\t * The accent color to use for the button, or undefined to use the default.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic accent: AccentColor;\r\n\r\n\t/**\r\n\t * True to use `fixed` positioning for the dropdown, otherwise false.\r\n\t * This may be needed if the dropdown is placed within a container that\r\n\t * hides overflowing content, but note that it has a performance cost.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic fixed: boolean;\r\n\r\n\t/**\r\n\t * The placement of the dropdown, relative to its owner.\r\n\t */\r\n\t@bindable({ defaultValue: \"bottom-start\" })\r\n\tpublic placement: Placement;\r\n\r\n\t/**\r\n\t * Opens the dropdown and optionally focuses the button element.\r\n\t * @param focusButton True to focus the button element, otherwise false.\r\n\t */\r\n\tprotected openDropdown(focusButton: boolean): void\r\n\t{\r\n\t\tthis.open = true;\r\n\r\n\t\tsetTimeout(() => this.itemPicker?.scrollToFocusedValue());\r\n\r\n\t\tif (focusButton)\r\n\t\t{\r\n\t\t\tsetTimeout(() => this.buttonElement.focus());\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Closes the dropdown, clears the filter value and optionally focuses the toggle icon.\r\n\t * Also reverts the focused value if no value was picked.\r\n\t * @param focusToggle True to focus the toggle icon, otherwise false.\r\n\t */\r\n\tprotected closeDropdown(focusToggle: boolean): void\r\n\t{\r\n\t\tthis.open = false;\r\n\t\tthis.focusedValue = null;\r\n\r\n\t\tif (focusToggle)\r\n\t\t{\r\n\t\t\tthis.buttonElement.focus();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the toggle icon is clicked, and if filtering is disabled, when the button element is clicked.\r\n\t * Toggles the dropdown between its open and closed state, focusing either the button element or toggle icon.\r\n\t */\r\n\tprotected toggleDropdown(): void\r\n\t{\r\n\t\tif (this.open)\r\n\t\t{\r\n\t\t\tthis.closeDropdown(true);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.openDropdown(true);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a `mousedown` event occurs on the dropdown.\r\n\t * Prevents default for the event, so it won't cause unwanted effects in ancestor elements.\r\n\t * @returns False to prevent default.\r\n\t */\r\n\tprotected onDropdownMouseDown(): boolean\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"select-button{position:relative;display:block}select-button>button{display:flex}select-button>button dropdown{display:flex;text-align:left}select-button>button item-picker{flex-grow:1}select-button>button dropdown-icon{margin-left:auto}select-button>button [slot=label]{margin-right:var(--size-inline-spacing-large);align-items:center}select-button>button [slot=icon]{display:flex;align-items:center;justify-content:center;line-height:1;font-size:var(--dropdown-icon-size);opacity:var(--opacity-faded)}select-button:not(.--open)>text-input{cursor:pointer}select-button:not(.--open)>text-input>.input-control>.input-control-inner{pointer-events:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/buttons/select-button/select-button.scss\"],\"names\":[],\"mappings\":\"AAAA,cAEC,iBAAA,CACA,aAAA,CAEA,qBAEC,YAAA,CAEA,8BAEC,YAAA,CACA,eAAA,CAGD,iCAEC,WAAA,CAGD,mCAGC,gBAAA,CAGD,kCAGC,6CAAA,CAGA,kBAAA,CAGD,iCAGC,YAAA,CAGA,kBAAA,CACA,sBAAA,CAGA,aAAA,CAGA,mCAAA,CAGA,4BAAA,CAIF,sCAGC,cAAA,CAEA,0EAGC,mBAAA\",\"sourcesContent\":[\"select-button\\r\\n{\\r\\n\\tposition: relative;\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\t> button\\r\\n\\t{\\r\\n\\t\\tdisplay: flex;\\r\\n\\r\\n\\t\\tdropdown\\r\\n\\t\\t{\\r\\n\\t\\t\\tdisplay: flex;\\r\\n\\t\\t\\ttext-align: left;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\titem-picker\\r\\n\\t\\t{\\r\\n\\t\\t\\tflex-grow: 1;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tdropdown-icon\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Push to the right.\\r\\n\\t\\t\\tmargin-left: auto;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t[slot=\\\"label\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply spacing between padding.\\r\\n\\t\\t\\tmargin-right: var(--size-inline-spacing-large);\\r\\n\\r\\n\\t\\t\\t// Center content on the cross axis, if flex layout is applied.\\r\\n\\t\\t\\talign-items: center;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t[slot=\\\"icon\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Use flex layout.\\r\\n\\t\\t\\tdisplay: flex;\\r\\n\\r\\n\\t\\t\\t// Center content.\\r\\n\\t\\t\\talign-items: center;\\r\\n\\t\\t\\tjustify-content: center;\\r\\n\\r\\n\\t\\t\\t// Set line height to ensure correct vertical alignment.\\r\\n\\t\\t\\tline-height: 1;\\r\\n\\r\\n\\t\\t\\t// Set the size of the icon, in proportion to the text.\\r\\n\\t\\t\\tfont-size: var(--dropdown-icon-size);\\r\\n\\r\\n\\t\\t\\t// Apply opacity to de-emphasize the icon.\\r\\n\\t\\t\\topacity: var(--opacity-faded);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--open) > text-input\\r\\n\\t{\\r\\n\\t\\t// Use cursor to indicate the element is clickable, when not accepting text input.\\r\\n\\t\\tcursor: pointer;\\r\\n\\r\\n\\t\\t> .input-control > .input-control-inner\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Disable pointer events to prevent unwanted text selection on double click.\\r\\n\\t\\t\\tpointer-events: none;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable } from \"aurelia-framework\";\r\nimport Popper, { Placement } from \"popper.js\";\r\nimport { EventManager } from \"shared/utilities\";\r\n\r\n/**\r\n * Custom element representing a dropdown, typically attached to a button or input.\r\n */\r\n@autoinject\r\nexport class DropdownCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element representing the component.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement;\r\n\tprivate readonly _eventManager = new EventManager(this);\r\n\tprivate _mutationObserver: MutationObserver;\r\n\tprivate _popper: Popper | undefined;\r\n\tprivate _attached = false;\r\n\tprivate _visible: boolean;\r\n\r\n\t/**\r\n\t * The element that owns the dropdown.\r\n\t * This is typically the input or button to which the dropdown is attached.\r\n\t * If not specified, this will be the parent element of the dropdown.\r\n\t */\r\n\t@bindable({ changeHandler: \"createPopper\" })\r\n\tpublic owner: HTMLElement | SVGElement;\r\n\r\n\t/**\r\n\t * True to use `fixed` positioning, otherwise false.\r\n\t * This may be needed if the dropdown is placed within a container that\r\n\t * hides overflowing content, but note that it has a performance cost.\r\n\t */\r\n\t@bindable({ changeHandler: \"createPopper\", defaultValue: false })\r\n\tpublic fixed: boolean;\r\n\r\n\t/**\r\n\t * The placement of the dropdown, relative to its owner.\r\n\t */\r\n\t@bindable({ changeHandler: \"createPopper\", defaultValue: \"bottom-start\" })\r\n\tpublic placement: Placement;\r\n\r\n\t/**\r\n\t * The function to call when the dropdown wants to close.\r\n\t */\r\n\t@bindable\r\n\tpublic close: (params:\r\n\t{\r\n\t\t// True if closing because the `Escape` key was pressed, otherwise false.\r\n\t\tescape: boolean;\r\n\r\n\t\t// True if closing because focus is no longer within the dropdown or its owner, otherwise false.\r\n\t\tfocusout: boolean;\r\n\r\n\t}) => void;\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\t// If no owner element is set, use the parent element.\r\n\t\tif (this.owner == null)\r\n\t\t{\r\n\t\t\tthis.owner = this._element.parentElement!;\r\n\t\t}\r\n\r\n\t\t// Listen for mutations within the dropdown or its owner, that might affect the visibility, size or position of the dropdown.\r\n\t\tthis._mutationObserver = new MutationObserver(() => this.updateVisibilityAndPosition());\r\n\t\tthis._mutationObserver.observe(this._element, { attributes: true, attributeFilter: [\"class\"], childList: true, subtree: true, characterData: true });\r\n\t\tthis._mutationObserver.observe(this.owner, { attributes: true, attributeFilter: [\"class\"], childList: true, subtree: true, characterData: true });\r\n\r\n\t\t// Indicate that the component is attached.\r\n\t\tthis._attached = true;\r\n\r\n\t\t// Create the `Popper`instance.\r\n\t\tthis.createPopper();\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t */\r\n\tpublic detached(): void\r\n\t{\r\n\t\t// Dispose event listeners.\r\n\t\tthis._eventManager.removeEventListeners();\r\n\r\n\t\t// Dispose mutation observers.\r\n\t\tthis._mutationObserver.disconnect();\r\n\r\n\t\t// Dispose the `Popper` instance.\r\n\t\tif (this._popper)\r\n\t\t{\r\n\t\t\tthis._popper.destroy();\r\n\t\t\tthis._popper = undefined;\r\n\t\t}\r\n\r\n\t\t// Reset the state.\r\n\t\tthis._visible = false;\r\n\t\tthis._attached = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the component is attached, and when the `owner` or `fixed` properties change\r\n\t * Creates a new `Popper` instance, then updates visibility and position.\r\n\t */\r\n\tprotected createPopper(): void\r\n\t{\r\n\t\t// Don't do anything while binding.\r\n\t\tif (!this._attached)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Dispose the `Popper` instance for the previous owner, if any.\r\n\t\tif (this._popper != null)\r\n\t\t{\r\n\t\t\tthis._popper.destroy();\r\n\t\t}\r\n\r\n\t\t// Create the `Popper` instance for the new owner.\r\n\t\tthis._popper = new Popper(this.owner, this._element,\r\n\t\t{\r\n\t\t\teventsEnabled: false,\r\n\t\t\tplacement: this.placement,\r\n\t\t\tpositionFixed: this.fixed,\r\n\t\t\tmodifiers:\r\n\t\t\t{\r\n\t\t\t\tpreventOverflow:\r\n\t\t\t\t{\r\n\t\t\t\t\tescapeWithReference: true\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Set the `placement` attribute so it can be used for styling.\r\n\t\tthis._element.setAttribute(\"placement\", this.placement);\r\n\r\n\t\t// Update the visibility and position.\r\n\t\tthis.updateVisibilityAndPosition();\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a new `Popper` instance is created, and when the class list of the element changes.\r\n\t * Determines whether the dropdown is visible, and if it is, updates its position.\r\n\t */\r\n\tprotected updateVisibilityAndPosition(): void\r\n\t{\r\n\t\t// Determine visibility based on the computed style of the element.\r\n\r\n\t\tconst style = getComputedStyle(this._element);\r\n\r\n\t\tthis._visible =\r\n\t\t\t(!style.visibility || style.visibility === \"visible\") &&\r\n\t\t\t(!style.display || style.display !== \"none\") &&\r\n\t\t\t(!style.opacity || style.opacity !== \"0\");\r\n\r\n\t\tif (this._visible)\r\n\t\t{\r\n\t\t\t// Update the position of the `Popper` instance.\r\n\t\t\tthis._popper!.update();\r\n\r\n\t\t\t// Enable event listeners on the `Popper` instance.\r\n\t\t\tthis._popper!.enableEventListeners();\r\n\r\n\t\t\t// Listen for interaction events, that might indicate that the dropdown should close.\r\n\t\t\tthis._eventManager.addEventListener(this.owner, \"keydown\", event => this.onKeyDownAnywhere(event as KeyboardEvent));\r\n\t\t\tthis._eventManager.addEventListener(document.documentElement, \"focusin\", event => this.onInteractionAnywhere(event), { capture: true });\r\n\t\t\tthis._eventManager.addEventListener(document.documentElement, \"mousedown\", event => this.onInteractionAnywhere(event), { capture: true });\r\n\t\t\tthis._eventManager.addEventListener(document.documentElement, \"touchstart\", event => this.onInteractionAnywhere(event), { capture: true });\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t// Disable event listeners on the `Popper` instance.\r\n\t\t\tthis._popper!.disableEventListeners();\r\n\r\n\t\t\t// Stop listening for interaction events\r\n\t\t\tthis._eventManager.removeEventListeners();\r\n\t\t}\r\n\r\n\t\t// If using fixed positioning, set min-width to match the owner.\r\n\r\n\t\tif (this.fixed)\r\n\t\t{\r\n\t\t\tconst ownerStyle = getComputedStyle(this.owner);\r\n\t\t\tthis._element.style.minWidth = ownerStyle.width;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis._element.style.minWidth = \"\";\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed anywhere on the page.\r\n\t * Closes the dropdown if the `Escape` key is pressed.\r\n\t * @param event The keyboard event.\r\n\t */\r\n\tprivate onKeyDownAnywhere(event: KeyboardEvent): void\r\n\t{\r\n\t\tif (this._visible && !event.defaultPrevented && event.key === \"Escape\")\r\n\t\t{\r\n\t\t\tevent.preventDefault();\r\n\t\t\tthis.close({ escape: true, focusout: false });\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the user clicks or touches anywhere on the page.\r\n\t * Closes the dropdown if the event did not originate from the dropdown or its owner.\r\n\t * @param event The interaction event.\r\n\t */\r\n\tprivate onInteractionAnywhere(event: Event): void\r\n\t{\r\n\t\tconst target = event.target as HTMLElement | SVGElement;\r\n\r\n\t\tif (this._visible && !this._element.contains(target) && !this.owner.contains(target))\r\n\t\t{\r\n\t\t\tthis.close({ escape: false, focusout: event.type === \"focusin\" });\r\n\t\t}\r\n\t}\r\n}\r\n","import { autoinject, bindable } from \"aurelia-framework\";\r\n\r\n/**\r\n * Custom element representing the toggle icon for a dropdown,\r\n * intended to be placed within a button or input.\r\n */\r\n@autoinject\r\nexport class DropdownIconCustomElement\r\n{\r\n\t/**\r\n\t * The function to call when the icon is toggled.\r\n\t */\r\n\t@bindable\r\n\tpublic toggle: () => void;\r\n\r\n\t/**\r\n\t * True if the dropdown is open, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic open: boolean;\r\n\r\n\t/**\r\n\t * Called when a key is pressed within the component.\r\n\t * Toggles if the `Enter` key is pressed.\r\n\t * @param event The keyboard event.\r\n\t * @returns True to continue, false to prevent default.\r\n\t */\r\n\tprotected onKeyDown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\tif (event.defaultPrevented)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (event.key === \"Enter\" && !(event.altKey || event.metaKey || event.shiftKey || event.ctrlKey))\r\n\t\t{\r\n\t\t\tif (this.toggle != null)\r\n\t\t\t{\r\n\t\t\t\tthis.toggle();\r\n\t\t\t}\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a mousedown event occurs on the icon.\r\n\t * Calls the `toggle` method to indicate that the dropdown shoulds open or close.\r\n\t */\r\n\tprotected onMouseDown(): void\r\n\t{\r\n\t\tif (this.toggle != null)\r\n\t\t{\r\n\t\t\tthis.toggle();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a click event occurs on the icon.\r\n\t * Does nothing, but is needed to prevent default on the event.\r\n\t */\r\n\tprotected onClick(): void\r\n\t{\r\n\t\t// Do nothing.\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--dropdown-icon-size: 1.286em}dropdown-icon{display:flex;align-items:center;justify-content:center;line-height:1;font-size:var(--dropdown-icon-size);opacity:var(--opacity-faded);cursor:pointer}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/dropdown/dropdown-icon.scss\"],\"names\":[],\"mappings\":\"AAAA,MAGC,6BAAA,CAGD,cAGC,YAAA,CAGA,kBAAA,CACA,sBAAA,CAGA,aAAA,CAGA,mCAAA,CAGA,4BAAA,CAGA,cAAA\",\"sourcesContent\":[\":root\\r\\n{\\r\\n\\t// The size of the dropdown icon.\\r\\n\\t--dropdown-icon-size: 1.286em;\\r\\n}\\r\\n\\r\\ndropdown-icon\\r\\n{\\r\\n\\t// Use flex layout.\\r\\n\\tdisplay: flex;\\r\\n\\r\\n\\t// Center content.\\r\\n\\talign-items: center;\\r\\n\\tjustify-content: center;\\r\\n\\r\\n\\t// Set line height to ensure correct vertical alignment.\\r\\n\\tline-height: 1;\\r\\n\\r\\n\\t// Set the size of the icon, in proportion to the text.\\r\\n\\tfont-size: var(--dropdown-icon-size);\\r\\n\\r\\n\\t// Apply opacity to de-emphasize the icon.\\r\\n\\topacity: var(--opacity-faded);\\r\\n\\r\\n\\t// Use cursor to indicate the element is clickable.\\r\\n\\tcursor: pointer;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--dropdown-min-width: 100%;--dropdown-max-width: none;--dropdown-min-height: 0;--dropdown-max-height: 300rem;--dropdown-border-width: var(--border-width-thin);--dropdown-border-radius: var(--border-radius-large)}dropdown{--dropdown-border-color: var(--surface-dropdown-border-color);--dropdown-surface-color: var(--surface-dropdown-surface-color);--dropdown-surface-text-color: var(--surface-dropdown-surface-text-color)}dropdown{display:block;overflow:hidden;z-index:var(--z-index-dropdown);margin-top:4rem;margin-bottom:4rem;min-width:var(--dropdown-min-width);max-width:var(--dropdown-max-width);min-height:var(--dropdown-min-height);max-height:var(--dropdown-max-height);border:var(--dropdown-border-width) solid var(--dropdown-border-color);border-radius:var(--dropdown-border-radius);background:var(--dropdown-surface-color);color:var(--dropdown-surface-text-color)}dropdown[placement*=bottom]{box-shadow:var(--shadow-dropdown-below)}dropdown[placement*=top]{box-shadow:var(--shadow-dropdown-above)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/dropdown/dropdown.scss\"],\"names\":[],\"mappings\":\"AAAA,MAOC,0BAAA,CAIA,0BAAA,CAIA,wBAAA,CAIA,6BAAA,CAGA,iDAAA,CAGA,oDAAA,CAGD,SAIC,6DAAA,CAIA,+DAAA,CAIA,yEAAA,CAGD,SAEC,aAAA,CAGA,eAAA,CAGA,+BAAA,CAGA,eAAA,CACA,kBAAA,CAGA,mCAAA,CACA,mCAAA,CACA,qCAAA,CACA,qCAAA,CAGA,sEAAA,CACA,2CAAA,CACA,wCAAA,CACA,wCAAA,CAEA,4BAEC,uCAAA,CAGD,yBAEC,uCAAA\",\"sourcesContent\":[\":root\\r\\n{\\r\\n\\t// TODO: Should we also have a property for shadow?\\r\\n\\r\\n\\t/// The min-width of the component.\\r\\n\\t/// The default ensures it grows to the width of its container, which is usually an input control.\\r\\n\\t/// Note that if fixed positioning is enabled, this must be changed to a reasonable value.\\r\\n\\t--dropdown-min-width: 100%;\\r\\n\\r\\n\\t/// The max-width of the component.\\r\\n\\t/// The default allows it to grow to fit any content.\\r\\n\\t--dropdown-max-width: none;\\r\\n\\r\\n\\t/// The min-height of the component.\\r\\n\\t/// The default allows it to shrink to fit any content.\\r\\n\\t--dropdown-min-height: 0;\\r\\n\\r\\n\\t/// The max-height of the component.\\r\\n\\t/// The default allows it to grow, up to a reasonable limit.\\r\\n\\t--dropdown-max-height: 300rem;\\r\\n\\r\\n\\t/// The width of the border of the component.\\r\\n\\t--dropdown-border-width: var(--border-width-thin);\\r\\n\\r\\n\\t/// The radius of the border of the component.\\r\\n\\t--dropdown-border-radius: var(--border-radius-large);\\r\\n}\\r\\n\\r\\ndropdown\\r\\n{\\r\\n\\t/// The color of the border of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--dropdown-border-color: var(--surface-dropdown-border-color);\\r\\n\\r\\n\\t/// The color of the surface of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--dropdown-surface-color: var(--surface-dropdown-surface-color);\\r\\n\\r\\n\\t/// The color of the text on the surface of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--dropdown-surface-text-color: var(--surface-dropdown-surface-text-color);\\r\\n}\\r\\n\\r\\ndropdown\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\t// Hide overflow by default.\\r\\n\\toverflow: hidden;\\r\\n\\r\\n\\t// Apply the z-index for dropdowns.\\r\\n\\tz-index: var(--z-index-dropdown);\\r\\n\\r\\n\\t// Add offset above and below the dropdown.\\r\\n\\tmargin-top: 4rem;\\r\\n\\tmargin-bottom: 4rem;\\r\\n\\r\\n\\t// Apply size constraints.\\r\\n\\tmin-width: var(--dropdown-min-width);\\r\\n\\tmax-width: var(--dropdown-max-width);\\r\\n\\tmin-height: var(--dropdown-min-height);\\r\\n\\tmax-height: var(--dropdown-max-height);\\r\\n\\r\\n\\t// Style to appear as a dropdown.\\r\\n\\tborder: var(--dropdown-border-width) solid var(--dropdown-border-color);\\r\\n\\tborder-radius: var(--dropdown-border-radius);\\r\\n\\tbackground: var(--dropdown-surface-color);\\r\\n\\tcolor: var(--dropdown-surface-text-color);\\r\\n\\r\\n\\t&[placement*=\\\"bottom\\\"]\\r\\n\\t{\\r\\n\\t\\tbox-shadow: var(--shadow-dropdown-below);\\r\\n\\t}\\r\\n\\r\\n\\t&[placement*=\\\"top\\\"]\\r\\n\\t{\\r\\n\\t\\tbox-shadow: var(--shadow-dropdown-above);\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode } from \"aurelia-framework\";\r\nimport { Id } from \"shared/utilities\";\r\n\r\n/**\r\n * Custom element representing a color input.\r\n */\r\n@autoinject\r\nexport class ColorInputCustomElement\r\n{\r\n\t/**\r\n\t * The unique ID of the control.\r\n\t */\r\n\tprotected id = Id.sequential();\r\n\r\n\t/**\r\n\t * The value of the input, or undefined if the input is empty.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: number | undefined;\r\n\r\n\t/**\r\n\t * True if the input is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the input is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"color-input>.input-control{border-width:0 !important;background:none !important}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/inputs/color-input/color-input.scss\"],\"names\":[],\"mappings\":\"AAEC,2BAEC,yBAAA,CACA,0BAAA\",\"sourcesContent\":[\"color-input\\r\\n{\\r\\n\\t> .input-control\\r\\n\\t{\\r\\n\\t\\tborder-width: 0 !important;\\r\\n\\t\\tbackground: none !important;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\r\nimport { LabelPosition } from \"../../control\";\r\nimport { AutocompleteHint } from \"../input\";\r\nimport { DateTime, Zone } from \"luxon\";\r\nimport { DateFormat } from \"shared/localization\";\r\nimport { Placement } from \"popper.js\";\r\n\r\n/**\r\n * Custom element representing an input for picking a date.\r\n */\r\n@autoinject\r\nexport class DateInputCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element representing the component.\r\n\t * @param dateFormat The `DateFormat` instance.\r\n\t */\r\n\tpublic constructor(element: Element, dateFormat: DateFormat)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\t\tthis.dateFormat = dateFormat;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement;\r\n\r\n\t/**\r\n\t * The date format for the current locale.\r\n\t */\r\n\tprotected dateFormat: DateFormat;\r\n\r\n\t/**\r\n\t * The element representing the text input.\r\n\t */\r\n\tprotected inputElement: HTMLElement;\r\n\r\n\t/**\r\n\t * The element representing the toggle icon.\r\n\t */\r\n\tprotected toggleElement: HTMLElement;\r\n\r\n\t/**\r\n\t * True if the entered value is valid, otherwise false.\r\n\t */\r\n\tprotected isValid = true;\r\n\r\n\t/**\r\n\t * The value entered by the user, or undefined.\r\n\t */\r\n\tprotected enteredValue: string | undefined;\r\n\r\n\t/**\r\n\t * The placement of the dropdown, relative to its owner.\r\n\t */\r\n\t@bindable({ defaultValue: \"bottom-start\" })\r\n\tpublic placement: Placement;\r\n\r\n\t/**\r\n\t * Gets the input value.\r\n\t */\r\n\t@computedFrom(\"open\", \"enteredValue\", \"focusedValue\", \"value\")\r\n\tprotected get inputValue(): string\r\n\t{\r\n\t\t// If the user entered a value, return that.\r\n\t\tif (this.enteredValue != null)\r\n\t\t{\r\n\t\t\treturn this.enteredValue;\r\n\t\t}\r\n\r\n\t\tif (this.open)\r\n\t\t{\r\n\t\t\t// If open with a focused value, format and return that.\r\n\t\t\tif (this.focusedValue != null)\r\n\t\t\t{\r\n\t\t\t\treturn this.focusedValue.toFormat(this.dateFormat.inputFormat);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t// If closed with a comitted value, format and return that.\r\n\t\t\tif (this.value != null)\r\n\t\t\t{\r\n\t\t\t\treturn this.value.toFormat(this.dateFormat.inputFormat);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// The input is empty.\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the input value.\r\n\t */\r\n\tprotected set inputValue(value: string)\r\n\t{\r\n\t\t// Store the value entered by the user.\r\n\t\tthis.enteredValue = value;\r\n\r\n\t\tif (value)\r\n\t\t{\r\n\t\t\t// Try to parse the value.\r\n\t\t\tlet date = DateTime.fromFormat(value, this.dateFormat.inputFormat);\r\n\r\n\t\t\t// If enabled, preserve the time of the current value.\r\n\t\t\tif (this.preserveTime && value != null && this.focusedValue != null)\r\n\t\t\t{\r\n\t\t\t\tdate = date.plus(this.focusedValue.diff(this.focusedValue.startOf(\"day\")));\r\n\t\t\t}\r\n\r\n\t\t\t// Update the focused value.\r\n\t\t\tthis.focusedValue = date.isValid ? date : null;\r\n\r\n\t\t\t// Update the validity.\r\n\t\t\tthis.isValid = date.isValid;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t// The input is empty, so reset the focused value and validity.\r\n\t\t\tthis.focusedValue = undefined;\r\n\t\t\tthis.isValid = true;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * The position of the label, or undefined to show no label.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic label: LabelPosition | undefined;\r\n\r\n\t/**\r\n\t * The IANA Time Zone Identifier to use, `local` to use the local zone, or `utc` to use the UTC zone.\r\n\t */\r\n\t@bindable({ defaultValue: \"local\" })\r\n\tpublic zone: string | Zone;\r\n\r\n\t/**\r\n\t * The date picked by the user, null if the entered value could not be parsed,\r\n\t * or undefined if no date has been entered or picked.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: DateTime | null | undefined;\r\n\r\n\t/**\r\n\t * The date that is focused, but not yet picked, null if the entered value\r\n\t * could not be parsed, or undefined if no date has been entered or focused.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic focusedValue: DateTime | null | undefined;\r\n\r\n\t/**\r\n\t * The earliest date that can be selected, or undefined to disable this constraint.\r\n\t * This may be a `DateTime` instance, an ISO 8601 string, or the string `today`.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic min: DateTime | string | \"today\" | undefined;\r\n\r\n\t/**\r\n\t * The latest date that can be selected, or undefined to disable this constraint.\r\n\t * This may be a `DateTime` instance, an ISO 8601 string, or the string `today`.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic max: DateTime | string | \"today\" | undefined;\r\n\r\n\t/**\r\n\t * True to preserve the time of the current value when selecting a date,\r\n\t * false to always selecting the start of the day.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic preserveTime: boolean | undefined;\r\n\r\n\t/**\r\n\t * True if the dropdown is open, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false, defaultBindingMode: bindingMode.fromView })\r\n\tpublic open: boolean;\r\n\r\n\t/**\r\n\t * True if the input is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the input is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n\r\n\t/**\r\n\t * The autocomplete mode to use,\r\n\t * or undefined to use the default behavior.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic autocomplete: AutocompleteHint;\r\n\r\n\t/**\r\n\t * True to select the contents when the input is focused, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic autoselect: boolean;\r\n\r\n\t/**\r\n\t * True to use `fixed` positioning for the dropdown, otherwise false.\r\n\t * This may be needed if the dropdown is placed within a container that\r\n\t * hides overflowing content, but note that it has a performance cost.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic fixed: boolean;\r\n\r\n\t/**\r\n\t * Opens the dropdown and optionally focuses the input element.\r\n\t * @param focusInput True to focus the input element, otherwise false.\r\n\t */\r\n\tprotected openDropdown(focusInput: boolean): void\r\n\t{\r\n\t\tthis.open = true;\r\n\t\tthis.focusedValue = this.isValid ? this.value : null;\r\n\r\n\t\tif (focusInput)\r\n\t\t{\r\n\t\t\tsetTimeout(() => this.inputElement.focus());\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Closes the dropdown and optionally focuses the toggle icon.\r\n\t * Also either sets the focused value as the picked value, or reverts it.\r\n\t * @param focusToggle True to focus the toggle icon, otherwise false.\r\n\t * @param pick True if the user picked a value, otherwise false.\r\n\t */\r\n\tprotected closeDropdown(focusToggle: boolean, pick = false): void\r\n\t{\r\n\t\tthis.open = false;\r\n\r\n\t\tif (pick)\r\n\t\t{\r\n\t\t\tconst value = this.isValid ? this.focusedValue : null;\r\n\r\n\t\t\tif (value !== this.value)\r\n\t\t\t{\r\n\t\t\t\tthis.value = value;\r\n\r\n\t\t\t\t// Dispatch the `input` event to indicate that the comitted value, has changed.\r\n\t\t\t\tthis._element.dispatchEvent(new CustomEvent(\"input\", { bubbles: true, detail: { value: this.value } }));\r\n\r\n\t\t\t\t// Dispatch the `change` event to indicate that the comitted value, has changed.\r\n\t\t\t\tthis._element.dispatchEvent(new CustomEvent(\"change\", { bubbles: true, detail: { value: this.value } }));\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.focusedValue = this.isValid ? this.value : null;\r\n\t\t\tthis.enteredValue = undefined;\r\n\t\t\tthis.isValid = true;\r\n\t\t}\r\n\r\n\t\tif (focusToggle)\r\n\t\t{\r\n\t\t\tthis.toggleElement.focus();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the toggle icon is clicked, and when the input element is clicked.\r\n\t * Toggles the dropdown between its open and closed state, focusing either the input element or toggle icon.\r\n\t */\r\n\tprotected toggleDropdown(): void\r\n\t{\r\n\t\tif (this.open)\r\n\t\t{\r\n\t\t\tthis.closeDropdown(true, true);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.openDropdown(true);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input element is clicked.\r\n\t * Opens the dropdown and focuses the input element.\r\n\t * @param event The mouse event.\r\n\t * @returns True to continue.\r\n\t */\r\n\tprotected onInputMouseDown(event: MouseEvent): boolean\r\n\t{\r\n\t\tif (!event.defaultPrevented && !this.open)\r\n\t\t{\r\n\t\t\tthis.openDropdown(true);\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed within the input element.\r\n\t * Prevents the user from entering some invalid values.\r\n\t * @param event The keyboard event.\r\n\t * @returns True to continue, false to prevent default.\r\n\t */\r\n\tprotected onInputKeyDown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\tif (event.defaultPrevented)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (!this.isValid && !(event.altKey || event.metaKey || event.shiftKey || event.ctrlKey))\r\n\t\t{\r\n\t\t\tswitch (event.key)\r\n\t\t\t{\r\n\t\t\t\tcase \"Enter\":\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Never block special keys or key combinations.\r\n\t\tif (!event.key || event.key.length > 1 || event.metaKey || event.ctrlKey)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// Prevent the user from entering characters that are not part of the pattern.\r\n\t\tif (!this.dateFormat.keyPattern.test(event.key))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input, or an element within the input, receives focus.\r\n\t * Opens the dropdown if the focused element is not the toggle icon.\r\n\t * @param event The focus event.\r\n\t */\r\n\tprotected onInputFocusIn(event: FocusEvent): void\r\n\t{\r\n\t\tif (event.target !== this.toggleElement && !this.open)\r\n\t\t{\r\n\t\t\tthis.openDropdown(false);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when an event is triggered.\r\n\t * Prevents the event from bubbling further, as this input dispatches its own event.\r\n\t * @param event The event.\r\n\t */\r\n\tprotected onInternalEvent(event: Event): void\r\n\t{\r\n\t\tevent.stopPropagation();\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `value` property changes.\r\n\t */\r\n\tprotected valueChanged(): void\r\n\t{\r\n\t\t// This check is needed to avoid clearing the entered value when parsing fails.\r\n\t\tif (this.value !== null)\r\n\t\t{\r\n\t\t\t// Clear the entered value when a new value is set.\r\n\t\t\tthis.enteredValue = undefined;\r\n\r\n\t\t\t// We cannot assume the value is valid, as it may come from outside the component.\r\n\t\t\tthis.isValid = this.value == null || this.value.isValid;\r\n\t\t}\r\n\r\n\t\t// Set the focused value to match the value.\r\n\t\tthis.focusedValue = this.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `focusedValue` property changes.\r\n\t */\r\n\tprotected focusedValueChanged(): void\r\n\t{\r\n\t\t// This check is needed to avoid clearing the entered value when parsing fails.\r\n\t\tif (this.focusedValue !== null)\r\n\t\t{\r\n\t\t\t// Clear the entered value when a new value is focused.\r\n\t\t\tthis.enteredValue = undefined;\r\n\r\n\t\t\t// We can assume the new focused value is valid, as it comes from within the component.\r\n\t\t\tthis.isValid = true;\r\n\t\t}\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"date-input{display:block}date-input>text-input.input>.input-control>.input-control-inner .input-input,date-input>text-input.input>.input-control>.input-control-inner .input-placeholder{padding-right:0}date-input>text-input dropdown-icon{padding:var(--input-padding)}date-input:not(.--open)>text-input{cursor:pointer}date-input:not(.--open)>text-input>.input-control>.input-control-inner{pointer-events:none}date-input dropdown{max-width:none;max-height:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/inputs/date-input/date-input.scss\"],\"names\":[],\"mappings\":\"AAAA,WAEC,aAAA,CAIC,gKAIC,eAAA,CAGD,oCAGC,4BAAA,CAIF,mCAGC,cAAA,CAEA,uEAGC,mBAAA,CAIF,oBAEC,cAAA,CACA,eAAA\",\"sourcesContent\":[\"date-input\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\t> text-input\\r\\n\\t{\\r\\n\\t\\t&.input > .input-control > .input-control-inner .input-input,\\r\\n\\t\\t&.input > .input-control > .input-control-inner .input-placeholder\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Remove padding at the end closest to the toggle icon.\\r\\n\\t\\t\\tpadding-right: 0;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tdropdown-icon\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply input padding.\\r\\n\\t\\t\\tpadding: var(--input-padding);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--open) > text-input\\r\\n\\t{\\r\\n\\t\\t// Use cursor to indicate the element is clickable, when not accepting text input.\\r\\n\\t\\tcursor: pointer;\\r\\n\\r\\n\\t\\t> .input-control > .input-control-inner\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Disable pointer events to prevent unwanted text selection on double click.\\r\\n\\t\\t\\tpointer-events: none;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\tdropdown\\r\\n\\t{\\r\\n\\t\\tmax-width: none;\\r\\n\\t\\tmax-height: none;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode, observable, computedFrom } from \"aurelia-framework\";\r\nimport { DateTime, Zone, Duration } from \"luxon\";\r\n\r\n/**\r\n * Custom element representing an input for picking a date and time.\r\n */\r\n@autoinject\r\nexport class DateTimeInputCustomElement\r\n{\r\n\tprivate _nowIntervalHandle: any;\r\n\tprivate _now: DateTime;\r\n\r\n\t/**\r\n\t * True if the value property is being updated due to an internal change, otherwise false.\r\n\t */\r\n\tprivate isInternalUpdate = false;\r\n\r\n\t/**\r\n\t * The date value.\r\n\t */\r\n\t@observable\r\n\tprotected dateValue: DateTime | undefined;\r\n\r\n\t/**\r\n\t * The time value.\r\n\t */\r\n\t@observable\r\n\tprotected timeValue: Duration | undefined;\r\n\r\n\t/**\r\n\t * The computed min time.\r\n\t */\r\n\t@computedFrom(\"min\", \"minTime\", \"dateValue\", \"zone\", \"_now\")\r\n\tprotected get computedMinTime(): Duration | undefined\r\n\t{\r\n\t\tlet minTime: Duration | undefined;\r\n\r\n\t\tif (typeof this.minTime === \"string\")\r\n\t\t{\r\n\t\t\tif (this.minTime.startsWith(\"P\"))\r\n\t\t\t{\r\n\t\t\t\tminTime = Duration.fromISO(this.minTime);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tconst [hour, minute] = this.minTime.split(\":\").map(s => parseInt(s));\r\n\t\t\t\tminTime = Duration.fromObject({ hour, minute });\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tminTime = this.minTime;\r\n\t\t}\r\n\r\n\t\tif (this.min === \"now\")\r\n\t\t{\r\n\t\t\tif (this.dateValue?.hasSame(this._now, \"day\"))\r\n\t\t\t{\r\n\t\t\t\tconst timeNow = this._now.diff(this._now.startOf(\"day\"));\r\n\r\n\t\t\t\tif (minTime == null || timeNow.valueOf() > minTime.valueOf())\r\n\t\t\t\t{\r\n\t\t\t\t\tminTime = timeNow;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn minTime;\r\n\t}\r\n\r\n\t/**\r\n\t * The computed max time.\r\n\t */\r\n\t@computedFrom(\"max\", \"maxTime\", \"dateValue\", \"zone\", \"_now\")\r\n\tprotected get computedMaxTime(): Duration | undefined\r\n\t{\r\n\t\tlet maxTime: Duration | undefined;\r\n\r\n\t\tif (typeof this.maxTime === \"string\")\r\n\t\t{\r\n\t\t\tif (this.maxTime.startsWith(\"P\"))\r\n\t\t\t{\r\n\t\t\t\tmaxTime = Duration.fromISO(this.maxTime);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tconst [hour, minute] = this.maxTime.split(\":\").map(s => parseInt(s));\r\n\t\t\t\tmaxTime = Duration.fromObject({ hour, minute });\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tmaxTime = this.maxTime;\r\n\t\t}\r\n\r\n\t\tif (this.max === \"now\")\r\n\t\t{\r\n\t\t\tif (this.dateValue?.hasSame(this._now, \"day\"))\r\n\t\t\t{\r\n\t\t\t\tconst timeNow = this._now.diff(this._now.startOf(\"day\"));\r\n\r\n\t\t\t\tif (maxTime == null || timeNow.valueOf() < maxTime.valueOf())\r\n\t\t\t\t{\r\n\t\t\t\t\tmaxTime = timeNow;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn maxTime;\r\n\t}\r\n\r\n\t/**\r\n\t * The IANA Time Zone Identifier to use, `local` to use the local zone, or `utc` to use the UTC zone.\r\n\t */\r\n\t@bindable({ defaultValue: \"local\" })\r\n\tpublic zone: string | Zone;\r\n\r\n\t/**\r\n\t * The date picked by the user, null if the entered value could not be parsed,\r\n\t * or undefined if no date has been entered or picked.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: DateTime | null | undefined;\r\n\r\n\t/**\r\n\t * The date that is focused, but not yet picked, null if the entered value\r\n\t * could not be parsed, or undefined if no date has been entered or focused.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic focusedValue: DateTime | null | undefined;\r\n\r\n\t/**\r\n\t * The earliest date and time that can be selected, or undefined to disable this constraint.\r\n\t * This may be an ISO 8601 string, the string `now` or `today`, or a `DateTime` instance.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic min: string | DateTime | \"now\" | \"today\" | undefined;\r\n\r\n\t/**\r\n\t * The latest date and time that can be selected, or undefined to disable this constraint.\r\n\t * This may be an ISO 8601 string, the string `now` or `today`, or a `DateTime` instance.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic max: string | DateTime | \"now\" | \"today\" | undefined;\r\n\r\n\t/**\r\n\t * The earliest time that can be selected on any given day, or undefined to disable this constraint.\r\n\t * This may be an ISO 8601 string or a `Duration` instance.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic minTime: string | Duration | undefined;\r\n\r\n\t/**\r\n\t * The latest date that can be selected on any given day, or undefined to disable this constraint.\r\n\t * This may be an ISO 8601 string or a `Duration` instance.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic maxTime: string | Duration | undefined;\r\n\r\n\t/**\r\n\t * True if the dropdown is open, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false, defaultBindingMode: bindingMode.fromView })\r\n\tpublic open: boolean;\r\n\r\n\t/**\r\n\t * True if the input is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the input is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n\r\n\t/**\r\n\t * True to select the contents when the input is focused, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic autoselect: boolean;\r\n\r\n\t/**\r\n\t * True to use `fixed` positioning for the dropdown, otherwise false.\r\n\t * This may be needed if the dropdown is placed within a container that\r\n\t * hides overflowing content, but note that it has a performance cost.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic fixed: boolean;\r\n\r\n\t/**\r\n\t * Called by the framework when the component is binding.\r\n\t */\r\n\tpublic bind(): void\r\n\t{\r\n\t\tthis._now = DateTime.local().setZone(this.zone);\r\n\t\tthis.scheduleNowRefresh();\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is unbinding.\r\n\t */\r\n\tpublic unbind(): void\r\n\t{\r\n\t\t// Stop refreshing the `now` value.\r\n\t\tclearInterval(this._nowIntervalHandle);\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `value` property changes.\r\n\t * @param newValue The new value.\r\n\t * @param oldValue The old value.\r\n\t */\r\n\tprotected valueChanged(newValue: DateTime, oldValue: DateTime): void\r\n\t{\r\n\t\tif (!this.isInternalUpdate)\r\n\t\t{\r\n\t\t\tif (newValue != null)\r\n\t\t\t{\r\n\t\t\t\tthis.dateValue = newValue.startOf(\"day\");\r\n\t\t\t\tthis.timeValue = newValue.diff(this.dateValue);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.dateValue = undefined;\r\n\t\t\t\tthis.timeValue = undefined;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.isInternalUpdate = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the user changes the date.\r\n\t * @param newValue The new date value.\r\n\t */\r\n\tprotected onDateValueChange(newValue: DateTime): void\r\n\t{\r\n\t\tthis.isInternalUpdate = true;\r\n\t\tthis.dateValue = newValue;\r\n\r\n\t\tconst isToday = newValue?.hasSame(DateTime.local().setZone(this.zone), \"day\");\r\n\t\tconst timeValue = this.timeValue?.valueOf();\r\n\t\tconst minTime = this.computedMinTime?.valueOf();\r\n\t\tconst maxTime = this.computedMaxTime?.valueOf();\r\n\r\n\t\tif (isToday && timeValue != null && ((minTime != null && timeValue < minTime) || (maxTime != null && timeValue > maxTime)))\r\n\t\t{\r\n\t\t\tthis.timeValue = undefined;\r\n\t\t}\r\n\r\n\t\tif (newValue != null && this.timeValue != null)\r\n\t\t{\r\n\t\t\tthis.value = newValue.plus(this.timeValue);\r\n\t\t}\r\n\t\telse if (this.value !== undefined)\r\n\t\t{\r\n\t\t\tthis.value = undefined;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.isInternalUpdate = false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the user changes the time.\r\n\t * @param newValue The new time value.\r\n\t */\r\n\tprotected onTimeValueChange(newValue: Duration): void\r\n\t{\r\n\t\tthis.isInternalUpdate = true;\r\n\t\tthis.timeValue = newValue;\r\n\r\n\t\tif (this.dateValue != null && newValue != null)\r\n\t\t{\r\n\t\t\tthis.value = this.dateValue.plus(newValue);\r\n\t\t}\r\n\t\telse if (this.value !== undefined)\r\n\t\t{\r\n\t\t\tthis.value = undefined;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Schedules updates of the `now` value.\r\n\t */\r\n\tprivate scheduleNowRefresh(): void\r\n\t{\r\n\t\tthis._nowIntervalHandle = setInterval(() =>\r\n\t\t{\r\n\t\t\tthis._now = DateTime.local().setZone(this.zone);\r\n\t\t}, 1000);\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"date-time-input{display:block}date-time-input>.input-controls>.input-controls-inner{display:flex}date-time-input>.input-controls>.input-controls-inner.--disabled{opacity:1}date-time-input>.input-controls>.input-controls-inner date-input,date-time-input>.input-controls>.input-controls-inner time-input{flex-grow:1}date-time-input>.input-controls>.input-controls-inner date-input .--disabled,date-time-input>.input-controls>.input-controls-inner time-input .--disabled{opacity:1}date-time-input>.input-controls>.input-controls-inner date-input .--disabled .input-control>*,date-time-input>.input-controls>.input-controls-inner time-input .--disabled .input-control>*{opacity:var(--opacity-disabled)}date-time-input>.input-controls>.input-controls-inner date-input{--input-width: 136rem}date-time-input>.input-controls>.input-controls-inner date-input .input-control{border-top-right-radius:0;border-bottom-right-radius:0}date-time-input>.input-controls>.input-controls-inner time-input{--input-width: 104rem}date-time-input>.input-controls>.input-controls-inner time-input .input-control{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/inputs/date-time-input/date-time-input.scss\"],\"names\":[],\"mappings\":\"AAAA,gBAEC,aAAA,CAEA,sDAEC,YAAA,CAEA,iEAEC,SAAA,CAGD,kIAGC,WAAA,CAEA,0JAEC,SAAA,CAEA,4LAEC,+BAAA,CAKH,iEAEC,qBAAA,CAEA,gFAEC,yBAAA,CACA,4BAAA,CAIF,iEAEC,qBAAA,CAEA,gFAEC,gBAAA,CACA,wBAAA,CACA,2BAAA\",\"sourcesContent\":[\"date-time-input\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\t> .input-controls > .input-controls-inner\\r\\n\\t{\\r\\n\\t\\tdisplay: flex;\\r\\n\\r\\n\\t\\t&.--disabled\\r\\n\\t\\t{\\r\\n\\t\\t\\topacity: 1;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tdate-input,\\r\\n\\t\\ttime-input\\r\\n\\t\\t{\\r\\n\\t\\t\\tflex-grow: 1;\\r\\n\\r\\n\\t\\t\\t.--disabled\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\topacity: 1;\\r\\n\\r\\n\\t\\t\\t\\t.input-control > *\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\topacity: var(--opacity-disabled);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tdate-input\\r\\n\\t\\t{\\r\\n\\t\\t\\t--input-width: 136rem;\\r\\n\\r\\n\\t\\t\\t.input-control\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tborder-top-right-radius: 0;\\r\\n\\t\\t\\t\\tborder-bottom-right-radius: 0;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\ttime-input\\r\\n\\t\\t{\\r\\n\\t\\t\\t--input-width: 104rem;\\r\\n\\r\\n\\t\\t\\t.input-control\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tborder-left: none;\\r\\n\\t\\t\\t\\tborder-top-left-radius: 0;\\r\\n\\t\\t\\t\\tborder-bottom-left-radius: 0;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\r\nimport { Id } from \"shared/utilities\";\r\nimport { AutocompleteHint, EnterKeyHint } from \"../input\";\r\n\r\n/**\r\n * Custom element representing an email input.\r\n */\r\n@autoinject\r\nexport class EmailInputCustomElement\r\n{\r\n\t/**\r\n\t * The unique ID of the control.\r\n\t */\r\n\tprotected id = Id.sequential();\r\n\r\n\t/**\r\n\t * Whether if the input field has been focused.\r\n\t */\r\n\tprotected focused: boolean = false;\r\n\r\n\t/**\r\n\t * The input element.\r\n\t */\r\n\tprotected inputElement: HTMLInputElement | HTMLTextAreaElement;\r\n\r\n\t/**\r\n\t * Gets the input value.\r\n\t */\r\n\t@computedFrom(\"value\")\r\n\tprotected get inputValue(): string\r\n\t{\r\n\t\treturn this.value != null ? this.value : \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the input value.\r\n\t */\r\n\tprotected set inputValue(value: string)\r\n\t{\r\n\t\tthis.value = value || undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the validation trigger to use for the validation.\r\n\t * This ensures errors won't be shown while a user types the beginning of an email address.\r\n\t */\r\n\t@computedFrom(\"value\")\r\n\tprotected get validationTrigger(): string | undefined\r\n\t{\r\n\t\treturn this.value != null && (!/.@./.test(this.value) || /[@.]$/.test(this.value)) ? \"change\" : undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * The value of the input, or undefined if the input is empty.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: string | undefined;\r\n\r\n\t/**\r\n\t * True if the input is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the input is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n\r\n\t/**\r\n\t * The autocomplete mode to use.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic autocomplete: AutocompleteHint;\r\n\r\n\t/**\r\n\t * True to select the contents when the input is focused, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic autoselect: boolean;\r\n\r\n\t/**\r\n\t * The hint indicating the type of `Enter` key to show on a virtual keyboard,\r\n\t * or undefined to use the default behavior.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic enterkey: EnterKeyHint | undefined;\r\n\r\n\t/**\r\n\t * The max length of the value, or undefined to use the max supported length.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic maxlength: number | undefined;\r\n\r\n @bindable\r\n public onInputBlur: () => void;\r\n\r\n\t/**\r\n\t * Called when the input receives focus.\r\n\t * Selects the contents of the input, if `autoselect` is enabled.\r\n\t */\r\n\tprotected onFocus(): void\r\n\t{\r\n\t\tthis.focused = true;\r\n\r\n\t\tif (this.autoselect)\r\n\t\t{\r\n\t\t\tsetTimeout(() => this.inputElement.setSelectionRange(0, this.inputElement.value.length), 50);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input looses focus.\r\n\t * If enabled, trims the value to remove leading and trailing whitespace.\r\n\t */\r\n\tprotected onBlur(): void\r\n\t{\r\n\t\tthis.focused = false;\r\n\r\n\t\tif (this.onInputBlur != null)\r\n\t\t{\r\n\t\t\tthis.onInputBlur();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input loses focus.\r\n\t * Trims the value to remove leading and trailing whitespace.\r\n\t */\r\n\tprotected trimOnBlur(): void\r\n\t{\r\n\t\tif (this.value)\r\n\t\t{\r\n\t\t\tthis.value = this.value.trim();\r\n\t\t}\r\n\t\tif (this.onBlur != null)\r\n\t\t{\r\n\t\t\tthis.onBlur();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed.\r\n\t * Prevents the user from entering invalid characters.\r\n\t * @returns True to continue, false to prevent default.\r\n\t */\r\n\tprotected onKeyDown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\t// Never block special keys or key combinations.\r\n\t\tif (event.defaultPrevented || !event.key || event.key.length > 1 || event.metaKey || event.ctrlKey)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn !/\\s/.test(event.key);\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--input-width: 144rem;--input-min-height: 40rem;--input-max-height: none;--input-padding: 16rem 24rem;--input-border-width: var(--border-width-thin);--input-border-radius: var(--border-radius-large)}.input{--input-border-color: var(--palette-color-neutral);--input-border-color--hover: var(--surface-input-border-color--hover);--input-border-color--focus: var(--surface-input-border-color--focus);--input-border-color--invalid: var(--surface-input-border-color--invalid);--input-surface-color: transparent;--input-surface-color--hover: transparent;--input-surface-color--focus: transparent;--input-surface-color--invalid: transparent;--input-surface-text-color: var(--surface-input-surface-text-color);--input-surface-text-color--hover: var(--surface-input-surface-text-color--hover);--input-surface-text-color--focus: var(--surface-input-surface-text-color--focus);--input-surface-text-color--invalid: var(--surface-input-surface-text-color--invalid);--input-surface-icon-color: var(--surface-input-surface-icon-color);--input-surface-icon-color--hover: var(--surface-input-surface-icon-color--hover);--input-surface-icon-color--focus: var(--surface-input-surface-icon-color--focus);--input-surface-icon-color--invalid: var(--surface-input-surface-icon-color--invalid)}.input{display:grid;align-items:flex-start;grid-template-columns:1fr;grid-template-rows:1fr -webkit-min-content;grid-template-rows:1fr min-content;grid-template-areas:\\\"control\\\" \\\"validation\\\";cursor:default;font-size:18rem;line-height:calc(18rem * 1.3);font-weight:200;position:relative}.input[label=above]{grid-template-columns:1fr;grid-template-rows:-webkit-min-content 1fr -webkit-min-content;grid-template-rows:min-content 1fr min-content;grid-template-areas:\\\"label\\\" \\\"control\\\" \\\"validation\\\"}.input[label=above]>.input-label{display:block;margin-bottom:4rem;font-size:var(--font-smaller-font-size);line-height:var(--font-smaller-line-height);font-weight:var(--font-smaller-font-weight);color:var(--palette-color-neutral)}.input[label=above]>.input-label .input-heading>*{margin-bottom:var(--font-small-margin-top)}.input[label=above]>.input-label .input-description>*{margin-bottom:var(--font-small-margin-top)}.input[label=before]>.input-label .input-description>*,.input[label=after]>.input-label .input-description>*{margin-top:var(--font-current-margin-bottom)}.input[label=before]{grid-template-columns:.4fr .6fr;grid-template-rows:1fr -webkit-min-content;grid-template-rows:1fr min-content;grid-template-areas:\\\"label control\\\" \\\"validation validation\\\"}.input[label=before]>.input-label{display:block;align-self:center;margin-right:var(--size-inline-spacing-large)}.input[label=after]{grid-template-columns:.6fr .4fr;grid-template-rows:1fr -webkit-min-content;grid-template-rows:1fr min-content;grid-template-areas:\\\"control label\\\" \\\"validation validation\\\"}.input[label=after]>.input-label{display:block;align-self:center;margin-left:var(--size-inline-spacing-large)}.input.--focused>.input-label{color:var(--surface-text-color)}.input.--focused>.input-control>span[slot=after]{color:var(--surface-text-color)}.input>.input-label{grid-area:label;position:relative;cursor:default;display:none;transition:color var(--animation-duration-short)}.input:focus-within>.input-label{pointer-events:none}.input>.input-control{grid-area:control;position:relative;display:flex;align-items:stretch;min-height:var(--input-min-height);max-width:var(--input-width);min-width:100%;resize:inherit;border:var(--input-border-width) solid;border-radius:var(--input-border-radius);border-color:var(--input-border-color);background:var(--input-surface-color);color:var(--input-surface-text-color)}.input>.input-control>div[slot=before],.input>.input-control>div[slot=after]{display:flex;align-items:stretch}.input>.input-control>div[slot=before] .input,.input>.input-control>div[slot=after] .input{--input-width: auto;--input-border-width: 0;--input-border-radius: 0}.input>.input-control>span[slot=before]{padding:var(--input-padding);padding-right:0;white-space:nowrap}.input>.input-control>span[slot=after]{padding:var(--input-padding);padding-left:0;color:var(--palette-color-neutral);white-space:nowrap}.input>.input-control>.input-control-inner{position:relative;width:100%;display:flex;align-items:center;resize:inherit}.input>.input-control>.input-control-inner .input-input{width:100%;min-height:100%;resize:inherit}.input>.input-control>.input-control-inner .input-input,.input>.input-control>.input-control-inner .input-value,.input>.input-control>.input-control-inner .input-placeholder{padding:var(--input-padding)}.input>.input-control>.input-control-inner .input-value,.input>.input-control>.input-control-inner .input-placeholder{position:absolute;top:0;left:0;right:0;bottom:0}.input>.input-control>.input-control-inner .input-value{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.input>.input-control>.input-control-inner .input-placeholder{color:var(--palette-color-neutral);overflow:hidden;pointer-events:none}.input>.input-control>.input-control-inner .input-placeholder [slot=placeholder]{min-width:0}.input>.input-control>.input-control-inner .input-placeholder span[slot=placeholder]{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.input>.input-validation{grid-area:validation;position:absolute;margin-top:2rem}.input>.input-validation [slot=validation]{display:flex}.input>.input-validation [slot=validation] validation-message:not(.--single):not(:first-child){margin-left:4rem}.input>.input-validation [slot=validation] a{color:inherit}.input:not(.--multiline)>.input-control>.input-control-inner>.input-placeholder{display:flex;align-items:center}.input.--disabled>.input-control,.input.--disabled>.input-label{opacity:var(--opacity-disabled)}.input.--disabled>.input-control{border-color:var(--palette-color-neutral);background:var(--palette-color-neutral-light);color:var(--palette-color-neutral-dark)}.input.--readonly>.input-control,.input.--readonly>.input-label{opacity:var(--opacity-disabled)}.input.--readonly>.input-control{border-color:var(--palette-color-neutral);background:var(--palette-color-neutral-light)}.input:not(.--disabled):not(.--readonly):hover>.input-control{border-color:var(--input-border-color--hover);background:var(--input-surface-color--hover);color:var(--input-surface-text-color--hover)}.input:not(.--disabled):not(.--readonly):focus-within>.input-control{border-color:var(--input-border-color--focus);background:var(--input-surface-color--focus);color:var(--input-surface-text-color--focus)}.input:not(.--disabled).--readonly.--invalid>.input-control{border-color:var(--input-border-color--invalid);background:var(--palette-color-negative-light);color:var(--input-surface-text-color)}.input:not(.--disabled).--readonly.--invalid>.input-control [slot=after]{color:var(--input-surface-text-color--invalid)}.input:not(.--disabled).--readonly.--invalid>.input-label{color:var(--input-surface-text-color--invalid)}.input:not(.--disabled).--readonly.--invalid:not(.--empty)>.input-control>.input-control-inner{color:var(--input-surface-text-color--invalid)}.input:not(.--disabled):not(.--readonly).--invalid>.input-control{border-color:var(--input-border-color--invalid);background:var(--input-surface-color--invalid);color:var(--input-surface-text-color)}.input:not(.--disabled):not(.--readonly).--invalid>.input-control [slot=after]{color:var(--input-surface-text-color--invalid)}.input:not(.--disabled):not(.--readonly).--invalid>.input-label{color:var(--input-surface-text-color--invalid)}.input:not(.--disabled):not(.--readonly).--invalid:not(.--empty)>.input-control>.input-control-inner{color:var(--input-surface-text-color--invalid)}.input:not(.--empty)>.input-control>.input-control-inner>.input-placeholder{opacity:0}.input:focus-within>.input-control>.input-control-inner>.input-value,.input.--invalid>.input-control>.input-control-inner>.input-value{opacity:0;pointer-events:none}.input:not(:focus-within):not(.--invalid)>.input-control>.input-control-inner>.input-input.--hide-when-unfocused{opacity:0}.input>.input-control dropdown{min-width:calc(var(--dropdown-min-width) + 2 * var(--input-border-width))}.input>.input-control dropdown-icon{color:var(--input-surface-icon-color)}.input:hover>.input-control dropdown-icon{color:var(--input-surface-icon-color--hover)}.input:focus-within>.input-control dropdown-icon{color:var(--input-surface-icon-color--focus)}.input.--invalid>.input-control dropdown-icon{color:var(--input-surface-icon-color--invalid)}.input>.input-control>.input-control-inner input.input-input,.input>.input-control>.input-control-inner textarea.input-input{margin:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;border-radius:0;background:transparent;color:inherit;font:inherit}.input>.input-control>.input-control-inner textarea.input-input{min-height:calc(var(--input-min-height) - 2 * var(--input-border-width));max-height:calc(var(--input-max-height) - 2 * var(--input-border-width))}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/inputs/input.scss\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\":root\\r\\n{\\r\\n\\t// TODO: Add --input-heading-font.\\r\\n\\t// TODO: Add --input-description-font.\\r\\n\\t// TODO: What about label-related margins?\\r\\n\\t// TODO: What about label-related colors or opacity?\\r\\n\\r\\n\\t/// The default width of the component.\\r\\n\\t/// The default ensures a reasonable width when no width is specified.\\r\\n\\t--input-width: 144rem;\\r\\n\\r\\n\\t/// The min-height of the component, if resizing is allowed.\\r\\n\\t/// The default prevents resizing to less than the height of a single-line input.\\r\\n\\t--input-min-height: 40rem;\\r\\n\\r\\n\\t/// The max-height of the component, if resizing is allowed.\\r\\n\\t/// The default allows resizing to fit any content.\\r\\n\\t--input-max-height: none;\\r\\n\\r\\n\\t/// The padding of the component.\\r\\n\\t--input-padding: 16rem 24rem;\\r\\n\\r\\n\\t/// The width of the border of the component.\\r\\n\\t--input-border-width: var(--border-width-thin);\\r\\n\\r\\n\\t/// The radius of the border of the component.\\r\\n\\t--input-border-radius: var(--border-radius-large);\\r\\n}\\r\\n\\r\\n.input\\r\\n{\\r\\n\\t/// The color of the border of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--input-border-color: var(--palette-color-neutral);\\r\\n\\t--input-border-color--hover: var(--surface-input-border-color--hover);\\r\\n\\t--input-border-color--focus: var(--surface-input-border-color--focus);\\r\\n\\t--input-border-color--invalid: var(--surface-input-border-color--invalid);\\r\\n\\r\\n\\t/// The color of the surface of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--input-surface-color: transparent;\\r\\n\\t--input-surface-color--hover: transparent;\\r\\n\\t--input-surface-color--focus: transparent;\\r\\n\\t--input-surface-color--invalid: transparent;\\r\\n\\r\\n\\t/// The color of the text on the surface of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--input-surface-text-color: var(--surface-input-surface-text-color);\\r\\n\\t--input-surface-text-color--hover: var(--surface-input-surface-text-color--hover);\\r\\n\\t--input-surface-text-color--focus: var(--surface-input-surface-text-color--focus);\\r\\n\\t--input-surface-text-color--invalid: var(--surface-input-surface-text-color--invalid);\\r\\n\\r\\n\\t/// The color of icons on the surface of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--input-surface-icon-color: var(--surface-input-surface-icon-color);\\r\\n\\t--input-surface-icon-color--hover: var(--surface-input-surface-icon-color--hover);\\r\\n\\t--input-surface-icon-color--focus: var(--surface-input-surface-icon-color--focus);\\r\\n\\t--input-surface-icon-color--invalid: var(--surface-input-surface-icon-color--invalid);\\r\\n}\\r\\n\\r\\n.input\\r\\n{\\r\\n\\t// Use grid layout.\\r\\n\\tdisplay: grid;\\r\\n\\r\\n\\t// Align items with the top.\\r\\n\\talign-items: flex-start;\\r\\n\\r\\n\\t// By default, define the grid without the label.\\r\\n\\tgrid-template-columns: 1fr;\\r\\n\\tgrid-template-rows: 1fr min-content;\\r\\n\\tgrid-template-areas:\\r\\n\\t\\t\\\"control\\\"\\r\\n\\t\\t\\\"validation\\\";\\r\\n\\r\\n\\t// Use default cursor.\\r\\n\\tcursor: default;\\r\\n\\r\\n\\t// Define font styles\\r\\n\\tfont-size: 18rem;\\r\\n\\tline-height: calc(18rem * 1.3);\\r\\n\\tfont-weight: 200;\\r\\n\\r\\n\\tposition: relative;\\r\\n\\r\\n\\t&[label=\\\"above\\\"]\\r\\n\\t{\\r\\n\\t\\t// Define the grid with the label above the control.\\r\\n\\t\\tgrid-template-columns: 1fr;\\r\\n\\t\\tgrid-template-rows: min-content 1fr min-content;\\r\\n\\t\\tgrid-template-areas:\\r\\n\\t\\t\\t\\\"label\\\"\\r\\n\\t\\t\\t\\\"control\\\"\\r\\n\\t\\t\\t\\\"validation\\\";\\r\\n\\r\\n\\t\\t> .input-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Show the label.\\r\\n\\t\\t\\tdisplay: block;\\r\\n\\r\\n\\t\\t\\t// Apply spacing between the label and the control.\\r\\n\\t\\t\\tmargin-bottom: 4rem;\\r\\n\\r\\n\\t\\t\\t// Define the font styling of the label\\r\\n\\t\\t\\tfont-size: var(--font-smaller-font-size);\\r\\n\\t\\t\\tline-height: var(--font-smaller-line-height);\\r\\n\\t\\t\\tfont-weight: var(--font-smaller-font-weight);\\r\\n\\t\\t\\tcolor: var(--palette-color-neutral);\\r\\n\\r\\n\\t\\t\\t.input-heading > *\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply spacing between the heading and the description.\\r\\n\\t\\t\\t\\tmargin-bottom: var(--font-small-margin-top);\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t.input-description > *\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply spacing between the heading and the description.\\r\\n\\t\\t\\t\\tmargin-bottom: var(--font-small-margin-top);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&[label=\\\"before\\\"],\\r\\n\\t&[label=\\\"after\\\"]\\r\\n\\t{\\r\\n\\t\\t> .input-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t.input-description > *\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply spacing between the heading and the description.\\r\\n\\t\\t\\t\\tmargin-top: var(--font-current-margin-bottom);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&[label=\\\"before\\\"]\\r\\n\\t{\\r\\n\\t\\t// Define the grid with the label inline with the control.\\r\\n\\t\\tgrid-template-columns: 0.4fr 0.6fr;\\r\\n\\t\\tgrid-template-rows: 1fr min-content;\\r\\n\\t\\tgrid-template-areas:\\r\\n\\t\\t\\t\\\"label control\\\"\\r\\n\\t\\t\\t\\\"validation validation\\\";\\r\\n\\r\\n\\t\\t> .input-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Show the label.\\r\\n\\t\\t\\tdisplay: block;\\r\\n\\r\\n\\t\\t\\t// Center vertically.\\r\\n\\t\\t\\talign-self: center;\\r\\n\\r\\n\\t\\t\\t// Apply spacing between the label and the control.\\r\\n\\t\\t\\tmargin-right: var(--size-inline-spacing-large);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&[label=\\\"after\\\"]\\r\\n\\t{\\r\\n\\t\\t// Define the grid with the label inline with the control.\\r\\n\\t\\tgrid-template-columns: 0.6fr 0.4fr;\\r\\n\\t\\tgrid-template-rows: 1fr min-content;\\r\\n\\t\\tgrid-template-areas:\\r\\n\\t\\t\\t\\\"control label\\\"\\r\\n\\t\\t\\t\\\"validation validation\\\";\\r\\n\\r\\n\\t\\t> .input-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Show the label.\\r\\n\\t\\t\\tdisplay: block;\\r\\n\\r\\n\\t\\t\\t// Center vertically.\\r\\n\\t\\t\\talign-self: center;\\r\\n\\r\\n\\t\\t\\t// Apply spacing between the label and the control.\\r\\n\\t\\t\\tmargin-left: var(--size-inline-spacing-large);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.--focused\\r\\n\\t{\\r\\n\\t\\t> .input-label\\r\\n\\t\\t{\\r\\n\\t\\t\\tcolor: var(--surface-text-color);\\r\\n\\t\\t}\\r\\n\\t\\t> .input-control\\r\\n\\t\\t{\\r\\n\\t\\t\\t> span\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t&[slot=\\\"after\\\"]\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tcolor: var(--surface-text-color);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t> .input-label\\r\\n\\t{\\r\\n\\t\\t// Position the element within the grid.\\r\\n\\t\\tgrid-area: label;\\r\\n\\r\\n\\t\\t// Allow content to be positioned relative to this element.\\r\\n\\t\\tposition: relative;\\r\\n\\r\\n\\t\\t// Always use the default cursor.\\r\\n\\t\\tcursor: default;\\r\\n\\r\\n\\t\\t// Only shown if the `label` attribute is specified.\\r\\n\\t\\tdisplay: none;\\r\\n\\r\\n\\t\\ttransition: color var(--animation-duration-short);\\r\\n\\t}\\r\\n\\r\\n\\t&:focus-within > .input-label\\r\\n\\t{\\r\\n\\t\\t// Make the label non-clickable when focus is already within.\\r\\n\\t\\tpointer-events: none;\\r\\n\\t}\\r\\n\\r\\n\\t> .input-control\\r\\n\\t{\\r\\n\\t\\t// Position the element within the grid.\\r\\n\\t\\tgrid-area: control;\\r\\n\\r\\n\\t\\t// Allow content to be positioned relative to this element.\\r\\n\\t\\tposition: relative;\\r\\n\\r\\n\\t\\t// Use horizontal flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\talign-items: stretch;\\r\\n\\r\\n\\t\\t// Set the min-height.\\r\\n\\t\\tmin-height: var(--input-min-height);\\r\\n\\r\\n\\t\\t// Set the min-width and max-width.\\r\\n\\t\\tmax-width: var(--input-width);\\r\\n\\t\\tmin-width: 100%;\\r\\n\\r\\n\\t\\t// Inherit the resize mode.\\r\\n\\t\\tresize: inherit;\\r\\n\\r\\n\\t\\t// Apply a border around the component.\\r\\n\\t\\tborder: var(--input-border-width) solid;\\r\\n\\t\\tborder-radius: var(--input-border-radius);\\r\\n\\r\\n\\t\\t// Apply component style for the normal state.\\r\\n\\t\\tborder-color: var(--input-border-color);\\r\\n\\t\\tbackground: var(--input-surface-color);\\r\\n\\t\\tcolor: var(--input-surface-text-color);\\r\\n\\r\\n\\t\\t> div[slot=\\\"before\\\"],\\r\\n\\t\\t> div[slot=\\\"after\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Use horizontal flex layout.\\r\\n\\t\\t\\tdisplay: flex;\\r\\n\\t\\t\\talign-items: stretch;\\r\\n\\r\\n\\t\\t\\t.input\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Remove default width if nested within another input.\\r\\n\\t\\t\\t\\t--input-width: auto;\\r\\n\\r\\n\\t\\t\\t\\t// Remove border if nested within another input.\\r\\n\\t\\t\\t\\t--input-border-width: 0;\\r\\n\\t\\t\\t\\t--input-border-radius: 0;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> span[slot=\\\"before\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply the input padding, except at the end closest to the input value.\\r\\n\\t\\t\\tpadding: var(--input-padding);\\r\\n\\t\\t\\tpadding-right: 0;\\r\\n\\r\\n\\t\\t\\t// Prevent wrapping.\\r\\n\\t\\t\\twhite-space: nowrap;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> span[slot=\\\"after\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply the input padding, except at the end closest to the input value.\\r\\n\\t\\t\\tpadding: var(--input-padding);\\r\\n\\t\\t\\tpadding-left: 0;\\r\\n\\r\\n\\t\\t\\tcolor: var(--palette-color-neutral);\\r\\n\\r\\n\\t\\t\\t// Prevent wrapping.\\r\\n\\t\\t\\twhite-space: nowrap;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> .input-control-inner\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Allow content to be positioned relative to this element.\\r\\n\\t\\t\\tposition: relative;\\r\\n\\r\\n\\t\\t\\t// Expand to fill the available width.\\r\\n\\t\\t\\twidth: 100%;\\r\\n\\r\\n\\t\\t\\t// Use horizontal flex layout.\\r\\n\\t\\t\\tdisplay: flex;\\r\\n\\t\\t\\talign-items: center;\\r\\n\\r\\n\\t\\t\\t// Inherit the resize mode.\\r\\n\\t\\t\\tresize: inherit;\\r\\n\\r\\n\\t\\t\\t.input-input\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Expand to fill the available width and height.\\r\\n\\t\\t\\t\\twidth: 100%;\\r\\n\\t\\t\\t\\tmin-height: 100%;\\r\\n\\r\\n\\t\\t\\t\\t// Inherit the resize mode.\\r\\n\\t\\t\\t\\tresize: inherit;\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t.input-input,\\r\\n\\t\\t\\t.input-value,\\r\\n\\t\\t\\t.input-placeholder\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply the input padding.\\r\\n\\t\\t\\t\\tpadding: var(--input-padding);\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t.input-value,\\r\\n\\t\\t\\t.input-placeholder\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Position to cover the input.\\r\\n\\t\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\t\\ttop: 0;\\r\\n\\t\\t\\t\\tleft: 0;\\r\\n\\t\\t\\t\\tright: 0;\\r\\n\\t\\t\\t\\tbottom: 0;\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t.input-value\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Truncate text content with an ellipsis.\\r\\n\\t\\t\\t\\twhite-space: nowrap;\\r\\n\\t\\t\\t\\toverflow: hidden;\\r\\n\\t\\t\\t\\ttext-overflow: ellipsis;\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t.input-placeholder\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Make the placeholder appear faded.\\r\\n\\t\\t\\t\\tcolor: var(--palette-color-neutral);\\r\\n\\r\\n\\t\\t\\t\\t// Prevent overflow.\\r\\n\\t\\t\\t\\toverflow: hidden;\\r\\n\\r\\n\\t\\t\\t\\t// Ignore pointer events.\\r\\n\\t\\t\\t\\tpointer-events: none;\\r\\n\\r\\n\\t\\t\\t\\t[slot=\\\"placeholder\\\"]\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\t// Allow the element, which is a flex child, to shrink to less than\\r\\n\\t\\t\\t\\t\\t// the width of its children, thus enabling text truncation.\\r\\n\\t\\t\\t\\t\\tmin-width: 0;\\r\\n\\t\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t\\tspan[slot=\\\"placeholder\\\"]\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\t// Truncate text content with an ellipsis.\\r\\n\\t\\t\\t\\t\\tdisplay: block;\\r\\n\\t\\t\\t\\t\\twhite-space: nowrap;\\r\\n\\t\\t\\t\\t\\toverflow: hidden;\\r\\n\\t\\t\\t\\t\\ttext-overflow: ellipsis;\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t> .input-validation\\r\\n\\t{\\r\\n\\t\\t// Position the element within the grid.\\r\\n\\t\\tgrid-area: validation;\\r\\n\\t\\tposition: absolute;\\r\\n\\t\\tmargin-top: 2rem;\\r\\n\\r\\n\\t\\t[slot=\\\"validation\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\tdisplay: flex;\\r\\n\\r\\n\\t\\t\\tvalidation-message:not(.--single)\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t&:not(:first-child)\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tmargin-left: 4rem;\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\ta\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tcolor: inherit;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--multiline)\\r\\n\\t{\\r\\n\\t\\t> .input-control > .input-control-inner > .input-placeholder\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Center content vertically.\\r\\n\\t\\t\\tdisplay: flex;\\r\\n\\t\\t\\talign-items: center;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.--disabled\\r\\n\\t{\\r\\n\\t\\t> .input-control, > .input-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Reduce opacity when disabled.\\r\\n\\t\\t\\topacity: var(--opacity-disabled);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> .input-control\\r\\n\\t\\t{\\r\\n\\t\\t\\tborder-color: var(--palette-color-neutral);\\r\\n\\t\\t\\tbackground: var(--palette-color-neutral-light);\\r\\n\\t\\t\\tcolor: var(--palette-color-neutral-dark);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.--readonly\\r\\n\\t{\\r\\n\\t\\t> .input-control, > .input-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Reduce opacity when disabled.\\r\\n\\t\\t\\topacity: var(--opacity-disabled);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> .input-control\\r\\n\\t\\t{\\r\\n\\t\\t\\tborder-color: var(--palette-color-neutral);\\r\\n\\t\\t\\tbackground: var(--palette-color-neutral-light);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--disabled):not(.--readonly)\\r\\n\\t{\\r\\n\\t\\t&:hover\\r\\n\\t\\t{\\r\\n\\t\\t\\t> .input-control\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply style for the hover state.\\r\\n\\t\\t\\t\\tborder-color: var(--input-border-color--hover);\\r\\n\\t\\t\\t\\tbackground: var(--input-surface-color--hover);\\r\\n\\t\\t\\t\\tcolor: var(--input-surface-text-color--hover);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&:focus-within\\r\\n\\t\\t{\\r\\n\\t\\t\\t> .input-control\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply style for the focus state.\\r\\n\\t\\t\\t\\tborder-color: var(--input-border-color--focus);\\r\\n\\t\\t\\t\\tbackground: var(--input-surface-color--focus);\\r\\n\\t\\t\\t\\tcolor: var(--input-surface-text-color--focus);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--disabled).--readonly,\\r\\n\\t{\\r\\n\\t\\t&.--invalid\\r\\n\\t\\t{\\r\\n\\t\\t\\t> .input-control\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply style for the invalid state.\\r\\n\\t\\t\\t\\tborder-color: var(--input-border-color--invalid);\\r\\n\\t\\t\\t\\tbackground: var(--palette-color-negative-light);\\r\\n\\t\\t\\t\\tcolor: var(--input-surface-text-color);\\r\\n\\r\\n\\t\\t\\t\\t[slot=\\\"after\\\"]\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tcolor: var(--input-surface-text-color--invalid);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t> .input-label\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tcolor: var(--input-surface-text-color--invalid);\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t&:not(.--empty) > .input-control > .input-control-inner\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply the text color for the invalid state only if the input is not empty.\\r\\n\\t\\t\\t\\tcolor: var(--input-surface-text-color--invalid);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--disabled):not(.--readonly)\\r\\n\\t{\\r\\n\\t\\t&.--invalid\\r\\n\\t\\t{\\r\\n\\t\\t\\t> .input-control\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply style for the invalid state.\\r\\n\\t\\t\\t\\tborder-color: var(--input-border-color--invalid);\\r\\n\\t\\t\\t\\tbackground: var(--input-surface-color--invalid);\\r\\n\\t\\t\\t\\tcolor: var(--input-surface-text-color);\\r\\n\\r\\n\\t\\t\\t\\t[slot=\\\"after\\\"]\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tcolor: var(--input-surface-text-color--invalid);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t> .input-label\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tcolor: var(--input-surface-text-color--invalid);\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t&:not(.--empty) > .input-control > .input-control-inner\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply the text color for the invalid state only if the input is not empty.\\r\\n\\t\\t\\t\\tcolor: var(--input-surface-text-color--invalid);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--empty)\\r\\n\\t{\\r\\n\\t\\t> .input-control > .input-control-inner > .input-placeholder\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Hide the placeholder when the input is not empty.\\r\\n\\t\\t\\topacity: 0;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:focus-within, &.--invalid\\r\\n\\t{\\r\\n\\t\\t> .input-control > .input-control-inner > .input-value\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Hide the value when the input is invalid or focused.\\r\\n\\t\\t\\topacity: 0;\\r\\n\\r\\n\\t\\t\\t// Allow pointer events to reach the input below.\\r\\n\\t\\t\\tpointer-events: none;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(:focus-within):not(.--invalid)\\r\\n\\t{\\r\\n\\t\\t> .input-control > .input-control-inner > .input-input.--hide-when-unfocused\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Hide the input element when the input is valid and unfocused.\\r\\n\\t\\t\\topacity: 0;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\\r\\n.input > .input-control dropdown\\r\\n{\\r\\n\\t// Ensure the dropdown width matches the input width.\\r\\n\\tmin-width: calc(var(--dropdown-min-width) + 2 * var(--input-border-width));\\r\\n}\\r\\n\\r\\n.input\\r\\n{\\r\\n\\t> .input-control dropdown-icon\\r\\n\\t{\\r\\n\\t\\tcolor: var(--input-surface-icon-color);\\r\\n\\t}\\r\\n\\r\\n\\t&:hover\\r\\n\\t{\\r\\n\\t\\t> .input-control dropdown-icon\\r\\n\\t\\t{\\r\\n\\t\\t\\tcolor: var(--input-surface-icon-color--hover);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:focus-within\\r\\n\\t{\\r\\n\\t\\t> .input-control dropdown-icon\\r\\n\\t\\t{\\r\\n\\t\\t\\tcolor: var(--input-surface-icon-color--focus);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.--invalid\\r\\n\\t{\\r\\n\\t\\t> .input-control dropdown-icon\\r\\n\\t\\t{\\r\\n\\t\\t\\tcolor: var(--input-surface-icon-color--invalid);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\\r\\n// Apply basic styling to native controls, so we won't have to repeat this in every component.\\r\\n\\r\\n// stylelint-disable-next-line no-duplicate-selectors\\r\\n.input > .input-control > .input-control-inner\\r\\n{\\r\\n\\tinput.input-input,\\r\\n\\ttextarea.input-input\\r\\n\\t{\\r\\n\\t\\t// Remove the default browser styling.\\r\\n\\t\\tmargin: 0;\\r\\n\\t\\tappearance: none;\\r\\n\\t\\tborder: none;\\r\\n\\t\\tborder-radius: 0;\\r\\n\\t\\tbackground: transparent;\\r\\n\\t\\tcolor: inherit;\\r\\n\\t\\tfont: inherit;\\r\\n\\t}\\r\\n\\r\\n\\ttextarea.input-input\\r\\n\\t{\\r\\n\\t\\t// Constrain resizing.\\r\\n\\t\\tmin-height: calc(var(--input-min-height) - 2 * var(--input-border-width));\\r\\n\\t\\tmax-height: calc(var(--input-max-height) - 2 * var(--input-border-width));\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, computedFrom, bindingMode } from \"aurelia-framework\";\r\nimport { Id, escapeRegExp } from \"shared/utilities\";\r\nimport { AutocompleteHint, EnterKeyHint } from \"../input\";\r\nimport { NumberFormat } from \"shared/localization\";\r\n\r\n/**\r\n * Custom element representing a number input.\r\n */\r\n@autoinject\r\nexport class NumberInputCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param numberFormat The `NumberFormat` instance.\r\n\t */\r\n\tpublic constructor(numberFormat: NumberFormat)\r\n\t{\r\n\t\tthis.numberFormat = numberFormat;\r\n\t}\r\n\r\n\t/**\r\n\t * The unique ID of the input element associated with the label.\r\n\t */\r\n\tprotected id = Id.sequential();\r\n\r\n\t/**\r\n\t * Whether if the input field has been focused.\r\n\t */\r\n\tprotected focused: boolean = false;\r\n\r\n\t/**\r\n\t * The number format for the current locale.\r\n\t */\r\n\tprotected numberFormat: NumberFormat;\r\n\r\n\t/**\r\n\t * The input element.\r\n\t */\r\n\tprotected inputElement: HTMLInputElement;\r\n\r\n\t/**\r\n\t * The value entered in the input element, or undefined if the value is valid and the input is not focused.\r\n\t */\r\n\tprotected enteredValue: string | undefined;\r\n\r\n\t/**\r\n\t * True if the entered value should be validated, otherwise false\r\n\t */\r\n\tprotected validate = false;\r\n\r\n\t/**\r\n\t * True if the entered value is invalid, otherwise false.\r\n\t */\r\n\tprotected invalid = false;\r\n\r\n\t/**\r\n\t * Gets the value of the input element based on the value of the component.\r\n\t */\r\n\t@computedFrom(\"enteredValue\", \"value\")\r\n\tprotected get inputValue(): string\r\n\t{\r\n\t\t// If the user entered a value, return that.\r\n\t\tif (this.enteredValue != null)\r\n\t\t{\r\n\t\t\treturn this.enteredValue;\r\n\t\t}\r\n\r\n\t\t// Return the value of the input element.\r\n\t\treturn this.value != null ? this.value.toString().replace(\".\", this.numberFormat.decimalSeparator) : \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the value of the component based on the value of the input element.\r\n\t * Note that the value is only set if the input value can be parsed successfully.\r\n\t */\r\n\tprotected set inputValue(value: string)\r\n\t{\r\n\t\t// Store the value entered by the user.\r\n\t\tthis.enteredValue = value;\r\n\r\n\t\t// Parse the value of the input element.\r\n\t\tif (value)\r\n\t\t{\r\n\t\t\t// Is the value valid?\r\n\t\t\tif (this.numberFormat.validPattern.test(value))\r\n\t\t\t{\r\n\t\t\t\tthis.value = parseFloat(value.replace(this.numberFormat.decimalSeparator, \".\")) || 0;\r\n\t\t\t\tthis.invalid = false;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.value = undefined;\r\n\t\t\t\tthis.invalid = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.value = undefined;\r\n\t\t\tthis.invalid = false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * The value of the input, or undefined if the input is empty or invalid.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: number | undefined;\r\n\r\n\t/**\r\n\t * True if the input is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the input is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n\r\n\t/**\r\n\t * The hint indicating the type of `Enter` key to show on a virtual keyboard,\r\n\t * or undefined to use the default behavior.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic enterkey: EnterKeyHint | undefined;\r\n\r\n\t/**\r\n\t * The autocomplete mode to use, or undefined to use the default behavior.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic autocomplete: AutocompleteHint;\r\n\r\n\t/**\r\n\t * True to select the content when the input is focused, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic autoselect: boolean;\r\n\r\n\t/**\r\n\t * The amount by which the value should increment or decrement for each step,\r\n\t * or undefined to use the default behavior.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic step: number | undefined;\r\n\r\n\t/**\r\n\t * The min value of the input, or undefined to use no min value.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic min: number | undefined;\r\n\r\n\t/**\r\n\t * The max value of the input, or undefined to use no max value.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic max: number | undefined;\r\n\r\n\t/**\r\n\t * True to format the value according to locale rules, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic useGrouping: boolean;\r\n\r\n\t/**\r\n\t * Called when the input element receives focus.\r\n\t * Selects the content of the input element, if `autoselect` is enabled.\r\n\t */\r\n\tprotected onFocus(): void\r\n\t{\r\n\t\tthis.validate = this.invalid;\r\n\t\tthis.focused = true;\r\n\r\n\t\tif (this.autoselect)\r\n\t\t{\r\n\t\t\tsetTimeout(() => this.inputElement.setSelectionRange(0, this.inputElement.value.length), 50);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input element looses focus.\r\n\t * Clears the value entered by the user.\r\n\t */\r\n\tprotected onBlur(): void\r\n\t{\r\n\t\tthis.validate = true;\r\n\t\tthis.focused = false;\r\n\r\n\t\tif (!this.invalid)\r\n\t\t{\r\n\t\t\tthis.enteredValue = undefined;\r\n\t\t\tthis.inputElement.value = this.inputValue;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed.\r\n\t * Prevents the user from entering some invalid values.\r\n\t * @returns True to continue, false to prevent default.\r\n\t */\r\n\tprotected onKeyDown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\t// Never handle the event if default has been prevented.\r\n\t\tif (event.defaultPrevented)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Never block special keys or key combinations.\r\n\t\tif (!event.key || event.key.length > 1 || event.metaKey || event.ctrlKey)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tconst selectionStart = this.inputElement.selectionStart!;\r\n\t\tconst selectionEnd = this.inputElement.selectionEnd;\r\n\t\tconst inputValue = this.inputElement.value;\r\n\t\tconst decimalSeparatorPattern = new RegExp(`\\\\.|,|${escapeRegExp(this.numberFormat.decimalSeparator)}`);\r\n\r\n\t\t// Prevent the user from entering something other than a digit, a minus sign or a decimal separator.\r\n\t\tif (!this.numberFormat.keyPattern.test(event.key) && !decimalSeparatorPattern.test(event.key))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Prevent the user from entering a minus sign, except at the beginning of the value.\r\n\t\tif (event.key === this.numberFormat.minusSign && selectionStart > 0)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Prevent the user from entering something other than a minus sign or a non-zero digit before a leading zero.\r\n\t\tif (event.key !== this.numberFormat.minusSign && !(/[1-9]/).test(event.key) && selectionStart === 0 && inputValue.search(/0/) === 0)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Prevent the user from entering something other than a decimal separator after a leading zero.\r\n\t\tif (!decimalSeparatorPattern.test(event.key) && selectionStart === 1 && inputValue.search(/0/) === 0)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Prevent the user from entering a decimal separator if the value already contains a decimal separator outside the selection range.\r\n\t\tif (decimalSeparatorPattern.test(event.key) && (\r\n\t\t\tinputValue.substring(0, selectionStart).search(decimalSeparatorPattern) >= 0 ||\r\n\t\t\tselectionEnd != null && inputValue.substring(selectionEnd).search(decimalSeparatorPattern) >= 0))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Prevent the user from entering negative numbers if `min` is more than zero.\r\n\t\tif (this.min != null && this.min >= 0)\r\n\t\t{\r\n\t\t\tif (event.key === this.numberFormat.minusSign)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Prevent the user from entering positive numbers if `max` is less than zero.\r\n\t\tif (this.max != null && this.max < 0)\r\n\t\t{\r\n\t\t\tif (event.key !== this.numberFormat.minusSign && selectionStart === 0)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Prevent the user from entering a decimal point if `step` is a whole number.\r\n\t\tif (this.step != null && this.step % 1 === 0)\r\n\t\t{\r\n\t\t\tif (decimalSeparatorPattern.test(event.key))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Coerce the enterede decimal separator to match the decimal separator for the current locale.\r\n\t\tif (decimalSeparatorPattern.test(event.key))\r\n\t\t{\r\n\t\t\tdocument.execCommand(\"insertText\", false, this.numberFormat.decimalSeparator);\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"number-input>.input-control>.input-control-inner .input-input::-webkit-inner-spin-button,number-input>.input-control>.input-control-inner .input-input::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/inputs/number-input/number-input.scss\"],\"names\":[],\"mappings\":\"AAMG,kLAIC,uBAAA,CAAA,eAAA,CACA,QAAA\",\"sourcesContent\":[\"number-input\\r\\n{\\r\\n\\t> .input-control > .input-control-inner\\r\\n\\t{\\r\\n\\t\\t.input-input\\r\\n\\t\\t{\\r\\n\\t\\t\\t&::-webkit-inner-spin-button,\\r\\n\\t\\t\\t&::-webkit-outer-spin-button\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Remove spin buttons.\\r\\n\\t\\t\\t\\tappearance: none;\\r\\n\\t\\t\\t\\tmargin: 0;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\r\nimport { Id } from \"shared/utilities\";\r\nimport { EnterKeyHint } from \"../input\";\r\n\r\n/**\r\n * Custom element representing a password input.\r\n */\r\n@autoinject\r\nexport class PasswordInputCustomElement\r\n{\r\n\t/**\r\n\t * The unique ID of the control.\r\n\t */\r\n\tprotected id = Id.sequential();\r\n\r\n\t/**\r\n\t * Whether if the input field has been focused.\r\n\t */\r\n\tprotected focused: boolean = false;\r\n\r\n\t/**\r\n\t * The input element.\r\n\t */\r\n\tprotected inputElement: HTMLInputElement;\r\n\r\n\t/**\r\n\t * Gets the input value.\r\n\t */\r\n\t@computedFrom(\"value\")\r\n\tprotected get inputValue(): string\r\n\t{\r\n\t\treturn this.value != null ? this.value : \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the input value.\r\n\t */\r\n\tprotected set inputValue(value: string)\r\n\t{\r\n\t\tthis.value = value || undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * The value of the input, or undefined if the input is empty.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: string | undefined;\r\n\r\n\t/**\r\n\t * True if the input is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the input is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n\r\n\t/**\r\n\t * The autocomplete mode to use.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic autocomplete: \"on\" | \"off\" | \"new-password\" | \"current-password\";\r\n\r\n\t/**\r\n\t * True to select the contents when the input is focused, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic autoselect: boolean;\r\n\r\n\t/**\r\n\t * The hint indicating the type of `Enter` key to show on a virtual keyboard\r\n\t * for a single-line text input, or undefined to use the default behavior.\r\n\t */\r\n\t@bindable({ defaultValue: \"search\" })\r\n\tpublic enterkey: EnterKeyHint | undefined;\r\n\r\n\t/**\r\n\t * The max length of the value, or undefined to use the max supported length.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic maxlength: number | undefined;\r\n\r\n\t/**\r\n\t * True to remove leading and trailing whitespace, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic trim: boolean;\r\n\r\n\t/**\r\n\t * Called when the input receives focus.\r\n\t * Selects the contents of the input, if `autoselect` is enabled.\r\n\t */\r\n\tprotected onFocus(): void\r\n\t{\r\n\t\tthis.focused = true;\r\n\r\n\t\tif (this.autoselect)\r\n\t\t{\r\n\t\t\tsetTimeout(() => this.inputElement.setSelectionRange(0, this.inputElement.value.length), 50);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input looses focus.\r\n\t * If enabled, trims the value to remove leading and trailing whitespace.\r\n\t */\r\n\tprotected onBlur(): void\r\n\t{\r\n\t\tthis.focused = false;\r\n\r\n\t\tif (this.trim && this.value)\r\n\t\t{\r\n\t\t\tthis.value = this.value.trim();\r\n\t\t}\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"password-input>.input-control icon{margin-right:16rem;cursor:pointer}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/inputs/password-input/password-input.scss\"],\"names\":[],\"mappings\":\"AAIE,mCAEC,kBAAA,CACA,cAAA\",\"sourcesContent\":[\"password-input\\n{\\n\\t> .input-control\\n\\t{\\n\\t\\ticon\\n\\t\\t{\\n\\t\\t\\tmargin-right: 16rem;\\n\\t\\t\\tcursor: pointer;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, computedFrom, bindingMode } from \"aurelia-framework\";\r\nimport { Id } from \"shared/utilities\";\r\nimport { AutocompleteHint, EnterKeyHint } from \"../input\";\r\nimport { IPhoneNumber } from \"shared/types\";\r\nimport { PhoneValueConverter } from \"shared/localization\";\r\n\r\nimport { parsePhoneNumber, ParseError } from \"libphonenumber-js/min\";\r\n\r\n/**\r\n * Custom element representing a phone number input.\r\n */\r\n@autoinject\r\nexport class PhoneInputCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param phoneValueConverter The `PhoneValueConverter` instance.\r\n\t */\r\n\tpublic constructor(phoneValueConverter: PhoneValueConverter)\r\n\t{\r\n\t\tthis._phoneValueConverter = phoneValueConverter;\r\n\t}\r\n\r\n\tprivate readonly _phoneValueConverter: PhoneValueConverter;\r\n\r\n\t/**\r\n\t * The unique ID of the input element associated with the label.\r\n\t */\r\n\tprotected id = Id.sequential();\r\n\r\n\t/**\r\n\t * Whether if the input field has been focused.\r\n\t */\r\n\tprotected focused: boolean = false;\r\n\r\n\t/**\r\n\t * The input element.\r\n\t */\r\n\tprotected inputElement: HTMLInputElement;\r\n\r\n\t/**\r\n\t * The value entered in the input element, or undefined if the value is valid and the input is not focused.\r\n\t */\r\n\tprotected enteredValue: string | undefined;\r\n\r\n\t/**\r\n\t * True if the entered value should be validated, otherwise false\r\n\t */\r\n\tprotected validate = false;\r\n\r\n\t/**\r\n\t * True if the entered value is invalid, otherwise false.\r\n\t */\r\n\tprotected invalid = false;\r\n\r\n\t/**\r\n\t * The reason the entered value is invalid, or undefined if unknown or not invalid.\r\n\t */\r\n\tprotected invalidReason: \"INVALID_COUNTRY\" | \"NOT_A_NUMBER\" | \"TOO_LONG\" | \"TOO_SHORT\" | undefined;\r\n\r\n\t/**\r\n\t * Gets the value of the input element based on the value of the component.\r\n\t */\r\n\t@computedFrom(\"enteredValue\", \"value\")\r\n\tprotected get inputValue(): string\r\n\t{\r\n\t\t// If the user entered a value, return that.\r\n\t\tif (this.enteredValue != null)\r\n\t\t{\r\n\t\t\treturn this.enteredValue;\r\n\t\t}\r\n\r\n\t\t// Return the value of the input element.\r\n\t\treturn this.value ? this._phoneValueConverter.toView(this.value) as string : \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the value of the component based on the value of the input element.\r\n\t * Note that the value is only set if the input value can be parsed successfully.\r\n\t */\r\n\tprotected set inputValue(value: string)\r\n\t{\r\n\t\t// Store the value entered by the user.\r\n\t\tthis.enteredValue = value;\r\n\r\n\t\t// Parse the value of the input element.\r\n\t\tif (value)\r\n\t\t{\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tconst phoneNumber = parsePhoneNumber(value, this.defaultCountryCode as any);\r\n\r\n\t\t\t\tif (phoneNumber.isPossible())\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.value =\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcountryCode: phoneNumber.country,\r\n\t\t\t\t\t\tcountryCallingCode: phoneNumber.countryCallingCode as string,\r\n\t\t\t\t\t\tnationalNumber: phoneNumber.nationalNumber as string\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tthis.invalid = false;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.value = undefined;\r\n\t\t\t\t\tthis.invalid = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (error)\r\n\t\t\t{\r\n\t\t\t\tthis.invalidReason = error instanceof ParseError ? error.message as any : undefined;\r\n\r\n\t\t\t\tthis.value = undefined;\r\n\t\t\t\tthis.invalid = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.value = undefined;\r\n\t\t\tthis.invalid = false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * The value of the input, or undefined if the input is empty or invalid.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: IPhoneNumber | undefined;\r\n\r\n\t/**\r\n\t * True if the input is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the input is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n\r\n\t/**\r\n\t * The hint indicating the type of `Enter` key to show on a virtual keyboard,\r\n\t * or undefined to use the default behavior.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic enterkey: EnterKeyHint | undefined;\r\n\r\n\t/**\r\n\t * The autocomplete mode to use, or undefined to use the default behavior.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic autocomplete: AutocompleteHint;\r\n\r\n\t/**\r\n\t * True to select the content when the input is focused, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic autoselect: boolean;\r\n\r\n\t/**\r\n\t * The upper-case ISO 3166-1 Alpha 2 country code to use, if no country calling\r\n\t * code is specified, or undefined to always require a country calling code.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic defaultCountryCode: string;\r\n\r\n\t/**\r\n\t * Called when the input element receives focus.\r\n\t * Selects the content of the input element, if `autoselect` is enabled.\r\n\t */\r\n\tprotected onFocus(): void\r\n\t{\r\n\t\tthis.validate = this.invalid;\r\n\t\tthis.focused = true;\r\n\r\n\t\tif (this.autoselect)\r\n\t\t{\r\n\t\t\tsetTimeout(() => this.inputElement.setSelectionRange(0, this.inputElement.value.length), 50);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input element looses focus.\r\n\t * Clears the value entered by the user.\r\n\t */\r\n\tprotected onBlur(): void\r\n\t{\r\n\t\tthis.validate = true;\r\n\t\tthis.focused = false;\r\n\r\n\t\tif (!this.invalid)\r\n\t\t{\r\n\t\t\tthis.enteredValue = undefined;\r\n\t\t\tthis.inputElement.value = this.inputValue;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed.\r\n\t * Prevents the user from entering some invalid values.\r\n\t * @returns True to continue, false to prevent default.\r\n\t */\r\n\tprotected onKeyDown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\t// Never handle the event if default has been prevented.\r\n\t\tif (event.defaultPrevented)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Never block special keys or key combinations.\r\n\t\tif (!event.key || event.key.length > 1 || event.metaKey || event.ctrlKey)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tconst selectionStart = this.inputElement.selectionStart!;\r\n\t\tconst selectionEnd = this.inputElement.selectionEnd;\r\n\t\tconst inputValue = this.inputElement.value;\r\n\r\n\t\t// Prevent the user from entering something other than a digit or a plus sign.\r\n\t\tif (!/\\d|\\+/.test(event.key))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Prevent the user from entering a plus sign, except at the beginning of the value.\r\n\t\tif (/\\+/.test(event.key) && (selectionStart > 0 || ((selectionEnd ?? selectionStart) <= inputValue.indexOf(\"+\"))))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Prevent the user from entering a digit in front of the plus sign.\r\n\t\tif (/\\d/.test(event.key) && ((selectionEnd ?? selectionStart) <= inputValue.indexOf(\"+\")))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","import { autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\r\nimport { Id } from \"shared/utilities\";\r\nimport { AutocompleteHint, AutocorrectHint, AutocapitalizeHint, EnterKeyHint, SpellcheckHint } from \"../input\";\r\n\r\n/**\r\n * Custom element representing a search input.\r\n */\r\n@autoinject\r\nexport class SearchInputCustomElement\r\n{\r\n\t/**\r\n\t * The unique ID of the control.\r\n\t */\r\n\tprotected id = Id.sequential();\r\n\r\n\t/**\r\n\t * Whether if the input field has been focused.\r\n\t */\r\n\tprotected focused: boolean = false;\r\n\r\n\t/**\r\n\t * The input element.\r\n\t */\r\n\tprotected inputElement: HTMLInputElement;\r\n\r\n\t/**\r\n\t * Gets the input value.\r\n\t */\r\n\t@computedFrom(\"value\")\r\n\tprotected get inputValue(): string\r\n\t{\r\n\t\treturn this.value != null ? this.value : \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the input value.\r\n\t */\r\n\tprotected set inputValue(value: string)\r\n\t{\r\n\t\tthis.value = value || undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * The value of the input, or undefined if the input is empty.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: string | undefined;\r\n\r\n\t/**\r\n\t * True if the input is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the input is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n\r\n\t/**\r\n\t * The autocomplete mode to use.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic autocomplete: AutocompleteHint;\r\n\r\n\t/**\r\n\t * The autocorrect mode to use.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic autocorrect: AutocorrectHint;\r\n\r\n\t/**\r\n\t * The autocapitalize mode to use.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic autocapitalize: AutocapitalizeHint;\r\n\r\n\t/**\r\n\t * True to select the contents when the input is focused, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic autoselect: boolean;\r\n\r\n\t/**\r\n\t * The spellcheck mode to use.\r\n\t */\r\n\t@bindable({ defaultValue: \"auto\" })\r\n\tpublic spellcheck: SpellcheckHint;\r\n\r\n\t/**\r\n\t * The hint indicating the type of `Enter` key to show on a virtual keyboard\r\n\t * for a single-line text input, or undefined to use the default behavior.\r\n\t */\r\n\t@bindable({ defaultValue: \"search\" })\r\n\tpublic enterkey: EnterKeyHint | undefined;\r\n\r\n\t/**\r\n\t * The max length of the value, or undefined to use the max supported length.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic maxlength: number | undefined;\r\n\r\n\t/**\r\n\t * True to remove leading and trailing whitespace, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic trim: boolean;\r\n\r\n\t/**\r\n\t * Called when the input receives focus.\r\n\t * Selects the contents of the input, if `autoselect` is enabled.\r\n\t */\r\n\tprotected onFocus(): void\r\n\t{\r\n\t\tthis.focused = true;\r\n\r\n\t\tif (this.autoselect)\r\n\t\t{\r\n\t\t\tsetTimeout(() => this.inputElement.setSelectionRange(0, this.inputElement.value.length), 50);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input looses focus.\r\n\t * If enabled, trims the value to remove leading and trailing whitespace.\r\n\t */\r\n\tprotected onBlur(): void\r\n\t{\r\n\t\tthis.focused = false;\r\n\r\n\t\tif (this.trim && this.value)\r\n\t\t{\r\n\t\t\tthis.value = this.value.trim();\r\n\t\t}\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","import { autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\r\nimport { LabelPosition } from \"../../control\";\r\nimport { AutocompleteHint } from \"../input\";\r\nimport { ItemPickerCustomElement } from \"../../pickers/item-picker/item-picker\";\r\n\r\n/**\r\n * Custom element representing an input for picking a single item from a list.\r\n */\r\n@autoinject\r\nexport class SelectInputCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element representing the component.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement;\r\n\r\n\t/**\r\n\t * The element representing the input.\r\n\t */\r\n\tprotected inputElement: HTMLElement;\r\n\r\n\t/**\r\n\t * The element representing the toggle icon.\r\n\t */\r\n\tprotected toggleElement: HTMLElement;\r\n\r\n\t/**\r\n\t * The view model for the item picker.\r\n\t */\r\n\tprotected itemPicker: ItemPickerCustomElement;\r\n\r\n\t/**\r\n\t * Gets the input value.\r\n\t */\r\n\t@computedFrom(\"open\", \"filter\", \"filterValue\", \"displayValue\", \"value\")\r\n\tprotected get inputValue(): string\r\n\t{\r\n\t\tif (this.open)\r\n\t\t{\r\n\t\t\tif (this.filter !== \"off\" && this.filterValue != null)\r\n\t\t\t{\r\n\t\t\t\treturn this.filterValue;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif (this.displayValue != null)\r\n\t\t\t{\r\n\t\t\t\treturn this.displayValue.toString();\r\n\t\t\t}\r\n\r\n\t\t\tif (this.value != null)\r\n\t\t\t{\r\n\t\t\t\treturn this.value.toString();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the input value.\r\n\t */\r\n\tprotected set inputValue(value: string)\r\n\t{\r\n\t\tif (value)\r\n\t\t{\r\n\t\t\tthis.filterValue = value;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.filterValue = undefined;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * The position of the label, or undefined to show no label.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic label: LabelPosition | undefined;\r\n\r\n\t/**\r\n\t * The value of the item picked by the user, or undefined if no item has been picked.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: any | undefined;\r\n\r\n\t/**\r\n\t * The value of the item that is focused, but not yet picked, or undefined if no item has been focused.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic focusedValue: any | undefined;\r\n\r\n\t/**\r\n\t * The value to shown in the input, or undefined to use the string representation of the `value`.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic displayValue: any | undefined;\r\n\r\n\t/**\r\n\t * True to show the `None` option, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic none: boolean;\r\n\r\n\t/**\r\n\t * The type of filtering to use, where `off` means no filtering, `auto` means filtering based on\r\n\t * the text presented in the items, and `custom` means that the input element is enabled, but the\r\n\t * actual filtering the items is an external concern.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic filter: \"off\" | \"auto\" | \"custom\";\r\n\r\n\t/**\r\n\t * The value entered in the input element, or undefined if no value is entered.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic filterValue: string | undefined;\r\n\r\n\t/**\r\n\t * True if the dropdown is open, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false, defaultBindingMode: bindingMode.fromView })\r\n\tpublic open: boolean;\r\n\r\n\t/**\r\n\t * True if the input is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the input is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n\r\n\t/**\r\n\t * The autocomplete mode to use,\r\n\t * or undefined to use the default behavior.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic autocomplete: AutocompleteHint;\r\n\r\n\t/**\r\n\t * True to select the contents when the input is focused, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic autoselect: boolean;\r\n\r\n\t/**\r\n\t * True to use `fixed` positioning for the dropdown, otherwise false.\r\n\t * This may be needed if the dropdown is placed within a container that\r\n\t * hides overflowing content, but note that it has a performance cost.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic fixed: boolean;\r\n\r\n\t/**\r\n\t * Opens the dropdown and optionally focuses the input element.\r\n\t * @param focusInput True to focus the input element, otherwise false.\r\n\t */\r\n\tprotected openDropdown(focusInput: boolean): void\r\n\t{\r\n\t\tthis.open = true;\r\n\t\tthis.focusedValue = this.value;\r\n\r\n\t\tsetTimeout(() => this.itemPicker?.scrollToFocusedValue());\r\n\r\n\t\tif (focusInput)\r\n\t\t{\r\n\t\t\tsetTimeout(() => this.inputElement.focus());\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Closes the dropdown, clears the filter value and optionally focuses the toggle icon.\r\n\t * Also reverts the focused value if no value was picked.\r\n\t * @param focusToggle True to focus the toggle icon, otherwise false.\r\n\t * @param pick True if the user picked a value, otherwise false.\r\n\t */\r\n\tprotected closeDropdown(focusToggle: boolean, pick = false): void\r\n\t{\r\n\t\tthis.open = false;\r\n\t\tthis.filterValue = undefined;\r\n\r\n\t\tif (pick && this.focusedValue !== this.value)\r\n\t\t{\r\n\t\t\tthis.value = this.focusedValue;\r\n\r\n\t\t\t// Dispatch the `input` event to indicate that the comitted value, has changed.\r\n\t\t\tthis._element.dispatchEvent(new CustomEvent(\"input\", { bubbles: true, detail: { value: this.value } }));\r\n\r\n\t\t\t// Dispatch the `change` event to indicate that the comitted value, has changed.\r\n\t\t\tthis._element.dispatchEvent(new CustomEvent(\"change\", { bubbles: true, detail: { value: this.value } }));\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.focusedValue = this.value;\r\n\t\t}\r\n\r\n\t\tif (focusToggle)\r\n\t\t{\r\n\t\t\tthis.toggleElement.focus();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the toggle icon is clicked, and if filtering is disabled, when the input element is clicked.\r\n\t * Toggles the dropdown between its open and closed state, focusing either the input element or toggle icon.\r\n\t */\r\n\tprotected toggleDropdown(): void\r\n\t{\r\n\t\tif (this.open)\r\n\t\t{\r\n\t\t\tthis.closeDropdown(true, true);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.openDropdown(true);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input element is clicked.\r\n\t * Opens the dropdown and focuses the input element.\r\n\t * @param event The mouse event.\r\n\t * @returns True to continue.\r\n\t */\r\n\tprotected onInputMouseDown(event: MouseEvent): boolean\r\n\t{\r\n\t\tif (!event.defaultPrevented)\r\n\t\t{\r\n\t\t\tif (!this.open)\r\n\t\t\t{\r\n\t\t\t\tthis.openDropdown(true);\r\n\t\t\t}\r\n\t\t\telse if (this.filter === \"off\")\r\n\t\t\t{\r\n\t\t\t\tthis.closeDropdown(false);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a `mousedown` event occurs on the dropdown.\r\n\t * Prevents default for the event, so it won't cause unwanted effects in ancestor elements.\r\n\t * @returns False to prevent default.\r\n\t */\r\n\tprotected onDropdownMouseDown(): boolean\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input, or an element within the input, receives focus.\r\n\t * Opens the dropdown if the focused element is not the toggle icon.\r\n\t * @param event The focus event.\r\n\t */\r\n\tprotected onInputFocusIn(event: FocusEvent): void\r\n\t{\r\n\t\tif (event.target !== this.toggleElement && !this.open)\r\n\t\t{\r\n\t\t\tthis.openDropdown(false);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when an event is triggered.\r\n\t * Prevents the event from bubbling further, as this input dispatches its own event.\r\n\t * @param event The event.\r\n\t */\r\n\tprotected onInternalEvent(event: Event): void\r\n\t{\r\n\t\tevent.stopPropagation();\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `value` property changes.\r\n\t * Ensures the focused value matches the new value.\r\n\t */\r\n\tprotected valueChanged(): void\r\n\t{\r\n\t\tthis.focusedValue = this.value;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"select-input{display:block}select-input .--readonly{pointer-events:none}select-input>text-input.input>.input-control>.input-control-inner .input-input{padding-right:0}select-input>text-input dropdown{display:flex}select-input>text-input item-picker{flex-grow:1}select-input>text-input dropdown-icon{padding:var(--input-padding)}select-input:not(.--open)>text-input,select-input:not(.--filter)>text-input{cursor:pointer}select-input:not(.--open)>text-input>.input-control>.input-control-inner,select-input:not(.--filter)>text-input>.input-control>.input-control-inner{pointer-events:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/inputs/select-input/select-input.scss\"],\"names\":[],\"mappings\":\"AAAA,aAEC,aAAA,CAEA,yBAEC,mBAAA,CAKA,+EAGC,eAAA,CAGD,iCAEC,YAAA,CAGD,oCAEC,WAAA,CAGD,sCAGC,4BAAA,CAIF,4EAIC,cAAA,CAEA,oJAGC,mBAAA\",\"sourcesContent\":[\"select-input\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\t.--readonly\\r\\n\\t{\\r\\n\\t\\tpointer-events: none;\\r\\n\\t}\\r\\n\\r\\n\\t> text-input\\r\\n\\t{\\r\\n\\t\\t&.input > .input-control > .input-control-inner .input-input\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Remove padding at the end closest to the toggle icon.\\r\\n\\t\\t\\tpadding-right: 0;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tdropdown\\r\\n\\t\\t{\\r\\n\\t\\t\\tdisplay: flex;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\titem-picker\\r\\n\\t\\t{\\r\\n\\t\\t\\tflex-grow: 1;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tdropdown-icon\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply input padding.\\r\\n\\t\\t\\tpadding: var(--input-padding);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--open) > text-input,\\r\\n\\t&:not(.--filter) > text-input\\r\\n\\t{\\r\\n\\t\\t// Use cursor to indicate the element is clickable, when not accepting text input.\\r\\n\\t\\tcursor: pointer;\\r\\n\\r\\n\\t\\t> .input-control > .input-control-inner\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Disable pointer events to prevent unwanted text selection on double click.\\r\\n\\t\\t\\tpointer-events: none;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\r\nimport { Id } from \"shared/utilities\";\r\nimport { AutocompleteHint, EnterKeyHint } from \"../input\";\r\n\r\n/**\r\n * Custom element representing a slug input.\r\n */\r\n@autoinject\r\nexport class SlugInputCustomElement\r\n{\r\n\t/**\r\n\t * The unique ID of the control.\r\n\t */\r\n\tprotected id = Id.sequential();\r\n\r\n\t/**\r\n\t * The input element.\r\n\t */\r\n\tprotected inputElement: HTMLInputElement | HTMLTextAreaElement;\r\n\r\n\t/**\r\n\t * Gets the input value.\r\n\t */\r\n\t@computedFrom(\"value\")\r\n\tprotected get inputValue(): string\r\n\t{\r\n\t\treturn this.value != null ? this.value : \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the input value.\r\n\t */\r\n\tprotected set inputValue(value: string)\r\n\t{\r\n\t\tthis.value = value || undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * The value of the input, or undefined if the input is empty.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: string | undefined;\r\n\r\n\t/**\r\n\t * True if the input is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the input is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n\r\n\t/**\r\n\t * The autocomplete mode to use.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic autocomplete: AutocompleteHint;\r\n\r\n\t/**\r\n\t * True to select the contents when the input is focused, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic autoselect: boolean;\r\n\r\n\t/**\r\n\t * The hint indicating the type of `Enter` key to show on a virtual keyboard,\r\n\t * or undefined to use the default behavior.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic enterkey: EnterKeyHint | undefined;\r\n\r\n\t/**\r\n\t * The max length of the value, or undefined to use the max supported length.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic maxlength: number | undefined;\r\n\r\n\t/**\r\n\t * Called when the input receives focus.\r\n\t * Selects the contents of the input, if `autoselect` is enabled.\r\n\t */\r\n\tprotected onFocus(): void\r\n\t{\r\n\t\tif (this.autoselect)\r\n\t\t{\r\n\t\t\tsetTimeout(() => this.inputElement.setSelectionRange(0, this.inputElement.value.length), 50);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input looses focus.\r\n\t * Trims the value to remove leading and trailing whitespace.\r\n\t */\r\n\tprotected onBlur(): void\r\n\t{\r\n\t\tif (this.value)\r\n\t\t{\r\n\t\t\tthis.value = this.value.trim();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed.\r\n\t * Prevents the user from entering invalid characters.\r\n\t * @returns True to continue, false to prevent default.\r\n\t */\r\n\tprotected onKeyDown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\t// Never block special keys or key combinations.\r\n\t\tif (event.defaultPrevented || !event.key || event.key.length > 1 || event.metaKey || event.ctrlKey)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn /^[-a-z0-9]$/.test(event.key);\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"slug-input>.input-control>span[slot=before]+.input-control-inner .input-input,slug-input>.input-control>span[slot=before]+.input-control-inner .input-value,slug-input>.input-control>span[slot=before]+.input-control-inner .input-placeholder{padding-left:2rem !important}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/inputs/slug-input/slug-input.scss\"],\"names\":[],\"mappings\":\"AAEC,gPAIC,4BAAA\",\"sourcesContent\":[\"slug-input\\r\\n{\\r\\n\\t> .input-control > span[slot=\\\"before\\\"] + .input-control-inner .input-input,\\r\\n\\t> .input-control > span[slot=\\\"before\\\"] + .input-control-inner .input-value,\\r\\n\\t> .input-control > span[slot=\\\"before\\\"] + .input-control-inner .input-placeholder\\r\\n\\t{\\r\\n\\t\\tpadding-left: 2rem !important;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, Container } from \"aurelia-framework\";\r\nimport { TagsInputCustomElement } from \"./tags-input\";\r\n\r\n/**\r\n * Custom element representing a tag in a tags input.\r\n */\r\n@autoinject\r\nexport class TagCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the class.\r\n\t * @param container The `Container` instance associated with the component.\r\n\t */\r\n\tpublic constructor(container: Container)\r\n\t{\r\n\t\tif (container.hasResolver(TagsInputCustomElement, true))\r\n\t\t{\r\n\t\t\tthis.tagsInput = container.get(TagsInputCustomElement);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * The `tags-input` associated with the tag, if any.\r\n\t */\r\n\tprotected readonly tagsInput: TagsInputCustomElement | undefined;\r\n\r\n\t/**\r\n\t * The value associated with the element.\r\n\t */\r\n\t@bindable\r\n\tpublic model: any;\r\n\r\n\t/**\r\n\t * Called when the remove icon is clicked.\r\n\t */\r\n\t@bindable\r\n\tpublic remove: (() => void) | undefined;\r\n\r\n\t/**\r\n\t * Called when the remove icon is clicked.\r\n\t * Removes the tag from the input value.\r\n\t * @returns False to prevent default.\r\n\t */\r\n\tprotected onRemoveMouseDown(): boolean\r\n\t{\r\n\t\tif (this.remove != null)\r\n\t\t{\r\n\t\t\tthis.remove();\r\n\t\t}\r\n\r\n\t\tif (this.tagsInput != null)\r\n\t\t{\r\n\t\t\tthis.tagsInput.deselectItem(this.model);\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--tag-padding: 4rem 7rem;--tag-border-width: var(--border-width-thin);--tag-border-radius: var(--border-radius-small)}tag{--tag-border-color: var(--surface-input-surface-tag-border-color);--tag-surface-color: var(--surface-input-surface-tag-surface-color);--tag-surface-text-color: var(--surface-input-surface-tag-surface-text-color);--tag-surface-icon-color: var(--surface-input-surface-tag-surface-icon-color);--tag-surface-icon-color--hover: var(--surface-input-surface-tag-surface-icon-color--hover)}tag{display:flex;align-items:center;padding:var(--tag-padding);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:var(--tag-border-width) solid;border-radius:var(--tag-border-radius);border-color:var(--tag-border-color);background:var(--tag-surface-color);color:var(--tag-surface-text-color)}tags-input tag{margin-top:4rem}tags-input tag:not(:last-child){margin-right:4rem}tag .tag-remove{display:flex;align-items:center;margin-left:auto}tag icon{margin-left:var(--size-inline-spacing);color:var(--tag-surface-icon-color);cursor:pointer}tag icon:hover{color:var(--tag-surface-icon-color--hover)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/inputs/tags-input/tag.scss\"],\"names\":[],\"mappings\":\"AAAA,MAMC,wBAAA,CAGA,4CAAA,CAGA,+CAAA,CAGD,IAIC,iEAAA,CAIA,mEAAA,CAIA,6EAAA,CAIA,6EAAA,CACA,2FAAA,CAGD,IAGC,YAAA,CACA,kBAAA,CAcA,0BAAA,CAGA,kBAAA,CACA,eAAA,CACA,sBAAA,CAGA,oCAAA,CACA,sCAAA,CAGA,oCAAA,CACA,mCAAA,CACA,mCAAA,CAzBA,eAEC,eAAA,CAEA,gCAEC,iBAAA,CAqBF,gBAGC,YAAA,CACA,kBAAA,CAGA,gBAAA,CAGD,SAEC,sCAAA,CACA,mCAAA,CACA,cAAA,CAEA,eAEC,0CAAA\",\"sourcesContent\":[\":root\\r\\n{\\r\\n\\t// TODO: What about hover and focused states?\\r\\n\\r\\n\\t/// The padding of the component.\\r\\n\\t/// The default is chosen so the tag fits within an input control.\\r\\n\\t--tag-padding: 4rem 7rem;\\r\\n\\r\\n\\t/// The width of the border of the component.\\r\\n\\t--tag-border-width: var(--border-width-thin);\\r\\n\\r\\n\\t/// The radius of the border of the component.\\r\\n\\t--tag-border-radius: var(--border-radius-small);\\r\\n}\\r\\n\\r\\ntag\\r\\n{\\r\\n\\t/// The color of the border of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--tag-border-color: var(--surface-input-surface-tag-border-color);\\r\\n\\r\\n\\t/// The color of the surface of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--tag-surface-color: var(--surface-input-surface-tag-surface-color);\\r\\n\\r\\n\\t/// The color of text on the surface of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--tag-surface-text-color: var(--surface-input-surface-tag-surface-text-color);\\r\\n\\r\\n\\t/// The color of icons on the surface of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--tag-surface-icon-color: var(--surface-input-surface-tag-surface-icon-color);\\r\\n\\t--tag-surface-icon-color--hover: var(--surface-input-surface-tag-surface-icon-color--hover);\\r\\n}\\r\\n\\r\\ntag\\r\\n{\\r\\n\\t// Use Horizontal flex layout.\\r\\n\\tdisplay: flex;\\r\\n\\talign-items: center;\\r\\n\\r\\n\\t// Apply margin between tags, if placed within a tag-input.\\r\\n\\ttags-input &\\r\\n\\t{\\r\\n\\t\\tmargin-top: 4rem;\\r\\n\\r\\n\\t\\t&:not(:last-child)\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-right: 4rem;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t// Apply padding.\\r\\n\\tpadding: var(--tag-padding);\\r\\n\\r\\n\\t// Truncate text content with an ellipsis.\\r\\n\\twhite-space: nowrap;\\r\\n\\toverflow: hidden;\\r\\n\\ttext-overflow: ellipsis;\\r\\n\\r\\n\\t// Apply a border around the component.\\r\\n\\tborder: var(--tag-border-width) solid;\\r\\n\\tborder-radius: var(--tag-border-radius);\\r\\n\\r\\n\\t// Apply component style.\\r\\n\\tborder-color: var(--tag-border-color);\\r\\n\\tbackground: var(--tag-surface-color);\\r\\n\\tcolor: var(--tag-surface-text-color);\\r\\n\\r\\n\\t.tag-remove\\r\\n\\t{\\r\\n\\t\\t// Use Horizontal flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\talign-items: center;\\r\\n\\r\\n\\t\\t// Push to the right.\\r\\n\\t\\tmargin-left: auto;\\r\\n\\t}\\r\\n\\r\\n\\ticon\\r\\n\\t{\\r\\n\\t\\tmargin-left: var(--size-inline-spacing);\\r\\n\\t\\tcolor: var(--tag-surface-icon-color);\\r\\n\\t\\tcursor: pointer;\\r\\n\\r\\n\\t\\t&:hover\\r\\n\\t\\t{\\r\\n\\t\\t\\tcolor: var(--tag-surface-icon-color--hover);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\r\nimport { LabelPosition } from \"../../control\";\r\nimport { AutocompleteHint } from \"../input\";\r\nimport { ItemPickerCustomElement } from \"../../pickers/item-picker/item-picker\";\r\n\r\n/**\r\n * Custom element representing an input for picking one or more items from a list.\r\n */\r\n@autoinject\r\nexport class TagsInputCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element representing the component.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement;\r\n\r\n\t/**\r\n\t * The element representing the input.\r\n\t */\r\n\tprotected inputElement: HTMLElement;\r\n\r\n\t/**\r\n\t * The element representing the toggle icon.\r\n\t */\r\n\tprotected toggleElement: HTMLElement;\r\n\r\n\t/**\r\n\t * The view model for the item picker.\r\n\t */\r\n\tprotected itemPicker: ItemPickerCustomElement;\r\n\r\n\t/**\r\n\t * Gets the input value.\r\n\t */\r\n\t@computedFrom(\"open\", \"new\", \"filter\", \"filterValue\")\r\n\tprotected get inputValue(): string\r\n\t{\r\n\t\tif ((this.new || this.filter !== \"off\") && this.filterValue != null)\r\n\t\t{\r\n\t\t\treturn this.filterValue;\r\n\t\t}\r\n\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the input value.\r\n\t */\r\n\tprotected set inputValue(value: string)\r\n\t{\r\n\t\tif (value)\r\n\t\t{\r\n\t\t\tthis.filterValue = value;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.filterValue = undefined;\r\n\t\t}\r\n\r\n\t\tif (this.new)\r\n\t\t{\r\n\t\t\tthis.focusedValue = value;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * The position of the label, or undefined to show no label.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic label: LabelPosition | undefined;\r\n\r\n\t/**\r\n\t * The models associated with the items picked by the user, or undefined if no items have been picked.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: any[] | undefined;\r\n\r\n\t/**\r\n\t * The value of the item that is focused, but not yet picked, or undefined if no item has been focused.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic focusedValue: any | undefined;\r\n\r\n\t/**\r\n\t * The type of filtering to use, where `off` means no filtering, `auto` means filtering based on\r\n\t * the text presented in the items, and `custom` means that the input element is enabled, but the\r\n\t * actual filtering the items is an external concern.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic filter: \"off\" | \"auto\" | \"custom\";\r\n\r\n\t/**\r\n\t * The value entered in the input element, or undefined if no value is entered.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic filterValue: string | undefined;\r\n\r\n\t/**\r\n\t * True to show the `New tag` option, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic new: boolean;\r\n\r\n\t/**\r\n\t * True if the dropdown is open, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false, defaultBindingMode: bindingMode.fromView })\r\n\tpublic open: boolean;\r\n\r\n\t/**\r\n\t * True if the input is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the input is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n\r\n\t/**\r\n\t * The autocomplete mode to use,\r\n\t * or undefined to use the default behavior.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic autocomplete: AutocompleteHint;\r\n\r\n\t/**\r\n\t * True to select the contents when the input is focused, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic autoselect: boolean;\r\n\r\n\t/**\r\n\t * True to use `fixed` positioning for the dropdown, otherwise false.\r\n\t * This may be needed if the dropdown is placed within a container that\r\n\t * hides overflowing content, but note that it has a performance cost.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic fixed: boolean;\r\n\r\n\t/**\r\n\t * Called by an item when it wants to remove itself from the value.\r\n\t * Removes the model associated with the item from the value.\r\n\t * @param model The model associated with the item.\r\n\t */\r\n\tpublic deselectItem(model: any): void\r\n\t{\r\n\t\tconst value = [...this.value!];\r\n\t\tconst index = value.indexOf(model);\r\n\t\tvalue.splice(index, 1);\r\n\r\n\t\tif (value.length > 0)\r\n\t\t{\r\n\t\t\tthis.value = value;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.value = undefined;\r\n\t\t}\r\n\r\n\t\t// Dispatch the `input` event to indicate that the comitted value, has changed.\r\n\t\tthis._element.dispatchEvent(new CustomEvent(\"input\", { bubbles: true, detail: { value: this.value } }));\r\n\r\n\t\t// Dispatch the `input` event to indicate that the comitted value, has changed.\r\n\t\tthis._element.dispatchEvent(new CustomEvent(\"input\", { bubbles: true, detail: { value: this.value } }));\r\n\t}\r\n\r\n\t/**\r\n\t * Opens the dropdown and optionally focuses the input element.\r\n\t * @param focusInput True to focus the input element, otherwise false.\r\n\t */\r\n\tprotected openDropdown(focusInput: boolean): void\r\n\t{\r\n\t\tthis.open = true;\r\n\t\tthis.focusedValue = undefined;\r\n\r\n\t\tsetTimeout(() => this.itemPicker?.scrollToFocusedValue());\r\n\r\n\t\tif (focusInput)\r\n\t\t{\r\n\t\t\tsetTimeout(() => this.inputElement.focus());\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Closes the dropdown, clears the filter value and optionally focuses the toggle icon.\r\n\t * Also reverts the focused value if no value was picked.\r\n\t * @param focusToggle True to focus the toggle icon, otherwise false.\r\n\t * @param pick True if the user picked a value, otherwise false.\r\n\t */\r\n\tprotected closeDropdown(focusToggle: boolean, pick = false): void\r\n\t{\r\n\t\t// Click outside or escape.\r\n\t\tif (!focusToggle || !pick)\r\n\t\t{\r\n\t\t\tthis.open = false;\r\n\t\t}\r\n\r\n\t\tthis.filterValue = undefined;\r\n\r\n\t\tif (pick && this.focusedValue && !this.value?.includes(this.focusedValue))\r\n\t\t{\r\n\t\t\t// To ensuere a binding update is triggered, replace the\r\n\t\t\t// value with a new array including the picked value.\r\n\t\t\tconst value = this.value != null ? [...this.value] : [];\r\n\t\t\tvalue.push(this.focusedValue);\r\n\t\t\tthis.value = value;\r\n\r\n\t\t\t// Dispatch the `input` event to indicate that the comitted value, has changed.\r\n\t\t\tthis._element.dispatchEvent(new CustomEvent(\"input\", { bubbles: true, detail: { value: this.value } }));\r\n\r\n\t\t\t// Dispatch the `change` event to indicate that the comitted value, has changed.\r\n\t\t\tthis._element.dispatchEvent(new CustomEvent(\"change\", { bubbles: true, detail: { value: this.value } }));\r\n\t\t}\r\n\r\n\t\tthis.focusedValue = undefined;\r\n\r\n\t\tif (focusToggle && !pick)\r\n\t\t{\r\n\t\t\tsetTimeout(() => this.toggleElement.focus());\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the toggle icon is clicked, and if filtering is disabled, when the input element is clicked.\r\n\t * Toggles the dropdown between its open and closed state, focusing either the input element or toggle icon.\r\n\t */\r\n\tprotected toggleDropdown(): void\r\n\t{\r\n\t\tif (this.open)\r\n\t\t{\r\n\t\t\tthis.closeDropdown(true, true);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.openDropdown(true);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed within the input element.\r\n\t * Deletes the last tag when `Backspace` is pressed while the input is empty.\r\n\t * @param event The keyboard event.\r\n\t * @returns True to continue, false to prevent default.\r\n\t */\r\n\tprotected onInputKeyDown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\tif (event.defaultPrevented)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (!(event.altKey || event.metaKey || event.shiftKey || event.ctrlKey))\r\n\t\t{\r\n\t\t\tswitch (event.key)\r\n\t\t\t{\r\n\t\t\t\tcase \"Backspace\":\r\n\t\t\t\t{\r\n\t\t\t\t\tif (this.open && !this.filterValue && this.value != null && this.value.length > 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis.open = false;\r\n\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (!this.open && this.value != null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis.value.pop();\r\n\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcase \"Enter\":\r\n\t\t\t\t{\r\n\t\t\t\t\tif (!this.open)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis.openDropdown(true);\r\n\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.open = true;\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input element is clicked.\r\n\t * Opens the dropdown and focuses the input element.\r\n\t * @param event The mouse event.\r\n\t * @returns True to continue.\r\n\t */\r\n\tprotected onInputMouseDown(event: MouseEvent): boolean\r\n\t{\r\n\t\tif (!event.defaultPrevented)\r\n\t\t{\r\n\t\t\tif (event.composedPath().some((e: HTMLElement) => e.nodeName === \"TAG\"))\r\n\t\t\t{\r\n\t\t\t\tsetTimeout(() => this.inputElement.focus());\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif (!this.open)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.openDropdown(true);\r\n\t\t\t\t}\r\n\t\t\t\telse if (!this.new && this.filter === \"off\")\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.closeDropdown(false);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a `mousedown` event occurs on the dropdown.\r\n\t * Prevents default for the event, so it won't cause unwanted effects in ancestor elements.\r\n\t * @returns False to prevent default.\r\n\t */\r\n\tprotected onDropdownMouseDown(): boolean\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the value is clicked.\r\n\t * Prevents the click from focusing the input and opening the dropdown.\r\n\t * @returns False to prevent default.\r\n\t */\r\n\tprotected onValueMouseDown(): boolean\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input, or an element within the input, receives focus.\r\n\t * Opens the dropdown if the focused element is not the toggle icon.\r\n\t * @param event The focus event.\r\n\t */\r\n\tprotected onInputFocusIn(event: FocusEvent): void\r\n\t{\r\n\t\tif (!event.defaultPrevented && event.target !== this.toggleElement && !this.open)\r\n\t\t{\r\n\t\t\tthis.openDropdown(false);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input, or an element within the input, looses focus.\r\n\t * Ensures the state is reset, even if the dropdown is not visible.\r\n\t * @param event The focus event.\r\n\t */\r\n\tprotected onInputFocusOut(event: FocusEvent): void\r\n\t{\r\n\t\tif (!event.defaultPrevented && this.open && this.itemPicker.empty)\r\n\t\t{\r\n\t\t\tthis.closeDropdown(false, false);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a `change` event is triggered on the input.\r\n\t * Prevents the event from bubbling further, as this input dispatches its own event.\r\n\t * @param event The change event.\r\n\t */\r\n\tprotected onInputChange(event: Event): void\r\n\t{\r\n\t\tevent.stopPropagation();\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"tags-input{display:block}tags-input>text-input{width:100%}tags-input>text-input.input>.input-control>.input-control-inner .input-input{padding-right:0}tags-input>text-input dropdown{display:flex}tags-input>text-input item-picker{flex-grow:1}tags-input>text-input dropdown-icon{padding:var(--input-padding)}tags-input:not(.--open)>text-input,tags-input:not(.--filter)>text-input,tags-input:not(.--new)>text-input{cursor:pointer}tags-input:not(.--open)>text-input>.input-control>.input-control-inner,tags-input:not(.--filter)>text-input>.input-control>.input-control-inner,tags-input:not(.--new)>text-input>.input-control>.input-control-inner{pointer-events:none}tags-input .input-control{flex-wrap:wrap;padding-right:6rem}tags-input.--readonly>text-input>.input-control>.input-control-inner{visibility:hidden;height:4rem}tags-input.--readonly>text-input>.input-control dropdown-icon{display:none !important}tags-input.--readonly>text-input>.input-control .tag-remove{display:none}tags-input [slot=before],tags-input [slot=value],tags-input tag{max-width:100%}tags-input [slot=value]:not(:empty),tags-input .tags-input-value-list{display:flex;align-items:flex-start;flex-wrap:wrap;padding-left:4rem}tags-input>text-input>.input-control>.input-control-inner{flex-grow:1;width:auto !important;min-width:160rem;padding-right:42rem}tags-input [slot=after]{position:absolute;right:0;bottom:0}tags-input .tags-input-value{width:100%}tags-input.--stretch [slot=before],tags-input.--stretch [slot=value]:not(:empty){width:100%}tags-input.--stretch tag{margin-right:0;width:100%}tags-input.--stretch tag icon{margin-left:auto}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/inputs/tags-input/tags-input.scss\"],\"names\":[],\"mappings\":\"AAAA,WAEC,aAAA,CAEA,sBAEC,UAAA,CAEA,6EAGC,eAAA,CAGD,+BAEC,YAAA,CAGD,kCAEC,WAAA,CAGD,oCAGC,4BAAA,CAIF,0GAKC,cAAA,CAEA,sNAGC,mBAAA,CAIF,0BAEC,cAAA,CACA,kBAAA,CAGD,qEAEC,iBAAA,CACA,WAAA,CAKA,8DAEC,uBAAA,CAGD,4DAEC,YAAA,CAIF,gEAIC,cAAA,CAGD,sEAGC,YAAA,CACA,sBAAA,CACA,cAAA,CACA,iBAAA,CAGD,0DAEC,WAAA,CACA,qBAAA,CACA,gBAAA,CACA,mBAAA,CAGD,wBAEC,iBAAA,CACA,OAAA,CACA,QAAA,CAGD,6BAEC,UAAA,CAKA,iFAGC,UAAA,CAGD,yBAEC,cAAA,CACA,UAAA,CAEA,8BAEC,gBAAA\",\"sourcesContent\":[\"tags-input\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\t> text-input\\r\\n\\t{\\r\\n\\t\\twidth: 100%;\\r\\n\\r\\n\\t\\t&.input > .input-control > .input-control-inner .input-input\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Remove padding at the end closest to the toggle icon.\\r\\n\\t\\t\\tpadding-right: 0;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tdropdown\\r\\n\\t\\t{\\r\\n\\t\\t\\tdisplay: flex;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\titem-picker\\r\\n\\t\\t{\\r\\n\\t\\t\\tflex-grow: 1;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tdropdown-icon\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply input padding.\\r\\n\\t\\t\\tpadding: var(--input-padding);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--open) > text-input,\\r\\n\\t&:not(.--filter) > text-input,\\r\\n\\t&:not(.--new) > text-input\\r\\n\\t{\\r\\n\\t\\t// Use cursor to indicate the element is clickable, when not accepting text input.\\r\\n\\t\\tcursor: pointer;\\r\\n\\r\\n\\t\\t> .input-control > .input-control-inner\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Disable pointer events to prevent unwanted text selection on double click.\\r\\n\\t\\t\\tpointer-events: none;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.input-control\\r\\n\\t{\\r\\n\\t\\tflex-wrap: wrap;\\r\\n\\t\\tpadding-right: 6rem;\\r\\n\\t}\\r\\n\\r\\n\\t&.--readonly > text-input > .input-control > .input-control-inner\\r\\n\\t{\\r\\n\\t\\tvisibility: hidden;\\r\\n\\t\\theight: 4rem;\\r\\n\\t}\\r\\n\\r\\n\\t&.--readonly > text-input > .input-control\\r\\n\\t{\\r\\n\\t\\tdropdown-icon\\r\\n\\t\\t{\\r\\n\\t\\t\\tdisplay: none !important;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t.tag-remove\\r\\n\\t\\t{\\r\\n\\t\\t\\tdisplay: none;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t[slot=\\\"before\\\"],\\r\\n\\t[slot=\\\"value\\\"],\\r\\n\\ttag\\r\\n\\t{\\r\\n\\t\\tmax-width: 100%;\\r\\n\\t}\\r\\n\\r\\n\\t[slot=\\\"value\\\"]:not(:empty),\\r\\n\\t.tags-input-value-list\\r\\n\\t{\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\talign-items: flex-start;\\r\\n\\t\\tflex-wrap: wrap;\\r\\n\\t\\tpadding-left: 4rem;\\r\\n\\t}\\r\\n\\r\\n\\t> text-input > .input-control > .input-control-inner\\r\\n\\t{\\r\\n\\t\\tflex-grow: 1;\\r\\n\\t\\twidth: auto !important;\\r\\n\\t\\tmin-width: 160rem;\\r\\n\\t\\tpadding-right: 42rem;\\r\\n\\t}\\r\\n\\r\\n\\t[slot=\\\"after\\\"]\\r\\n\\t{\\r\\n\\t\\tposition: absolute;\\r\\n\\t\\tright: 0;\\r\\n\\t\\tbottom: 0;\\r\\n\\t}\\r\\n\\r\\n\\t.tags-input-value\\r\\n\\t{\\r\\n\\t\\twidth: 100%;\\r\\n\\t}\\r\\n\\r\\n\\t&.--stretch\\r\\n\\t{\\r\\n\\t\\t[slot=\\\"before\\\"],\\r\\n\\t\\t[slot=\\\"value\\\"]:not(:empty)\\r\\n\\t\\t{\\r\\n\\t\\t\\twidth: 100%;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\ttag\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-right: 0;\\r\\n\\t\\t\\twidth: 100%;\\r\\n\\r\\n\\t\\t\\ticon\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tmargin-left: auto;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\r\nimport { Id } from \"shared/utilities\";\r\nimport { AutocompleteHint, AutocorrectHint, AutocapitalizeHint, EnterKeyHint, SpellcheckHint } from \"../input\";\r\n\r\n/**\r\n * Custom element representing a text input.\r\n */\r\n@autoinject\r\nexport class TextInputCustomElement\r\n{\r\n\t/**\r\n\t * The unique ID of the input element associated with the label.\r\n\t */\r\n\tprotected id = Id.sequential();\r\n\r\n\t/**\r\n\t * The input element.\r\n\t */\r\n\tprotected inputElement: HTMLInputElement | HTMLTextAreaElement;\r\n\r\n\t/**\r\n\t * Whether if the input field has been focused.\r\n\t */\r\n\t@bindable\r\n\tprotected focused: boolean = false;\r\n\r\n\t/**\r\n\t * Gets the value of the input element based on the value of the component.\r\n\t */\r\n\t@computedFrom(\"value\")\r\n\tprotected get inputValue(): string\r\n\t{\r\n\t\treturn this.value || \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the value of the component based on the value of the input element.\r\n\t */\r\n\tprotected set inputValue(value: string)\r\n\t{\r\n\t\tthis.value = value || undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * The value of the input, or undefined if the input is empty.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: string | undefined;\r\n\r\n\t/**\r\n\t * True if the input is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the input is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n\r\n\t/**\r\n\t * The autocomplete mode to use.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic autocomplete: AutocompleteHint;\r\n\r\n\t/**\r\n\t * The autocorrect mode to use.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic autocorrect: AutocorrectHint;\r\n\r\n\t/**\r\n\t * The autocapitalize mode to use.\r\n\t */\r\n\t@bindable({ defaultValue: \"sentence\" })\r\n\tpublic autocapitalize: AutocapitalizeHint;\r\n\r\n\t/**\r\n\t * True to select the contents when the input is focused, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic autoselect: boolean;\r\n\r\n\t/**\r\n\t * The spellcheck mode to use.\r\n\t */\r\n\t@bindable({ defaultValue: \"multiline\" })\r\n\tpublic spellcheck: SpellcheckHint;\r\n\r\n\t/**\r\n\t * The hint indicating the type of `Enter` key to show on a virtual keyboard\r\n\t * for a single-line text input, or undefined to use the default behavior.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic enterkey: EnterKeyHint | undefined;\r\n\r\n\t/**\r\n\t * The initial number of text lines in the input, or undefined to allow only a single line.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic lines: number | undefined;\r\n\r\n\t/**\r\n\t * True to allow the input to grow to fit the content, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic autosize: boolean;\r\n\r\n\t/**\r\n\t * The max length of the value, or undefined to use the max supported length.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic maxlength: number | undefined;\r\n\r\n\t/**\r\n\t * True to remove leading and trailing whitespace, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic trim: boolean;\r\n\r\n\t/**\r\n\t * Called when the input receives focus.\r\n\t * Selects the contents of the input, if `autoselect` is enabled, or if the input contains\r\n\t * line breaks, ensures the cursor is positioned at the beginning of the text.\r\n\t */\r\n\tprotected onFocus(): void\r\n\t{\r\n\t\tthis.focused = true;\r\n\r\n\t\tif (this.autoselect)\r\n\t\t{\r\n\t\t\tsetTimeout(() => this.inputElement.setSelectionRange(0, this.inputElement.value.length), 50);\r\n\t\t}\r\n\t\telse if (this.value && this.value.includes(\"\\n\"))\r\n\t\t{\r\n\t\t\tthis.inputElement.setSelectionRange(0, 0);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input looses focus.\r\n\t * If enabled, trims the value to remove leading and trailing whitespace.\r\n\t */\r\n\tprotected onBlur(): void\r\n\t{\r\n\t\tthis.focused = false;\r\n\r\n\t\tif (this.trim && this.value)\r\n\t\t{\r\n\t\t\tthis.value = this.value.trim();\r\n\t\t}\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"text-input{resize:vertical}text-input.--autosize>.input-control>.input-control-inner .input-input{position:absolute;top:0;left:0;right:0;bottom:0;resize:none !important;height:100%}text-input.--autosize>.input-control>.input-control-inner .input-autosize{visibility:hidden;padding:var(--input-padding);overflow:hidden;overflow-wrap:break-word;white-space:pre-wrap}text-input.--multiline.--use-column-layout>.input-control{flex-direction:column}text-input.--multiline.--use-column-layout>.input-control>div[slot=before]{border-bottom:var(--input-border-width) solid var(--input-border-color)}text-input.--multiline.--use-column-layout>.input-control>div[slot=after]{border-top:var(--input-border-width) solid var(--input-border-color)}text-input.--multiline.--use-column-layout>.input-control>span[slot=before]{padding:var(--input-padding);white-space:inherit}text-input.--multiline.--use-column-layout>.input-control>span[slot=after]{padding:var(--input-padding);white-space:inherit}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/inputs/text-input/text-input.scss\"],\"names\":[],\"mappings\":\"AAAA,WAGC,eAAA,CAIC,uEAGC,iBAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CACA,sBAAA,CAGA,WAAA,CAGD,0EAGC,iBAAA,CACA,4BAAA,CACA,eAAA,CACA,wBAAA,CACA,oBAAA,CAMD,0DAGC,qBAAA,CAEA,2EAGC,uEAAA,CAGD,0EAGC,oEAAA,CAGD,4EAGC,4BAAA,CAGA,mBAAA,CAGD,2EAGC,4BAAA,CAGA,mBAAA\",\"sourcesContent\":[\"text-input\\r\\n{\\r\\n\\t// Set the default resize mode.\\r\\n\\tresize: vertical;\\r\\n\\r\\n\\t&.--autosize\\r\\n\\t{\\r\\n\\t\\t> .input-control > .input-control-inner .input-input\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Position the input on top of the autosized element.\\r\\n\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\ttop: 0;\\r\\n\\t\\t\\tleft: 0;\\r\\n\\t\\t\\tright: 0;\\r\\n\\t\\t\\tbottom: 0;\\r\\n\\t\\t\\tresize: none !important;\\r\\n\\r\\n\\t\\t\\t// HACK: Because Firefox does not size the textarea correctly without it.\\r\\n\\t\\t\\theight: 100%;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> .input-control > .input-control-inner .input-autosize\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Style the content as if it was a textarea.\\r\\n\\t\\t\\tvisibility: hidden;\\r\\n\\t\\t\\tpadding: var(--input-padding);\\r\\n\\t\\t\\toverflow: hidden;\\r\\n\\t\\t\\toverflow-wrap: break-word;\\r\\n\\t\\t\\twhite-space: pre-wrap;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.--multiline.--use-column-layout\\r\\n\\t{\\r\\n\\t\\t> .input-control\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Use column layout.\\r\\n\\t\\t\\tflex-direction: column;\\r\\n\\r\\n\\t\\t\\t> div[slot=\\\"before\\\"]\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply a border below the before content.\\r\\n\\t\\t\\t\\tborder-bottom: var(--input-border-width) solid var(--input-border-color);\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t> div[slot=\\\"after\\\"]\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply a border above the after content.\\r\\n\\t\\t\\t\\tborder-top: var(--input-border-width) solid var(--input-border-color);\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t> span[slot=\\\"before\\\"]\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply the input padding, except at the end closest to the input value.\\r\\n\\t\\t\\t\\tpadding: var(--input-padding);\\r\\n\\r\\n\\t\\t\\t\\t// Prevent wrapping.\\r\\n\\t\\t\\t\\twhite-space: inherit;\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t> span[slot=\\\"after\\\"]\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply the input padding, except at the end closest to the input value.\\r\\n\\t\\t\\t\\tpadding: var(--input-padding);\\r\\n\\r\\n\\t\\t\\t\\t// Prevent wrapping.\\r\\n\\t\\t\\t\\twhite-space: inherit;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\r\nimport { Duration, DateTime, Zone } from \"luxon\";\r\nimport { TimeValueConverter, TimeFormat } from \"shared/localization\";\r\nimport { LabelPosition } from \"../../control\";\r\nimport { AutocompleteHint } from \"../input\";\r\nimport { ItemPickerCustomElement } from \"../../pickers/item-picker/item-picker\";\r\n\r\n// The items to choose from in the dropdown.\r\nconst timeItems: Duration[] = [];\r\n\r\nfor (let hour = 0; hour < 24; hour++)\r\n{\r\n\tfor (let minute = 0; minute < 60; minute += 15)\r\n\t{\r\n\t\ttimeItems.push(Duration.fromObject({ hour, minute }));\r\n\t}\r\n}\r\n\r\ntimeItems.push(Duration.fromObject({ hour: 23, minutes: 59, seconds: 59 }));\r\n\r\n/**\r\n * Custom element representing an input for picking a single item from a list.\r\n */\r\n@autoinject\r\nexport class TimeInputCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element representing the component.\r\n\t * @param timeFormat The `TimeFormat` instance.\r\n\t * @param timeValueConverter The `TimeValueConverter` instance.\r\n\t */\r\n\tpublic constructor(element: Element, timeFormat: TimeFormat, timeValueConverter: TimeValueConverter)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\t\tthis.timeFormat = timeFormat;\r\n\t\tthis._timeValueConverter = timeValueConverter;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement;\r\n\tprivate readonly _timeValueConverter: TimeValueConverter;\r\n\tprivate _nowIntervalHandle: any;\r\n\tprivate _now: DateTime;\r\n\r\n\t/**\r\n\t * The format info for the current locale.\r\n\t */\r\n\tprotected timeFormat: TimeFormat;\r\n\r\n\t/**\r\n\t * The element representing the input.\r\n\t */\r\n\tprotected inputElement: HTMLElement;\r\n\r\n\t/**\r\n\t * The element representing the toggle icon.\r\n\t */\r\n\tprotected toggleElement: HTMLElement;\r\n\r\n\t/**\r\n\t * The items to show in the dropdown.\r\n\t */\r\n\tprotected items = timeItems;\r\n\r\n\t/**\r\n\t * True if the entered value is valid, otherwise false.\r\n\t */\r\n\tprotected isValid = true;\r\n\r\n\t/**\r\n\t * The value entered by the user, or undefined.\r\n\t */\r\n\tprotected enteredValue: string | undefined;\r\n\r\n\t/**\r\n\t * The view model for the item picker.\r\n\t */\r\n\tprotected itemPicker: ItemPickerCustomElement;\r\n\r\n\t/**\r\n\t * Gets the items that satisfy the min and max constraints.\r\n\t */\r\n\t@computedFrom(\"items\", \"computedMin\", \"computedMax\")\r\n\tprotected get filteredItems(): Duration[]\r\n\t{\r\n\t\treturn this.items.filter(item => item == null ||\r\n\t\t(\r\n\t\t\t(this.computedMin == null || (this.minInclusive ? item.valueOf() >= this.computedMin.valueOf() : item.valueOf() > this.computedMin.valueOf())) &&\r\n\t\t\t(this.computedMax == null || (this.minInclusive ? item.valueOf() <= this.computedMax.valueOf() : item.valueOf() < this.computedMax.valueOf()))\r\n\t\t));\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the input value.\r\n\t */\r\n\t@computedFrom(\"open\", \"enteredValue\", \"focusedValue\", \"value\")\r\n\tprotected get inputValue(): string\r\n\t{\r\n\t\t// If the user entered a value, return that.\r\n\t\tif (this.enteredValue != null)\r\n\t\t{\r\n\t\t\treturn this.enteredValue;\r\n\t\t}\r\n\r\n\t\tif (this.open)\r\n\t\t{\r\n\t\t\t// If open with a focused value, format and return that.\r\n\t\t\tif (this.focusedValue != null)\r\n\t\t\t{\r\n\t\t\t\treturn this._timeValueConverter.toView(this.focusedValue)!;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t// If closed with a comitted value, format and return that.\r\n\t\t\tif (this.value != null)\r\n\t\t\t{\r\n\t\t\t\treturn this._timeValueConverter.toView(this.value)!;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// The input is empty.\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the input value.\r\n\t */\r\n\tprotected set inputValue(value: string)\r\n\t{\r\n\t\t// Store the value entered by the user.\r\n\t\tthis.enteredValue = value;\r\n\r\n\t\tif (value)\r\n\t\t{\r\n\t\t\t// Try to parse the value.\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tif (!this.timeFormat.inputPattern.test(value) || value.length !== 5)\r\n\t\t\t\t{\r\n\t\t\t\t\tthrow new Error(\"Invalid time of day.\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst [hour = 0, minute = 0] = value.split(/[^\\d]+/, 2).map(s => s ? parseInt(s) : 0);\r\n\r\n\t\t\t\tif (isNaN(hour) || hour < 0 || hour > 23 || isNaN(minute) || minute < 0 || minute > 59)\r\n\t\t\t\t{\r\n\t\t\t\t\tthrow new Error(\"Invalid time of day.\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet duration = Duration.fromObject({ hour, minute });\r\n\r\n\t\t\t\t// If the input value is an exact match for one of the items, use the item.\r\n\t\t\t\t// This is needed to ensure the item is highlighted in the item-picker.\r\n\t\t\t\tduration = timeItems.find(d => d.valueOf() === duration.valueOf()) || duration;\r\n\r\n\t\t\t\t// Update the focused value.\r\n\t\t\t\tthis.focusedValue = duration;\r\n\r\n\t\t\t\t// Update the validity.\r\n\t\t\t\tthis.isValid = true;\r\n\t\t\t}\r\n\t\t\tcatch (error)\r\n\t\t\t{\r\n\t\t\t\t// Update the focused value.\r\n\t\t\t\tthis.focusedValue = null;\r\n\r\n\t\t\t\t// Update the validity.\r\n\t\t\t\tthis.isValid = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t// The input is empty, so reset the focused value and validity.\r\n\t\t\tthis.focusedValue = undefined;\r\n\t\t\tthis.isValid = true;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * The computed min value.\r\n\t */\r\n\t@computedFrom(\"min\", \"zone\", \"_now\")\r\n\tprotected get computedMin(): Duration | undefined\r\n\t{\r\n\t\tif (this.min === \"now\")\r\n\t\t{\r\n\t\t\treturn this._now.diff(this._now.startOf(\"day\"));\r\n\t\t}\r\n\r\n\t\tif (typeof this.min === \"string\")\r\n\t\t{\r\n\t\t\tif (this.min.startsWith(\"P\"))\r\n\t\t\t{\r\n\t\t\t\treturn Duration.fromISO(this.min);\r\n\t\t\t}\r\n\r\n\t\t\tconst [hour, minute, second, millisecond] = this.min.split(/:|\\./g).map(s => parseInt(s));\r\n\r\n\t\t\treturn Duration.fromObject({ hour, minute, second, millisecond });\r\n\t\t}\r\n\r\n\t\treturn this.min;\r\n\t}\r\n\r\n\t/**\r\n\t * The computed max value.\r\n\t */\r\n\t@computedFrom(\"max\", \"zone\", \"_now\")\r\n\tprotected get computedMax(): Duration | undefined\r\n\t{\r\n\t\tif (this.max === \"now\")\r\n\t\t{\r\n\t\t\treturn this._now.diff(this._now.startOf(\"day\"));\r\n\t\t}\r\n\r\n\t\tif (typeof this.max === \"string\")\r\n\t\t{\r\n\t\t\tif (this.max.startsWith(\"P\"))\r\n\t\t\t{\r\n\t\t\t\treturn Duration.fromISO(this.max);\r\n\t\t\t}\r\n\r\n\t\t\tconst [hour, minute, second, millisecond] = this.max.split(/:|\\./g).map(s => parseInt(s));\r\n\r\n\t\t\treturn Duration.fromObject({ hour, minute, second, millisecond });\r\n\t\t}\r\n\r\n\t\treturn this.max;\r\n\t}\r\n\r\n\t/**\r\n\t * The position of the label, or undefined to show no label.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic label: LabelPosition | undefined;\r\n\r\n\t/**\r\n\t * The IANA Time Zone Identifier to use, `local` to use the local zone, or `utc` to use the UTC zone.\r\n\t */\r\n\t@bindable({ defaultValue: \"local\" })\r\n\tpublic zone: string | Zone;\r\n\r\n\t/**\r\n\t * The time picked by the user, null if the entered value could not be parsed,\r\n\t * or undefined if no time has been entered or picked.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: Duration | null | undefined;\r\n\r\n\t/**\r\n\t * The time that is focused, but not yet picked, null if the entered value\r\n\t * could not be parsed, or undefined if no time has been entered or focused.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic focusedValue: Duration | null | undefined;\r\n\r\n\t/**\r\n\t * The earliest time that can be selected, or undefined to disable this constraint.\r\n\t * This may be an ISO 8601 string, the string `now`, or a `Duration` instance.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic min: string | Duration | \"now\" | undefined;\r\n\r\n\t/**\r\n\t * The latest time that can be selected, or undefined to disable this constraint.\r\n\t * This may be an ISO 8601 string, the string `now`, or a `Duration` instance.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic max: string | Duration | \"now\" | undefined;\r\n\r\n\t/**\r\n\t * True to include the min value as a valid value, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic minInclusive: boolean | undefined;\r\n\r\n\t/**\r\n\t * True to include the max value as a valid value, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic maxInclusive: boolean | undefined;\r\n\r\n\t/**\r\n\t * True to show the `None` option, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic none: boolean;\r\n\r\n\t/**\r\n\t * True if the dropdown is open, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false, defaultBindingMode: bindingMode.fromView })\r\n\tpublic open: boolean;\r\n\r\n\t/**\r\n\t * True if the input is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the input is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n\r\n\t/**\r\n\t * The autocomplete mode to use,\r\n\t * or undefined to use the default behavior.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic autocomplete: AutocompleteHint;\r\n\r\n\t/**\r\n\t * True to select the contents when the input is focused, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic autoselect: boolean;\r\n\r\n\t/**\r\n\t * True to use `fixed` positioning for the dropdown, otherwise false.\r\n\t * This may be needed if the dropdown is placed within a container that\r\n\t * hides overflowing content, but note that it has a performance cost.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic fixed: boolean;\r\n\r\n\t/**\r\n\t * Called by the framework when the component is binding.\r\n\t */\r\n\tpublic bind(): void\r\n\t{\r\n\t\tthis._now = DateTime.local().setZone(this.zone);\r\n\t\tthis.scheduleNowRefresh();\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is unbinding.\r\n\t */\r\n\tpublic unbind(): void\r\n\t{\r\n\t\t// Stop refreshing the `now` value.\r\n\t\tclearInterval(this._nowIntervalHandle);\r\n\t}\r\n\r\n\t/**\r\n\t * Opens the dropdown and optionally focuses the input element.\r\n\t * @param focusInput True to focus the input element, otherwise false.\r\n\t */\r\n\tprotected openDropdown(focusInput: boolean): void\r\n\t{\r\n\t\tthis.open = true;\r\n\t\tthis.focusedValue = this.value;\r\n\r\n\t\tsetTimeout(() => this.itemPicker?.scrollToFocusedValue());\r\n\r\n\t\tif (focusInput)\r\n\t\t{\r\n\t\t\tsetTimeout(() => this.inputElement.focus());\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Closes the dropdown and optionally focuses the toggle icon.\r\n\t * Also reverts the focused value if no value was picked.\r\n\t * @param focusToggle True to focus the toggle icon, otherwise false.\r\n\t * @param pick True if the user picked a value, otherwise false.\r\n\t */\r\n\tprotected closeDropdown(focusToggle: boolean, pick = false): void\r\n\t{\r\n\t\tthis.open = false;\r\n\r\n\t\tif (pick)\r\n\t\t{\r\n\t\t\tif (this.focusedValue !== this.value)\r\n\t\t\t{\r\n\t\t\t\tthis.value = this.focusedValue;\r\n\r\n\t\t\t\tif (this.value !== null)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.enteredValue = undefined;\r\n\t\t\t\t\tthis.isValid = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Dispatch the `input` event to indicate that the comitted value, has changed.\r\n\t\t\t\tthis._element.dispatchEvent(new CustomEvent(\"input\", { bubbles: true, detail: { value: this.value } }));\r\n\r\n\t\t\t\t// Dispatch the `change` event to indicate that the comitted value, has changed.\r\n\t\t\t\tthis._element.dispatchEvent(new CustomEvent(\"change\", { bubbles: true, detail: { value: this.value } }));\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.focusedValue = this.isValid ? this.value : null;\r\n\t\t\tthis.enteredValue = undefined;\r\n\t\t\tthis.isValid = true;\r\n\t\t}\r\n\r\n\t\tif (focusToggle)\r\n\t\t{\r\n\t\t\tthis.toggleElement.focus();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the toggle icon or the input element is clicked.\r\n\t * Toggles the dropdown between its open and closed state, focusing either the input element or toggle icon.\r\n\t */\r\n\tprotected toggleDropdown(): void\r\n\t{\r\n\t\tif (this.open)\r\n\t\t{\r\n\t\t\tthis.closeDropdown(true, true);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.openDropdown(true);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input element is clicked.\r\n\t * Opens the dropdown and focuses the input element.\r\n\t * @param event The mouse event.\r\n\t * @returns True to continue.\r\n\t */\r\n\tprotected onInputMouseDown(event: MouseEvent): boolean\r\n\t{\r\n\t\tif (!event.defaultPrevented && !this.open)\r\n\t\t{\r\n\t\t\tthis.openDropdown(true);\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed within the input element.\r\n\t * Prevents the user from entering some invalid values.\r\n\t * @param event The keyboard event.\r\n\t * @returns True to continue, false to prevent default.\r\n\t */\r\n\tprotected onInputKeyDown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\tif (event.defaultPrevented)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (!this.isValid && !(event.altKey || event.metaKey || event.shiftKey || event.ctrlKey))\r\n\t\t{\r\n\t\t\tswitch (event.key)\r\n\t\t\t{\r\n\t\t\t\tcase \"Enter\":\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Never block special keys or key combinations.\r\n\t\tif (!event.key || event.key.length > 1 || event.altKey || event.metaKey || event.shiftKey || event.ctrlKey)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// Prevent the user from entering characters that are not part of the pattern.\r\n\t\tif (!this.timeFormat.keyPattern.test(event.key))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a `mousedown` event occurs on the dropdown.\r\n\t * Prevents default for the event, so it won't cause unwanted effects in ancestor elements.\r\n\t * @returns False to prevent default.\r\n\t */\r\n\tprotected onDropdownMouseDown(): boolean\r\n\t{\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input, or an element within the input, receives focus.\r\n\t * Opens the dropdown if the focused element is not the toggle icon.\r\n\t * @param event The focus event.\r\n\t */\r\n\tprotected onInputFocusIn(event: FocusEvent): void\r\n\t{\r\n\t\tif (event.target !== this.toggleElement && !this.open)\r\n\t\t{\r\n\t\t\tthis.openDropdown(false);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when an event is triggered.\r\n\t * Prevents the event from bubbling further, as this input dispatches its own event.\r\n\t * @param event The event.\r\n\t */\r\n\tprotected onInternalEvent(event: Event): void\r\n\t{\r\n\t\tevent.stopPropagation();\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `value` property changes.\r\n\t * Ensures the focused value matches the new value.\r\n\t */\r\n\tprotected valueChanged(): void\r\n\t{\r\n\t\tthis.focusedValue = this.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Schedules updates of the `now` value.\r\n\t */\r\n\tprivate scheduleNowRefresh(): void\r\n\t{\r\n\t\tthis._nowIntervalHandle = setInterval(() =>\r\n\t\t{\r\n\t\t\tthis._now = DateTime.local().setZone(this.zone);\r\n\t\t}, 1000);\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"time-input{display:block}time-input>text-input.input>.input-control>.input-control-inner .input-input,time-input>text-input.input>.input-control>.input-control-inner .input-placeholder{padding-right:0}time-input>text-input dropdown{display:flex}time-input>text-input item-picker{flex-grow:1}time-input>text-input dropdown-icon{padding:var(--input-padding)}time-input:not(.--open)>text-input{cursor:pointer}time-input:not(.--open)>text-input>.input-control>.input-control-inner{pointer-events:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/inputs/time-input/time-input.scss\"],\"names\":[],\"mappings\":\"AAAA,WAEC,aAAA,CAIC,gKAIC,eAAA,CAGD,+BAEC,YAAA,CAGD,kCAEC,WAAA,CAGD,oCAGC,4BAAA,CAIF,mCAGC,cAAA,CAEA,uEAGC,mBAAA\",\"sourcesContent\":[\"time-input\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\t> text-input\\r\\n\\t{\\r\\n\\t\\t&.input > .input-control > .input-control-inner .input-input,\\r\\n\\t\\t&.input > .input-control > .input-control-inner .input-placeholder\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Remove padding at the end closest to the toggle icon.\\r\\n\\t\\t\\tpadding-right: 0;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tdropdown\\r\\n\\t\\t{\\r\\n\\t\\t\\tdisplay: flex;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\titem-picker\\r\\n\\t\\t{\\r\\n\\t\\t\\tflex-grow: 1;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tdropdown-icon\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply input padding.\\r\\n\\t\\t\\tpadding: var(--input-padding);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--open) > text-input\\r\\n\\t{\\r\\n\\t\\t// Use cursor to indicate the element is clickable, when not accepting text input.\\r\\n\\t\\tcursor: pointer;\\r\\n\\r\\n\\t\\t> .input-control > .input-control-inner\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Disable pointer events to prevent unwanted text selection on double click.\\r\\n\\t\\t\\tpointer-events: none;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\r\nimport { Id } from \"shared/utilities\";\r\nimport { AutocompleteHint, EnterKeyHint } from \"../input\";\r\n\r\n/**\r\n * Custom element representing an URL input.\r\n */\r\n@autoinject\r\nexport class UrlInputCustomElement\r\n{\r\n\t/**\r\n\t * The unique ID of the control.\r\n\t */\r\n\tprotected id = Id.sequential();\r\n\r\n\t/**\r\n\t * The input element.\r\n\t */\r\n\tprotected inputElement: HTMLInputElement | HTMLTextAreaElement;\r\n\r\n\t/**\r\n\t * Gets the input value.\r\n\t */\r\n\t@computedFrom(\"value\")\r\n\tprotected get inputValue(): string\r\n\t{\r\n\t\treturn this.value != null ? this.value : \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the input value.\r\n\t */\r\n\tprotected set inputValue(value: string)\r\n\t{\r\n\t\tthis.value = value || undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the validation trigger to use for the validation.\r\n\t * This ensures errors won't be shown while a user types the beginning of an URL.\r\n\t */\r\n\t@computedFrom(\"value\")\r\n\tprotected get validationTrigger(): string | undefined\r\n\t{\r\n\t\treturn this.value != null && (\"http://\".startsWith(this.value) || \"https://\".startsWith(this.value)) ? \"change\" : undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * The value of the input, or undefined if the input is empty.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: string | undefined;\r\n\r\n\t/**\r\n\t * True if the input is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the input is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n\r\n\t/**\r\n\t * The autocomplete mode to use.\r\n\t */\r\n\t@bindable({ defaultValue: \"off\" })\r\n\tpublic autocomplete: AutocompleteHint;\r\n\r\n\t/**\r\n\t * True to select the contents when the input is focused, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic autoselect: boolean;\r\n\r\n\t/**\r\n\t * The hint indicating the type of `Enter` key to show on a virtual keyboard,\r\n\t * or undefined to use the default behavior.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic enterkey: EnterKeyHint | undefined;\r\n\r\n\t/**\r\n\t * The max length of the value, or undefined to use the max supported length.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic maxlength: number | undefined;\r\n\r\n\t/**\r\n\t * Called when the input receives focus.\r\n\t * Selects the contents of the input, if `autoselect` is enabled.\r\n\t */\r\n\tprotected onFocus(): void\r\n\t{\r\n\t\tif (this.autoselect)\r\n\t\t{\r\n\t\t\tsetTimeout(() => this.inputElement.setSelectionRange(0, this.inputElement.value.length), 50);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the input looses focus.\r\n\t * Trims the value to remove leading and trailing whitespace.\r\n\t */\r\n\tprotected onBlur(): void\r\n\t{\r\n\t\tif (this.value)\r\n\t\t{\r\n\t\t\tthis.value = this.value.trim();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed.\r\n\t * Prevents the user from entering invalid characters.\r\n\t * @returns True to continue, false to prevent default.\r\n\t */\r\n\tprotected onKeyDown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\t// Never block special keys or key combinations.\r\n\t\tif (event.defaultPrevented || !event.key || event.key.length > 1 || event.metaKey || event.ctrlKey)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn event.key !== \" \";\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","import { autoinject } from \"aurelia-framework\";\r\n\r\n@autoinject\r\nexport class PathNavCustomElement\r\n{\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"path-nav{display:flex;align-items:center;flex-wrap:wrap}path-nav>*,path-nav>a[accent=inherit]{display:block;white-space:nowrap}path-nav>*:not(:last-child),path-nav>a[accent=inherit]:not(:last-child){position:relative;padding-right:2.5em}path-nav>*:not(:last-child)::after,path-nav>a[accent=inherit]:not(:last-child)::after{content:\\\"-\\\";position:absolute;right:0;width:2.5em;opacity:.3;background:var(--surface-neutral-icon-color);color:transparent;-webkit-mask-size:.75em;mask-size:.75em;-webkit-mask-position:center 57%;mask-position:center 57%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:url(\\\"data:image/svg+xml;utf8,\\\");mask-image:url(\\\"data:image/svg+xml;utf8,\\\")}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/navigation/path-nav/path-nav.scss\"],\"names\":[],\"mappings\":\"AAEA,SAEC,YAAA,CACA,kBAAA,CACA,cAAA,CAEA,sCAGC,aAAA,CACA,kBAAA,CAEA,wEAEC,iBAAA,CACA,mBAAA,CAEA,sFAEC,WAAA,CAEA,iBAAA,CACA,OAAA,CACA,WAAA,CACA,UAAA,CACA,4CAAA,CACA,iBAAA,CACA,uBAAA,CAAA,eAAA,CACA,gCAAA,CAAA,wBAAA,CACA,6BAAA,CAAA,qBAAA,CAGA,8NAAA,CAAA,sNAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\npath-nav\\r\\n{\\r\\n\\tdisplay: flex;\\r\\n\\talign-items: center;\\r\\n\\tflex-wrap: wrap;\\r\\n\\r\\n\\t> *,\\r\\n\\t> a[accent=\\\"inherit\\\"]\\r\\n\\t{\\r\\n\\t\\tdisplay: block;\\r\\n\\t\\twhite-space: nowrap;\\r\\n\\r\\n\\t\\t&:not(:last-child)\\r\\n\\t\\t{\\r\\n\\t\\t\\tposition: relative;\\r\\n\\t\\t\\tpadding-right: 2.5em;\\r\\n\\r\\n\\t\\t\\t&::after\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tcontent: \\\"-\\\";\\r\\n\\r\\n\\t\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\t\\tright: 0;\\r\\n\\t\\t\\t\\twidth: 2.5em;\\r\\n\\t\\t\\t\\topacity: 0.3;\\r\\n\\t\\t\\t\\tbackground: var(--surface-neutral-icon-color);\\r\\n\\t\\t\\t\\tcolor: transparent;\\r\\n\\t\\t\\t\\tmask-size: 0.75em;\\r\\n\\t\\t\\t\\tmask-position: center 57%;\\r\\n\\t\\t\\t\\tmask-repeat: no-repeat;\\r\\n\\r\\n\\t\\t\\t\\t/* stylelint-disable indentation */\\r\\n\\t\\t\\t\\tmask-image: url(\\r\\n\\t\\t\\t\\t\\t\\\"data:image/svg+xml;utf8,\\\" +\\r\\n\\t\\t\\t\\t\\t\\\"\\\" +\\r\\n\\t\\t\\t\\t\\t\\t\\\"\\\" +\\r\\n\\t\\t\\t\\t\\t\\\"\\\"\\r\\n\\t\\t\\t\\t);\\r\\n\\t\\t\\t\\t/* stylelint-enable */\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable } from \"aurelia-framework\";\r\nimport { TabNavCustomElement } from \"./tab-nav\";\r\n\r\n/**\r\n * Custom element that represents a single tab.\r\n */\r\n@autoinject\r\nexport class TabCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param tabNav The `tab-nav`component to which this tab belongs.\r\n\t */\r\n\tpublic constructor(tabNav: TabNavCustomElement)\r\n\t{\r\n\t\tthis.tabNav = tabNav;\r\n\t}\r\n\r\n\t/**\r\n\t * The `tab-nav`component to which this tab belongs.\r\n\t */\r\n\tprotected tabNav: TabNavCustomElement;\r\n\r\n\t/**\r\n\t * The name identifying the tab.\r\n\t */\r\n\t@bindable\r\n\tpublic name: string | undefined;\r\n\r\n\t/**\r\n\t * True to disable the tab, otherwise false.\r\n\t */\r\n\t@bindable\r\n\tpublic disabled: boolean | undefined;\r\n\r\n\t/**\r\n\t * True to indicate that the state of the tab is invalid, otherwise false.\r\n\t */\r\n\t@bindable\r\n\tpublic invalid: boolean | undefined;\r\n\r\n\t/**\r\n\t * Called when the tab is clicked.\r\n\t */\r\n\tprotected onClick(): void\r\n\t{\r\n\t\t// Call the change callback, if specified.\r\n\t\tif (this.tabNav.change != null)\r\n\t\t{\r\n\t\t\tconst allowChange = this.tabNav.change({ newValue: this.name, oldValue: this.tabNav.value });\r\n\r\n\t\t\t// Did the callback cancel the change?\r\n\t\t\tif (allowChange === false)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Change the of the `tab-nav` value.\r\n\t\tthis.tabNav.value = this.name;\r\n\t}\r\n}\r\n","import { autoinject, bindable, bindingMode } from \"aurelia-framework\";\r\n\r\n/**\r\n * Custom element that represents a group of tabs.\r\n */\r\n@autoinject\r\nexport class TabNavCustomElement\r\n{\r\n\t/**\r\n\t * The currently selected tab.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: string | undefined;\r\n\r\n\t/**\r\n\t * Called when the value is about to change.\r\n\t * @param context.newValue The new value.\r\n\t * @param oldValue The old value.\r\n\t * @returns False to prevent the change, otherwise true.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic change: undefined | ((params:\r\n\t{\r\n\t\tnewValue: string | undefined;\r\n\t\toldValue: string | undefined;\r\n\r\n\t}) => void | boolean);\r\n\r\n\t/**\r\n\t * The appearance to use for the tabs.\r\n\t */\r\n\t@bindable\r\n\tpublic appearance: \"tabs\" | \"solid\" | \"outline\" | \"text\";\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"tab-nav{--tab-nav-border-width: var(--border-width-medium);--tab-nav-border-radius: var(--border-radius-medium);--tab-nav-border-color: var(--surface-neutral-surface-color)}tab-nav{display:flex;color:var(--surface-primary-text-color);font-weight:500}tab-nav:not([appearance]),tab-nav[appearance=tabs]{border-bottom:var(--tab-nav-border-width) solid var(--tab-nav-border-color)}tab-nav[appearance=solid]{border:var(--tab-nav-border-width) solid var(--tab-nav-border-color);border-radius:var(--border-radius-medium)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/navigation/tab-nav/tab-nav.scss\"],\"names\":[],\"mappings\":\"AAEA,QAIC,kDAAA,CAGA,oDAAA,CAIA,4DAAA,CAGD,QAGC,YAAA,CAGA,uCAAA,CACA,eAAA,CAEA,mDAIC,2EAAA,CAGD,0BAGC,oEAAA,CACA,yCAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ntab-nav\\r\\n{\\r\\n\\r\\n\\t/// The width of the border of the component.\\r\\n\\t--tab-nav-border-width: var(--border-width-medium);\\r\\n\\r\\n\\t/// The radius of the border of the component.\\r\\n\\t--tab-nav-border-radius: var(--border-radius-medium);\\r\\n\\r\\n\\t/// The color of the border of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--tab-nav-border-color: var(--surface-neutral-surface-color);\\r\\n}\\r\\n\\r\\ntab-nav\\r\\n{\\r\\n\\t// Use horizontal flex layout.\\r\\n\\tdisplay: flex;\\r\\n\\r\\n\\t// Set the text color and font weight.\\r\\n\\tcolor: var(--surface-primary-text-color);\\r\\n\\tfont-weight: 500;\\r\\n\\r\\n\\t&:not([appearance]),\\r\\n\\t&[appearance=\\\"tabs\\\"]\\r\\n\\t{\\r\\n\\t\\t// Apply a border along the bottom of the tabs.\\r\\n\\t\\tborder-bottom: var(--tab-nav-border-width) solid var(--tab-nav-border-color);\\r\\n\\t}\\r\\n\\r\\n\\t&[appearance=\\\"solid\\\"]\\r\\n\\t{\\r\\n\\t\\t// Apply a border around the tabs.\\r\\n\\t\\tborder: var(--tab-nav-border-width) solid var(--tab-nav-border-color);\\r\\n\\t\\tborder-radius: var(--border-radius-medium);\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"tab{--tab-min-width: 120rem;--tab-min-height: 40rem;--tab-padding: 0 14rem;--tab-spacing: 24rem;--tab-surface-color: transparent;--tab-surface-color--active: var(--surface-neutral-surface-color);--tab-surface-text-color: var(--surface-neutral-text-color);--tab-surface-text-color--active: var(--surface-neutral-text-color)}tab{display:block;position:relative;cursor:pointer}tab:focus-within{z-index:1}tab.--invalid{color:var(--surface-negative-text-color)}tab.--disabled{opacity:var(--opacity-disabled)}tab-nav[appearance=text] tab:not(:last-child){margin-right:var(--tab-spacing)}tab-nav[appearance=text] tab.--active{color:var(--tab-surface-text-color--active)}tab-nav:not([appearance]) tab button,tab-nav[appearance=tabs] tab button,tab-nav[appearance=solid] tab button,tab-nav[appearance=outline] tab button{min-width:var(--tab-min-width);padding:var(--tab-padding);text-align:center}tab-nav:not([appearance]) tab,tab-nav[appearance=tabs] tab{flex-grow:1}tab-nav:not([appearance]) tab button,tab-nav[appearance=tabs] tab button{width:100%;line-height:calc(var(--tab-min-height) - 2 * var(--tab-nav-border-width));border:var(--tab-nav-border-width) solid transparent;margin-bottom:calc(-1 * var(--tab-nav-border-width));background:var(--tab-surface-color);color:var(--tab-surface-text-color)}tab-nav:not([appearance]) tab.--active button,tab-nav[appearance=tabs] tab.--active button{background:var(--tab-surface-color--active);color:var(--tab-surface-text-color--active);border-color:var(--tab-nav-border-color);border-bottom-color:transparent;border-top-left-radius:var(--tab-nav-border-radius);border-top-right-radius:var(--tab-nav-border-radius)}tab-nav[appearance=solid] tab button{flex-grow:1;line-height:calc(var(--tab-min-height) - 2 * var(--tab-nav-border-width));background:var(--tab-surface-color);color:var(--tab-surface-text-color)}tab-nav[appearance=solid] tab:not(:last-child) button{border-right:var(--tab-nav-border-width) solid var(--tab-nav-border-color)}tab-nav[appearance=solid] tab.--active button{background:var(--tab-surface-color--active);color:var(--tab-surface-text-color--active)}tab-nav[appearance=outline] tab button{border:var(--tab-nav-border-width) solid transparent;border-radius:var(--tab-nav-border-radius);line-height:calc(var(--tab-min-height) - 2 * var(--tab-nav-border-width))}tab-nav[appearance=outline] tab.--active button{border-color:var(--tab-nav-border-color);color:var(--tab-surface-text-color--active)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/navigation/tab-nav/tab.scss\"],\"names\":[],\"mappings\":\"AAEA,IAGC,uBAAA,CAGA,uBAAA,CAGA,sBAAA,CAGA,oBAAA,CAIA,gCAAA,CACA,iEAAA,CAIA,2DAAA,CACA,mEAAA,CAGD,IAEC,aAAA,CACA,iBAAA,CACA,cAAA,CAEA,iBAIC,SAAA,CAGD,cAIC,wCAAA,CAGD,eAGC,+BAAA,CAKA,8CAGC,+BAAA,CAGD,sCAGC,2CAAA,CASD,qJAGC,8BAAA,CAGA,0BAAA,CACA,iBAAA,CAIF,2DAIC,WAAA,CAEA,yEAEC,UAAA,CAGA,yEAAA,CAGA,oDAAA,CACA,oDAAA,CAGA,mCAAA,CACA,mCAAA,CAGD,2FAGC,2CAAA,CACA,2CAAA,CACA,wCAAA,CACA,+BAAA,CACA,mDAAA,CACA,oDAAA,CAMD,qCAGC,WAAA,CAGA,yEAAA,CAGA,mCAAA,CACA,mCAAA,CAGD,sDAGC,0EAAA,CAGD,8CAGC,2CAAA,CACA,2CAAA,CAMD,uCAGC,oDAAA,CACA,0CAAA,CAGA,yEAAA,CAGD,gDAGC,wCAAA,CACA,2CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ntab\\r\\n{\\r\\n\\t/// The min-width of the component.\\r\\n\\t--tab-min-width: 120rem;\\r\\n\\r\\n\\t/// The min-height of the component.\\r\\n\\t--tab-min-height: 40rem;\\r\\n\\r\\n\\t/// The padding of the component.\\r\\n\\t--tab-padding: 0 14rem;\\r\\n\\r\\n\\t/// The spacing between the tabs with appearance `text`.\\r\\n\\t--tab-spacing: 24rem;\\r\\n\\r\\n\\t/// The color of the surface of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--tab-surface-color: transparent;\\r\\n\\t--tab-surface-color--active: var(--surface-neutral-surface-color);\\r\\n\\r\\n\\t/// The color of the text on the surface of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--tab-surface-text-color: var(--surface-neutral-text-color);\\r\\n\\t--tab-surface-text-color--active: var(--surface-neutral-text-color);\\r\\n}\\r\\n\\r\\ntab\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\tposition: relative;\\r\\n\\tcursor: pointer;\\r\\n\\r\\n\\t&:focus-within\\r\\n\\t{\\r\\n\\t\\t// Increase the z-index, so the focus outline is\\r\\n\\t\\t// not covered by other tabs.\\r\\n\\t\\tz-index: 1;\\r\\n\\t}\\r\\n\\r\\n\\t&.--invalid\\r\\n\\t{\\r\\n\\t\\t// Use negative accent color if the tab is invalid.\\r\\n\\t\\t// Note that this will be overridden if the tab is active.\\r\\n\\t\\tcolor: var(--surface-negative-text-color);\\r\\n\\t}\\r\\n\\r\\n\\t&.--disabled\\r\\n\\t{\\r\\n\\t\\t// Reduce opacity when disabled.\\r\\n\\t\\topacity: var(--opacity-disabled);\\r\\n\\t}\\r\\n\\r\\n\\ttab-nav[appearance=\\\"text\\\"] &\\r\\n\\t{\\r\\n\\t\\t&:not(:last-child)\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply margin between the tabs.\\r\\n\\t\\t\\tmargin-right: var(--tab-spacing);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&.--active\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply colors for the active tab.\\r\\n\\t\\t\\tcolor: var(--tab-surface-text-color--active);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\ttab-nav:not([appearance]) &,\\r\\n\\ttab-nav[appearance=\\\"tabs\\\"] &,\\r\\n\\ttab-nav[appearance=\\\"solid\\\"] &,\\r\\n\\ttab-nav[appearance=\\\"outline\\\"] &\\r\\n\\t{\\r\\n\\t\\tbutton\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply a min-width to the tab.\\r\\n\\t\\t\\tmin-width: var(--tab-min-width);\\r\\n\\r\\n\\t\\t\\t// Style to appear as a button.\\r\\n\\t\\t\\tpadding: var(--tab-padding);\\r\\n\\t\\t\\ttext-align: center;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\ttab-nav:not([appearance]) &,\\r\\n\\ttab-nav[appearance=\\\"tabs\\\"] &\\r\\n\\t{\\r\\n\\t\\t// Fill the available space.\\r\\n\\t\\tflex-grow: 1;\\r\\n\\r\\n\\t\\tbutton\\r\\n\\t\\t{\\r\\n\\t\\t\\twidth: 100%;\\r\\n\\r\\n\\t\\t\\t// Compensate for the border along the bottom of the tabs.\\r\\n\\t\\t\\tline-height: calc(var(--tab-min-height) - 2 * var(--tab-nav-border-width));\\r\\n\\r\\n\\t\\t\\t// Apply a border around each tab.\\r\\n\\t\\t\\tborder: var(--tab-nav-border-width) solid transparent;\\r\\n\\t\\t\\tmargin-bottom: calc(-1 * var(--tab-nav-border-width));\\r\\n\\r\\n\\t\\t\\t// Apply colors for inactive tabs.\\r\\n\\t\\t\\tbackground: var(--tab-surface-color);\\r\\n\\t\\t\\tcolor: var(--tab-surface-text-color);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&.--active button\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply colors for the active tab.\\r\\n\\t\\t\\tbackground: var(--tab-surface-color--active);\\r\\n\\t\\t\\tcolor: var(--tab-surface-text-color--active);\\r\\n\\t\\t\\tborder-color: var(--tab-nav-border-color);\\r\\n\\t\\t\\tborder-bottom-color: transparent;\\r\\n\\t\\t\\tborder-top-left-radius: var(--tab-nav-border-radius);\\r\\n\\t\\t\\tborder-top-right-radius: var(--tab-nav-border-radius);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\ttab-nav[appearance=\\\"solid\\\"] &\\r\\n\\t{\\r\\n\\t\\tbutton\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Fill the available space.\\r\\n\\t\\t\\tflex-grow: 1;\\r\\n\\r\\n\\t\\t\\t// Compensate for the border around the tabs.\\r\\n\\t\\t\\tline-height: calc(var(--tab-min-height) - 2 * var(--tab-nav-border-width));\\r\\n\\r\\n\\t\\t\\t// Apply colors for inactive tabs.\\r\\n\\t\\t\\tbackground: var(--tab-surface-color);\\r\\n\\t\\t\\tcolor: var(--tab-surface-text-color);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&:not(:last-child) button\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply a border between the tabs.\\r\\n\\t\\t\\tborder-right: var(--tab-nav-border-width) solid var(--tab-nav-border-color);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&.--active button\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply colors for the active tab.\\r\\n\\t\\t\\tbackground: var(--tab-surface-color--active);\\r\\n\\t\\t\\tcolor: var(--tab-surface-text-color--active);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\ttab-nav[appearance=\\\"outline\\\"] &\\r\\n\\t{\\r\\n\\t\\tbutton\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply a border around the tab.\\r\\n\\t\\t\\tborder: var(--tab-nav-border-width) solid transparent;\\r\\n\\t\\t\\tborder-radius: var(--tab-nav-border-radius);\\r\\n\\r\\n\\t\\t\\t// Compensate for the border around the tab.\\r\\n\\t\\t\\tline-height: calc(var(--tab-min-height) - 2 * var(--tab-nav-border-width));\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&.--active button\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply colors for the active tab.\\r\\n\\t\\t\\tborder-color: var(--tab-nav-border-color);\\r\\n\\t\\t\\tcolor: var(--tab-surface-text-color--active);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { bindable, autoinject, computedFrom, bindingMode } from \"aurelia-framework\";\r\nimport { TreeNode } from \"shared/types\";\r\nimport { TreeNavCustomElement } from \"../../tree-nav\";\r\n\r\n@autoinject\r\nexport class TreeNavNodeCustomElement\r\n{\r\n\t/**\r\n\t * True if the node supports having child nodes, i.e. whether the node is folder-like, otherwise false.\r\n\t */\r\n\t@computedFrom(\"model.children.length\")\r\n\tprotected get folderLike(): boolean\r\n\t{\r\n\t\treturn this.model.children != null;\r\n\t}\r\n\r\n\t/**\r\n\t * True if the node is folder-like and has at least one child node, otherwise false.\r\n\t */\r\n\t@computedFrom(\"model.children.length\")\r\n\tprotected get expandable(): boolean\r\n\t{\r\n\t\treturn this.model.children != null && this.model.children.length > 0;\r\n\t}\r\n\r\n\t/**\r\n\t * True if the node is active, otherwise false.\r\n\t */\r\n\t@computedFrom(\"tree.value\")\r\n\tprotected get active(): boolean\r\n\t{\r\n\t\treturn this.tree.value === this.model;\r\n\t}\r\n\r\n\t/**\r\n\t * The name of the icon to use for the node.\r\n\t */\r\n\t@computedFrom(\"active\", \"tree.selectSubtree\", \"model.expanded\")\r\n\tprotected get descendentsActive(): boolean\r\n\t{\r\n\t\tif (!this.active)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!this.folderLike || !this.expandable)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (this.tree.selectSubtree === true)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (this.tree.selectSubtree === false)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (this.model.expanded)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * The name of the icon to use for the node.\r\n\t */\r\n\t@computedFrom(\"active\", \"tree.selectSubtree\", \"model.expanded\")\r\n\tprotected get iconName(): string\r\n\t{\r\n\t\tif (!this.folderLike)\r\n\t\t{\r\n\t\t\t// File icon, if the node is not folder-like.\r\n\t\t\treturn \"md-file\";\r\n\t\t}\r\n\r\n\t\tif (!this.active)\r\n\t\t{\r\n\t\t\t// Filled folder icon, when the node is not active.\r\n\t\t\treturn \"md-folder\";\r\n\t\t}\r\n\r\n\t\tif (!this.expandable)\r\n\t\t{\r\n\t\t\t // Filled folder icon, if the node is not expandable.\r\n\t\t\t return \"md-folder\";\r\n\t\t}\r\n\r\n\t\tif (this.tree.selectSubtree === true)\r\n\t\t{\r\n\t\t\t// Filled folder icon, indicating that child nodes are included.\r\n\t\t\treturn \"md-folder\";\r\n\t\t}\r\n\r\n\t\tif (this.tree.selectSubtree === false)\r\n\t\t{\r\n\t\t\t// Outline folder icon, indicating that child nodes are excluded.\r\n\t\t\treturn \"md-folder-outline\";\r\n\t\t}\r\n\r\n\t\tif (this.model.expanded)\r\n\t\t{\r\n\t\t\t// Filled folder icon, indicating that child nodes are included.\r\n\t\t\treturn \"md-folder\";\r\n\t\t}\r\n\r\n\t\t// Outline folder icon, indicating that child nodes are excluded.\r\n\t\treturn \"md-folder-outline\";\r\n\t}\r\n\r\n\t/**\r\n\t * True if the node is being renamed, otherwise false.\r\n\t */\r\n\tprotected renaming = false;\r\n\r\n\t/**\r\n\t * True if an entity is being dragged over the node, otherwise false.\r\n\t */\r\n\tprotected dragover = false;\r\n\r\n\t/**\r\n\t * The tree to which the node belongs.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.oneTime })\r\n\tpublic tree: TreeNavCustomElement;\r\n\r\n\t/**\r\n\t * The model to use for the node.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.oneTime })\r\n\tpublic model: TreeNode;\r\n\r\n\t/**\r\n\t * Called when the node is clicked.\r\n\t * @param toggle True if the click should toggle the expanded state of the node.\r\n\t * @param event The mouse event.\r\n\t */\r\n\tprotected onClick(toggle: boolean, event: MouseEvent): void\r\n\t{\r\n\t\tif (!event.defaultPrevented && !this.renaming)\r\n\t\t{\r\n\t\t\tif (this.expandable && (toggle || this.active || !this.model.expanded))\r\n\t\t\t{\r\n\t\t\t\tthis.tree.navigate(this.model, true, !this.model.expanded);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.tree.navigate(this.model, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tevent.stopPropagation();\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the rename option is clicked.\r\n\t * @param event The mouse event.\r\n\t */\r\n\tprotected onNewFolderClick(event: MouseEvent): void\r\n\t{\r\n\t\tconst newNode = this.tree.createNode!({ parentNode: this.model });\r\n\t\tnewNode.attach(this.model);\r\n\r\n\t\tif (this.tree.nodeCreated != null)\r\n\t\t{\r\n\t\t\tthis.tree.nodeCreated({ node: newNode });\r\n\t\t}\r\n\r\n\t\tevent.stopPropagation();\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the settings icon is clicked.\r\n\t * @param event The mouse event.\r\n\t */\r\n\tprotected onSettingsClick(event: MouseEvent): void\r\n\t{\r\n\t\tif (this.tree.nodeSettings != null)\r\n\t\t{\r\n\t\t\tthis.tree.nodeSettings({ node: this.model });\r\n\t\t}\r\n\r\n\t\tevent.stopPropagation();\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the rename option is clicked.\r\n\t * @param event The mouse event.\r\n\t */\r\n\tprotected async onDeleteClick(event: MouseEvent): Promise\r\n\t{\r\n\t\tconst parentNode = this.model.parent;\r\n\t\tlet confirmed = true;\r\n\r\n\t\tif (this.tree.deleteNode != null)\r\n\t\t{\r\n\t\t\tconfirmed = await this.tree.deleteNode({ node: this.model });\r\n\t\t}\r\n\r\n\t\tif (confirmed)\r\n\t\t{\r\n\t\t\tthis.model.detach();\r\n\r\n\t\t\tif (this.tree.nodeDeleted != null)\r\n\t\t\t{\r\n\t\t\t\tthis.tree.nodeDeleted({ node: this.model, parentNode });\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tevent.stopPropagation();\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the rename option is clicked.\r\n\t * @param event The mouse event.\r\n\t */\r\n\tprotected onRenameClick(event: MouseEvent): void\r\n\t{\r\n\t\tthis.renaming = true;\r\n\r\n\t\tevent.stopPropagation();\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the text input used for renaming looses focus.\r\n\t * @param event The focus event.\r\n\t */\r\n\tprotected onTextInputBlur(event: FocusEvent): void\r\n\t{\r\n\t\tconst inputElement = event.target as HTMLInputElement;\r\n\r\n\t\tif (inputElement.value && inputElement.value !== this.model.name)\r\n\t\t{\r\n\t\t\tthis.model.rename(inputElement.value);\r\n\r\n\t\t\tif (this.tree.nodeRenamed != null)\r\n\t\t\t{\r\n\t\t\t\tthis.tree.nodeRenamed({ node: this.model });\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.renaming = false;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed while the text input used for renaming has focus.\r\n\t * Allows the changes to be committed by pressing the `Enter` key, or discarded\r\n\t * by pressing the `Escape` key.\r\n\t * @param event The keyboard event.\r\n\t * @returns True to continue, false to prevent default.\r\n\t */\r\n\tprotected onTextInputKeyDown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\t// Never block special keys or key combinations.\r\n\t\tif (event.defaultPrevented || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (event.key === \"Enter\")\r\n\t\t{\r\n\t\t\tthis.renaming = false;\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (event.key === \"Escape\")\r\n\t\t{\r\n\t\t\tconst inputElement = event.target as HTMLInputElement;\r\n\r\n\t\t\tinputElement.value = this.model.name;\r\n\r\n\t\t\tthis.renaming = false;\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when an entity is being dragged over the node.\r\n\t * @param event The drag event.\r\n\t */\r\n\tprotected onDragOver(event: DragEvent): void\r\n\t{\r\n\t\tevent.dataTransfer!.dropEffect = \"none\";\r\n\r\n\t\tif (this.tree.dragOver != null)\r\n\t\t{\r\n\t\t\tthis.tree.dragOver({ event, node: this.model });\r\n\t\t}\r\n\r\n\t\tthis.dragover = event.dataTransfer!.dropEffect !== \"none\";\r\n\t}\r\n\r\n\t/**\r\n\t * Called when an entity that is being dragged leaves the node.\r\n\t * @param event The drag event.\r\n\t */\r\n\tprotected onDragLeave(): void\r\n\t{\r\n\t\tthis.dragover = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when an entity is dropped on the node.\r\n\t * @param event The drag event.\r\n\t */\r\n\tprotected onDrop(event: DragEvent): void\r\n\t{\r\n\t\tif (this.tree != null && this.tree.drop != null)\r\n\t\t{\r\n\t\t\tthis.tree.drop({ event, node: this.model });\r\n\t\t}\r\n\r\n\t\tthis.dragover = false;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"tree-nav-node{display:block}tree-nav-subtree tree-nav-node{padding-left:16rem}tree-nav-node .tree-nav-node{position:relative;display:flex;margin-bottom:1rem;padding:calc(4rem - var(--border-width-medium)) 12rem;height:40rem;align-items:center;border:var(--border-width-medium) solid transparent;border-radius:var(--border-radius-medium);color:var(--surface-nav-link-surface-text-color);background:var(--surface-nav-link-surface-color);cursor:pointer}tree-nav-node .tree-nav-node:focus{z-index:1}tree-nav-node .tree-nav-node:not(.--active):hover,.focus-visible tree-nav-node .tree-nav-node:not(.--active):focus,tree-nav-node .tree-nav-node.--dragover{color:var(--surface-nav-link-surface-text-color--hover);background:var(--surface-nav-link-surface-color--hover);border-color:var(--surface-nav-link-border-color--hover)}tree-nav-node .tree-nav-node:not(.--active):hover .tree-nav-node-icon>icon,.focus-visible tree-nav-node .tree-nav-node:not(.--active):focus .tree-nav-node-icon>icon,tree-nav-node .tree-nav-node.--dragover .tree-nav-node-icon>icon{color:var(--surface-nav-link-surface-icon-color--hover)}tree-nav-node .tree-nav-node.--active{color:var(--surface-nav-link-surface-text-color--active);background:var(--surface-nav-link-surface-color--active);border-color:var(--surface-nav-link-border-color--active)}tree-nav-node .tree-nav-node.--active .tree-nav-node-icon>icon{color:var(--surface-nav-link-surface-icon-color--active)}tree-nav-node .tree-nav-node.--dragover{border-color:var(--surface-primary-border-color)}tree-nav-node .tree-nav-node-title{position:relative;flex-grow:1}tree-nav-node .tree-nav-node-title text-input{position:absolute;top:0;left:-6rem;right:-10rem;bottom:0;--input-min-height: 1em;--input-padding: 0 0 0 6rem;--input-border-width: 0;--input-surface-color: transparent;--input-surface-color--hover: transparent;--input-surface-color--focus: transparent;--input-surface-text-color: currentColor;--input-surface-text-color--hover: currentColor;--input-surface-text-color--focus: currentColor}tree-nav-node .tree-nav-node-badge{position:relative;display:flex;align-items:center;height:100%;margin-left:8rem;margin-right:4rem;font-size:12rem;font-weight:700;background:inherit;opacity:var(--opacity-faded-more)}tree-nav-node .tree-nav-node-actions{position:relative;display:flex;align-items:center;height:100%;margin-left:auto;right:-8rem;font-size:16rem;visibility:hidden;background:inherit}tree-nav-node .tree-nav-node-actions icon{margin-left:var(--size-inline-spacing)}tree-nav-node .tree-nav-node-actions>icon{margin-right:8rem;color:var(--surface-nav-link-surface-icon-color)}tree-nav-node .tree-nav-node-actions>div{pointer-events:none;display:flex;position:absolute;top:0;right:4rem;bottom:0;padding-right:4rem;align-items:center;color:var(--surface-nav-link-surface-icon-color);background:inherit;cursor:default;opacity:0}tree-nav-node .tree-nav-node-actions>div::before{content:\\\"\\\";position:absolute;top:0;left:-8rem;bottom:0;width:8rem;background:inherit;-webkit-mask-image:linear-gradient(to left, black, rgba(0, 0, 0, 0));mask-image:linear-gradient(to left, black, rgba(0, 0, 0, 0))}tree-nav-node .tree-nav-node-actions>div icon:hover{color:var(--surface-nav-link-surface-icon-color--active)}body:not(.focus-visible) tree-nav-node .tree-nav-node:hover .tree-nav-node-actions,body.focus-visible tree-nav-node .tree-nav-node:focus .tree-nav-node-actions,body.focus-visible tree-nav-node .tree-nav-node:focus-within .tree-nav-node-actions{visibility:visible}body:not(.focus-visible) tree-nav-node .tree-nav-node.--settings:hover .tree-nav-node-badge,body.focus-visible tree-nav-node .tree-nav-node.--settings:focus .tree-nav-node-badge,body.focus-visible tree-nav-node .tree-nav-node.--settings:focus-within .tree-nav-node-badge{visibility:visible}tree-nav-node .tree-nav-node:not(.--editable) .tree-nav-node-actions icon:hover,body.focus-visible tree-nav-node .tree-nav-node:not(.--editable) .tree-nav-node-actions icon:focus{color:var(--surface-nav-link-surface-icon-color--active)}tree-nav-node .tree-nav-node.--editable .tree-nav-node-actions:hover>icon,body.focus-visible tree-nav-node .tree-nav-node.--editable .tree-nav-node-actions:focus-within>icon{transition:opacity var(--animation-duration-short);transition-delay:var(--animation-delay-hover);opacity:0}tree-nav-node .tree-nav-node.--editable .tree-nav-node-actions:hover>div,body.focus-visible tree-nav-node .tree-nav-node.--editable .tree-nav-node-actions:focus-within>div{pointer-events:auto;transition:opacity var(--animation-duration-short),max-width 0s;transition-delay:var(--animation-delay-hover);opacity:1;max-width:400rem}tree-nav-node .tree-nav-node.--editable .tree-nav-node-actions:hover>div icon,body.focus-visible tree-nav-node .tree-nav-node.--editable .tree-nav-node-actions:focus-within>div icon{cursor:pointer}tree-nav-node .tree-nav-node-icon{margin-right:calc(0rem + 1 * var(--size-inline-spacing));margin-left:0rem;font-size:22rem;vertical-align:middle;font-weight:700;color:var(--surface-nav-link-surface-icon-color)}tree-nav-node .tree-nav-node-icon>icon:last-child{opacity:0}tree-nav-node .--folder-like .tree-nav-node-icon{margin-left:0;margin-right:var(--size-inline-spacing);font-size:22rem}tree-nav-node>.tree-nav-node.--active .tree-nav-node-icon>icon:first-child,tree-nav-node>tree-nav-subtree.--descendents-active .tree-nav-node .tree-nav-node-icon>icon:first-child{opacity:.1}tree-nav-node>.tree-nav-node.--active .tree-nav-node-icon>icon:last-child,tree-nav-node>tree-nav-subtree.--descendents-active .tree-nav-node .tree-nav-node-icon>icon:last-child{color:var(--surface-nav-link-surface-icon-color--active);opacity:1}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/navigation/tree-nav/components/tree-nav-node/tree-nav-node.scss\"],\"names\":[],\"mappings\":\"AAIA,cAEC,aAAA,CAEA,+BAEC,kBAAA,CAGD,6BAEC,iBAAA,CACA,YAAA,CACA,kBAAA,CACA,qDAAA,CACA,YAAA,CACA,kBAAA,CACA,mDAAA,CACA,yCAAA,CACA,gDAAA,CACA,gDAAA,CACA,cAAA,CAEA,mCAGC,SAAA,CAGD,2JAIC,uDAAA,CACA,uDAAA,CACA,wDAAA,CAEA,sOAEC,uDAAA,CAIF,sCAEC,wDAAA,CACA,wDAAA,CACA,yDAAA,CAEA,+DAEC,wDAAA,CAIF,wCAEC,gDAAA,CAIF,mCAEC,iBAAA,CACA,WAAA,CAEA,8CAEC,iBAAA,CACA,KAAA,CACA,UAAA,CACA,YAAA,CACA,QAAA,CAEA,uBAAA,CACA,2BAAA,CACA,uBAAA,CACA,kCAAA,CACA,yCAAA,CACA,yCAAA,CACA,wCAAA,CACA,+CAAA,CACA,+CAAA,CAIF,mCAEC,iBAAA,CACA,YAAA,CACA,kBAAA,CACA,WAAA,CACA,gBAAA,CACA,iBAAA,CACA,eAAA,CACA,eAAA,CACA,kBAAA,CACA,iCAAA,CAGD,qCAEC,iBAAA,CACA,YAAA,CACA,kBAAA,CACA,WAAA,CACA,gBAAA,CACA,WAAA,CACA,eAAA,CACA,iBAAA,CACA,kBAAA,CAEA,0CAEC,sCAAA,CAGD,0CAEC,iBAAA,CACA,gDAAA,CAGD,yCAEC,mBAAA,CACA,YAAA,CACA,iBAAA,CACA,KAAA,CACA,UAAA,CACA,QAAA,CACA,kBAAA,CACA,kBAAA,CACA,gDAAA,CACA,kBAAA,CACA,cAAA,CACA,SAAA,CAEA,iDAEC,UAAA,CAEA,iBAAA,CACA,KAAA,CACA,UAAA,CACA,QAAA,CACA,UAAA,CACA,kBAAA,CACA,oEAAA,CAAA,4DAAA,CAGD,oDAEC,wDAAA,CAKH,oPAIC,kBAAA,CAGD,+QAIC,kBAAA,CAGD,mLAGC,wDAAA,CAMA,8KAEC,kDAAA,CACA,6CAAA,CACA,SAAA,CAGD,4KAEC,mBAAA,CACA,+DAAA,CACA,6CAAA,CACA,SAAA,CACA,gBAAA,CAEA,sLAEC,cAAA,CAQH,kCAEC,wDAAA,CACA,gBAAA,CACA,eANgB,CAOhB,qBAAA,CACA,eAAA,CACA,gDAAA,CAGD,kDAEC,SAAA,CAGD,iDAEC,aAAA,CACA,uCAAA,CACA,eAtBkB,CAyBnB,mLAGC,UAAA,CAGD,iLAGC,wDAAA,CACA,SAAA\",\"sourcesContent\":[\"@use 'sass:math';\\r\\n\\r\\n@import \\\"resources/index\\\";\\r\\n\\r\\ntree-nav-node\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\ttree-nav-subtree &\\r\\n\\t{\\r\\n\\t\\tpadding-left: 16rem;\\r\\n\\t}\\r\\n\\r\\n\\t.tree-nav-node\\r\\n\\t{\\r\\n\\t\\tposition: relative;\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\tmargin-bottom: 1rem;\\r\\n\\t\\tpadding: calc(4rem - var(--border-width-medium)) 12rem;\\r\\n\\t\\theight: 40rem;\\r\\n\\t\\talign-items: center;\\r\\n\\t\\tborder: var(--border-width-medium) solid transparent;\\r\\n\\t\\tborder-radius: var(--border-radius-medium);\\r\\n\\t\\tcolor: var(--surface-nav-link-surface-text-color);\\r\\n\\t\\tbackground: var(--surface-nav-link-surface-color);\\r\\n\\t\\tcursor: pointer;\\r\\n\\r\\n\\t\\t&:focus\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Ensure the focus outline is not covered by other items.\\r\\n\\t\\t\\tz-index: 1;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&:not(.--active):hover,\\r\\n\\t\\t.focus-visible &:not(.--active):focus,\\r\\n\\t\\t&.--dragover\\r\\n\\t\\t{\\r\\n\\t\\t\\tcolor: var(--surface-nav-link-surface-text-color--hover);\\r\\n\\t\\t\\tbackground: var(--surface-nav-link-surface-color--hover);\\r\\n\\t\\t\\tborder-color: var(--surface-nav-link-border-color--hover);\\r\\n\\r\\n\\t\\t\\t.tree-nav-node-icon > icon\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tcolor: var(--surface-nav-link-surface-icon-color--hover);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&.--active\\r\\n\\t\\t{\\r\\n\\t\\t\\tcolor: var(--surface-nav-link-surface-text-color--active);\\r\\n\\t\\t\\tbackground: var(--surface-nav-link-surface-color--active);\\r\\n\\t\\t\\tborder-color: var(--surface-nav-link-border-color--active);\\r\\n\\r\\n\\t\\t\\t.tree-nav-node-icon > icon\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tcolor: var(--surface-nav-link-surface-icon-color--active);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&.--dragover\\r\\n\\t\\t{\\r\\n\\t\\t\\tborder-color: var(--surface-primary-border-color);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.tree-nav-node-title\\r\\n\\t{\\r\\n\\t\\tposition: relative;\\r\\n\\t\\tflex-grow: 1;\\r\\n\\r\\n\\t\\ttext-input\\r\\n\\t\\t{\\r\\n\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\ttop: 0;\\r\\n\\t\\t\\tleft: -6rem;\\r\\n\\t\\t\\tright: -10rem;\\r\\n\\t\\t\\tbottom: 0;\\r\\n\\r\\n\\t\\t\\t--input-min-height: 1em;\\r\\n\\t\\t\\t--input-padding: 0 0 0 6rem;\\r\\n\\t\\t\\t--input-border-width: 0;\\r\\n\\t\\t\\t--input-surface-color: transparent;\\r\\n\\t\\t\\t--input-surface-color--hover: transparent;\\r\\n\\t\\t\\t--input-surface-color--focus: transparent;\\r\\n\\t\\t\\t--input-surface-text-color: currentColor;\\r\\n\\t\\t\\t--input-surface-text-color--hover: currentColor;\\r\\n\\t\\t\\t--input-surface-text-color--focus: currentColor;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.tree-nav-node-badge\\r\\n\\t{\\r\\n\\t\\tposition: relative;\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\talign-items: center;\\r\\n\\t\\theight: 100%;\\r\\n\\t\\tmargin-left: 8rem;\\r\\n\\t\\tmargin-right: 4rem;\\r\\n\\t\\tfont-size: 12rem;\\r\\n\\t\\tfont-weight: 700;\\r\\n\\t\\tbackground: inherit;\\r\\n\\t\\topacity: var(--opacity-faded-more);\\r\\n\\t}\\r\\n\\r\\n\\t.tree-nav-node-actions\\r\\n\\t{\\r\\n\\t\\tposition: relative;\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\talign-items: center;\\r\\n\\t\\theight: 100%;\\r\\n\\t\\tmargin-left: auto;\\r\\n\\t\\tright: -8rem;\\r\\n\\t\\tfont-size: 16rem;\\r\\n\\t\\tvisibility: hidden;\\r\\n\\t\\tbackground: inherit;\\r\\n\\r\\n\\t\\ticon\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-left: var(--size-inline-spacing);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> icon\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-right: 8rem;\\r\\n\\t\\t\\tcolor: var(--surface-nav-link-surface-icon-color);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> div\\r\\n\\t\\t{\\r\\n\\t\\t\\tpointer-events: none;\\r\\n\\t\\t\\tdisplay: flex;\\r\\n\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\ttop: 0;\\r\\n\\t\\t\\tright: 4rem;\\r\\n\\t\\t\\tbottom: 0;\\r\\n\\t\\t\\tpadding-right: 4rem;\\r\\n\\t\\t\\talign-items: center;\\r\\n\\t\\t\\tcolor: var(--surface-nav-link-surface-icon-color);\\r\\n\\t\\t\\tbackground: inherit;\\r\\n\\t\\t\\tcursor: default;\\r\\n\\t\\t\\topacity: 0;\\r\\n\\r\\n\\t\\t\\t&::before\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tcontent: \\\"\\\";\\r\\n\\r\\n\\t\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\t\\ttop: 0;\\r\\n\\t\\t\\t\\tleft: -8rem;\\r\\n\\t\\t\\t\\tbottom: 0;\\r\\n\\t\\t\\t\\twidth: 8rem;\\r\\n\\t\\t\\t\\tbackground: inherit;\\r\\n\\t\\t\\t\\tmask-image: linear-gradient(to left, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0));\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\ticon:hover\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tcolor: var(--surface-nav-link-surface-icon-color--active);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\tbody:not(.focus-visible) & .tree-nav-node:hover .tree-nav-node-actions,\\r\\n\\tbody.focus-visible & .tree-nav-node:focus .tree-nav-node-actions,\\r\\n\\tbody.focus-visible & .tree-nav-node:focus-within .tree-nav-node-actions\\r\\n\\t{\\r\\n\\t\\tvisibility: visible;\\r\\n\\t}\\r\\n\\r\\n\\tbody:not(.focus-visible) & .tree-nav-node.--settings:hover .tree-nav-node-badge,\\r\\n\\tbody.focus-visible & .tree-nav-node.--settings:focus .tree-nav-node-badge,\\r\\n\\tbody.focus-visible & .tree-nav-node.--settings:focus-within .tree-nav-node-badge\\r\\n\\t{\\r\\n\\t\\tvisibility: visible;\\r\\n\\t}\\r\\n\\r\\n\\t.tree-nav-node:not(.--editable) .tree-nav-node-actions icon:hover,\\r\\n\\tbody.focus-visible & .tree-nav-node:not(.--editable) .tree-nav-node-actions icon:focus\\r\\n\\t{\\r\\n\\t\\tcolor: var(--surface-nav-link-surface-icon-color--active);\\r\\n\\t}\\r\\n\\r\\n\\t.tree-nav-node.--editable .tree-nav-node-actions:hover,\\r\\n\\tbody.focus-visible & .tree-nav-node.--editable .tree-nav-node-actions:focus-within\\r\\n\\t{\\r\\n\\t\\t> icon\\r\\n\\t\\t{\\r\\n\\t\\t\\ttransition: opacity var(--animation-duration-short);\\r\\n\\t\\t\\ttransition-delay: var(--animation-delay-hover);\\r\\n\\t\\t\\topacity: 0;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> div\\r\\n\\t\\t{\\r\\n\\t\\t\\tpointer-events: auto;\\r\\n\\t\\t\\ttransition: opacity var(--animation-duration-short), max-width 0s;\\r\\n\\t\\t\\ttransition-delay: var(--animation-delay-hover);\\r\\n\\t\\t\\topacity: 1;\\r\\n\\t\\t\\tmax-width: 400rem;\\r\\n\\r\\n\\t\\t\\ticon\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tcursor: pointer;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t$icon-size-folder: 22rem;\\r\\n\\t$icon-size-file: 22rem;\\r\\n\\r\\n\\t.tree-nav-node-icon\\r\\n\\t{\\r\\n\\t\\tmargin-right: calc(#{math.div($icon-size-folder - $icon-size-file, 2)} + #{math.div($icon-size-folder, $icon-size-file)} * var(--size-inline-spacing));\\r\\n\\t\\tmargin-left: math.div($icon-size-folder - $icon-size-file, 2);\\r\\n\\t\\tfont-size: $icon-size-file;\\r\\n\\t\\tvertical-align: middle;\\r\\n\\t\\tfont-weight: 700;\\r\\n\\t\\tcolor: var(--surface-nav-link-surface-icon-color);\\r\\n\\t}\\r\\n\\r\\n\\t.tree-nav-node-icon > icon:last-child\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t}\\r\\n\\r\\n\\t.--folder-like .tree-nav-node-icon\\r\\n\\t{\\r\\n\\t\\tmargin-left: 0;\\r\\n\\t\\tmargin-right: var(--size-inline-spacing);\\r\\n\\t\\tfont-size: $icon-size-folder;\\r\\n\\t}\\r\\n\\r\\n\\t> .tree-nav-node.--active .tree-nav-node-icon > icon:first-child,\\r\\n\\t> tree-nav-subtree.--descendents-active .tree-nav-node .tree-nav-node-icon > icon:first-child\\r\\n\\t{\\r\\n\\t\\topacity: 0.1;\\r\\n\\t}\\r\\n\\r\\n\\t> .tree-nav-node.--active .tree-nav-node-icon > icon:last-child,\\r\\n\\t> tree-nav-subtree.--descendents-active .tree-nav-node .tree-nav-node-icon > icon:last-child,\\r\\n\\t{\\r\\n\\t\\tcolor: var(--surface-nav-link-surface-icon-color--active);\\r\\n\\t\\topacity: 1;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { bindable, autoinject, bindingMode } from \"aurelia-framework\";\r\nimport { TreeNode } from \"shared/types\";\r\n\r\n/**\r\n * Represents a tree structure, that the user can navigate within.\r\n */\r\n@autoinject\r\nexport class TreeNavCustomElement\r\n{\r\n\t/**\r\n\t * The tree of which this is a sub-tree, or undefined if this is the root.\r\n\t */\r\n\t@bindable\r\n\tpublic tree: TreeNavCustomElement;\r\n\r\n\t/**\r\n\t * The root nodes of the tree.\r\n\t */\r\n\t@bindable\r\n\tpublic model: TreeNode[];\r\n\r\n\t/**\r\n\t * The selected node, or undefined if no node is selected.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: TreeNode | undefined;\r\n\r\n\t/**\r\n\t * True to allow the user to edit the tree, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic editable: boolean;\r\n\r\n\t/**\r\n\t * True to indicate that the selected node includes its subtree,\r\n\t * false to indicate that the selected node excludes its subtree,\r\n\t * or undefined to indicate that the selected node includes its\r\n\t * subtree only when the node is collapsed.\r\n\t * The default is undefined.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic selectSubtree: boolean | undefined;\r\n\r\n\t/**\r\n\t * The name of the settings icon shown when a node is hovered.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic settingsIcon: string | undefined;\r\n\r\n\t/**\r\n\t * The title of the settings icon shown when a node is hovered.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic settingsIconTitle: string | undefined;\r\n\r\n\t/**\r\n\t * Called when an element is dropped on a node.\r\n\t * @param params The parameters available for binding.\r\n\t */\r\n\t@bindable\r\n\tpublic drop: undefined | ((params:\r\n\t{\r\n\t\t/**\r\n\t\t * The drag event.\r\n\t\t */\r\n\t\tevent: DragEvent;\r\n\r\n\t\t/**\r\n\t\t * The node on which the event occurred.\r\n\t\t */\r\n\t\tnode: TreeNode;\r\n\r\n\t}) => void);\r\n\r\n\t/**\r\n\t * Called when an element is dragged over a node.\r\n\t * @param params The parameters available for binding.\r\n\t */\r\n\t@bindable\r\n\tpublic dragOver: undefined | ((params:\r\n\t{\r\n\t\t/**\r\n\t\t * The drag event.\r\n\t\t */\r\n\t\tevent: DragEvent;\r\n\r\n\t\t/**\r\n\t\t * The node on which the event occurred.\r\n\t\t */\r\n\t\tnode: TreeNode;\r\n\r\n\t}) => void);\r\n\r\n\t/**\r\n\t * Called when the value changes, or when the expanded state of the value changes.\r\n\t * @param params The parameters available for binding.\r\n\t */\r\n\t@bindable\r\n\tpublic change: undefined | ((params:\r\n\t{\r\n\t\t/**\r\n\t\t * The new value.\r\n\t\t */\r\n\t\tnewValue: TreeNode | undefined;\r\n\r\n\t\t/**\r\n\t\t * The old value.\r\n\t\t */\r\n\t\toldValue: TreeNode | undefined;\r\n\r\n\t}) => void);\r\n\r\n\t/**\r\n\t * Called when a new folder-like node should be created.\r\n\t * @returns The new node to be added.\r\n\t */\r\n\t@bindable\r\n\tpublic createNode: undefined | ((params:\r\n\t{\r\n\t\t/**\r\n\t\t * The parent node of the node being created.\r\n\t\t */\r\n\t\tparentNode: TreeNode;\r\n\r\n\t}) => TreeNode);\r\n\r\n\t/**\r\n\t * Called after a new folder-like node was added.\r\n\t * @param params The parameters available for binding.\r\n\t */\r\n\t@bindable\r\n\tpublic nodeCreated: undefined | ((params:\r\n\t{\r\n\t\t/**\r\n\t\t * The node that was added.\r\n\t\t */\r\n\t\tnode: TreeNode;\r\n\r\n\t}) => void);\r\n\r\n\t/**\r\n\t * Called after a node was renamed.\r\n\t * @param params The parameters available for binding.\r\n\t */\r\n\t@bindable\r\n\tpublic nodeRenamed: undefined | ((params:\r\n\t{\r\n\t\t/**\r\n\t\t * The node that was renamed.\r\n\t\t */\r\n\t\tnode: TreeNode;\r\n\r\n\t}) => void);\r\n\r\n\t/**\r\n\t * Called when a node is being deleted.\r\n\t * @param params The parameters available for binding.\r\n\t * @returns A promise that will be resolved with true if the operation should continue, otherwise false.\r\n\t */\r\n\t@bindable\r\n\tpublic deleteNode: undefined | ((params:\r\n\t{\r\n\t\t/**\r\n\t\t * The node being deleted.\r\n\t\t */\r\n\t\tnode: TreeNode;\r\n\r\n\t}) => Promise);\r\n\r\n\t/**\r\n\t * Called when the settings icon for a node is clicked.\r\n\t * @param params The parameters available for binding.\r\n\t */\r\n\t@bindable\r\n\tpublic nodeSettings: undefined | ((params:\r\n\t{\r\n\t\t/**\r\n\t\t * The node whose settings icon was clicked.\r\n\t\t */\r\n\t\tnode: TreeNode;\r\n\r\n\t}) => void);\r\n\r\n\t/**\r\n\t * Called after a node was deleted.\r\n\t * @param params The parameters available for binding.\r\n\t */\r\n\t@bindable\r\n\tpublic nodeDeleted: undefined | ((params:\r\n\t{\r\n\t\t/**\r\n\t\t * The node that was deleted.\r\n\t\t */\r\n\t\tnode: TreeNode;\r\n\r\n\t\t/**\r\n\t\t * The parent node from which the node was detached.\r\n\t\t */\r\n\t\tparentNode: TreeNode;\r\n\r\n\t}) => void);\r\n\r\n\t/**\r\n\t * Navigates to the specified node.\r\n\t * @param newValue The note to navigate to and set as the new value.\r\n\t * @param selectNode True to select the node, otherewise false.\r\n\t * @param expandNode True to expand the node itself, otherwise false.\r\n\t * @param expandPath True to expand every node along the path to the node, otherwise false.\r\n\t * @param notify True to call the `change` function if something changed, otherwise false.\r\n\t */\r\n\tpublic navigate(newValue: TreeNode | undefined, selectNode?: boolean, expandNode?: boolean, expandPath = true, notify = true): void\r\n\t{\r\n\t\tconst oldValue = this.value;\r\n\t\tconst oldExpanded = this.value != null ? this.value.expanded : undefined;\r\n\r\n\t\tif (newValue != null && expandPath)\r\n\t\t{\r\n\t\t\tnewValue.expandPath(expandNode);\r\n\t\t}\r\n\r\n\t\tif (selectNode)\r\n\t\t{\r\n\t\t\tthis.value = newValue;\r\n\t\t}\r\n\r\n\t\tif (notify)\r\n\t\t{\r\n\t\t\tthis.notifyValueChanged(newValue, oldValue, oldExpanded);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Determines whether the specified node supports having child nodes,\r\n\t * i.e. whether the node is folder-like.\r\n\t * @param node The node to test.\r\n\t * @returns True if the node supports having child nodes, otherwise false.\r\n\t */\r\n\tprotected isFolderLike = (node: TreeNode) =>\r\n\t{\r\n\t\treturn node.children != null;\r\n\t}\r\n\r\n\t/**\r\n\t * Determines whether the specified node does not support having child nodes,\r\n\t * i.e. whether the node is file-like.\r\n\t * @param node The node to test.\r\n\t * @returns True if the node does not support having child nodes, otherwise false.\r\n\t */\r\n\tprotected isFileLike = (node: TreeNode) =>\r\n\t{\r\n\t\treturn node.children == null;\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `value` property changes.\r\n\t * @param newValue The new value.\r\n\t * @param oldValue The old value.\r\n\t */\r\n\tprotected valueChanged(newValue: TreeNode | undefined, oldValue: TreeNode | undefined): void\r\n\t{\r\n\t\tif (newValue !== oldValue)\r\n\t\t{\r\n\t\t\tthis.navigate(newValue, true, undefined, true, false);\r\n\r\n\t\t\tconst oldExpanded = oldValue != null ? oldValue.expanded : undefined;\r\n\r\n\t\t\tthis.notifyValueChanged(newValue, oldValue, oldExpanded);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Calls the `change` callback function if something has changed.\r\n\t * @param newValue The new value.\r\n\t * @param oldValue The old value.\r\n\t * @param oldExpanded The expanded state of the old value.\r\n\t */\r\n\tprivate notifyValueChanged(newValue: TreeNode | undefined, oldValue: TreeNode | undefined, oldExpanded: boolean | undefined): void\r\n\t{\r\n\t\tif (this.change != null)\r\n\t\t{\r\n\t\t\tconst changed =\r\n\t\t\t\t(newValue !== oldValue) ||\r\n\t\t\t\t(newValue != null && newValue.expanded !== oldExpanded);\r\n\r\n\t\t\tif (changed)\r\n\t\t\t{\r\n\t\t\t\tthis.change({ newValue, oldValue });\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"tree-nav,tree-nav-subtree{display:block}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/navigation/tree-nav/tree-nav.scss\"],\"names\":[],\"mappings\":\"AAEA,0BAGC,aAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ntree-nav,\\r\\ntree-nav-subtree\\r\\n{\\r\\n\\tdisplay: block;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode } from \"aurelia-framework\";\r\n\r\n/**\r\n * Custom element representing a picker for picking a theme data color.\r\n */\r\n@autoinject\r\nexport class ColorPickerCustomElement\r\n{\r\n\t/**\r\n\t * The value of the picked item, or undefined if no item has been picked.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: number;\r\n\r\n\t/**\r\n\t * Called when the user picks an item.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic pick: () => void;\r\n\r\n\t/**\r\n\t * Called when an item is clicked.\r\n\t * Selects the item.\r\n\t * @param index The index of the selected item.\r\n\t */\r\n\tprotected onItemClick(index: number): void\r\n\t{\r\n\t\tthis.value = index;\r\n\t\tthis.pick?.();\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed within the component.\r\n\t * Moves the selection to the next or previous item if the arrow keys are pressed.\r\n\t * @param event The keyboard event.\r\n\t * @returns True to continue, false to prevent default.\r\n\t */\r\n\tprotected onKeyDown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\t// Never handle the event if default has been prevented.\r\n\t\tif (event.defaultPrevented)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Never block special keys or key combinations.\r\n\t\tif (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif ((event.key === \"PageUp\" || event.key === \"End\") && this.value < 8)\r\n\t\t{\r\n\t\t\tthis.value = 8;\r\n\t\t\tthis.pick?.();\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif ((event.key === \"ArrowUp\" || event.key === \"ArrowRight\") && this.value < 8)\r\n\t\t{\r\n\t\t\tthis.value += 1;\r\n\t\t\tthis.pick?.();\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif ((event.key === \"ArrowDown\" || event.key === \"ArrowLeft\") && this.value > 1)\r\n\t\t{\r\n\t\t\tthis.value -= 1;\r\n\t\t\tthis.pick?.();\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif ((event.key === \"PageDown\" || event.key === \"Home\") && this.value > 1)\r\n\t\t{\r\n\t\t\tthis.value = 1;\r\n\t\t\tthis.pick?.();\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"color-picker{display:flex;align-items:center}color-picker .color-picker-item{width:var(--input-min-height);height:var(--input-min-height);border:var(--border-width-medium) solid var(--surface-input-border-color);border-radius:50%;color:var(--palette-color-whitepoint);cursor:pointer}color-picker .color-picker-item:not(:last-child){margin-right:var(--size-inline-spacing-large)}color-picker .color-picker-item>div{width:100%;height:100%;display:flex;align-items:center;justify-content:center;border-radius:50%;box-shadow:0 0 1px 1px var(--palette-color-whitepoint)}color-picker .color-picker-item icon{filter:drop-shadow(0 0 3px #0005)}color-picker .color-picker-item.--selected{border-color:var(--surface-primary-border-color)}color-picker .color-picker-item.--selected>div{box-shadow:0 0 0 1px var(--palette-color-whitepoint)}color-picker [slot=validation] validation-message{margin-top:6rem}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/pickers/color-picker/color-picker.scss\"],\"names\":[],\"mappings\":\"AAAA,aAGC,YAAA,CAGA,kBAAA,CAEA,gCAEC,6BAAA,CACA,8BAAA,CACA,yEAAA,CACA,iBAAA,CACA,qCAAA,CACA,cAAA,CAEA,iDAGC,6CAAA,CAGD,oCAEC,UAAA,CACA,WAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,iBAAA,CACA,sDAAA,CAGD,qCAEC,iCAAA,CAGD,2CAEC,gDAAA,CAEA,+CAEC,oDAAA,CAOF,kDAGC,eAAA\",\"sourcesContent\":[\"color-picker\\r\\n{\\r\\n\\t// Use horizontal flex layout.\\r\\n\\tdisplay: flex;\\r\\n\\r\\n\\t// Center items vertically.\\r\\n\\talign-items: center;\\r\\n\\r\\n\\t.color-picker-item\\r\\n\\t{\\r\\n\\t\\twidth: var(--input-min-height);\\r\\n\\t\\theight: var(--input-min-height);\\r\\n\\t\\tborder: var(--border-width-medium) solid var(--surface-input-border-color);\\r\\n\\t\\tborder-radius: 50%;\\r\\n\\t\\tcolor: var(--palette-color-whitepoint);\\r\\n\\t\\tcursor: pointer;\\r\\n\\r\\n\\t\\t&:not(:last-child)\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply margin to separate items.\\r\\n\\t\\t\\tmargin-right: var(--size-inline-spacing-large);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> div\\r\\n\\t\\t{\\r\\n\\t\\t\\twidth: 100%;\\r\\n\\t\\t\\theight: 100%;\\r\\n\\t\\t\\tdisplay: flex;\\r\\n\\t\\t\\talign-items: center;\\r\\n\\t\\t\\tjustify-content: center;\\r\\n\\t\\t\\tborder-radius: 50%;\\r\\n\\t\\t\\tbox-shadow: 0 0 1px 1px var(--palette-color-whitepoint);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\ticon\\r\\n\\t\\t{\\r\\n\\t\\t\\tfilter: drop-shadow(0 0 3px #0005);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&.--selected\\r\\n\\t\\t{\\r\\n\\t\\t\\tborder-color: var(--surface-primary-border-color);\\r\\n\\r\\n\\t\\t\\t> div\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tbox-shadow: 0 0 0 1px var(--palette-color-whitepoint);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t[slot=\\\"validation\\\"]\\r\\n\\t{\\r\\n\\t\\tvalidation-message\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply spacing above the validation messages.\\r\\n\\t\\t\\tmargin-top: 6rem;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode, observable } from \"aurelia-framework\";\r\nimport { DateTime, Info, Zone } from \"luxon\";\r\nimport { EventManager } from \"shared/utilities\";\r\nimport { DatesModel } from \"./model/dates-model\";\r\nimport { MonthsModel } from \"./model/months-model\";\r\nimport { YearsModel } from \"./model/years-model\";\r\n\r\n/**\r\n * Custom element representing a picker for picking a date.\r\n */\r\n@autoinject\r\nexport class DatePickerCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element representing the component.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement;\r\n\tprivate readonly _eventManager = new EventManager(this);\r\n\tprivate _isSettingValueInternally = false;\r\n\tprivate _todayTimeoutHandle: any;\r\n\r\n\t/**\r\n\t * The model for the current view.\r\n\t */\r\n\tprotected model: DatesModel | MonthsModel | YearsModel;\r\n\r\n\t/**\r\n\t * The names of the weekdays, ordered according to locale rules.\r\n\t */\r\n\tprotected weekdays = Info.weekdays(\"short\").map(d => d.substring(0, 2));\r\n\r\n\t/**\r\n\t * True to highlight items when hovered, otherwise false.\r\n\t */\r\n\tprotected hoverable = false;\r\n\r\n\t/**\r\n\t * The view currently being presented.\r\n\t */\r\n\t@observable\r\n\tpublic view: \"years\" | \"months\" | \"dates\";\r\n\r\n\t/**\r\n\t * The date of today.\r\n\t */\r\n\tpublic today: DateTime;\r\n\r\n\t/**\r\n\t * The date used as a reference for navigation.\r\n\t */\r\n\tpublic cursor: DateTime;\r\n\r\n\tpublic minValue: DateTime | undefined;\r\n\tpublic maxValue: DateTime | undefined;\r\n\r\n\t/**\r\n\t * The IANA Time Zone Identifier to use, `local` to use the local zone, or `utc` to use the UTC zone.\r\n\t */\r\n\t@bindable({ defaultValue: \"local\" })\r\n\tpublic zone: string | Zone;\r\n\r\n\t/**\r\n\t * The picked date, or undefined if no date has been picked.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: DateTime | undefined;\r\n\r\n\t/**\r\n\t * The focused date, or undefined if no date is focused.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic focusedValue: DateTime | undefined;\r\n\r\n\t/**\r\n\t * The earliest date that can be selected, or undefined to disable this constraint.\r\n\t * This may be a `DateTime` instance, an ISO 8601 string, or the string `today`.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic min: DateTime | string | \"today\" | undefined;\r\n\r\n\t/**\r\n\t * The latest date that can be selected, or undefined to disable this constraint.\r\n\t * This may be a `DateTime` instance, an ISO 8601 string, or the string `today`.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic max: DateTime | string | \"today\" | undefined;\r\n\r\n\t/**\r\n\t * True to preserve the time of the current value when changing the date,\r\n\t * false to always choose the start of the day.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic preserveTime: boolean | undefined;\r\n\r\n\t/**\r\n\t * The element that has input focus.\r\n\t * This must be set to enable keyboard navigation.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic focusedElement: HTMLElement;\r\n\r\n\t/**\r\n\t * True to enable keyboard navigation, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic keyboard: boolean;\r\n\r\n\t/**\r\n\t * Called when the user picks an item.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic pick: () => void;\r\n\r\n\t/**\r\n\t * Called by the framework when the component is binding.\r\n\t */\r\n\tpublic bind(): void\r\n\t{\r\n\t\tthis.focusedElement = this.focusedElement || this._element;\r\n\t\tthis.today = DateTime.local().setZone(this.zone).startOf(\"day\");\r\n\t\tthis.cursor = this.value?.setZone(this.zone).startOf(\"day\") || this.today;\r\n\t\tthis.focusedValue = this.value;\r\n\r\n\t\tthis.minChanged();\r\n\t\tthis.maxChanged();\r\n\r\n\t\tthis.view = \"dates\";\r\n\t\tthis.viewChanged();\r\n\r\n\t\tthis.scheduleTodayRefresh();\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is unbinding.\r\n\t */\r\n\tpublic unbind(): void\r\n\t{\r\n\t\t// Stop refreshing the `today` value.\r\n\t\tclearTimeout(this._todayTimeoutHandle);\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t * Ensures keyboard listeners are attached.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\tthis.keyboardChanged();\r\n\t}\r\n\r\n\t/**\r\n\t * Changes the value of the item picker to the specified value and dispatches an `input` event,\r\n\t * and if the user picked the value, dispatches a `change` event and calls the `pick` callback.\r\n\t * @param value The new value.\r\n\t * @param pick True if the user picked the value, otherwise false.\r\n\t */\r\n\tpublic changeValue(value: DateTime | undefined, pick = false): void\r\n\t{\r\n\t\t// If enabled, preserve the time of the current value.\r\n\t\tif (this.preserveTime && value != null && this.focusedValue != null)\r\n\t\t{\r\n\t\t\tvalue = value.plus(this.focusedValue.diff(this.focusedValue.startOf(\"day\")));\r\n\t\t}\r\n\r\n\t\t// Set the focused value to match the new value.\r\n\t\tthis.focusedValue = value;\r\n\r\n\t\t// Dispatch the `input` event to indicate that the focused value, and possibly the value, has changed.\r\n\t\tthis._element.dispatchEvent(new CustomEvent(\"input\", { bubbles: true, detail: { value } }));\r\n\r\n\t\t// Did the user pick the value?\r\n\t\tif (pick && this.focusedValue !== this.value)\r\n\t\t{\r\n\t\t\t// Set the flag used to prevent navigation to the `dates` view when the value changes.\r\n\t\t\tthis._isSettingValueInternally = true;\r\n\r\n\t\t\t// Set the value.\r\n\t\t\tthis.value = value;\r\n\r\n\t\t\t// Dispatch the `change` event to indicate that the comitted value, has changed.\r\n\t\t\tthis._element.dispatchEvent(new CustomEvent(\"change\", { bubbles: true, detail: { value } }));\r\n\r\n\t\t\t// If the user picked the value, call the `pick` callback.\r\n\t\t\tif (this.pick != null)\r\n\t\t\t{\r\n\t\t\t\t// HACK: Delay the callback so the new value has a chance to propagate through the bindings.\r\n\t\t\t\tPromise.resolve().then(() => this.pick()).catch(error => console.error(error));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the title is clicked, or when navigating between views using the keyboard.\r\n\t * @param direction The direction to zoom, or undefined to zoom in and loop.\r\n\t * Navigates to the parent view.\r\n\t */\r\n\tprotected zoom(direction?: \"in\" | \"out\"): void\r\n\t{\r\n\t\tswitch (this.view)\r\n\t\t{\r\n\t\t\tcase \"dates\": this.view = direction === \"out\" ? \"months\" : direction === \"in\" ? \"dates\" : \"months\"; break;\r\n\t\t\tcase \"months\": this.view = direction === \"out\" ? \"years\" : direction === \"in\" ? \"dates\" : \"years\"; break;\r\n\t\t\tcase \"years\": this.view = direction === \"out\" ? \"years\" : direction === \"in\" ? \"months\" : \"dates\"; break;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `view` property changes.\r\n\t * Creates model for the view.\r\n\t */\r\n\tprotected viewChanged(): void\r\n\t{\r\n\t\tswitch (this.view)\r\n\t\t{\r\n\t\t\tcase \"dates\": this.model = new DatesModel(this); break;\r\n\t\t\tcase \"months\": this.model = new MonthsModel(this); break;\r\n\t\t\tcase \"years\": this.model = new YearsModel(this); break;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `keyboard` property changes.\r\n\t * Adds or removes keyboard event listeners.\r\n\t */\r\n\tprotected keyboardChanged(): void\r\n\t{\r\n\t\t// Dispose event listeners.\r\n\t\tthis._eventManager.removeEventListeners();\r\n\r\n\t\tif (this.keyboard)\r\n\t\t{\r\n\t\t\t// Listen for keyboard events.\r\n\t\t\tthis._eventManager.addEventListener(this.focusedElement, \"keydown\", event => this.onKeyDown(event as KeyboardEvent));\r\n\r\n\t\t\t// Listen for `focusin` events, so we can return focus to the focused element.\r\n\t\t\tthis._eventManager.addEventListener(this._element, \"focusin\", () => this.onFocusIn());\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `value` property changes.\r\n\t * Updates the cursor and focused value to match the new value,\r\n\t * and if the value was set from outside the component,\r\n\t * navigates to the `dates` view.\r\n\t */\r\n\tprotected valueChanged(): void\r\n\t{\r\n\t\t// Update the focused value to match the new value.\r\n\t\tthis.focusedValue = this.value;\r\n\r\n\t\tif (this.value != null)\r\n\t\t{\r\n\t\t\t// Update the cursor to match the new value.\r\n\t\t\tthis.cursor = this.value.setZone(this.zone).startOf(\"day\");\r\n\r\n\t\t\t// If the value was set from outside the component, navigate to the `dates` view.\r\n\t\t\tif (!this._isSettingValueInternally)\r\n\t\t\t{\r\n\t\t\t\tthis.view = \"dates\";\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Reset the flag used to prevent navigation to the `dates` view when the value changes.\r\n\t\tthis._isSettingValueInternally = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `min` property changes.\r\n\t */\r\n\tprotected minChanged(): void\r\n\t{\r\n\t\tif (this.min == null)\r\n\t\t{\r\n\t\t\tthis.minValue = undefined;\r\n\t\t}\r\n\t\telse if (this.min === \"today\")\r\n\t\t{\r\n\t\t\tthis.minValue = this.today;\r\n\t\t}\r\n\t\telse if (typeof this.min === \"string\")\r\n\t\t{\r\n\t\t\tthis.minValue = DateTime.fromISO(this.min).setZone(this.zone);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.minValue = this.min.setZone(this.zone);\r\n\t\t}\r\n\r\n\t\tthis.viewChanged();\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `max` property changes.\r\n\t */\r\n\tprotected maxChanged(): void\r\n\t{\r\n\t\tif (this.max == null)\r\n\t\t{\r\n\t\t\tthis.maxValue = undefined;\r\n\t\t}\r\n\t\telse if (this.max === \"today\")\r\n\t\t{\r\n\t\t\tthis.maxValue = this.today;\r\n\t\t}\r\n\t\telse if (typeof this.max === \"string\")\r\n\t\t{\r\n\t\t\tthis.maxValue = DateTime.fromISO(this.max).setZone(this.zone);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.maxValue = this.max.setZone(this.zone);\r\n\t\t}\r\n\r\n\t\tthis.viewChanged();\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `focusedValue` property changes.\r\n\t * Updates the cursor and if needed re-renders the items.\r\n\t */\r\n\tprotected focusedValueChanged(): void\r\n\t{\r\n\t\tif (this.focusedValue != null)\r\n\t\t{\r\n\t\t\tconst cursorBefore = this.cursor;\r\n\r\n\t\t\t// Update the cursor to match the new value.\r\n\t\t\tthis.cursor = this.focusedValue.setZone(this.zone).startOf(\"day\");\r\n\r\n\t\t\t// Re-rendering is expensive, so avoid doing it too often.\r\n\t\t\tif (!this.cursor.hasSame(cursorBefore, \"month\"))\r\n\t\t\t{\r\n\t\t\t\tthis.viewChanged();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the mouse is moved over the date picker.\r\n\t * Switches to mouse mode, where hover effects are enabled.\r\n\t * @returns True to continue.\r\n\t */\r\n\tprotected onMouseMove(): boolean\r\n\t{\r\n\t\t// The user is using the mouse, so enable hover effects.\r\n\t\tthis.hoverable = true;\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when any part of the component receives focus.\r\n\t * Returns focus to the element specified as the focused element.\r\n\t */\r\n\tprivate onFocusIn(): void\r\n\t{\r\n\t\tthis.focusedElement.focus();\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed within the focused element.\r\n\t * handles keyboard navigation in the grid and between views.\r\n\t * @param event The keyboard event.\r\n\t */\r\n\tprivate onKeyDown(event: KeyboardEvent): void\r\n\t{\r\n\t\t// The user is using the keyboard, so disable hover effects.\r\n\t\tthis.hoverable = false;\r\n\r\n\t\tif (event.defaultPrevented)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!(event.altKey || event.metaKey || event.shiftKey || event.ctrlKey))\r\n\t\t{\r\n\t\t\tswitch (event.key)\r\n\t\t\t{\r\n\t\t\t\tcase \"Home\":\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.changeValue(this.today);\r\n\t\t\t\t\tthis.view = \"dates\";\r\n\t\t\t\t\tevent.preventDefault();\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ((event.altKey || event.metaKey) && !(event.shiftKey || event.ctrlKey))\r\n\t\t{\r\n\t\t\tswitch (event.key)\r\n\t\t\t{\r\n\t\t\t\tcase \"ArrowUp\":\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.zoom(\"out\");\r\n\t\t\t\t\tevent.preventDefault();\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcase \"ArrowDown\":\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.zoom(\"in\");\r\n\t\t\t\t\tevent.preventDefault();\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.model.onKeyDown(event);\r\n\t}\r\n\r\n\t/**\r\n\t * Schedules updates of the `today` value at the end of each day.\r\n\t */\r\n\tprivate scheduleTodayRefresh(): void\r\n\t{\r\n\t\tthis._todayTimeoutHandle = setTimeout(() =>\r\n\t\t{\r\n\t\t\tthis.today = DateTime.local().setZone(this.zone).startOf(\"day\");\r\n\t\t\tthis.scheduleTodayRefresh();\r\n\r\n\t\t}, this.today.endOf(\"day\").diffNow().as(\"milliseconds\"));\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--date-picker-width: 338rem;--date-picker-padding: 16rem;--date-picker-item-gap: 4rem}date-picker{--date-picker-surface-item-border-color: var(--surface-date-picker-surface-item-border-color);--date-picker-surface-item-border-color--hover: var(--surface-date-picker-surface-item-border-color--hover);--date-picker-surface-item-border-color--active: var(--surface-date-picker-surface-item-border-color--active);--date-picker-surface-item-border-color--today: var(--surface-date-picker-surface-item-border-color--today);--date-picker-surface-item-surface-color: var(--surface-date-picker-surface-item-surface-color);--date-picker-surface-item-surface-color--hover: var(--surface-date-picker-surface-item-surface-color--hover);--date-picker-surface-item-surface-color--active: var(--surface-date-picker-surface-item-surface-color--active);--date-picker-surface-item-surface-color--today: var(--surface-date-picker-surface-item-surface-color--today);--date-picker-surface-item-surface-text-color: var(--surface-date-picker-surface-item-surface-text-color);--date-picker-surface-item-surface-text-color--hover: var(--surface-date-picker-surface-item-surface-text-color--hover);--date-picker-surface-item-surface-text-color--active: var(--surface-date-picker-surface-item-surface-text-color--active);--date-picker-surface-item-surface-text-color--today: var(--surface-date-picker-surface-item-surface-text-color--today)}date-picker{display:block;padding:var(--date-picker-padding);width:var(--date-picker-width);max-width:100%;cursor:default}date-picker.--view-dates{--date-picker-columns: 7;--date-picker-row-gap: var(--date-picker-item-gap);--date-picker-column-gap: var(--date-picker-item-gap)}date-picker.--view-months,date-picker.--view-years{--date-picker-item-size-small: calc((100% - 6 * var(--date-picker-item-gap)) / 7);--date-picker-dates-view-height: calc(7 * var(--date-picker-item-size-small) + 6 * var(--date-picker-item-gap));--date-picker-item-size-large: calc((var(--date-picker-dates-view-height) - 3 * var(--date-picker-item-gap)) / 4);--date-picker-column-gap-large: calc((100% - 3 * var(--date-picker-item-size-large)) / 2);--date-picker-columns: 3;--date-picker-row-gap: var(--date-picker-item-gap);--date-picker-column-gap: var(--date-picker-column-gap-large)}date-picker .date-picker-header,date-picker .date-picker-weekdays{display:grid;grid-template-columns:repeat(7, 1fr);row-gap:var(--date-picker-row-gap);-moz-column-gap:var(--date-picker-item-gap);column-gap:var(--date-picker-item-gap)}date-picker .date-picker-header{justify-content:center;align-items:center;margin-bottom:2rem}date-picker .date-picker-header>div{grid-column:2/span 5;display:flex;justify-content:center;align-items:center}date-picker .date-picker-weekdays{margin-bottom:var(--date-picker-row-gap);font-size:var(--font-small-font-size);opacity:var(--opacity-faded)}date-picker .date-picker-weekdays>::before{content:\\\"\\\";display:block;padding-top:100%}date-picker .date-picker-items{display:grid;grid-template-columns:repeat(var(--date-picker-columns), 1fr);row-gap:var(--date-picker-row-gap);-moz-column-gap:var(--date-picker-column-gap);column-gap:var(--date-picker-column-gap)}date-picker .date-picker-items>button[appearance=icon]{border-color:var(--date-picker-surface-item-border-color) !important;background:var(--date-picker-surface-item-surface-color) !important;color:var(--date-picker-surface-item-surface-text-color) !important}date-picker .date-picker-items>button[appearance=icon]:hover{border-color:var(--date-picker-surface-item-border-color--hover) !important;background:var(--date-picker-surface-item-surface-color--hover) !important;color:var(--date-picker-surface-item-surface-text-color--hover) !important}date-picker .date-picker-items>button[appearance=icon].--today{border-color:var(--date-picker-surface-item-border-color--today) !important;background:var(--date-picker-surface-item-surface-color--today) !important;color:var(--date-picker-surface-item-surface-text-color--today) !important}date-picker .date-picker-items>button[appearance=icon].--selected{border-color:var(--date-picker-surface-item-border-color--active) !important;background:var(--date-picker-surface-item-surface-color--active) !important;color:var(--date-picker-surface-item-surface-text-color--active) !important}date-picker .date-picker-items>button[appearance=icon]:not(.--selected).--outside-range{opacity:calc(var(--opacity-faded) / 6)}date-picker .date-picker-items>button[appearance=icon]:not(.--selected).--disabled{opacity:calc(var(--opacity-disabled) / 6)}date-picker .date-picker-items>button[appearance=icon]:not(.--selected).--disabled::after{content:\\\"\\\";position:absolute;top:20%;left:50%;right:50%;bottom:20%;width:2rem;background:currentColor;transform:rotate(45deg)}date-picker .date-picker-weekdays>*,date-picker .date-picker-items>*{position:relative;display:flex;justify-content:center;align-items:center}date-picker.--view-dates .date-picker-items{position:relative}date-picker.--view-dates .date-picker-items>:nth-last-child(2),date-picker.--view-dates .date-picker-items>:nth-last-child(1){display:none}date-picker .date-picker-today{position:absolute;right:0;bottom:0;padding:0 10rem !important;--date-picker-item-width-small: calc((100% - 6 * var(--date-picker-column-gap)) / 7);--date-picker-item-height-small: calc((100% - 5 * var(--date-picker-row-gap)) / 6);min-width:0 !important;width:calc(2 * var(--date-picker-item-width-small) + var(--date-picker-column-gap));min-height:0 !important;height:var(--date-picker-item-height-small)}date-picker:not(.--hoverable) .date-picker-items button[appearance=icon]{pointer-events:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/pickers/date-picker/date-picker.scss\"],\"names\":[],\"mappings\":\"AAAA,MAGC,2BAAA,CAGA,4BAAA,CAGA,4BAAA,CAGD,YAIC,6FAAA,CACA,2GAAA,CACA,6GAAA,CACA,2GAAA,CAIA,+FAAA,CACA,6GAAA,CACA,+GAAA,CACA,6GAAA,CAIA,yGAAA,CACA,uHAAA,CACA,yHAAA,CACA,uHAAA,CAGD,YAEC,aAAA,CAGA,kCAAA,CAGA,8BAAA,CAGA,cAAA,CAGA,cAAA,CAEA,yBAGC,wBAAA,CACA,kDAAA,CACA,qDAAA,CAGD,mDAIC,iFAAA,CACA,+GAAA,CAGA,iHAAA,CACA,yFAAA,CAGA,wBAAA,CACA,kDAAA,CACA,6DAAA,CAGD,kEAIC,YAAA,CACA,oCAAA,CAGA,kCAAA,CACA,2CAAA,CAAA,sCAAA,CAGD,gCAGC,sBAAA,CACA,kBAAA,CAGA,kBAAA,CAEA,oCAGC,oBAAA,CAGA,YAAA,CACA,sBAAA,CACA,kBAAA,CAIF,kCAGC,wCAAA,CAGA,qCAAA,CAGA,4BAAA,CAEA,2CAGC,UAAA,CACA,aAAA,CACA,gBAAA,CAIF,+BAGC,YAAA,CACA,6DAAA,CAGA,kCAAA,CACA,6CAAA,CAAA,wCAAA,CAEA,uDAGC,oEAAA,CACA,mEAAA,CACA,mEAAA,CAEA,6DAGC,2EAAA,CACA,0EAAA,CACA,0EAAA,CAGD,+DAGC,2EAAA,CACA,0EAAA,CACA,0EAAA,CAGD,kEAGC,4EAAA,CACA,2EAAA,CACA,2EAAA,CAKA,wFAGC,sCAAA,CAGD,mFAGC,yCAAA,CAGA,0FAEC,UAAA,CAEA,iBAAA,CACA,OAAA,CACA,QAAA,CACA,SAAA,CACA,UAAA,CACA,UAAA,CACA,uBAAA,CACA,uBAAA,CAUJ,qEAEC,iBAAA,CAGA,YAAA,CACA,sBAAA,CACA,kBAAA,CAIF,4CAGC,iBAAA,CAEA,8HAIC,YAAA,CAIF,+BAGC,iBAAA,CACA,OAAA,CACA,QAAA,CAGA,0BAAA,CAGA,oFAAA,CAGA,kFAAA,CAGA,sBAAA,CACA,mFAAA,CAGA,uBAAA,CACA,2CAAA,CAGD,yEAGC,mBAAA\",\"sourcesContent\":[\":root\\r\\n{\\r\\n\\t// The default width of the component.\\r\\n\\t--date-picker-width: 338rem;\\r\\n\\r\\n\\t// The padding of the component.\\r\\n\\t--date-picker-padding: 16rem;\\r\\n\\r\\n\\t// The gap between items in the grid.\\r\\n\\t--date-picker-item-gap: 4rem;\\r\\n}\\r\\n\\r\\ndate-picker\\r\\n{\\r\\n\\t/// The color of the border of the items within the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--date-picker-surface-item-border-color: var(--surface-date-picker-surface-item-border-color);\\r\\n\\t--date-picker-surface-item-border-color--hover: var(--surface-date-picker-surface-item-border-color--hover);\\r\\n\\t--date-picker-surface-item-border-color--active: var(--surface-date-picker-surface-item-border-color--active);\\r\\n\\t--date-picker-surface-item-border-color--today: var(--surface-date-picker-surface-item-border-color--today);\\r\\n\\r\\n\\t/// The color of the surface of items within the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--date-picker-surface-item-surface-color: var(--surface-date-picker-surface-item-surface-color);\\r\\n\\t--date-picker-surface-item-surface-color--hover: var(--surface-date-picker-surface-item-surface-color--hover);\\r\\n\\t--date-picker-surface-item-surface-color--active: var(--surface-date-picker-surface-item-surface-color--active);\\r\\n\\t--date-picker-surface-item-surface-color--today: var(--surface-date-picker-surface-item-surface-color--today);\\r\\n\\r\\n\\t/// The color of the text on the surface of items within the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--date-picker-surface-item-surface-text-color: var(--surface-date-picker-surface-item-surface-text-color);\\r\\n\\t--date-picker-surface-item-surface-text-color--hover: var(--surface-date-picker-surface-item-surface-text-color--hover);\\r\\n\\t--date-picker-surface-item-surface-text-color--active: var(--surface-date-picker-surface-item-surface-text-color--active);\\r\\n\\t--date-picker-surface-item-surface-text-color--today: var(--surface-date-picker-surface-item-surface-text-color--today);\\r\\n}\\r\\n\\r\\ndate-picker\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\t// Apply padding.\\r\\n\\tpadding: var(--date-picker-padding);\\r\\n\\r\\n\\t// Set the default width.\\r\\n\\twidth: var(--date-picker-width);\\r\\n\\r\\n\\t// Limit to the width of the container.\\r\\n\\tmax-width: 100%;\\r\\n\\r\\n\\t// Use default cursor.\\r\\n\\tcursor: default;\\r\\n\\r\\n\\t&.--view-dates\\r\\n\\t{\\r\\n\\t\\t// Use 7 columns for the dates view.\\r\\n\\t\\t--date-picker-columns: 7;\\r\\n\\t\\t--date-picker-row-gap: var(--date-picker-item-gap);\\r\\n\\t\\t--date-picker-column-gap: var(--date-picker-item-gap);\\r\\n\\t}\\r\\n\\r\\n\\t&.--view-months,\\r\\n\\t&.--view-years\\r\\n\\t{\\r\\n\\t\\t// Calculate the height of the dates view.\\r\\n\\t\\t--date-picker-item-size-small: calc((100% - 6 * var(--date-picker-item-gap)) / 7);\\r\\n\\t\\t--date-picker-dates-view-height: calc(7 * var(--date-picker-item-size-small) + 6 * var(--date-picker-item-gap));\\r\\n\\r\\n\\t\\t// Calculate the column gap for the other views, so they match the height of the dates view.\\r\\n\\t\\t--date-picker-item-size-large: calc((var(--date-picker-dates-view-height) - 3 * var(--date-picker-item-gap)) / 4);\\r\\n\\t\\t--date-picker-column-gap-large: calc((100% - 3 * var(--date-picker-item-size-large)) / 2);\\r\\n\\r\\n\\t\\t// Use 4 columns for the months and years view.\\r\\n\\t\\t--date-picker-columns: 3;\\r\\n\\t\\t--date-picker-row-gap: var(--date-picker-item-gap);\\r\\n\\t\\t--date-picker-column-gap: var(--date-picker-column-gap-large);\\r\\n\\t}\\r\\n\\r\\n\\t.date-picker-header,\\r\\n\\t.date-picker-weekdays\\r\\n\\t{\\r\\n\\t\\t// Use grid layout to create 7 columns, one for each weekday.\\r\\n\\t\\tdisplay: grid;\\r\\n\\t\\tgrid-template-columns: repeat(7, 1fr);\\r\\n\\r\\n\\t\\t// Apply spacing between cells.\\r\\n\\t\\trow-gap: var(--date-picker-row-gap);\\r\\n\\t\\tcolumn-gap: var(--date-picker-item-gap);\\r\\n\\t}\\r\\n\\r\\n\\t.date-picker-header\\r\\n\\t{\\r\\n\\t\\t// Center content to ensure alignment with grid columns.\\r\\n\\t\\tjustify-content: center;\\r\\n\\t\\talign-items: center;\\r\\n\\r\\n\\t\\t// Apply spacing between the header and the weekdays.\\r\\n\\t\\tmargin-bottom: 2rem;\\r\\n\\r\\n\\t\\t> div\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Position the div containing the title so it spans the middle columns.\\r\\n\\t\\t\\tgrid-column: 2 / span 5;\\r\\n\\r\\n\\t\\t\\t// Center the title horizontally.\\r\\n\\t\\t\\tdisplay: flex;\\r\\n\\t\\t\\tjustify-content: center;\\r\\n\\t\\t\\talign-items: center;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.date-picker-weekdays\\r\\n\\t{\\r\\n\\t\\t// Add bottom margin to compensate for the missing row gap.\\r\\n\\t\\tmargin-bottom: var(--date-picker-row-gap);\\r\\n\\r\\n\\t\\t// Use small font size.\\r\\n\\t\\tfont-size: var(--font-small-font-size);\\r\\n\\r\\n\\t\\t// Fade the weekdays.\\r\\n\\t\\topacity: var(--opacity-faded);\\r\\n\\r\\n\\t\\t> ::before\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Hack to ensure the height matches the width.\\r\\n\\t\\t\\tcontent: \\\"\\\";\\r\\n\\t\\t\\tdisplay: block;\\r\\n\\t\\t\\tpadding-top: 100%;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.date-picker-items\\r\\n\\t{\\r\\n\\t\\t// Use grid layout to present the items.\\r\\n\\t\\tdisplay: grid;\\r\\n\\t\\tgrid-template-columns: repeat(var(--date-picker-columns), 1fr);\\r\\n\\r\\n\\t\\t// Apply spacing between cells.\\r\\n\\t\\trow-gap: var(--date-picker-row-gap);\\r\\n\\t\\tcolumn-gap: var(--date-picker-column-gap);\\r\\n\\r\\n\\t\\t> button[appearance=\\\"icon\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply item style for the normal state.\\r\\n\\t\\t\\tborder-color: var(--date-picker-surface-item-border-color) !important;\\r\\n\\t\\t\\tbackground: var(--date-picker-surface-item-surface-color) !important;\\r\\n\\t\\t\\tcolor: var(--date-picker-surface-item-surface-text-color) !important;\\r\\n\\r\\n\\t\\t\\t&:hover\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply item style for the hover state.\\r\\n\\t\\t\\t\\tborder-color: var(--date-picker-surface-item-border-color--hover) !important;\\r\\n\\t\\t\\t\\tbackground: var(--date-picker-surface-item-surface-color--hover) !important;\\r\\n\\t\\t\\t\\tcolor: var(--date-picker-surface-item-surface-text-color--hover) !important;\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t&.--today\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply item style for the today state.\\r\\n\\t\\t\\t\\tborder-color: var(--date-picker-surface-item-border-color--today) !important;\\r\\n\\t\\t\\t\\tbackground: var(--date-picker-surface-item-surface-color--today) !important;\\r\\n\\t\\t\\t\\tcolor: var(--date-picker-surface-item-surface-text-color--today) !important;\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t&.--selected\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply item style for the selected state.\\r\\n\\t\\t\\t\\tborder-color: var(--date-picker-surface-item-border-color--active) !important;\\r\\n\\t\\t\\t\\tbackground: var(--date-picker-surface-item-surface-color--active) !important;\\r\\n\\t\\t\\t\\tcolor: var(--date-picker-surface-item-surface-text-color--active) !important;\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t&:not(.--selected)\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t&.--outside-range\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\t// Fade items that are outside the range.\\r\\n\\t\\t\\t\\t\\topacity: calc(var(--opacity-faded) / 6);\\r\\n\\t\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t\\t&.--disabled\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\t// Fade items that are disabled more than items outside the range.\\r\\n\\t\\t\\t\\t\\topacity: calc(var(--opacity-disabled) / 6);\\r\\n\\r\\n\\t\\t\\t\\t\\t// Add a diagonal line to indicate that the item is unavailable.\\r\\n\\t\\t\\t\\t\\t&::after\\r\\n\\t\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\t\\tcontent: \\\"\\\";\\r\\n\\r\\n\\t\\t\\t\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\t\\t\\t\\ttop: 20%;\\r\\n\\t\\t\\t\\t\\t\\tleft: 50%;\\r\\n\\t\\t\\t\\t\\t\\tright: 50%;\\r\\n\\t\\t\\t\\t\\t\\tbottom: 20%;\\r\\n\\t\\t\\t\\t\\t\\twidth: 2rem;\\r\\n\\t\\t\\t\\t\\t\\tbackground: currentColor;\\r\\n\\t\\t\\t\\t\\t\\ttransform: rotate(45deg);\\r\\n\\t\\t\\t\\t\\t}\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.date-picker-weekdays,\\r\\n\\t.date-picker-items\\r\\n\\t{\\r\\n\\t\\t> *\\r\\n\\t\\t{\\r\\n\\t\\t\\tposition: relative;\\r\\n\\r\\n\\t\\t\\t// Use flex layout to center content.\\r\\n\\t\\t\\tdisplay: flex;\\r\\n\\t\\t\\tjustify-content: center;\\r\\n\\t\\t\\talign-items: center;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.--view-dates .date-picker-items\\r\\n\\t{\\r\\n\\t\\t// Allow content to be positioned relative to this element.\\r\\n\\t\\tposition: relative;\\r\\n\\r\\n\\t\\t> :nth-last-child(2),\\r\\n\\t\\t> :nth-last-child(1)\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Hide the last two dates, to make room for the `Today` button.\\r\\n\\t\\t\\tdisplay: none;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.date-picker-today\\r\\n\\t{\\r\\n\\t\\t// Position at the bottom right corner of the grid.\\r\\n\\t\\tposition: absolute;\\r\\n\\t\\tright: 0;\\r\\n\\t\\tbottom: 0;\\r\\n\\r\\n\\t\\t// Reduce padding to align with column content.\\r\\n\\t\\tpadding: 0 10rem !important;\\r\\n\\r\\n\\t\\t// The computed width of a single item in the grid.\\r\\n\\t\\t--date-picker-item-width-small: calc((100% - 6 * var(--date-picker-column-gap)) / 7);\\r\\n\\r\\n\\t\\t// The computed height of a single item in the grid.\\r\\n\\t\\t--date-picker-item-height-small: calc((100% - 5 * var(--date-picker-row-gap)) / 6);\\r\\n\\r\\n\\t\\t// Match the width of two grid columns.\\r\\n\\t\\tmin-width: 0 !important;\\r\\n\\t\\twidth: calc(2 * var(--date-picker-item-width-small) + var(--date-picker-column-gap));\\r\\n\\r\\n\\t\\t// Match the height of the grid rows.\\r\\n\\t\\tmin-height: 0 !important;\\r\\n\\t\\theight: var(--date-picker-item-height-small);\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--hoverable) .date-picker-items button[appearance=\\\"icon\\\"]\\r\\n\\t{\\r\\n\\t\\t// Prevent hover effects while in keyboard mode.\\r\\n\\t\\tpointer-events: none;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, computedFrom } from \"aurelia-framework\";\r\nimport { ItemPickerCustomElement } from \"./item-picker\";\r\n\r\n/**\r\n * Custom element representing an item in an item picker.\r\n */\r\n@autoinject\r\nexport class ItemCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the class.\r\n\t * @param element The element representing the component.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement;\r\n\tprivate _itemPicker: ItemPickerCustomElement | undefined;\r\n\tprivate _itemPickerElement: HTMLElement;\r\n\r\n\t/**\r\n\t * True if this item represents the focused value of the item picker, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_itemPicker.focusedValue\")\r\n\tprotected get active(): boolean\r\n\t{\r\n\t\tif (this._itemPicker != null)\r\n\t\t{\r\n\t\t\treturn this.equals(this._itemPicker.focusedValue, this.model);\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * True if this item should be visible, false if it should be hidden due to filtering.\r\n\t */\r\n\t@computedFrom(\"model\", \"_itemPicker.excludeValues\", \"_itemPicker.filterValue\")\r\n\tpublic get visible(): boolean\r\n\t{\r\n\t\tif (this._itemPicker != null)\r\n\t\t{\r\n\t\t\tif (this._itemPicker.excludeValues && this._itemPicker.excludeValues.some(value => this.equals(value, this.model)))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (this._itemPicker.filterValue && !this.contains(this._itemPicker.filterValue))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * The value associated with the element.\r\n\t */\r\n\t@bindable\r\n\tpublic model: any;\r\n\r\n\t/**\r\n\t * True if the item is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\t// Find the closest item picker.\r\n\t\tthis._itemPickerElement = this._element.closest(\"item-picker\") as HTMLElement;\r\n\r\n\t\t// Ensure the item picker element was found.\r\n\t\tif (this._itemPickerElement == null)\r\n\t\t{\r\n\t\t\tthrow new Error(\"An 'item' must be placed within an 'item-picker'.\");\r\n\t\t}\r\n\r\n\t\t// Get the view model for the item picker\r\n\t\tthis._itemPicker = (this._itemPickerElement as any).au.controller.viewModel;\r\n\r\n\t\t// Attach the item to the item picker.\r\n\t\tthis._itemPicker!.attachItem();\r\n\r\n\t\t// If the item is focused, ensure it is scrolled into view.\r\n\t\tif (this.equals(this.model, this._itemPicker!.value))\r\n\t\t{\r\n\t\t\tthis.scrollIntoView();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is detached.\r\n\t * Detaches the item from the item picker.\r\n\t */\r\n\tpublic detached(): void\r\n\t{\r\n\t\tthis._itemPicker!.detachItem(this);\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the model of this item as the focused value of the item picker,\r\n\t * scrolling it into view if needed.\r\n\t */\r\n\tpublic focus(): void\r\n\t{\r\n\t\tthis._itemPicker!.changeValue(this.model);\r\n\t\tthis.scrollIntoView();\r\n\t}\r\n\r\n\t/**\r\n\t * Queries the DOM for the item, to determine whether it includes the specified text.\r\n\t * Note that the comparison is case insensitive, and that any whitespace is collapsed to a single space.\r\n\t * @param text The text to look for in the item.\r\n\t * @returns True if the item contains the specified text, otherwise false.\r\n\t */\r\n\tpublic contains(text: string): boolean\r\n\t{\r\n\t\tconst elements: Element[] = [this._element];\r\n\r\n\t\tlet innerText = \"\";\r\n\r\n\t\twhile (elements.length > 0)\r\n\t\t{\r\n\t\t\tconst element = elements.shift()!;\r\n\r\n\t\t\tif (element.textContent)\r\n\t\t\t{\r\n\t\t\t\tinnerText += ` ${element.textContent}`;\r\n\t\t\t}\r\n\r\n\t\t\telements.push(...Array.from(element.children));\r\n\t\t}\r\n\r\n\t\tconst searchText = text.replace(/([^\\w]|_)+/g, \" \").trim().toLowerCase();\r\n\t\tinnerText = innerText.replace(/([^\\w]|_)+/g, \" \").trim().toLowerCase();\r\n\r\n\t\treturn innerText.includes(searchText);\r\n\t}\r\n\r\n\t/**\r\n\t * Scrolls the item into view.\r\n\t */\r\n\tpublic scrollIntoView(): void\r\n\t{\r\n\t\tconst top = this._element.offsetTop - this._element.parentElement!.offsetTop;\r\n\r\n\t\tif (top < this._itemPickerElement.scrollTop)\r\n\t\t{\r\n\t\t\tthis._itemPickerElement.scrollTo({ top });\r\n\t\t}\r\n\t\telse if (top + this._element.offsetHeight > this._itemPickerElement.scrollTop + this._itemPickerElement.offsetHeight)\r\n\t\t{\r\n\t\t\tthis._itemPickerElement.scrollTo({ top: top - this._itemPickerElement.offsetHeight + this._element.offsetHeight });\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `model` property changes.\r\n\t * Re-attaches the item to the item picker.\r\n\t */\r\n\tprotected modelChanged(): void\r\n\t{\r\n\t\tif (this._itemPicker != null)\r\n\t\t{\r\n\t\t\t// If the item is not disabled, attach the item to the item picker.\r\n\t\t\tthis._itemPicker.attachItem();\r\n\r\n\t\t\t// If the item is focused, ensure it is scrolled into view.\r\n\t\t\tif (this.equals(this.model, this._itemPicker.value))\r\n\t\t\t{\r\n\t\t\t\tthis.scrollIntoView();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the item is clicked.\r\n\t * Selects this item, setting its model as the value of the item picker,\r\n\t * and scrolling it into view if needed.\r\n\t * @returns False to prevent default.\r\n\t */\r\n\tprotected onClick(): boolean\r\n\t{\r\n\t\tif (!this.disabled)\r\n\t\t{\r\n\t\t\tthis._itemPicker!.changeValue(this.model, true);\r\n\t\t}\r\n\r\n\t\tthis.scrollIntoView();\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * Determines whether the specified values represent the same primitive value.\r\n\t * @param value1 The first value.\r\n\t * @param value2 The second value.\r\n\t * @returns True if the values represent the same primitive value, otherwise false.\r\n\t */\r\n\tprivate equals(value1: any, value2: any): boolean\r\n\t{\r\n\t\treturn (value1?.valueOf() ?? value1) === (value2?.valueOf() ?? value2);\r\n\t}\r\n}\r\n","import { autoinject, bindable, bindingMode } from \"aurelia-framework\";\r\nimport { ItemCustomElement } from \"./item\";\r\nimport { EventManager } from \"shared/utilities\";\r\n\r\n/**\r\n * Custom element representing a picker for picking an item from a list of items.\r\n */\r\n@autoinject\r\nexport class ItemPickerCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element representing the component.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement;\r\n\tprivate readonly _eventManager = new EventManager(this);\r\n\tprivate _items: ItemCustomElement[] = [];\r\n\r\n\t/**\r\n\t * The element into which items will be projected.\r\n\t */\r\n\tprotected itemsElement: HTMLElement;\r\n\r\n\t/**\r\n\t * True to highlight items when hovered, otherwise false.\r\n\t */\r\n\tprotected hoverable = false;\r\n\r\n\t/**\r\n\t * The element that has input focus.\r\n\t * This must be set to enable keyboard navigation.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic focusedElement: HTMLElement;\r\n\r\n\t/**\r\n\t * The value of the picked item, or undefined if no item has been picked.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: any;\r\n\r\n\t/**\r\n\t * True if the picker contains no visible items, otherwise false.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.fromView })\r\n\tpublic empty = true;\r\n\r\n\t/**\r\n\t * The value of the focused item, or undefined if no item is focused.\r\n\t */\r\n\t@bindable({ defaultValue: undefined, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic focusedValue: any;\r\n\r\n\t/**\r\n\t * True to enable keyboard navigation, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic keyboard: boolean;\r\n\r\n\t/**\r\n\t * True to show the `None` option, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic none: boolean;\r\n\r\n\t/**\r\n\t * The text to filter the items by, or undefined to apply no filter.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic filterValue: string | undefined;\r\n\r\n\t/**\r\n\t * The values of the items that should be excluded from the list.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic excludeValues: any[] | undefined;\r\n\r\n\t/**\r\n\t * Called when the user picks an item.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic pick: () => void;\r\n\r\n\t/**\r\n\t * Called by the framework when the component is binding.\r\n\t */\r\n\tpublic bind(): void\r\n\t{\r\n\t\tthis.focusedElement = this.focusedElement || this._element;\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t * Ensures keyboard listeners are attached.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\tthis.keyboardChanged();\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a child item is attached.\r\n\t * Updates the collection of attached items to match the items present in the DOM.\r\n\t * This approach is needed, because we cannot rely on the order in which items are attached.\r\n\t */\r\n\tpublic attachItem(): void\r\n\t{\r\n\t\tconst newItems: ItemCustomElement[] = [];\r\n\r\n\t\t// Find all descendent elements of type `item`.\r\n\t\tconst itemElements = this.itemsElement.querySelectorAll(\"item\");\r\n\r\n\t\t// Iterate through the elements, in the order they appear in the DOM.\r\n\t\titemElements.forEach((itemElement: any) =>\r\n\t\t{\r\n\t\t\t// Does the element have an `Aurelia` controller?\r\n\t\t\tif (itemElement.au != null && itemElement.au.controller != null)\r\n\t\t\t{\r\n\t\t\t\tconst itemViewModel = itemElement.au.controller.viewModel;\r\n\r\n\t\t\t\t// Is the view model for the element of the expected type?\r\n\t\t\t\tif (itemViewModel instanceof ItemCustomElement)\r\n\t\t\t\t{\r\n\t\t\t\t\t// Add the view model to the new list of items.\r\n\t\t\t\t\tnewItems.push(itemViewModel);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Replace the list of items.\r\n\t\tthis._items = newItems;\r\n\r\n\t\t// Update the `empty` state.\r\n\t\tthis.empty = !this._items.some(i => i.visible);\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a child item is detached.\r\n\t * Removes the item as a child of this item picker.\r\n\t * @param item The child item to detach.\r\n\t */\r\n\tpublic detachItem(item: ItemCustomElement): void\r\n\t{\r\n\t\t// Try to find the item in the list of items.\r\n\t\tconst index = this._items.indexOf(item);\r\n\r\n\t\t// Do nothing if the item was not found.\r\n\t\tif (index > -1)\r\n\t\t{\r\n\t\t\t// Remove the item from the list of items.\r\n\t\t\tthis._items.splice(index, 1);\r\n\r\n\t\t\t// Update the `empty` state.\r\n\t\t\tthis.empty = !this._items.some(i => i.visible);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Changes the value of the item picker to the specified value and dispatches an `input` event,\r\n\t * and if the user picked the value, dispatches a `change` event and calls the `pick` callback.\r\n\t * @param value The new value.\r\n\t * @param pick True if the user picked the value, otherwise false.\r\n\t */\r\n\tpublic changeValue(value: any, pick = false): void\r\n\t{\r\n\t\tif (!this.equals(value, this.focusedValue))\r\n\t\t{\r\n\t\t\t// Set the focused value to match the new value.\r\n\t\t\tthis.focusedValue = value;\r\n\r\n\t\t\t// Dispatch the `input` event to indicate that the focused value, and possibly the value, has changed.\r\n\t\t\tthis._element.dispatchEvent(new CustomEvent(\"input\", { bubbles: true, detail: { value } }));\r\n\t\t}\r\n\r\n\t\t// Did the user pick the value?\r\n\t\tif (pick)\r\n\t\t{\r\n\t\t\tif (!this.equals(this.focusedValue, this.value))\r\n\t\t\t{\r\n\t\t\t\t// Set the value.\r\n\t\t\t\tthis.value = value;\r\n\r\n\t\t\t\t// Dispatch the `change` event to indicate that the comitted value, has changed.\r\n\t\t\t\tthis._element.dispatchEvent(new CustomEvent(\"change\", { bubbles: true, detail: { value } }));\r\n\t\t\t}\r\n\r\n\t\t\t// If the user picked the value, call the `pick` callback.\r\n\t\t\tif (this.pick != null)\r\n\t\t\t{\r\n\t\t\t\t// HACK: Delay the callback so the new value has a chance to propagate through the bindings.\r\n\t\t\t\tPromise.resolve().then(() => this.pick()).catch(error => console.error(error));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Scrolls the item representing the focused value into view.\r\n\t */\r\n\tpublic scrollToFocusedValue(): void\r\n\t{\r\n\t\tconst item = this._items.find(i => this.equals(i.model, this.focusedValue));\r\n\r\n\t\tif (item != null)\r\n\t\t{\r\n\t\t\titem.scrollIntoView();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `keyboard` property changes.\r\n\t * Adds or removes keyboard event listeners.\r\n\t */\r\n\tprotected keyboardChanged(): void\r\n\t{\r\n\t\t// Dispose event listeners.\r\n\t\tthis._eventManager.removeEventListeners();\r\n\r\n\t\tif (this.keyboard)\r\n\t\t{\r\n\t\t\t// Listen for keyboard events.\r\n\t\t\tthis._eventManager.addEventListener(this.focusedElement, \"keydown\", event => this.onKeyDown(event as KeyboardEvent));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `value` property changes.\r\n\t * Updates the `focusedValue` to match the `value`.\r\n\t */\r\n\tprotected valueChanged(): void\r\n\t{\r\n\t\tthis.focusedValue = this.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `focusedValue` property changes.\r\n\t * Focuses the item representing the value.\r\n\t */\r\n\tprotected focusedValueChanged(): void\r\n\t{\r\n\t\tconst item = this._items.find(i => this.equals(i.model, this.focusedValue));\r\n\r\n\t\tif (item != null)\r\n\t\t{\r\n\t\t\titem.focus();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `filterValue` property changes.\r\n\t * Updates the `empty` state to match the visibility of the items.\r\n\t */\r\n\tprotected filterValueChanged(): void\r\n\t{\r\n\t\t// Delay updating the empty state, in case some bindings need time to update.\r\n\t\t// This is specifically needed for the case where the content of an item is bound\r\n\t\t// to the filter value, thereby making it represent a `New item`.\r\n\t\tPromise.resolve().then(() => this.empty = !this._items.some(i => i.visible));\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the mouse is moved over the item picker.\r\n\t * Switches to mouse mode, where hover effects are enabled.\r\n\t * @param event The keyboard event.\r\n\t * @returns True to continue.\r\n\t */\r\n\tprotected onMouseMove(): boolean\r\n\t{\r\n\t\t// The user is using the mouse, so enable hover effects.\r\n\t\tthis.hoverable = true;\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the mouse leaves the item picker.\r\n\t * Switches to keyboard mode, where hover effects are disabled.\r\n\t * @param event The keyboard event.\r\n\t * @returns True to continue.\r\n\t */\r\n\tprotected onMouseLeave(): boolean\r\n\t{\r\n\t\t// The user is not using the mouse, so disable hover effects.\r\n\t\tthis.hoverable = false;\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `excludeValues` property changes.\r\n\t * Updates the empty state, based on the visibility of the items.\r\n\t */\r\n\tprotected excludeValuesChanged(): void\r\n\t{\r\n\t\t// Update the `empty` state.\r\n\t\tthis.empty = !this._items.some(i => i.visible);\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed within the focused element.\r\n\t * Switches to keyboard mode, where hover effects are disabled.\r\n\t * Moves the selection to the next or previous enabled item if the `ArrowUp` or `ArrowDown` keys are pressed.\r\n\t * Sets the value of the picker if the `Enter` key is pressed.\r\n\t * @param event The keyboard event.\r\n\t */\r\n\tprivate onKeyDown(event: KeyboardEvent): void\r\n\t{\r\n\t\t// The user is using the keyboard, so disable hover effects.\r\n\t\tthis.hoverable = false;\r\n\r\n\t\t// Never block special keys or key combinations.\r\n\t\tif (event.defaultPrevented || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Sets the value of the picker if the `Enter` key is pressed.\r\n\t\tif (event.key === \"Enter\")\r\n\t\t{\r\n\t\t\tthis.changeValue(this.focusedValue, true);\r\n\r\n\t\t\tevent.preventDefault();\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Moves the selection to the next or previous item if the `ArrowUp` or `ArrowDown` keys are pressed.\r\n\r\n\t\tconst offset =\r\n\t\t\tevent.key === \"ArrowUp\" ? -1 :\r\n\t\t\tevent.key === \"ArrowDown\" ? 1 :\r\n\t\t\tundefined;\r\n\r\n\t\tif (offset)\r\n\t\t{\r\n\t\t\tlet index: number | undefined;\r\n\r\n\t\t\tif (this.focusedValue !== undefined)\r\n\t\t\t{\r\n\t\t\t\tindex = this._items.findIndex(i => this.equals(i.model, this.focusedValue));\r\n\t\t\t}\r\n\t\t\telse if (this.none)\r\n\t\t\t{\r\n\t\t\t\tindex = 0;\r\n\t\t\t}\r\n\r\n\t\t\tif (index == null)\r\n\t\t\t{\r\n\t\t\t\tindex = offset === 1 ? -1 : this._items.length;\r\n\t\t\t}\r\n\r\n\t\t\tdo\r\n\t\t\t{\r\n\t\t\t\tindex += offset;\r\n\t\t\t}\r\n\t\t\twhile (this._items[index] != null && (this._items[index].disabled || !this._items[index].visible ||\r\n\t\t\t\t(this.filterValue && !this._items[index].contains(this.filterValue))));\r\n\r\n\t\t\tif (this._items[index] != null)\r\n\t\t\t{\r\n\t\t\t\tthis._items[index].focus();\r\n\t\t\t}\r\n\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Determines whether the specified values represent the same primitive value.\r\n\t * @param value1 The first value.\r\n\t * @param value2 The second value.\r\n\t * @returns True if the values represent the same primitive value, otherwise false.\r\n\t */\r\n\tprivate equals(value1: any, value2: any): boolean\r\n\t{\r\n\t\treturn (value1?.valueOf() ?? value1) === (value2?.valueOf() ?? value2);\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"item-picker{display:block;cursor:default}item-picker .item-picker-empty{padding:var(--item-picker-surface-item-padding);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;background:var(--item-picker-surface-item-surface-color);color:var(--item-picker-surface-item-surface-text-color);opacity:var(--opacity-faded)}item-picker .item-picker-none{opacity:var(--opacity-faded-less)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/pickers/item-picker/item-picker.scss\"],\"names\":[],\"mappings\":\"AAAA,YAEC,aAAA,CAGA,cAAA,CAEA,+BAGC,+CAAA,CAGA,kBAAA,CACA,eAAA,CACA,sBAAA,CAGA,wDAAA,CACA,wDAAA,CAGA,4BAAA,CAGD,8BAGC,iCAAA\",\"sourcesContent\":[\"item-picker\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\t// Use default cursor.\\r\\n\\tcursor: default;\\r\\n\\r\\n\\t.item-picker-empty\\r\\n\\t{\\r\\n\\t\\t// Apply padding.\\r\\n\\t\\tpadding: var(--item-picker-surface-item-padding);\\r\\n\\r\\n\\t\\t// Truncate text content with an ellipsis.\\r\\n\\t\\twhite-space: nowrap;\\r\\n\\t\\toverflow: hidden;\\r\\n\\t\\ttext-overflow: ellipsis;\\r\\n\\r\\n\\t\\t// Apply component style for the normal state.\\r\\n\\t\\tbackground: var(--item-picker-surface-item-surface-color);\\r\\n\\t\\tcolor: var(--item-picker-surface-item-surface-text-color);\\r\\n\\r\\n\\t\\t// Reduce opacity, as if disabled.\\r\\n\\t\\topacity: var(--opacity-faded);\\r\\n\\t}\\r\\n\\r\\n\\t.item-picker-none\\r\\n\\t{\\r\\n\\t\\t// Fade the item slightly, relative to other items.\\r\\n\\t\\topacity: var(--opacity-faded-less);\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--item-picker-surface-item-padding: var(--input-padding)}item{--item-picker-surface-item-surface-color: var(--surface-item-picker-surface-item-surface-color);--item-picker-surface-item-surface-color--hover: var(--surface-item-picker-surface-item-surface-color--hover);--item-picker-surface-item-surface-color--active: var(--surface-item-picker-surface-item-surface-color--active);--item-picker-surface-item-surface-text-color: var(--surface-item-picker-surface-item-surface-text-color);--item-picker-surface-item-surface-text-color--hover: var(--surface-item-picker-surface-item-surface-text-color--hover);--item-picker-surface-item-surface-text-color--active: var(--surface-item-picker-surface-item-surface-text-color--active)}item{display:block;padding:var(--item-picker-surface-item-padding);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;background:var(--item-picker-surface-item-surface-color);color:var(--item-picker-surface-item-surface-text-color)}item.--disabled{opacity:var(--opacity-faded)}item:not(.--disabled){cursor:pointer}item-picker.--hoverable item:not(.--disabled):not(.--active):hover{background:var(--item-picker-surface-item-surface-color--hover);color:var(--item-picker-surface-item-surface-text-color--hover)}item-picker item:not(.--disabled).--active{background:var(--item-picker-surface-item-surface-color--active);color:var(--item-picker-surface-item-surface-text-color--active)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/pickers/item-picker/item.scss\"],\"names\":[],\"mappings\":\"AAAA,MAKC,wDAAA,CAGD,KAIC,+FAAA,CACA,6GAAA,CACA,+GAAA,CAIA,yGAAA,CACA,uHAAA,CACA,yHAAA,CAGD,KAEC,aAAA,CAGA,+CAAA,CAGA,kBAAA,CACA,eAAA,CACA,sBAAA,CAGA,wDAAA,CACA,wDAAA,CAEA,gBAGC,4BAAA,CAGD,sBAGC,cAAA,CAGD,mEAGC,+DAAA,CACA,+DAAA,CAGD,2CAGC,gEAAA,CACA,gEAAA\",\"sourcesContent\":[\":root\\r\\n{\\r\\n\\t// TODO: What about border width, color and radius?\\r\\n\\r\\n\\t/// The padding of the component.\\r\\n\\t--item-picker-surface-item-padding: var(--input-padding);\\r\\n}\\r\\n\\r\\nitem\\r\\n{\\r\\n\\t/// The color of the surface of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--item-picker-surface-item-surface-color: var(--surface-item-picker-surface-item-surface-color);\\r\\n\\t--item-picker-surface-item-surface-color--hover: var(--surface-item-picker-surface-item-surface-color--hover);\\r\\n\\t--item-picker-surface-item-surface-color--active: var(--surface-item-picker-surface-item-surface-color--active);\\r\\n\\r\\n\\t/// The color of the text on the surface of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--item-picker-surface-item-surface-text-color: var(--surface-item-picker-surface-item-surface-text-color);\\r\\n\\t--item-picker-surface-item-surface-text-color--hover: var(--surface-item-picker-surface-item-surface-text-color--hover);\\r\\n\\t--item-picker-surface-item-surface-text-color--active: var(--surface-item-picker-surface-item-surface-text-color--active);\\r\\n}\\r\\n\\r\\nitem\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\t// Apply padding.\\r\\n\\tpadding: var(--item-picker-surface-item-padding);\\r\\n\\r\\n\\t// Truncate text content with an ellipsis.\\r\\n\\twhite-space: nowrap;\\r\\n\\toverflow: hidden;\\r\\n\\ttext-overflow: ellipsis;\\r\\n\\r\\n\\t// Apply component style for the normal state.\\r\\n\\tbackground: var(--item-picker-surface-item-surface-color);\\r\\n\\tcolor: var(--item-picker-surface-item-surface-text-color);\\r\\n\\r\\n\\t&.--disabled\\r\\n\\t{\\r\\n\\t\\t// Reduce opacity when disabled.\\r\\n\\t\\topacity: var(--opacity-faded);\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--disabled)\\r\\n\\t{\\r\\n\\t\\t// Set cursor to indicate the item is clickable.\\r\\n\\t\\tcursor: pointer;\\r\\n\\t}\\r\\n\\r\\n\\titem-picker.--hoverable &:not(.--disabled):not(.--active):hover\\r\\n\\t{\\r\\n\\t\\t// Apply component style for the hover state.\\r\\n\\t\\tbackground: var(--item-picker-surface-item-surface-color--hover);\\r\\n\\t\\tcolor: var(--item-picker-surface-item-surface-text-color--hover);\\r\\n\\t}\\r\\n\\r\\n\\titem-picker &:not(.--disabled).--active\\r\\n\\t{\\r\\n\\t\\t// Apply component style for the active state.\\r\\n\\t\\tbackground: var(--item-picker-surface-item-surface-color--active);\\r\\n\\t\\tcolor: var(--item-picker-surface-item-surface-text-color--active);\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { ToggleCustomElement } from \"../toggle\";\r\nimport { customElement } from \"aurelia-framework\";\r\n\r\n/**\r\n * Custom element representing a check toggle.\r\n */\r\n@customElement(\"check-toggle\")\r\nexport class CheckToggleCustomElement extends ToggleCustomElement\r\n{\r\n\t/**\r\n\t * True if the toggle is a single-select toggle, otherwise false.\r\n\t */\r\n\tpublic readonly single = false;\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"check-toggle{--icon-padding-width: calc(var(--toggle-height) * (24 - 18) / 2 / 24)}check-toggle .toggle-control{width:var(--toggle-height);height:var(--toggle-height)}check-toggle .toggle-control icon{position:absolute;width:100%;height:100%;pointer-events:none}check-toggle .toggle-control input{width:100%;height:100%}check-toggle.toggle[label=before]>.toggle-control icon{transform:translateX(var(--icon-padding-width))}check-toggle.toggle[label=before]>.toggle-label{padding-right:calc(var(--size-inline-spacing) - var(--icon-padding-width))}check-toggle.toggle[label=after]>.toggle-control icon{transform:translateX(calc(var(--icon-padding-width) * -1))}check-toggle.toggle[label=after]>.toggle-label{padding-left:calc(var(--size-inline-spacing) - var(--icon-padding-width))}check-toggle.toggle[label=above]>.toggle-control icon{transform:translateX(calc(var(--icon-padding-width) * -1))}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/toggles/check-toggle/check-toggle.scss\"],\"names\":[],\"mappings\":\"AAAA,aAuBC,qEAAA,CArBA,6BAEC,0BAAA,CACA,2BAAA,CAEA,kCAEC,iBAAA,CACA,UAAA,CACA,WAAA,CACA,mBAAA,CAGD,mCAEC,UAAA,CACA,WAAA,CASD,uDAIC,+CAAA,CAGD,gDAIC,0EAAA,CAMD,sDAIC,0DAAA,CAGD,+CAIC,yEAAA,CAMD,sDAIC,0DAAA\",\"sourcesContent\":[\"check-toggle\\r\\n{\\r\\n\\t.toggle-control\\r\\n\\t{\\r\\n\\t\\twidth: var(--toggle-height);\\r\\n\\t\\theight: var(--toggle-height);\\r\\n\\r\\n\\t\\ticon\\r\\n\\t\\t{\\r\\n\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\twidth: 100%;\\r\\n\\t\\t\\theight: 100%;\\r\\n\\t\\t\\tpointer-events: none;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tinput\\r\\n\\t\\t{\\r\\n\\t\\t\\twidth: 100%;\\r\\n\\t\\t\\theight: 100%;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t// The width of the horizontal padding within the SVG icon.\\r\\n\\t--icon-padding-width: calc(var(--toggle-height) * (24 - 18) / 2 / 24);\\r\\n\\r\\n\\t&.toggle[label=\\\"before\\\"]\\r\\n\\t{\\r\\n\\t\\t> .toggle-control icon\\r\\n\\t\\t{\\r\\n\\t\\t\\t// The icon does not fill its viewbox, so to ensure the right edge\\r\\n\\t\\t\\t// edge aligns with other controls, we translate the icon right.\\r\\n\\t\\t\\ttransform: translateX(var(--icon-padding-width));\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> .toggle-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply reduced spacing between the label and the control,\\r\\n\\t\\t\\t// to compensate for the translation of the icon.\\r\\n\\t\\t\\tpadding-right: calc(var(--size-inline-spacing) - var(--icon-padding-width));\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.toggle[label=\\\"after\\\"]\\r\\n\\t{\\r\\n\\t\\t> .toggle-control icon\\r\\n\\t\\t{\\r\\n\\t\\t\\t// The icon does not fill its viewbox, so to ensure the left edge\\r\\n\\t\\t\\t// edge aligns with other controls, we translate the icon left.\\r\\n\\t\\t\\ttransform: translateX(calc(var(--icon-padding-width) * -1));\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> .toggle-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply reduced spacing between the label and the control,\\r\\n\\t\\t\\t// to compensate for the translation of the icon.\\r\\n\\t\\t\\tpadding-left: calc(var(--size-inline-spacing) - var(--icon-padding-width));\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.toggle[label=\\\"above\\\"]\\r\\n\\t{\\r\\n\\t\\t> .toggle-control icon\\r\\n\\t\\t{\\r\\n\\t\\t\\t// The icon does not fill its viewbox, so to ensure the left edge\\r\\n\\t\\t\\t// edge aligns with other controls, we translate the icon left.\\r\\n\\t\\t\\ttransform: translateX(calc(var(--icon-padding-width) * -1));\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { ToggleCustomElement } from \"../toggle\";\r\nimport { customElement } from \"aurelia-framework\";\r\n\r\n/**\r\n * Custom element representing a radio roggle.\r\n */\r\n@customElement(\"radio-toggle\")\r\nexport class RadioToggleCustomElement extends ToggleCustomElement\r\n{\r\n\t/**\r\n\t * True if the toggle is a single-select toggle, otherwise false.\r\n\t */\r\n\tpublic readonly single = true;\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"radio-toggle{--icon-padding-width: calc(var(--toggle-height) * (24 - 18) / 2 / 24)}radio-toggle .toggle-control{width:var(--toggle-height);height:var(--toggle-height)}radio-toggle .toggle-control icon{position:absolute;width:100%;height:100%;pointer-events:none}radio-toggle .toggle-control input{width:100%;height:100%}radio-toggle.toggle[label=before]>.toggle-control icon{transform:translateX(var(--icon-padding-width))}radio-toggle.toggle[label=before]>.toggle-label{padding-right:calc(var(--size-inline-spacing) - var(--icon-padding-width))}radio-toggle.toggle[label=after]>.toggle-control icon{transform:translateX(calc(var(--icon-padding-width) * -1))}radio-toggle.toggle[label=after]>.toggle-label{padding-left:calc(var(--size-inline-spacing) - var(--icon-padding-width))}radio-toggle.toggle[label=after]>.toggle-label .toggle-description>*{color:var(--palette-color-neutral-dark)}radio-toggle.toggle[label=above]>.toggle-control icon{transform:translateX(calc(var(--icon-padding-width) * -1))}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/toggles/radio-toggle/radio-toggle.scss\"],\"names\":[],\"mappings\":\"AAAA,aAuBC,qEAAA,CArBA,6BAEC,0BAAA,CACA,2BAAA,CAEA,kCAEC,iBAAA,CACA,UAAA,CACA,WAAA,CACA,mBAAA,CAGD,mCAEC,UAAA,CACA,WAAA,CASD,uDAIC,+CAAA,CAGD,gDAIC,0EAAA,CAMD,sDAIC,0DAAA,CAGD,+CAIC,yEAAA,CAEA,qEAEC,uCAAA,CAOF,sDAIC,0DAAA\",\"sourcesContent\":[\"radio-toggle\\r\\n{\\r\\n\\t.toggle-control\\r\\n\\t{\\r\\n\\t\\twidth: var(--toggle-height);\\r\\n\\t\\theight: var(--toggle-height);\\r\\n\\r\\n\\t\\ticon\\r\\n\\t\\t{\\r\\n\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\twidth: 100%;\\r\\n\\t\\t\\theight: 100%;\\r\\n\\t\\t\\tpointer-events: none;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tinput\\r\\n\\t\\t{\\r\\n\\t\\t\\twidth: 100%;\\r\\n\\t\\t\\theight: 100%;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t// The width of the horizontal padding within the SVG icon.\\r\\n\\t--icon-padding-width: calc(var(--toggle-height) * (24 - 18) / 2 / 24);\\r\\n\\r\\n\\t&.toggle[label=\\\"before\\\"]\\r\\n\\t{\\r\\n\\t\\t> .toggle-control icon\\r\\n\\t\\t{\\r\\n\\t\\t\\t// The icon does not fill its viewbox, so to ensure the right edge\\r\\n\\t\\t\\t// edge aligns with other controls, we translate the icon right.\\r\\n\\t\\t\\ttransform: translateX(var(--icon-padding-width));\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> .toggle-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply reduced spacing between the label and the control,\\r\\n\\t\\t\\t// to compensate for the translation of the icon.\\r\\n\\t\\t\\tpadding-right: calc(var(--size-inline-spacing) - var(--icon-padding-width));\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.toggle[label=\\\"after\\\"]\\r\\n\\t{\\r\\n\\t\\t> .toggle-control icon\\r\\n\\t\\t{\\r\\n\\t\\t\\t// The icon does not fill its viewbox, so to ensure the left edge\\r\\n\\t\\t\\t// edge aligns with other controls, we translate the icon left.\\r\\n\\t\\t\\ttransform: translateX(calc(var(--icon-padding-width) * -1));\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> .toggle-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply reduced spacing between the label and the control,\\r\\n\\t\\t\\t// to compensate for the translation of the icon.\\r\\n\\t\\t\\tpadding-left: calc(var(--size-inline-spacing) - var(--icon-padding-width));\\r\\n\\r\\n\\t\\t\\t.toggle-description > *\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tcolor: var(--palette-color-neutral-dark);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.toggle[label=\\\"above\\\"]\\r\\n\\t{\\r\\n\\t\\t> .toggle-control icon\\r\\n\\t\\t{\\r\\n\\t\\t\\t// The icon does not fill its viewbox, so to ensure the left edge\\r\\n\\t\\t\\t// edge aligns with other controls, we translate the icon left.\\r\\n\\t\\t\\ttransform: translateX(calc(var(--icon-padding-width) * -1));\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { ToggleCustomElement } from \"../toggle\";\r\nimport { customElement } from \"aurelia-framework\";\r\n\r\n/**\r\n * Custom element representing a switch toggle.\r\n */\r\n@customElement(\"switch-toggle\")\r\nexport class SwitchToggleCustomElement extends ToggleCustomElement\r\n{\r\n\t/**\r\n\t * True if the toggle is a single-select toggle, otherwise false.\r\n\t */\r\n\tpublic readonly single = false;\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"switch-toggle{--icon-padding-width: calc(var(--toggle-height) * (48 - 40) / 2 / 24)}switch-toggle .toggle-control{width:calc(var(--toggle-height) * 2);height:var(--toggle-height)}switch-toggle .toggle-control icon{position:absolute;width:100%;height:200%;pointer-events:none}switch-toggle .toggle-control input{width:100%;height:100%}switch-toggle.toggle[label=before]>.toggle-control icon{transform:translateX(var(--icon-padding-width))}switch-toggle.toggle[label=before]>.toggle-label{padding-right:calc(var(--size-inline-spacing) - var(--icon-padding-width))}switch-toggle.toggle[label=after]>.toggle-control icon{transform:translateX(calc(var(--icon-padding-width) * -1))}switch-toggle.toggle[label=after]>.toggle-label{padding-left:calc(var(--size-inline-spacing) - var(--icon-padding-width))}switch-toggle.toggle[label=above]>.toggle-control icon{transform:translateX(calc(var(--icon-padding-width) * -1))}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/toggles/switch-toggle/switch-toggle.scss\"],\"names\":[],\"mappings\":\"AAAA,cAuBC,qEAAA,CArBA,8BAEC,oCAAA,CACA,2BAAA,CAEA,mCAEC,iBAAA,CACA,UAAA,CACA,WAAA,CACA,mBAAA,CAGD,oCAEC,UAAA,CACA,WAAA,CASD,wDAIC,+CAAA,CAGD,iDAIC,0EAAA,CAMD,uDAIC,0DAAA,CAGD,gDAIC,yEAAA,CAMD,uDAIC,0DAAA\",\"sourcesContent\":[\"switch-toggle\\r\\n{\\r\\n\\t.toggle-control\\r\\n\\t{\\r\\n\\t\\twidth: calc(var(--toggle-height) * 2);\\r\\n\\t\\theight: var(--toggle-height);\\r\\n\\r\\n\\t\\ticon\\r\\n\\t\\t{\\r\\n\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\twidth: 100%;\\r\\n\\t\\t\\theight: 200%;\\r\\n\\t\\t\\tpointer-events: none;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tinput\\r\\n\\t\\t{\\r\\n\\t\\t\\twidth: 100%;\\r\\n\\t\\t\\theight: 100%;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t// The width of the horizontal padding within the SVG icon.\\r\\n\\t--icon-padding-width: calc(var(--toggle-height) * (48 - 40) / 2 / 24);\\r\\n\\r\\n\\t&.toggle[label=\\\"before\\\"]\\r\\n\\t{\\r\\n\\t\\t> .toggle-control icon\\r\\n\\t\\t{\\r\\n\\t\\t\\t// The icon does not fill its viewbox, so to ensure the right edge\\r\\n\\t\\t\\t// edge aligns with other controls, we translate the icon right.\\r\\n\\t\\t\\ttransform: translateX(var(--icon-padding-width));\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> .toggle-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply reduced spacing between the label and the control,\\r\\n\\t\\t\\t// to compensate for the translation of the icon.\\r\\n\\t\\t\\tpadding-right: calc(var(--size-inline-spacing) - var(--icon-padding-width));\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.toggle[label=\\\"after\\\"]\\r\\n\\t{\\r\\n\\t\\t> .toggle-control icon\\r\\n\\t\\t{\\r\\n\\t\\t\\t// The icon does not fill its viewbox, so to ensure the left edge\\r\\n\\t\\t\\t// edge aligns with other controls, we translate the icon left.\\r\\n\\t\\t\\ttransform: translateX(calc(var(--icon-padding-width) * -1));\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> .toggle-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply reduced spacing between the label and the control,\\r\\n\\t\\t\\t// to compensate for the translation of the icon.\\r\\n\\t\\t\\tpadding-left: calc(var(--size-inline-spacing) - var(--icon-padding-width));\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.toggle[label=\\\"above\\\"]\\r\\n\\t{\\r\\n\\t\\t> .toggle-control icon\\r\\n\\t\\t{\\r\\n\\t\\t\\t// The icon does not fill its viewbox, so to ensure the left edge\\r\\n\\t\\t\\t// edge aligns with other controls, we translate the icon left.\\r\\n\\t\\t\\ttransform: translateX(calc(var(--icon-padding-width) * -1));\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode } from \"aurelia-framework\";\r\nimport { Id } from \"shared/utilities\";\r\nimport { ToggleCustomElement } from \"../toggle\";\r\n\r\n/**\r\n * Custom element representing a group of toggles.\r\n */\r\n@autoinject\r\nexport class ToggleGroupCustomElement\r\n{\r\n\tprivate readonly _toggles: ToggleCustomElement[] = [];\r\n\r\n\t/**\r\n\t * The unique ID of the control.\r\n\t */\r\n\tprotected id = Id.sequential();\r\n\r\n\t/**\r\n\t * The model associated with the active toggle, or if multiple toggles are active, and array\r\n\t * of the models associated with the active toggles, or undefined if no toggle is active.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: any | any[];\r\n\r\n\t/**\r\n\t * True if the toggle group is disabled, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * True if the toggle group is readonly, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic readonly: boolean;\r\n\r\n\t/**\r\n\t * True while toggle values are being updated, otherwise false.\r\n\t */\r\n\tpublic isUpdatingToggles = false;\r\n\r\n\t/**\r\n\t * Called when a toggle is attached.\r\n\t * Adds the toggle as a child of this toggle group.\r\n\t * @param toggle The toggle to attach.\r\n\t */\r\n\tpublic attachToggle(toggle: ToggleCustomElement): void\r\n\t{\r\n\t\t// Add the toggle to the list of toggles.\r\n\t\tthis._toggles.push(toggle);\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a toggle is detached.\r\n\t * Removes the toggle as a child of this toggle group.\r\n\t * @param toggle The toggle to detach.\r\n\t */\r\n\tpublic detachToggle(toggle: ToggleCustomElement): void\r\n\t{\r\n\t\t// Try to find the toggle in the list of toggles.\r\n\t\tconst index = this._toggles.indexOf(toggle);\r\n\r\n\t\t// Do nothing if the toggle was not found.\r\n\t\tif (index > -1)\r\n\t\t{\r\n\t\t\t// Remove the toggle from the list of toggles.\r\n\t\t\tthis._toggles.splice(this._toggles.indexOf(toggle), 1);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the specified toggle is activated.\r\n\t * Updates the group value to match the new state.\r\n\t * @param toggle The toggle being activated.\r\n\t */\r\n\tpublic onToggleActivated(toggle: ToggleCustomElement): void\r\n\t{\r\n\t\tif (toggle.single)\r\n\t\t{\r\n\t\t\tthis.value = toggle.model;\r\n\t\t}\r\n\t\telse if (this.value instanceof Array)\r\n\t\t{\r\n\t\t\tif (!this.value.includes(toggle.model))\r\n\t\t\t{\r\n\t\t\t\tthis.value = [...this.value, toggle.model];\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.value = [toggle.model];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the specified toggle is deactivated.\r\n\t * Updates the group value to match the new state.\r\n\t * @param toggle The toggle being deactivated.\r\n\t */\r\n\tpublic onToggleDeactivated(toggle: ToggleCustomElement): void\r\n\t{\r\n\t\tif (toggle.model === this.value)\r\n\t\t{\r\n\t\t\tthis.value = undefined;\r\n\t\t}\r\n\t\telse if (this.value instanceof Array)\r\n\t\t{\r\n\t\t\tconst index = this.value.indexOf(toggle.model);\r\n\r\n\t\t\tif (index > -1)\r\n\t\t\t{\r\n\t\t\t\tif (this.value.length > 1)\r\n\t\t\t\t{\r\n\t\t\t\t\tconst newValue = [...this.value];\r\n\t\t\t\t\tnewValue.splice(index, 1);\r\n\t\t\t\t\tthis.value = newValue;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.value = undefined;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the model of a toggle changes.\r\n\t * If the toggle is active, updates the group value to match the new model.\r\n\t * @param newModel The new toggle model.\r\n\t * @param oldModel The old toggle model.\r\n\t */\r\n\tpublic onToggleModelChanged(newModel: any, oldModel: any): void\r\n\t{\r\n\t\tif (this.value !== undefined)\r\n\t\t{\r\n\t\t\tif (this.value === oldModel)\r\n\t\t\t{\r\n\t\t\t\tthis.value = newModel;\r\n\t\t\t}\r\n\t\t\telse if (this.value instanceof Array)\r\n\t\t\t{\r\n\t\t\t\tconst index = this.value.indexOf(oldModel);\r\n\r\n\t\t\t\tif (index > -1)\r\n\t\t\t\t{\r\n\t\t\t\t\tconst newValue = [...this.value];\r\n\t\t\t\t\tnewValue.splice(index, 1, newModel);\r\n\t\t\t\t\tthis.value = newValue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `value` property changes.\r\n\t * Updates the state of the attached toggles.\r\n\t */\r\n\tprotected valueChanged(): void\r\n\t{\r\n\t\tthis.isUpdatingToggles = true;\r\n\r\n\t\tif (this.value instanceof Array)\r\n\t\t{\r\n\t\t\tfor (const toggle of this._toggles)\r\n\t\t\t{\r\n\t\t\t\ttoggle.value = this.value.includes(toggle.model);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tfor (const toggle of this._toggles)\r\n\t\t\t{\r\n\t\t\t\ttoggle.value = this.value === toggle.model;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.isUpdatingToggles = false;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"toggle-group{display:block}toggle-group>.toggle-validation validation-message{margin-top:6rem}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/toggles/toggle-group/toggle-group.scss\"],\"names\":[],\"mappings\":\"AAAA,aAEC,aAAA,CAIC,mDAGC,eAAA\",\"sourcesContent\":[\"toggle-group\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\t> .toggle-validation\\r\\n\\t{\\r\\n\\t\\tvalidation-message\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply spacing above the validation messages.\\r\\n\\t\\t\\tmargin-top: 6rem;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--toggle-height: calc(24em / 14)}.toggle{--toggle-surface-indicator-color: var(--surface-toggle-surface-indicator-color--active);--toggle-surface-indicator-color--hover: var(--surface-toggle-surface-indicator-color--active);--toggle-surface-indicator-color--focus: var(--surface-toggle-surface-indicator-color--active);--toggle-surface-indicator-color--active: var(--surface-toggle-surface-indicator-color--active);--toggle-surface-indicator-color--invalid: var(--surface-toggle-surface-indicator-color--invalid)}.toggle{display:grid;align-items:flex-start;grid-template-columns:1fr;grid-template-rows:1fr -webkit-min-content;grid-template-rows:1fr min-content;grid-template-areas:\\\"control\\\" \\\"validation\\\"}.toggle[label=above]{grid-template-columns:1fr;grid-template-rows:-webkit-min-content 1fr -webkit-min-content;grid-template-rows:min-content 1fr min-content;grid-template-areas:\\\"label\\\" \\\"control\\\" \\\"validation\\\"}.toggle[label=above]>.toggle-label{display:block;margin-bottom:calc(var(--font-current-margin-bottom) - var(--font-small-margin-top))}.toggle[label=above]>.toggle-label .toggle-heading>*{margin-bottom:var(--font-small-margin-top)}.toggle[label=above]>.toggle-label .toggle-description>*{margin-bottom:var(--font-small-margin-top)}.toggle[label=before]>.toggle-label .toggle-description>*,.toggle[label=after]>.toggle-label .toggle-description>*{margin-top:var(--font-current-margin-bottom)}.toggle[label=before]>.toggle-control,.toggle[label=after]>.toggle-control{margin-top:-2rem}.toggle[label=before]{grid-template-columns:1fr -webkit-min-content;grid-template-columns:1fr min-content;grid-template-rows:1fr -webkit-min-content;grid-template-rows:1fr min-content;grid-template-areas:\\\"label control\\\" \\\"validation validation\\\"}.toggle[label=before]>.toggle-label{display:block;align-self:center;padding-right:var(--size-inline-spacing-large)}.toggle[label=after]{grid-template-columns:-webkit-min-content 1fr;grid-template-columns:min-content 1fr;grid-template-rows:1fr -webkit-min-content;grid-template-rows:1fr min-content;grid-template-areas:\\\"control label\\\" \\\"validation validation\\\"}.toggle[label=after]>.toggle-label{display:block;align-self:center;padding-left:var(--size-inline-spacing-large)}.toggle>.toggle-label{grid-area:label;position:relative;display:none;cursor:pointer;min-width:0}.toggle>.toggle-control{grid-area:control;justify-self:flex-start;align-self:stretch;position:relative;display:flex;align-items:stretch;color:var(--toggle-surface-indicator-color);cursor:pointer}.toggle>.toggle-validation{grid-area:validation}.toggle>.toggle-validation validation-message{margin-top:6rem}.toggle.--disabled{opacity:var(--opacity-disabled)}.toggle.--disabled>.toggle-label,.toggle.--disabled>.toggle-control{cursor:default}.toggle:not(.--disabled):not(.--readonly):not(.--invalid):not(.--active):hover>.toggle-control{color:var(--toggle-surface-indicator-color--hover)}.toggle:not(.--disabled):not(.--readonly):not(.--invalid):not(.--active):focus-within>.toggle-control{color:var(--toggle-surface-indicator-color--focus)}.toggle:not(.--invalid).--active>.toggle-control{color:var(--toggle-surface-indicator-color--active)}.toggle:not(.--disabled):not(.--readonly).--invalid>.toggle-control{color:var(--toggle-surface-indicator-color--invalid)}.toggle>.toggle-control input{-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0;border:0;cursor:inherit}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/toggles/toggle.scss\"],\"names\":[],\"mappings\":\"AAEA,MAGC,gCAAA,CAGD,QAIC,uFAAA,CACA,8FAAA,CACA,8FAAA,CACA,+FAAA,CACA,iGAAA,CAGD,QAGC,YAAA,CAGA,sBAAA,CAGA,yBAAA,CACA,0CAAA,CAAA,kCAAA,CACA,0CACC,CAGD,qBAGC,yBAAA,CACA,8DAAA,CAAA,8CAAA,CACA,kDACC,CAID,mCAGC,aAAA,CAGA,oFAAA,CAEA,qDAGC,0CAAA,CAGD,yDAGC,0CAAA,CAUD,mHAGC,4CAAA,CAGF,2EAEC,gBAAA,CAIF,sBAGC,6CAAA,CAAA,qCAAA,CACA,0CAAA,CAAA,kCAAA,CACA,2DACC,CAGD,oCAGC,aAAA,CAGA,iBAAA,CAGA,8CAAA,CAIF,qBAGC,6CAAA,CAAA,qCAAA,CACA,0CAAA,CAAA,kCAAA,CACA,2DACC,CAGD,mCAGC,aAAA,CAGA,iBAAA,CAGA,6CAAA,CAIF,sBAGC,eAAA,CAGA,iBAAA,CAGA,YAAA,CAGA,cAAA,CAGA,WAAA,CAGD,wBAGC,iBAAA,CACA,uBAAA,CACA,kBAAA,CAGA,iBAAA,CAGA,YAAA,CACA,mBAAA,CAGA,2CAAA,CAGA,cAAA,CAGD,2BAGC,oBAAA,CAEA,8CAGC,eAAA,CAIF,mBAGC,+BAAA,CAEA,oEAIC,cAAA,CAMD,+FAGC,kDAAA,CAMD,sGAGC,kDAAA,CAMD,iDAGC,mDAAA,CAMD,oEAGC,oDAAA,CAUF,8BAEC,uBAAA,CAAA,oBAAA,CAAA,eAAA,CACA,QAAA,CACA,QAAA,CACA,cAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\n:root\\r\\n{\\r\\n\\t/// The min-height of the component.\\r\\n\\t--toggle-height: calc(24em / 14);\\r\\n}\\r\\n\\r\\n.toggle\\r\\n{\\r\\n\\t/// The color of the indicator on the surface of the component.\\r\\n\\t/// NOTE: This should be customized for each theme surface.\\r\\n\\t--toggle-surface-indicator-color: var(--surface-toggle-surface-indicator-color--active);\\r\\n\\t--toggle-surface-indicator-color--hover: var(--surface-toggle-surface-indicator-color--active);\\r\\n\\t--toggle-surface-indicator-color--focus: var(--surface-toggle-surface-indicator-color--active);\\r\\n\\t--toggle-surface-indicator-color--active: var(--surface-toggle-surface-indicator-color--active);\\r\\n\\t--toggle-surface-indicator-color--invalid: var(--surface-toggle-surface-indicator-color--invalid);\\r\\n}\\r\\n\\r\\n.toggle\\r\\n{\\r\\n\\t// Use grid layout.\\r\\n\\tdisplay: grid;\\r\\n\\r\\n\\t// Align items with the top.\\r\\n\\talign-items: flex-start;\\r\\n\\r\\n\\t// By default, define the grid without the label.\\r\\n\\tgrid-template-columns: 1fr;\\r\\n\\tgrid-template-rows: 1fr min-content;\\r\\n\\tgrid-template-areas:\\r\\n\\t\\t\\\"control\\\"\\r\\n\\t\\t\\\"validation\\\";\\r\\n\\r\\n\\t&[label=\\\"above\\\"]\\r\\n\\t{\\r\\n\\t\\t// Define the grid with the label above the control.\\r\\n\\t\\tgrid-template-columns: 1fr;\\r\\n\\t\\tgrid-template-rows: min-content 1fr min-content;\\r\\n\\t\\tgrid-template-areas:\\r\\n\\t\\t\\t\\\"label\\\"\\r\\n\\t\\t\\t\\\"control\\\"\\r\\n\\t\\t\\t\\\"validation\\\";\\r\\n\\r\\n\\t\\t> .toggle-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Show the label.\\r\\n\\t\\t\\tdisplay: block;\\r\\n\\r\\n\\t\\t\\t// Apply spacing between the label and the control.\\r\\n\\t\\t\\tmargin-bottom: calc(var(--font-current-margin-bottom) - var(--font-small-margin-top));\\r\\n\\r\\n\\t\\t\\t.toggle-heading > *\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply spacing between the heading and the description.\\r\\n\\t\\t\\t\\tmargin-bottom: var(--font-small-margin-top);\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t.toggle-description > *\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply spacing between the heading and the description.\\r\\n\\t\\t\\t\\tmargin-bottom: var(--font-small-margin-top);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&[label=\\\"before\\\"],\\r\\n\\t&[label=\\\"after\\\"]\\r\\n\\t{\\r\\n\\t\\t> .toggle-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t.toggle-description > *\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Apply spacing between the heading and the description.\\r\\n\\t\\t\\t\\tmargin-top: var(--font-current-margin-bottom);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t\\t> .toggle-control\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: -2rem;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&[label=\\\"before\\\"]\\r\\n\\t{\\r\\n\\t\\t// Define the grid with the label inline with the control.\\r\\n\\t\\tgrid-template-columns: 1fr min-content;\\r\\n\\t\\tgrid-template-rows: 1fr min-content;\\r\\n\\t\\tgrid-template-areas:\\r\\n\\t\\t\\t\\\"label control\\\"\\r\\n\\t\\t\\t\\\"validation validation\\\";\\r\\n\\r\\n\\t\\t> .toggle-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Show the label.\\r\\n\\t\\t\\tdisplay: block;\\r\\n\\r\\n\\t\\t\\t// Center vertically.\\r\\n\\t\\t\\talign-self: center;\\r\\n\\r\\n\\t\\t\\t// Apply spacing between the label and the control.\\r\\n\\t\\t\\tpadding-right: var(--size-inline-spacing-large);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&[label=\\\"after\\\"]\\r\\n\\t{\\r\\n\\t\\t// Define the grid with the label inline with the control.\\r\\n\\t\\tgrid-template-columns: min-content 1fr;\\r\\n\\t\\tgrid-template-rows: 1fr min-content;\\r\\n\\t\\tgrid-template-areas:\\r\\n\\t\\t\\t\\\"control label\\\"\\r\\n\\t\\t\\t\\\"validation validation\\\";\\r\\n\\r\\n\\t\\t> .toggle-label\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Show the label.\\r\\n\\t\\t\\tdisplay: block;\\r\\n\\r\\n\\t\\t\\t// Center vertically.\\r\\n\\t\\t\\talign-self: center;\\r\\n\\r\\n\\t\\t\\t// Apply spacing between the label and the control.\\r\\n\\t\\t\\tpadding-left: var(--size-inline-spacing-large);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t> .toggle-label\\r\\n\\t{\\r\\n\\t\\t// Position the element within the grid.\\r\\n\\t\\tgrid-area: label;\\r\\n\\r\\n\\t\\t// Allow content to be positioned relative to this element.\\r\\n\\t\\tposition: relative;\\r\\n\\r\\n\\t\\t// Only shown if the `label` attribute is specified.\\r\\n\\t\\tdisplay: none;\\r\\n\\r\\n\\t\\t// Use cursor to indicate the element is clickable.\\r\\n\\t\\tcursor: pointer;\\r\\n\\r\\n\\t\\t// Allow the element to shrink.\\r\\n\\t\\tmin-width: 0;\\r\\n\\t}\\r\\n\\r\\n\\t> .toggle-control\\r\\n\\t{\\r\\n\\t\\t// Position the element within the grid.\\r\\n\\t\\tgrid-area: control;\\r\\n\\t\\tjustify-self: flex-start;\\r\\n\\t\\talign-self: stretch;\\r\\n\\r\\n\\t\\t// Allow content to be positioned relative to this element.\\r\\n\\t\\tposition: relative;\\r\\n\\r\\n\\t\\t// Use horizontal flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\talign-items: stretch;\\r\\n\\r\\n\\t\\t// Apply component style for the normal state.\\r\\n\\t\\tcolor: var(--toggle-surface-indicator-color);\\r\\n\\r\\n\\t\\t// Use cursor to indicate the element is clickable.\\r\\n\\t\\tcursor: pointer;\\r\\n\\t}\\r\\n\\r\\n\\t> .toggle-validation\\r\\n\\t{\\r\\n\\t\\t// Position the element within the grid.\\r\\n\\t\\tgrid-area: validation;\\r\\n\\r\\n\\t\\tvalidation-message\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply spacing above the validation messages.\\r\\n\\t\\t\\tmargin-top: 6rem;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.--disabled\\r\\n\\t{\\r\\n\\t\\t// Reduce opacity when disabled.\\r\\n\\t\\topacity: var(--opacity-disabled);\\r\\n\\r\\n\\t\\t> .toggle-label,\\r\\n\\t\\t> .toggle-control\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Use default cursor.\\r\\n\\t\\t\\tcursor: default;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--disabled):not(.--readonly):not(.--invalid):not(.--active):hover\\r\\n\\t{\\r\\n\\t\\t> .toggle-control\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply style for the hover state.\\r\\n\\t\\t\\tcolor: var(--toggle-surface-indicator-color--hover);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--disabled):not(.--readonly):not(.--invalid):not(.--active):focus-within\\r\\n\\t{\\r\\n\\t\\t> .toggle-control\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply style for the focus state.\\r\\n\\t\\t\\tcolor: var(--toggle-surface-indicator-color--focus);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--invalid).--active\\r\\n\\t{\\r\\n\\t\\t> .toggle-control\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply style for the active state.\\r\\n\\t\\t\\tcolor: var(--toggle-surface-indicator-color--active);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--disabled):not(.--readonly).--invalid\\r\\n\\t{\\r\\n\\t\\t> .toggle-control\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply style for the invalid state.\\r\\n\\t\\t\\tcolor: var(--toggle-surface-indicator-color--invalid);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\\r\\n// Apply basic styling to native controls, so we won't have to repeat this in every component.\\r\\n\\r\\n// stylelint-disable-next-line no-duplicate-selectors\\r\\n.toggle > .toggle-control\\r\\n{\\r\\n\\tinput\\r\\n\\t{\\r\\n\\t\\tappearance: none;\\r\\n\\t\\tmargin: 0;\\r\\n\\t\\tborder: 0;\\r\\n\\t\\tcursor: inherit;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","/**\r\n * Represents a horizontal toolbar that centers items vertically.\r\n */\r\nexport class ToolbarCustomElement\r\n{\r\n}\r\n","/**\r\n * Represents a group of items within a `toolbar` element.\r\n */\r\nexport class ToolbarGroupCustomElement\r\n{\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"toolbar-group{display:flex;align-items:center}toolbar-group:not(:last-child){margin-right:24rem}toolbar-group>:not(:last-child){margin-right:24rem}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/toolbar/toolbar-group.scss\"],\"names\":[],\"mappings\":\"AAEA,cAGC,YAAA,CAGA,kBAAA,CAEA,+BAGC,kBAAA,CAGD,gCAGC,kBAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ntoolbar-group\\r\\n{\\r\\n\\t// Use horizontal flex layout.\\r\\n\\tdisplay: flex;\\r\\n\\r\\n\\t// Center items vertically.\\r\\n\\talign-items: center;\\r\\n\\r\\n\\t&:not(:last-child)\\r\\n\\t{\\r\\n\\t\\t// Apply margin to separate groups.\\r\\n\\t\\tmargin-right: 24rem;\\r\\n\\t}\\r\\n\\r\\n\\t> :not(:last-child)\\r\\n\\t{\\r\\n\\t\\t// Apply margin to separate items.\\r\\n\\t\\tmargin-right: 24rem;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"toolbar{display:flex;align-items:center}toolbar>:not(:last-child){margin-right:24rem}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/controls/toolbar/toolbar.scss\"],\"names\":[],\"mappings\":\"AAEA,QAGC,YAAA,CAGA,kBAAA,CAEA,0BAGC,kBAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ntoolbar\\r\\n{\\r\\n\\t// Use horizontal flex layout.\\r\\n\\tdisplay: flex;\\r\\n\\r\\n\\t// Center items vertically.\\r\\n\\talign-items: center;\\r\\n\\r\\n\\t> :not(:last-child)\\r\\n\\t{\\r\\n\\t\\t// Apply margin to separate items.\\r\\n\\t\\tmargin-right: 24rem;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode } from \"aurelia-framework\";\r\nimport { DataTableRowCustomElement } from \"./data-table-row\";\r\nimport { ISorting } from \"shared/types\";\r\n\r\n/**\r\n * Represents a data table.\r\n */\r\n@autoinject\r\nexport class DataTableCustomElement\r\n{\r\n\t/**\r\n\t * The rows within this `data-table`.\r\n\t */\r\n\tpublic readonly rows = new Set();\r\n\r\n\t/**\r\n\t * The model for the rows currently being dragged, if any.\r\n\t */\r\n\tpublic draggedModel: any | undefined;\r\n\r\n\t/**\r\n\t * The selection mode to use.\r\n\t */\r\n\t@bindable({ defaultValue: \"none\" })\r\n\tpublic selection: \"none\" | \"single\" | \"multiple\";\r\n\r\n\t/**\r\n\t * Called when the select all option is checked or unchecked.\r\n\t */\r\n\t@bindable\r\n\tpublic toggleAll: ((context: { value: boolean }) => void) | undefined;\r\n\r\n\t/**\r\n\t * Called when one or more rows are moved to a new position in the list.\r\n\t */\r\n\t@bindable\r\n\tpublic move: ((context: { source: any; target: any }) => void) | undefined;\r\n\r\n\t/**\r\n\t * Called when the add button below the last row is clicked.\r\n\t */\r\n\t@bindable\r\n\tpublic append: ((context: { event: MouseEvent }) => void) | undefined;\r\n\r\n\t/**\r\n\t * False to disable appending to the table, otherwise true.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic appendable: boolean;\r\n\r\n\t/**\r\n\t * True if the select all option is checked, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic allSelected: boolean;\r\n\r\n\t/**\r\n\t * True if busy, e.g. while loading data, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic busy: boolean;\r\n\r\n\t/**\r\n\t * The sorting to use, or undefined to use no sorting.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.twoWay })\r\n\tpublic sorting: ISorting | undefined;\r\n}\r\n","import { autoinject, bindable } from \"aurelia-framework\";\r\nimport { DataTableCustomElement } from \"./data-table\";\r\n\r\n/**\r\n * Represents a cell in a data table.\r\n */\r\n@autoinject\r\nexport class DataTableCellCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param dataTable The data table to which the cell belongs.\r\n\t */\r\n\tpublic constructor(dataTable: DataTableCustomElement)\r\n\t{\r\n\t\tthis.dataTable = dataTable;\r\n\t}\r\n\r\n\tprotected readonly dataTable: DataTableCustomElement;\r\n\r\n\t/**\r\n\t * The name of the cell, if used as a header.\r\n\t */\r\n\t@bindable\r\n\tpublic name: string | undefined;\r\n\r\n\t/**\r\n\t * Whether or not the cell is used for an icon.\r\n\t */\r\n\t@bindable\r\n\tpublic icon: boolean = false;\r\n\r\n\t/**\r\n\t * Which viewport the cell is shown to exclusively\r\n\t */\r\n\t@bindable\r\n\tpublic viewportShown: \"mobile\" | \"desktop\";\r\n\r\n\t/**\r\n\t * The horizontal alignment to use.\r\n\t */\r\n\t@bindable({ defaultValue: \"left\"})\r\n\tpublic align: \"left\" | \"right\" | \"center\";\r\n\r\n\t/**\r\n\t * Called when the cell is clicked.\r\n\t */\r\n\tprotected onClick(): boolean\r\n\t{\r\n\t\tif (this.name)\r\n\t\t{\r\n\t\t\tconst direction =\r\n\t\t\t\t(this.dataTable.sorting == null || this.dataTable.sorting.property !== this.name) ? \"descending\" :\r\n\t\t\t\tthis.dataTable.sorting.direction === \"descending\" ? \"ascending\" :\r\n\t\t\t\t\"descending\";\r\n\r\n\t\t\tthis.dataTable.sorting =\r\n\t\t\t{\r\n\t\t\t\tproperty: this.name,\r\n\t\t\t\tdirection\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"data-table-cell{display:flex;align-items:center;padding:var(--data-table-cell-padding);background:var(--data-table-cell-background);overflow:hidden;font-weight:200}@media(max-width: 800px){data-table-cell:not(.--icon){align-items:flex-start}data-table-cell.--desktop{display:none}}data-table-cell.--sortable{cursor:pointer}data-table-cell.--sortable:hover{color:var(--surface-primary-text-color--hover)}data-table-cell[align=right]{padding:var(--data-table-cell-padding-right-aligned)}data-table-cell.--icon{padding:var(--data-table-cell-padding-icon)}.data-table-row data-table-cell{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.data-table-row:-webkit-any-link data-table-cell{cursor:pointer}.data-table-row:-moz-any-link data-table-cell{cursor:pointer}.data-table-row:any-link data-table-cell{cursor:pointer}data-table-cell .data-table-cell-content{display:flex;align-items:center;min-width:0}data-table-cell .data-table-cell-content a{text-decoration:none}data-table-cell .data-table-cell-sorting{position:relative;display:flex;align-items:center;width:1em;margin-left:var(--size-inline-spacing)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/data-table/data-table-cell.scss\"],\"names\":[],\"mappings\":\"AAEA,gBAEC,YAAA,CACA,kBAAA,CACA,sCAAA,CACA,4CAAA,CACA,eAAA,CACA,eAAA,CAEA,yBAEC,6BAEC,sBAAA,CAGD,0BAEC,YAAA,CAAA,CAIF,2BAEC,cAAA,CAEA,iCAEC,8CAAA,CAIF,6BAEC,oDAAA,CAGD,uBAEC,2CAAA,CAGD,gCAEC,wBAAA,CAAA,qBAAA,CAAA,oBAAA,CAAA,gBAAA,CAGD,iDAEC,cAAA,CAFD,8CAEC,cAAA,CAFD,yCAEC,cAAA,CAGD,yCAEC,YAAA,CACA,kBAAA,CACA,WAAA,CAEA,2CAEC,oBAAA,CAIF,yCAEC,iBAAA,CACA,YAAA,CACA,kBAAA,CACA,SAAA,CACA,sCAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ndata-table-cell\\r\\n{\\r\\n\\tdisplay: flex;\\r\\n\\talign-items: center;\\r\\n\\tpadding: var(--data-table-cell-padding);\\r\\n\\tbackground: var(--data-table-cell-background);\\r\\n\\toverflow: hidden;\\r\\n\\tfont-weight: 200;\\r\\n\\r\\n\\t@media ($media-smaller-max)\\r\\n\\t{\\r\\n\\t\\t&:not(.--icon)\\r\\n\\t\\t{\\r\\n\\t\\t\\talign-items: flex-start;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&.--desktop\\r\\n\\t\\t{\\r\\n\\t\\t\\tdisplay: none;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.--sortable\\r\\n\\t{\\r\\n\\t\\tcursor: pointer;\\r\\n\\r\\n\\t\\t&:hover\\r\\n\\t\\t{\\r\\n\\t\\t\\tcolor: var(--surface-primary-text-color--hover);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&[align=\\\"right\\\"]\\r\\n\\t{\\r\\n\\t\\tpadding: var(--data-table-cell-padding-right-aligned);\\r\\n\\t}\\r\\n\\r\\n\\t&.--icon\\r\\n\\t{\\r\\n\\t\\tpadding: var(--data-table-cell-padding-icon);\\r\\n\\t}\\r\\n\\r\\n\\t.data-table-row &\\r\\n\\t{\\r\\n\\t\\tuser-select: text;\\r\\n\\t}\\r\\n\\r\\n\\t.data-table-row:any-link &\\r\\n\\t{\\r\\n\\t\\tcursor: pointer;\\r\\n\\t}\\r\\n\\r\\n\\t.data-table-cell-content\\r\\n\\t{\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\talign-items: center;\\r\\n\\t\\tmin-width: 0;\\r\\n\\r\\n\\t\\ta\\r\\n\\t\\t{\\r\\n\\t\\t\\ttext-decoration: none;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.data-table-cell-sorting\\r\\n\\t{\\r\\n\\t\\tposition: relative;\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\talign-items: center;\\r\\n\\t\\twidth: 1em;\\r\\n\\t\\tmargin-left: var(--size-inline-spacing);\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable } from \"aurelia-framework\";\r\nimport { AccentColor } from \"resources/styles\";\r\n\r\n/**\r\n * Represents a details row in a data table, which spans all columns.\r\n */\r\n@autoinject\r\nexport class DataTableDetailsCustomElement\r\n{\r\n\t/**\r\n\t * The accent to apply to the row, or undefined to apply no accent.\r\n\t */\r\n\t@bindable\r\n\tpublic accent: AccentColor | undefined;\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"data-table-details{grid-column:1/-1;padding:var(--data-table-cell-padding);cursor:pointer}data-table-details[accent]{color:inherit !important}data-table-details[accent=neutral]{--data-table-row-edge-color: var(--surface-neutral-border-color)}data-table-details[accent=primary]{--data-table-row-edge-color: var(--surface-primary-border-color)}data-table-details[accent=info]{--data-table-row-edge-color: var(--surface-info-border-color)}data-table-details[accent=positive]{--data-table-row-edge-color: var(--surface-positive-border-color)}data-table-details[accent=attention]{--data-table-row-edge-color: var(--surface-attention-border-color)}data-table-details[accent=negative]{--data-table-row-edge-color: var(--surface-negative-border-color)}data-table-details[accent=neutral]{--data-table-row-edge-color: var(--palette-color-neutral)}data-table[appearance=rows] data-table-details{border-bottom:var(--data-table-row-border-width) solid var(--data-table-row-border-color)}data-table[appearance=cards] data-table-details{position:relative;border-bottom:var(--data-table-row-border-width) solid var(--data-table-row-border-color);border-left:var(--data-table-row-edge-width) solid transparent;border-right:var(--data-table-row-border-width) solid var(--data-table-row-border-color);border-bottom-left-radius:var(--data-table-row-border-radius);border-bottom-right-radius:var(--data-table-row-border-radius)}data-table[appearance=cards] data-table-details:before{content:\\\"\\\";position:absolute;top:calc(-1 * var(--data-table-row-border-radius));left:calc(-1 * var(--data-table-row-edge-width));bottom:calc(-1 * var(--data-table-row-border-width))}data-table[appearance=cards] data-table-details:before{border-left:var(--data-table-row-edge-width) solid var(--data-table-row-edge-color);border-bottom-left-radius:var(--data-table-row-border-radius)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/data-table/data-table-details.scss\"],\"names\":[],\"mappings\":\"AAEA,mBAEC,gBAAA,CACA,sCAAA,CAEA,cAAA,CAEA,2BAEC,wBAAA,CAMA,mCAEC,gEAAA,CAFD,mCAEC,gEAAA,CAFD,gCAEC,6DAAA,CAFD,oCAEC,iEAAA,CAFD,qCAEC,kEAAA,CAFD,oCAEC,iEAAA,CAKF,mCAEC,yDAAA,CAMD,+CAEC,yFAAA,CAMD,gDAEC,iBAAA,CAEA,yFAAA,CACA,8DAAA,CACA,wFAAA,CACA,6DAAA,CACA,8DAAA,CAEA,uDAEC,UAAA,CACA,iBAAA,CACA,kDAAA,CACA,gDAAA,CACA,oDAAA,CAGD,uDAEC,mFAAA,CACA,6DAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ndata-table-details\\r\\n{\\r\\n\\tgrid-column: 1 / -1;\\r\\n\\tpadding: var(--data-table-cell-padding);\\r\\n\\r\\n\\tcursor: pointer;\\r\\n\\r\\n\\t&[accent]\\r\\n\\t{\\r\\n\\t\\tcolor: inherit !important;\\r\\n\\t}\\r\\n\\r\\n\\t// Add accent color support.\\r\\n\\t@each $accent in $accents\\r\\n\\t{\\r\\n\\t\\t&[accent=\\\"#{$accent}\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\t--data-table-row-edge-color: var(--surface-#{$accent}-border-color);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t// HACK: We don't have a separate edge color for the surface yet, so just use the neutral palette color for now.\\r\\n\\t&[accent=\\\"neutral\\\"]\\r\\n\\t{\\r\\n\\t\\t--data-table-row-edge-color: var(--palette-color-neutral);\\r\\n\\t}\\r\\n}\\r\\n\\r\\ndata-table[appearance=\\\"rows\\\"]\\r\\n{\\r\\n\\tdata-table-details\\r\\n\\t{\\r\\n\\t\\tborder-bottom: var(--data-table-row-border-width) solid var(--data-table-row-border-color);\\r\\n\\t}\\r\\n}\\r\\n\\r\\ndata-table[appearance=\\\"cards\\\"]\\r\\n{\\r\\n\\tdata-table-details\\r\\n\\t{\\r\\n\\t\\tposition: relative;\\r\\n\\r\\n\\t\\tborder-bottom: var(--data-table-row-border-width) solid var(--data-table-row-border-color);\\r\\n\\t\\tborder-left: var(--data-table-row-edge-width) solid transparent;\\r\\n\\t\\tborder-right: var(--data-table-row-border-width) solid var(--data-table-row-border-color);\\r\\n\\t\\tborder-bottom-left-radius: var(--data-table-row-border-radius);\\r\\n\\t\\tborder-bottom-right-radius: var(--data-table-row-border-radius);\\r\\n\\r\\n\\t\\t&:before\\r\\n\\t\\t{\\r\\n\\t\\t\\tcontent: \\\"\\\";\\r\\n\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\ttop: calc(-1 * var(--data-table-row-border-radius));\\r\\n\\t\\t\\tleft: calc(-1 * var(--data-table-row-edge-width));\\r\\n\\t\\t\\tbottom: calc(-1 * var(--data-table-row-border-width));\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&:before\\r\\n\\t\\t{\\r\\n\\t\\t\\tborder-left: var(--data-table-row-edge-width) solid var(--data-table-row-edge-color);\\r\\n\\t\\t\\tborder-bottom-left-radius: var(--data-table-row-border-radius);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\r\nimport { DataTableCustomElement } from \"./data-table\";\r\n\r\n/**\r\n * Represents the header row in a data table.\r\n */\r\n@autoinject\r\nexport class DataTableHeadersCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the class.\r\n\t * @param dataTable The `data-table` to which this component belongs.\r\n\t */\r\n\tpublic constructor(dataTable: DataTableCustomElement)\r\n\t{\r\n\t\tthis.dataTable = dataTable;\r\n\t}\r\n\r\n\t/**\r\n\t * The `data-table` to which this component belongs.\r\n\t */\r\n\tprotected readonly dataTable: DataTableCustomElement;\r\n\r\n\t/**\r\n\t * Called when the select all option is toggled.\r\n\t */\r\n\tprotected onToggleAll(): void\r\n\t{\r\n\t\t// Call the `toggleAll` callback function, if specified.\r\n\t\tif (this.dataTable.toggleAll != null)\r\n\t\t{\r\n\t\t\tthis.dataTable.toggleAll({ value: this.dataTable.allSelected });\r\n\t\t}\r\n\r\n\t\t// Toggle all selectable rows.\r\n\t\tthis.dataTable.rows.forEach(row =>\r\n\t\t{\r\n\t\t\tif (row.selectable)\r\n\t\t\t{\r\n\t\t\t\trow.selected = this.dataTable.allSelected;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"data-table-headers{display:contents}data-table-headers data-table-cell{position:sticky;top:0;z-index:2;padding:var(--data-table-header-padding);border-bottom:var(--data-table-header-border-width) solid var(--data-table-header-border-color);background:var(--data-table-header-background);color:#9fa8a7}data-table-headers data-table-cell[align=right]{padding:var(--data-table-header-padding-right-aligned)}data-table[appearance=rows] data-table-headers data-table-cell:first-of-type::before{content:none;border-left:none}data-table[appearance=rows] data-table-headers data-table-cell{position:relative}@media(min-width: 801px){data-table[appearance=rows] data-table-headers data-table-cell:first-of-type{padding-left:16rem;margin-left:-16rem}data-table[appearance=rows] data-table-headers data-table-cell:last-of-type{padding-right:16rem;margin-right:-16rem}}@media(max-width: 800px){data-table[appearance=rows] data-table-headers data-table-cell:first-of-type{padding-left:0}data-table[appearance=rows] data-table-headers data-table-cell:last-of-type{padding-right:0}}data-table[appearance=cards] data-table-headers data-table-cell:first-of-type::before{content:\\\"\\\";border-left:var(--data-table-row-edge-width) solid transparent}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/data-table/data-table-headers.scss\"],\"names\":[],\"mappings\":\"AAEA,mBAEC,gBAAA,CAEA,mCAEC,eAAA,CACA,KAAA,CACA,SAAA,CACA,wCAAA,CACA,+FAAA,CACA,8CAAA,CACA,aAAA,CAEA,gDAEC,sDAAA,CASD,qFAEC,YAAA,CACA,gBAAA,CAGD,+DAEC,iBAAA,CAEA,yBAEC,6EAEC,kBAAA,CACA,kBAAA,CAED,4EAEC,mBAAA,CACA,mBAAA,CAAA,CAIF,yBAEC,6EAEC,cAAA,CAED,4EAEC,eAAA,CAAA,CAWH,sFAEC,UAAA,CACA,8DAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ndata-table-headers\\r\\n{\\r\\n\\tdisplay: contents;\\r\\n\\r\\n\\tdata-table-cell\\r\\n\\t{\\r\\n\\t\\tposition: sticky;\\r\\n\\t\\ttop: 0;\\r\\n\\t\\tz-index: 2;\\r\\n\\t\\tpadding: var(--data-table-header-padding);\\r\\n\\t\\tborder-bottom: var(--data-table-header-border-width) solid var(--data-table-header-border-color);\\r\\n\\t\\tbackground: var(--data-table-header-background);\\r\\n\\t\\tcolor: hsl(173, 5%, 64%);\\r\\n\\r\\n\\t\\t&[align=\\\"right\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\tpadding: var(--data-table-header-padding-right-aligned);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\\r\\ndata-table[appearance=\\\"rows\\\"]\\r\\n{\\r\\n\\tdata-table-headers\\r\\n\\t{\\r\\n\\t\\tdata-table-cell:first-of-type::before\\r\\n\\t\\t{\\r\\n\\t\\t\\tcontent: none;\\r\\n\\t\\t\\tborder-left: none;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tdata-table-cell\\r\\n\\t\\t{\\r\\n\\t\\t\\tposition: relative;\\r\\n\\r\\n\\t\\t\\t@media ($media-small-min)\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t&:first-of-type\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tpadding-left: 16rem;\\r\\n\\t\\t\\t\\t\\tmargin-left: -16rem;\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t\\t&:last-of-type\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tpadding-right: 16rem;\\r\\n\\t\\t\\t\\t\\tmargin-right: -16rem;\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t&:first-of-type\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tpadding-left: 0;\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t\\t&:last-of-type\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tpadding-right: 0;\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\\r\\ndata-table[appearance=\\\"cards\\\"]\\r\\n{\\r\\n\\tdata-table-headers\\r\\n\\t{\\r\\n\\t\\tdata-table-cell:first-of-type::before\\r\\n\\t\\t{\\r\\n\\t\\t\\tcontent: \\\"\\\";\\r\\n\\t\\t\\tborder-left: var(--data-table-row-edge-width) solid transparent;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, computedFrom, bindingMode, observable } from \"aurelia-framework\";\r\nimport { IPaging } from \"shared/types\";\r\n\r\n/**\r\n * Represents a pager for a data table.\r\n */\r\n@autoinject\r\nexport class DataTablePagerCustomElement\r\n{\r\n\t/**\r\n\t * The value of the page number input element.\r\n\t */\r\n\tprotected pageNumber: number = 1;\r\n\r\n\t/**\r\n\t * The value of the page size input element.\r\n\t */\r\n\t@observable\r\n\tprotected pageSize: number = 10;\r\n\r\n\t/**\r\n\t * The total number of pages, or undefined if unknown.\r\n\t * This is computed from `listSize` and `value.pageSize`, with `pageCount` used as fallback.\r\n\t */\r\n\t@computedFrom(\"listSize\", \"value.pageSize\", \"pageCount\")\r\n\tprotected get computedPageCount(): number | undefined\r\n\t{\r\n\t\tif (this.value == null)\r\n\t\t{\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\tif (this.listSize == null || this.value.pageSize == null)\r\n\t\t{\r\n\t\t\treturn this.pageCount;\r\n\t\t}\r\n\r\n\t\treturn Math.ceil(this.listSize / this.value.pageSize);\r\n\t}\r\n\r\n\t/**\r\n\t * The model representing the current state of the pager.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.twoWay })\r\n\tpublic value: IPaging;\r\n\r\n\t/**\r\n\t * The page sizes the user may choose from.\r\n\t */\r\n\t@bindable({ defaultValue: [10, 20, 30, 40, 50] })\r\n\tpublic pageSizes: number[];\r\n\r\n\t/**\r\n\t * The total number of items in the list, or undefined if unknown.\r\n\t */\r\n\t@bindable\r\n\tpublic listSize: number | undefined;\r\n\r\n\t/**\r\n\t * The total number of pages, used as fallback if `listSize` or `pageSize` is undefined,\r\n\t * or undefined to to fall back to unlimited paging.\r\n\t */\r\n\t@bindable\r\n\tpublic pageCount: number | undefined;\r\n\r\n\t/**\r\n\t * True if disabled, e.g. while loading data, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic disabled: boolean;\r\n\r\n\t/**\r\n\t * Called when the page input loses focus.\r\n\t * Ensures the number shown in the input matches the current page number.\r\n\t */\r\n\tprotected onPageInputFocusOut(): void\r\n\t{\r\n\t\tthis.pageNumber = this.value.page;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed while the input is focused.\r\n\t * If the key being pressed is `Enter`, commits the change.\r\n\t * @param event The keyboard event.\r\n\t */\r\n\tprotected onPageInputKeydown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\tif (event.key === \"Enter\")\r\n\t\t{\r\n\t\t\tconst page = this.pageNumber || this.value.page;\r\n\t\t\tthis.value =\r\n\t\t\t{\r\n\t\t\t\t...this.value,\r\n\t\t\t\tpage: Math.max(1, this.computedPageCount == null ? page : Math.min(this.computedPageCount, page))\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the page size is changed.\r\n\t * Sets the page size and commits the change.\r\n\t */\r\n\tprotected pageSizeChanged(): void\r\n\t{\r\n\t\tthis.value =\r\n\t\t{\r\n\t\t\t...this.value,\r\n\t\t\tpageSize: this.pageSize\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the value is changed.\r\n\t * Sets the value of the page number input.\r\n\t */\r\n\tprotected valueChanged(): void\r\n\t{\r\n\t\tthis.pageNumber = this.value.page;\r\n\t\tthis.pageSize = this.value.pageSize;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when one of the navigation buttons are pressed.\r\n\t * Adds the specified offset to the current page number and commits the change.\r\n\t * @param offset The offset to apply to the current page.\r\n\t */\r\n\tprotected onNavClick(offset: number): void\r\n\t{\r\n\t\tthis.value =\r\n\t\t{\r\n\t\t\t...this.value,\r\n\t\t\tpage: this.value.page + offset\r\n\t\t};\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"data-table-pager{display:flex;align-items:center;transition:opacity var(--animation-duration-medium)}data-table-pager.--disabled{opacity:var(--opacity-disabled)}data-table-pager>:not(:last-child){margin-right:var(--size-inline-spacing-larger)}data-table-pager .data-table-pager-page-size,data-table-pager .data-table-pager-page{display:flex;align-items:center}data-table-pager .data-table-pager-page-size>div,data-table-pager .data-table-pager-page>div{flex-shrink:0}data-table-pager .data-table-pager-page-size>div:first-child,data-table-pager .data-table-pager-page>div:first-child{margin-right:var(--size-inline-spacing)}data-table-pager .data-table-pager-page-size>div:last-child,data-table-pager .data-table-pager-page>div:last-child{margin-left:var(--size-inline-spacing)}data-table-pager .data-table-pager-page-size select-input{width:76rem}data-table-pager .data-table-pager-page number-input{width:56rem;text-align:center;-webkit-appearance:none;-moz-appearance:none;appearance:none}data-table-pager .data-table-pager-buttons{display:flex}data-table-pager .data-table-pager-buttons icon{font-size:24rem;vertical-align:middle}data-table-pager .data-table-pager-buttons button{min-width:40rem !important}data-table-pager .data-table-pager-buttons button:first-child{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}data-table-pager .data-table-pager-buttons button:last-child{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0}data-table-pager .data-table-pager-buttons div{width:var(--border-width-medium);background:var(--surface-neutral-border-color)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/data-table/data-table-pager.scss\"],\"names\":[],\"mappings\":\"AAEA,iBAEC,YAAA,CACA,kBAAA,CAEA,mDAAA,CAEA,4BAEC,+BAAA,CAGD,mCAEC,8CAAA,CAGD,qFAGC,YAAA,CACA,kBAAA,CAEA,6FAEC,aAAA,CAEA,qHAEC,uCAAA,CAGD,mHAEC,sCAAA,CAKH,0DAEC,WAAA,CAGD,qDAEC,WAAA,CACA,iBAAA,CACA,uBAAA,CAAA,oBAAA,CAAA,eAAA,CAGD,2CAEC,YAAA,CAEA,gDAEC,eAAA,CACA,qBAAA,CAGD,kDAEC,0BAAA,CAGD,8DAEC,iBAAA,CACA,yBAAA,CACA,4BAAA,CAGD,6DAEC,gBAAA,CACA,wBAAA,CACA,2BAAA,CAGD,+CAEC,gCAAA,CACA,8CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ndata-table-pager\\r\\n{\\r\\n\\tdisplay: flex;\\r\\n\\talign-items: center;\\r\\n\\r\\n\\ttransition: opacity var(--animation-duration-medium);\\r\\n\\r\\n\\t&.--disabled\\r\\n\\t{\\r\\n\\t\\topacity: var(--opacity-disabled);\\r\\n\\t}\\r\\n\\r\\n\\t> :not(:last-child)\\r\\n\\t{\\r\\n\\t\\tmargin-right: var(--size-inline-spacing-larger);\\r\\n\\t}\\r\\n\\r\\n\\t.data-table-pager-page-size,\\r\\n\\t.data-table-pager-page\\r\\n\\t{\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\talign-items: center;\\r\\n\\r\\n\\t\\t> div\\r\\n\\t\\t{\\r\\n\\t\\t\\tflex-shrink: 0;\\r\\n\\r\\n\\t\\t\\t&:first-child\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tmargin-right: var(--size-inline-spacing);\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t&:last-child\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tmargin-left: var(--size-inline-spacing);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.data-table-pager-page-size select-input\\r\\n\\t{\\r\\n\\t\\twidth: 76rem;\\r\\n\\t}\\r\\n\\r\\n\\t.data-table-pager-page number-input\\r\\n\\t{\\r\\n\\t\\twidth: 56rem;\\r\\n\\t\\ttext-align: center;\\r\\n\\t\\tappearance: none;\\r\\n\\t}\\r\\n\\r\\n\\t.data-table-pager-buttons\\r\\n\\t{\\r\\n\\t\\tdisplay: flex;\\r\\n\\r\\n\\t\\ticon\\r\\n\\t\\t{\\r\\n\\t\\t\\tfont-size: 24rem;\\r\\n\\t\\t\\tvertical-align: middle;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tbutton\\r\\n\\t\\t{\\r\\n\\t\\t\\tmin-width: 40rem !important;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tbutton:first-child\\r\\n\\t\\t{\\r\\n\\t\\t\\tborder-right: none;\\r\\n\\t\\t\\tborder-top-right-radius: 0;\\r\\n\\t\\t\\tborder-bottom-right-radius: 0;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tbutton:last-child\\r\\n\\t\\t{\\r\\n\\t\\t\\tborder-left: none;\\r\\n\\t\\t\\tborder-top-left-radius: 0;\\r\\n\\t\\t\\tborder-bottom-left-radius: 0;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tdiv\\r\\n\\t\\t{\\r\\n\\t\\t\\twidth: var(--border-width-medium);\\r\\n\\t\\t\\tbackground: var(--surface-neutral-border-color);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, containerless, bindingMode } from \"aurelia-framework\";\r\nimport { DataTableCustomElement } from \"./data-table\";\r\nimport { AccentColor } from \"resources/styles\";\r\n\r\n/**\r\n * Represents a row in a data table.\r\n */\r\n@containerless\r\n@autoinject\r\nexport class DataTableRowCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the class.\r\n\t * @param dataTable The `data-table` to which this component belongs.\r\n\t */\r\n\tpublic constructor(dataTable: DataTableCustomElement)\r\n\t{\r\n\t\tthis.dataTable = dataTable;\r\n\t}\r\n\r\n\t/**\r\n\t * The `data-table` to which this component belongs.\r\n\t */\r\n\tprotected readonly dataTable: DataTableCustomElement;\r\n\r\n\t/**\r\n\t * The selected model, used when binding the radio button in `single` selection model.\r\n\t */\r\n\tprotected selectedModel: any | this | undefined;\r\n\r\n\t/**\r\n\t * The URL to navigate to when the row is clicked, or undefined to do nothing.\r\n\t */\r\n\t@bindable\r\n\tpublic href: string | undefined;\r\n\r\n\t/**\r\n\t * The accent to apply to the row, or undefined to apply no accent.\r\n\t */\r\n\t@bindable\r\n\tpublic accent: AccentColor | undefined;\r\n\r\n\t/**\r\n\t * The class names to apply to the row, if any.\r\n\t */\r\n\t@bindable\r\n\tpublic class: string | undefined;\r\n\r\n\t/**\r\n\t * Called when the row is selected or deselected.\r\n\t */\r\n\t@bindable\r\n\tpublic toggle: ((context: { value: boolean }) => void) | undefined;\r\n\r\n\t/**\r\n\t * Called when the row is clicked.\r\n\t */\r\n\t@bindable\r\n\tpublic click: ((context: { event: MouseEvent }) => void) | undefined;\r\n\r\n\t/**\r\n\t * Called when the insert button above the row is clicked.\r\n\t */\r\n\t@bindable\r\n\tpublic insert: ((context: { event: MouseEvent }) => void) | undefined;\r\n\r\n\t/**\r\n\t * The model associated with the row.\r\n\t */\r\n\t@bindable\r\n\tpublic model: any | undefined;\r\n\r\n\t/**\r\n\t * True if the row is selected, otherwise false.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.twoWay, defaultValue: false })\r\n\tpublic selected: boolean;\r\n\r\n\t/**\r\n\t * True if the row is faded, otherwise false.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.twoWay, defaultValue: false })\r\n\tpublic faded: boolean;\r\n\r\n\t/**\r\n\t * False to disable selection of the row, otherwise true.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic selectable: boolean;\r\n\r\n\t/**\r\n\t * False to explicitly make the row non-clickable, true to explicitly make it clickable,\r\n\t * and undefined to infer clickability based on the existence of a `href` or `onClick` value.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic clickable: boolean | undefined;\r\n\r\n\t/**\r\n\t * False to disable moving of the row, if moving is enabled for the data-table, otherwise true.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic movable: boolean;\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\tthis.dataTable.rows.add(this);\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is detached.\r\n\t */\r\n\tpublic detached(): void\r\n\t{\r\n\t\tthis.dataTable.rows.delete(this);\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the `selected` property changes.\r\n\t */\r\n\tprotected selectedChanged(): void\r\n\t{\r\n\t\tif (this.selected)\r\n\t\t{\r\n\t\t\t// Set the selected model, used when binding a radio button.\r\n\t\t\tthis.selectedModel = this.model != null ? this.model : this;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t// Set the selected model, used when binding a radio button.\r\n\t\t\tthis.selectedModel = undefined;\r\n\r\n\t\t\t// If deselected, also ensure the select all option is also deselected.\r\n\t\t\tthis.dataTable.allSelected = false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the selected state of the row is toggled.\r\n\t * @param event The event that caused the toggle.\r\n\t */\r\n\tprotected onToggle(event: Event): boolean\r\n\t{\r\n\t\tif (this.selectable)\r\n\t\t{\r\n\t\t\t// Get the selection state of this row.\r\n\t\t\tconst selected = this.selected;\r\n\r\n\t\t\t// In `single` selection mode, deselect all selectable rows.\r\n\t\t\tif (this.dataTable.selection === \"single\")\r\n\t\t\t{\r\n\t\t\t\tthis.dataTable.rows.forEach(row =>\r\n\t\t\t\t{\r\n\t\t\t\t\tif (row.selectable)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\trow.selected = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// Toggle the selection state of this row.\r\n\t\t\tthis.selected = !selected;\r\n\r\n\t\t\t// Call the `toggle` callback function, if specified.\r\n\t\t\tif (this.toggle != null)\r\n\t\t\t{\r\n\t\t\t\tthis.toggle({ value: this.selected });\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Prevent the event from triggering navigation if the row is a link,\r\n\t\t// but allow it to toggle the state of the checkbox or radio input.\r\n\r\n\t\tevent.stopPropagation();\r\n\r\n\t\treturn event.target instanceof HTMLInputElement;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the row is clicked.\r\n\t * @param event The click event.\r\n\t * @returns False to prevent default for the event, otherwise true.\r\n\t */\r\n\tprotected onClick(event: MouseEvent): boolean\r\n\t{\r\n\t\tif (this.clickable !== false && !event.defaultPrevented && !(event as any).__ignoreRowClick && this.click)\r\n\t\t{\r\n\t\t\tthis.click({ event });\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the insert button above a row is clicked.\r\n\t * @param event The click event.\r\n\t * @returns False to prevent default for the event, otherwise true.\r\n\t */\r\n\tprotected onInsertClick(event: MouseEvent): boolean\r\n\t{\r\n\t\tif (this.insert != null && !event.defaultPrevented)\r\n\t\t{\r\n\t\t\tthis.insert({ event });\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the drag handle is clicked.\r\n\t * Blocks the event from propagating.\r\n\t * @param event The click event.\r\n\t */\r\n\tprotected onDragHandleClick(event: MouseEvent): void\r\n\t{\r\n\t\tevent.preventDefault();\r\n\t\tevent.stopPropagation();\r\n\t\tevent.stopImmediatePropagation();\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the pointer is released anywhere.\r\n\t * @param event The click event.\r\n\t */\r\n\tprotected onMouseUpAnywhere = (event: MouseEvent) =>\r\n\t{\r\n\t\tdocument.removeEventListener(\"mouseup\", this.onMouseUpAnywhere, { capture: true });\r\n\r\n\t\tif (!event.defaultPrevented)\r\n\t\t{\r\n\t\t\tthis.dataTable.draggedModel = undefined;\r\n\t\t}\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".data-table-row{display:contents;color:inherit;cursor:default}.data-table-row[accent]{color:inherit !important}.data-table-row[accent=neutral]{--data-table-row-edge-color: var(--surface-neutral-border-color)}.data-table-row[accent=primary]{--data-table-row-edge-color: var(--surface-primary-border-color)}.data-table-row[accent=info]{--data-table-row-edge-color: var(--surface-info-border-color)}.data-table-row[accent=positive]{--data-table-row-edge-color: var(--surface-positive-border-color)}.data-table-row[accent=attention]{--data-table-row-edge-color: var(--surface-attention-border-color)}.data-table-row[accent=negative]{--data-table-row-edge-color: var(--surface-negative-border-color)}.data-table-row[accent=neutral]{--data-table-row-edge-color: var(--palette-color-neutral)}.data-table-row.--clickable{cursor:pointer}.data-table-row .data-table-row-insert{display:none}.data-table-row:hover{color:var(--palette-color-primary)}.data-table-row:hover .data-table-row-insert{display:block;grid-column:1/-1;z-index:1}.data-table-row:hover .data-table-row-insert:hover .data-table-row-insert-line::after,.data-table-row:hover .data-table-row-insert:hover .data-table-row-insert-action{opacity:1}.data-table-row:hover .data-table-row-insert .data-table-row-insert-line{pointer-events:none;position:absolute;margin-left:-1rem;width:calc(100% + 1rem);height:3rem;background:var(--palette-color-whitepoint);margin-top:-1rem}.data-table-row:hover .data-table-row-insert .data-table-row-insert-line::after{content:\\\"\\\";position:absolute;width:100%;height:100%;background:var(--surface-primary-icon-color);opacity:var(--opacity-faded-more);transition:opacity var(--animation-duration-short);box-shadow:1rem 1rem 0 .125px rgba(255,255,255,.5)}.data-table-row:hover .data-table-row-insert .data-table-row-insert-action{position:absolute;margin-left:-27rem;margin-top:-12rem;padding-right:1rem;height:78rem;opacity:var(--opacity-faded-more);transition:opacity var(--animation-duration-short)}.data-table-row:hover .data-table-row-insert .data-table-row-insert-action button[appearance=icon]{border-radius:var(--border-radius-medium);border-color:var(--surface-primary-border-color);background:var(--surface-primary-surface-color);color:var(--surface-primary-surface-text-color);padding:4rem}.data-table-row.data-table-append-action .data-table-row-insert{opacity:1}.data-table-row.data-table-append-action .data-table-row-insert .data-table-row-insert-line{margin-left:0;width:100%}.data-table-row.data-table-append-action .data-table-row-insert .data-table-row-insert-action{display:none}.data-table-row .data-table-row-drag-handle{padding-left:0}.data-table-row:not(.--movable) .data-table-row-drag-handle{pointer-events:none}data-table[appearance=rows]{row-gap:var(--data-table-row-gap)}data-table[appearance=rows] .data-table-row data-table-cell{position:relative}@media(min-width: 801px){data-table[appearance=rows] .data-table-row data-table-cell:first-of-type{padding-left:16rem;margin-left:-16rem}data-table[appearance=rows] .data-table-row data-table-cell:last-of-type{padding-right:16rem;margin-right:-16rem}}@media(max-width: 800px){data-table[appearance=rows] .data-table-row data-table-cell:first-of-type{padding-left:0}data-table[appearance=rows] .data-table-row data-table-cell:last-of-type{padding-right:0}}data-table[appearance=rows] .data-table-row data-table-cell:last-of-type::after{content:\\\"\\\";width:8rem}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/data-table/data-table-row.scss\"],\"names\":[],\"mappings\":\"AAEA,gBAEC,gBAAA,CACA,aAAA,CACA,cAAA,CAEA,wBAEC,wBAAA,CAMA,gCAEC,gEAAA,CAFD,gCAEC,gEAAA,CAFD,6BAEC,6DAAA,CAFD,iCAEC,iEAAA,CAFD,kCAEC,kEAAA,CAFD,iCAEC,iEAAA,CAKF,gCAEC,yDAAA,CAGD,4BAEC,cAAA,CAGD,uCAEC,YAAA,CAGD,sBAEC,kCAAA,CAEA,6CAEC,aAAA,CACA,gBAAA,CACA,SAAA,CAEA,uKAGC,SAAA,CAGD,yEAcC,mBAAA,CACA,iBAAA,CACA,iBAAA,CACA,uBAAA,CACA,WAAA,CACA,0CAAA,CACA,gBAAA,CAlBA,gFAEC,UAAA,CACA,iBAAA,CACA,UAAA,CACA,WAAA,CACA,4CAAA,CACA,iCAAA,CACA,kDAAA,CACA,kDAAA,CAYF,2EAEC,iBAAA,CACA,kBAAA,CACA,iBAAA,CACA,kBAAA,CACA,YAAA,CACA,iCAAA,CACA,kDAAA,CAEA,mGAEC,yCAAA,CACA,gDAAA,CACA,+CAAA,CACA,+CAAA,CACA,YAAA,CAMJ,gEAEC,SAAA,CAEA,4FAEC,aAAA,CACA,UAAA,CAGD,8FAEC,YAAA,CAIF,4CAEC,cAAA,CAGD,4DAEC,mBAAA,CAIF,4BAEC,iCAAA,CAIC,4DAEC,iBAAA,CAEA,yBAEC,0EAEC,kBAAA,CACA,kBAAA,CAED,yEAEC,mBAAA,CACA,mBAAA,CAAA,CAIF,yBAEC,0EAEC,cAAA,CAED,yEAEC,eAAA,CAAA,CAQH,gFAEC,UAAA,CACA,UAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\n.data-table-row\\r\\n{\\r\\n\\tdisplay: contents;\\r\\n\\tcolor: inherit;\\r\\n\\tcursor: default;\\r\\n\\r\\n\\t&[accent]\\r\\n\\t{\\r\\n\\t\\tcolor: inherit !important;\\r\\n\\t}\\r\\n\\r\\n\\t// Add accent color support.\\r\\n\\t@each $accent in $accents\\r\\n\\t{\\r\\n\\t\\t&[accent=\\\"#{$accent}\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\t--data-table-row-edge-color: var(--surface-#{$accent}-border-color);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t// HACK: We don't have a separate edge color for the surface yet, so just use the neutral palette color for now.\\r\\n\\t&[accent=\\\"neutral\\\"]\\r\\n\\t{\\r\\n\\t\\t--data-table-row-edge-color: var(--palette-color-neutral);\\r\\n\\t}\\r\\n\\r\\n\\t&.--clickable\\r\\n\\t{\\r\\n\\t\\tcursor: pointer;\\r\\n\\t}\\r\\n\\r\\n\\t.data-table-row-insert\\r\\n\\t{\\r\\n\\t\\tdisplay: none;\\r\\n\\t}\\r\\n\\r\\n\\t&:hover\\r\\n\\t{\\r\\n\\t\\tcolor: var(--palette-color-primary);\\r\\n\\r\\n\\t\\t.data-table-row-insert\\r\\n\\t\\t{\\r\\n\\t\\t\\tdisplay: block;\\r\\n\\t\\t\\tgrid-column: 1 / -1;\\r\\n\\t\\t\\tz-index: 1;\\r\\n\\r\\n\\t\\t\\t&:hover .data-table-row-insert-line::after,\\r\\n\\t\\t\\t&:hover .data-table-row-insert-action,\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\topacity: 1;\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t.data-table-row-insert-line\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t&::after\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tcontent: \\\"\\\";\\r\\n\\t\\t\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\t\\t\\twidth: 100%;\\r\\n\\t\\t\\t\\t\\theight: 100%;\\r\\n\\t\\t\\t\\t\\tbackground: var(--surface-primary-icon-color);\\r\\n\\t\\t\\t\\t\\topacity: var(--opacity-faded-more);\\r\\n\\t\\t\\t\\t\\ttransition: opacity var(--animation-duration-short);\\r\\n\\t\\t\\t\\t\\tbox-shadow: 1rem 1rem 0 0.125px rgba(255, 255, 255, 0.5);\\r\\n\\t\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t\\tpointer-events: none;\\r\\n\\t\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\t\\tmargin-left: -1rem;\\r\\n\\t\\t\\t\\twidth: calc(100% + 1rem);\\r\\n\\t\\t\\t\\theight: 3rem;\\r\\n\\t\\t\\t\\tbackground: var(--palette-color-whitepoint);\\r\\n\\t\\t\\t\\tmargin-top: -1rem;\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t.data-table-row-insert-action\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\t\\tmargin-left: -27rem;\\r\\n\\t\\t\\t\\tmargin-top: -12rem;\\r\\n\\t\\t\\t\\tpadding-right: 1rem;\\r\\n\\t\\t\\t\\theight: 78rem;\\r\\n\\t\\t\\t\\topacity: var(--opacity-faded-more);\\r\\n\\t\\t\\t\\ttransition: opacity var(--animation-duration-short);\\r\\n\\r\\n\\t\\t\\t\\tbutton[appearance=\\\"icon\\\"]\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tborder-radius: var(--border-radius-medium);\\r\\n\\t\\t\\t\\t\\tborder-color: var(--surface-primary-border-color);\\r\\n\\t\\t\\t\\t\\tbackground: var(--surface-primary-surface-color);\\r\\n\\t\\t\\t\\t\\tcolor: var(--surface-primary-surface-text-color);\\r\\n\\t\\t\\t\\t\\tpadding: 4rem;\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.data-table-append-action .data-table-row-insert\\r\\n\\t{\\r\\n\\t\\topacity: 1;\\r\\n\\r\\n\\t\\t.data-table-row-insert-line\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-left: 0;\\r\\n\\t\\t\\twidth: 100%;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t.data-table-row-insert-action\\r\\n\\t\\t{\\r\\n\\t\\t\\tdisplay: none;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.data-table-row-drag-handle\\r\\n\\t{\\r\\n\\t\\tpadding-left: 0;\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--movable) .data-table-row-drag-handle\\r\\n\\t{\\r\\n\\t\\tpointer-events: none;\\r\\n\\t}\\r\\n}\\r\\n\\r\\ndata-table[appearance=\\\"rows\\\"]\\r\\n{\\r\\n\\trow-gap: var(--data-table-row-gap);\\r\\n\\r\\n\\t.data-table-row\\r\\n\\t{\\r\\n\\t\\tdata-table-cell\\r\\n\\t\\t{\\r\\n\\t\\t\\tposition: relative;\\r\\n\\r\\n\\t\\t\\t@media ($media-small-min)\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t&:first-of-type\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tpadding-left: 16rem;\\r\\n\\t\\t\\t\\t\\tmargin-left: -16rem;\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t\\t&:last-of-type\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tpadding-right: 16rem;\\r\\n\\t\\t\\t\\t\\tmargin-right: -16rem;\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t&:first-of-type\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tpadding-left: 0;\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t\\t&:last-of-type\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tpadding-right: 0;\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.data-table-row data-table-cell:last-of-type\\r\\n\\t{\\r\\n\\t\\t&::after\\r\\n\\t\\t{\\r\\n\\t\\t\\tcontent: \\\"\\\";\\r\\n\\t\\t\\twidth: 8rem;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"data-table{display:grid;--data-table-columns: repeat(1, 1fr);transition:opacity var(--animation-duration-medium)}data-table:not(.--selection){grid-template-columns:var(--data-table-columns)}data-table.--selection{grid-template-columns:60rem var(--data-table-columns)}data-table.--disabled{opacity:.4;pointer-events:none}@media(max-width: 800px){data-table data-table-headers{display:none}}@media(min-width: 801px){data-table .data-table-row:hover{--data-table-cell-background: var(--data-table-cell-background--hover)}}data-table .data-table-row.--selected{--data-table-cell-background: var(--data-table-cell-background--active);--data-table-row-border-color: var(--data-table-row-border-color--active)}data-table data-table-details,data-table .data-table-row.expanded{--data-table-cell-background: var(--data-table-cell-background--active);--data-table-row-border-color: var(--data-table-row-border-color--active)}data-table .data-table-append-action .data-table-row-drag-handle{display:none}data-table .data-table-append-action data-table-cell{grid-column:1/-1;display:flex;border-bottom:none !important}data-table.--busy{opacity:var(--opacity-disabled)}data-table[appearance=rows]{--data-table-header-padding: 18rem 8rem 16rem;--data-table-header-padding-right-aligned: 24rem 20rem 8rem 8rem;--data-table-header-background: var(--palette-color-background);--data-table-header-border-width: var(--border-width-thin);--data-table-header-border-color: var(--data-table-row-border-color);--data-table-cell-padding: 12rem 8rem;--data-table-cell-padding-icon: 12rem;--data-table-cell-padding-right-aligned: 12rem 20rem 12rem 8rem;--data-table-cell-first-padding: 12rem 8rem 12rem 16rem;--data-table-cell-background: transparent;--data-table-cell-background--hover: var(--surface-color--active);--data-table-cell-background--active: var(--surface-color--active);--data-table-row-gap: 0;--data-table-row-edge-width: var(--border-width-thick);--data-table-row-edge-color: transparent}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/data-table/data-table.scss\"],\"names\":[],\"mappings\":\"AAEA,WAEC,YAAA,CAIA,oCAAA,CAEA,mDAAA,CAEA,6BAEC,+CAAA,CAGD,uBAEC,qDAAA,CAGD,sBAEC,UAAA,CACA,mBAAA,CAGD,yBAEC,8BAEC,YAAA,CAAA,CAMD,yBAFD,iCAIE,sEAAA,CAAA,CAIF,sCAEC,uEAAA,CACA,yEAAA,CAGD,kEAGC,uEAAA,CACA,yEAAA,CAKA,iEAEC,YAAA,CAGD,qDAEC,gBAAA,CACA,YAAA,CACA,6BAAA,CAIF,kBAEC,+BAAA,CAIF,4BAEC,6CAAA,CACA,gEAAA,CACA,+DAAA,CACA,0DAAA,CACA,oEAAA,CACA,qCAAA,CACA,qCAAA,CACA,+DAAA,CACA,uDAAA,CACA,yCAAA,CACA,iEAAA,CACA,kEAAA,CACA,uBAAA,CACA,sDAAA,CACA,wCAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ndata-table\\r\\n{\\r\\n\\tdisplay: grid;\\r\\n\\r\\n\\t// Define the grid columns.\\r\\n\\t// Note that this should be customized as needed for each table.\\r\\n\\t--data-table-columns: repeat(1, 1fr);\\r\\n\\r\\n\\ttransition: opacity var(--animation-duration-medium);\\r\\n\\r\\n\\t&:not(.--selection)\\r\\n\\t{\\r\\n\\t\\tgrid-template-columns: var(--data-table-columns);\\r\\n\\t}\\r\\n\\r\\n\\t&.--selection\\r\\n\\t{\\r\\n\\t\\tgrid-template-columns: 60rem var(--data-table-columns);\\r\\n\\t}\\r\\n\\r\\n\\t&.--disabled\\r\\n\\t{\\r\\n\\t\\topacity: .4;\\r\\n\\t\\tpointer-events: none;\\r\\n\\t}\\r\\n\\r\\n\\t@media ($media-smaller-max)\\r\\n\\t{\\r\\n\\t\\tdata-table-headers\\r\\n\\t\\t{\\r\\n\\t\\t\\tdisplay: none;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.data-table-row:hover\\r\\n\\t{\\r\\n\\t\\t@media ($media-small-min)\\r\\n\\t\\t{\\r\\n\\t\\t\\t--data-table-cell-background: var(--data-table-cell-background--hover);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.data-table-row.--selected\\r\\n\\t{\\r\\n\\t\\t--data-table-cell-background: var(--data-table-cell-background--active);\\r\\n\\t\\t--data-table-row-border-color: var(--data-table-row-border-color--active);\\r\\n\\t}\\r\\n\\r\\n\\tdata-table-details,\\r\\n\\t.data-table-row.expanded\\r\\n\\t{\\r\\n\\t\\t--data-table-cell-background: var(--data-table-cell-background--active);\\r\\n\\t\\t--data-table-row-border-color: var(--data-table-row-border-color--active);\\r\\n\\t}\\r\\n\\r\\n\\t.data-table-append-action\\r\\n\\t{\\r\\n\\t\\t.data-table-row-drag-handle\\r\\n\\t\\t{\\r\\n\\t\\t\\tdisplay: none;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tdata-table-cell\\r\\n\\t\\t{\\r\\n\\t\\t\\tgrid-column: 1/-1;\\r\\n\\t\\t\\tdisplay: flex;\\r\\n\\t\\t\\tborder-bottom: none !important;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.--busy\\r\\n\\t{\\r\\n\\t\\topacity: var(--opacity-disabled);\\r\\n\\t}\\r\\n}\\r\\n\\r\\ndata-table[appearance=\\\"rows\\\"]\\r\\n{\\r\\n\\t--data-table-header-padding: 18rem 8rem 16rem;\\r\\n\\t--data-table-header-padding-right-aligned: 24rem 20rem 8rem 8rem;\\r\\n\\t--data-table-header-background: var(--palette-color-background);\\r\\n\\t--data-table-header-border-width: var(--border-width-thin);\\r\\n\\t--data-table-header-border-color: var(--data-table-row-border-color);\\r\\n\\t--data-table-cell-padding: 12rem 8rem;\\r\\n\\t--data-table-cell-padding-icon: 12rem;\\r\\n\\t--data-table-cell-padding-right-aligned: 12rem 20rem 12rem 8rem;\\r\\n\\t--data-table-cell-first-padding: 12rem 8rem 12rem 16rem;\\r\\n\\t--data-table-cell-background: transparent;\\r\\n\\t--data-table-cell-background--hover: var(--surface-color--active);\\r\\n\\t--data-table-cell-background--active: var(--surface-color--active);\\r\\n\\t--data-table-row-gap: 0;\\r\\n\\t--data-table-row-edge-width: var(--border-width-thick);\\r\\n\\t--data-table-row-edge-color: transparent;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\r\n\r\n/**\r\n * Custom element that renders a badge.\r\n */\r\n@autoinject\r\nexport class BadgeCustomElement\r\n{\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"badge{position:absolute;font-size:.5em;font-weight:700;line-height:1.5em;top:-0.65em;right:-0.65em;min-width:1.5em;padding:0 .4em;border-radius:.75em;background:var(--surface-badge-surface-color);color:var(--surface-badge-surface-text-color);text-align:center}badge:empty{display:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/icons/badge/badge.scss\"],\"names\":[],\"mappings\":\"AAEA,MAEC,iBAAA,CACA,cAAA,CACA,eAAA,CACA,iBAAA,CACA,WAAA,CACA,aAAA,CACA,eAAA,CACA,cAAA,CACA,mBAAA,CACA,6CAAA,CACA,6CAAA,CACA,iBAAA,CAEA,YAEC,YAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\nbadge\\r\\n{\\r\\n\\tposition: absolute;\\r\\n\\tfont-size: 0.5em;\\r\\n\\tfont-weight: 700;\\r\\n\\tline-height: 1.5em;\\r\\n\\ttop: -0.65em;\\r\\n\\tright: -0.65em;\\r\\n\\tmin-width: 1.5em;\\r\\n\\tpadding: 0 0.4em;\\r\\n\\tborder-radius: 0.75em;\\r\\n\\tbackground: var(--surface-badge-surface-color);\\r\\n\\tcolor: var(--surface-badge-surface-text-color);\\r\\n\\ttext-align: center;\\r\\n\\r\\n\\t&:empty\\r\\n\\t{\\r\\n\\t\\tdisplay: none;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable } from \"aurelia-framework\";\r\n\r\n/**\r\n * Custom element that renders the icon with the specified name.\r\n */\r\n@autoinject\r\nexport class IconCustomElement\r\n{\r\n\t/**\r\n\t * The name of the icon to render, or undefined to render no icon.\r\n\t */\r\n\t@bindable\r\n\tpublic name?: string;\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"icon{display:inline-flex;position:relative;width:1em;height:1em;line-height:1;font-size:24rem;flex-shrink:0;align-self:center;vertical-align:bottom}icon icon{position:absolute;width:100%;height:100%}icon:empty{display:none}icon svg{position:absolute;width:100%;height:100%}icon[inline]{vertical-align:baseline}icon[inline] svg{bottom:-0.125em}icon[accent=neutral]{color:var(--surface-neutral-icon-color)}icon[accent=primary]{color:var(--surface-primary-icon-color)}icon[accent=info]{color:var(--surface-info-icon-color)}icon[accent=positive]{color:var(--surface-positive-icon-color)}icon[accent=attention]{color:var(--surface-attention-icon-color)}icon[accent=negative]{color:var(--surface-negative-icon-color)}icon[class*=md-]{fill:currentColor;stroke:none}icon:not([class*=md-]){stroke:none;fill:var(--surface-color)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/icons/icon/icon.scss\"],\"names\":[],\"mappings\":\"AAEA,KAEC,mBAAA,CACA,iBAAA,CACA,SAAA,CACA,UAAA,CACA,aAAA,CACA,eAAA,CAGA,aAAA,CAGA,iBAAA,CAKA,qBAAA,CAKA,UAEC,iBAAA,CACA,UAAA,CACA,WAAA,CAGD,WAEC,YAAA,CAGD,SAEC,iBAAA,CACA,UAAA,CACA,WAAA,CAGD,aAEC,uBAAA,CAEA,iBAIC,eAAA,CAOD,qBAEC,uCAAA,CAFD,qBAEC,uCAAA,CAFD,kBAEC,oCAAA,CAFD,sBAEC,wCAAA,CAFD,uBAEC,yCAAA,CAFD,sBAEC,wCAAA,CAMH,iBASC,iBAAA,CAGA,WAAA,CAID,uBAKC,WAAA,CAGA,yBAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\nicon\\r\\n{\\r\\n\\tdisplay: inline-flex;\\r\\n\\tposition: relative;\\r\\n\\twidth: 1em;\\r\\n\\theight: 1em;\\r\\n\\tline-height: 1;\\r\\n\\tfont-size: 24rem; // Temporary hack to fix dimensions\\r\\n\\r\\n\\t// Prevent shrinking when placed in a flex layout.\\r\\n\\tflex-shrink: 0;\\r\\n\\r\\n\\t// If placed in a flex container, center on the cross axis.\\r\\n\\talign-self: center;\\r\\n\\r\\n\\t// If placed inline with text, align to the bottom of the line box.\\r\\n\\t// Note that this will only align as intended if both the line height\\r\\n\\t// of the text and the height of the icon is equal to the font size.\\r\\n\\tvertical-align: bottom;\\r\\n\\r\\n\\t// Stack nested icons and let the outer-most icon control their size.\\r\\n\\t// When used in a stack, the size and offset of individual icons should\\r\\n\\t// be specified as percentages, so they scale together with the stack.\\r\\n\\ticon\\r\\n\\t{\\r\\n\\t\\tposition: absolute;\\r\\n\\t\\twidth: 100%;\\r\\n\\t\\theight: 100%;\\r\\n\\t}\\r\\n\\r\\n\\t&:empty\\r\\n\\t{\\r\\n\\t\\tdisplay: none;\\r\\n\\t}\\r\\n\\r\\n\\tsvg\\r\\n\\t{\\r\\n\\t\\tposition: absolute;\\r\\n\\t\\twidth: 100%;\\r\\n\\t\\theight: 100%;\\r\\n\\t}\\r\\n\\r\\n\\t&[inline]\\r\\n\\t{\\r\\n\\t\\tvertical-align: baseline;\\r\\n\\r\\n\\t\\tsvg\\r\\n\\t\\t{\\r\\n\\t\\t\\t// HACK: Needed to ensure correct vertical alignment.\\r\\n\\t\\t\\t// We should maybe consider making this a font variable.\\r\\n\\t\\t\\tbottom: -0.125em;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t// Add accent color support.\\r\\n\\t@each $accent in $accents\\r\\n\\t{\\r\\n\\t\\t&[accent=\\\"#{$accent}\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\tcolor: var(--surface-#{$accent}-icon-color);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\\r\\n// Apply colors to Material Design icons.\\r\\nicon[class*=\\\"md-\\\"]\\r\\n{\\r\\n\\t// Use the current foreground color for both stroke and fill.\\r\\n\\t// This means that the markup for each icon must specify the\\r\\n\\t// attributes `fill=\\\"none\\\"` and `stroke=\\\"none\\\"` as needed.\\r\\n\\r\\n\\t// Note: `color` is not used.\\r\\n\\r\\n\\t// Used as the primary icon color.\\r\\n\\tfill: currentColor;\\r\\n\\r\\n\\t// Not supported.\\r\\n\\tstroke: none;\\r\\n}\\r\\n\\r\\n// Apply colors to Atlassian icons.\\r\\nicon:not([class*=\\\"md-\\\"])\\r\\n{\\r\\n\\t// Note: `color` is used as the primary icon color.\\r\\n\\r\\n\\t// Not supported.\\r\\n\\tstroke: none;\\r\\n\\r\\n\\t// Used for elements inside a filled icon to give the impression of transparency.\\r\\n\\tfill: var(--surface-color);\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable } from \"aurelia-framework\";\r\n\r\n// Load the icon font.\r\nconst link = document.createElement(\"link\");\r\nlink.href = \"https://fonts.googleapis.com/icon?family=Material+Icons\";\r\nlink.rel = \"stylesheet\";\r\ndocument.head.appendChild(link);\r\n\r\n/**\r\n * Custom element that renders the icon with the specified name.\r\n */\r\n@autoinject\r\nexport class MdIconCustomElement\r\n{\r\n\t/**\r\n\t * The name of the icon to render.\r\n\t * See: https://material.io/tools/icons\r\n\t */\r\n\t@bindable\r\n\tpublic name?: string;\r\n}\r\n","/**\r\n * Custom element that renders the icons within as a stack,\r\n * thus allowing multiple icons to be composed together.\r\n */\r\nexport class MdIconStackCustomElement\r\n{\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"md-icon-stack{display:inline-flex;position:relative;flex-direction:column;line-height:1;vertical-align:bottom;flex-shrink:0}md-icon-stack:empty{display:none}md-icon-stack>md-icon:not(:first-child){margin-top:-1em}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/icons/md-icon/md-icon-stack.scss\"],\"names\":[],\"mappings\":\"AAAA,cAGC,mBAAA,CACA,iBAAA,CACA,qBAAA,CACA,aAAA,CACA,qBAAA,CAGA,aAAA,CAEA,oBAEC,YAAA,CAID,wCAGC,eAAA\",\"sourcesContent\":[\"md-icon-stack\\r\\n{\\r\\n\\t// Lay out the icons in a column.\\r\\n\\tdisplay: inline-flex;\\r\\n\\tposition: relative;\\r\\n\\tflex-direction: column;\\r\\n\\tline-height: 1;\\r\\n\\tvertical-align: bottom;\\r\\n\\r\\n\\t// Prevent shrinking when placed in a flex layout.\\r\\n\\tflex-shrink: 0;\\r\\n\\r\\n\\t&:empty\\r\\n\\t{\\r\\n\\t\\tdisplay: none;\\r\\n\\t}\\r\\n\\r\\n\\t// Leave the first icon untouched.\\r\\n\\t> md-icon:not(:first-child)\\r\\n\\t{\\r\\n\\t\\t// Pull the remaining icons up so they overlap with the first.\\r\\n\\t\\tmargin-top: -1em;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"md-icon{box-sizing:content-box;max-width:1em;overflow:hidden;flex-shrink:0;position:relative;line-height:inherit;vertical-align:bottom;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;font-family:\\\"Material Icons\\\";font-weight:300;font-style:normal;font-size:inherit;-webkit-font-feature-settings:\\\"liga\\\";-webkit-font-smoothing:antialiased}md-icon:empty{display:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/icons/md-icon/md-icon.scss\"],\"names\":[],\"mappings\":\"AAEA,QAGC,sBAAA,CACA,aAAA,CACA,eAAA,CAGA,aAAA,CAEA,iBAAA,CACA,mBAAA,CACA,qBAAA,CACA,qBAAA,CACA,mBAAA,CACA,oBAAA,CACA,kBAAA,CACA,gBAAA,CACA,aAAA,CAGA,4BAAA,CACA,eAAA,CACA,iBAAA,CACA,iBAAA,CAGA,oCAAA,CACA,kCAAA,CAGA,cAEC,YAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\nmd-icon\\r\\n{\\r\\n\\t// Ensure the icon does not take up excessive space while the font is downloading.\\r\\n\\tbox-sizing: content-box;\\r\\n\\tmax-width: 1em;\\r\\n\\toverflow: hidden;\\r\\n\\r\\n\\t// Prevent shrinking when placed in a flex layout.\\r\\n\\tflex-shrink: 0;\\r\\n\\r\\n\\tposition: relative;\\r\\n\\tline-height: inherit;\\r\\n\\tvertical-align: bottom;\\r\\n\\tletter-spacing: normal;\\r\\n\\ttext-transform: none;\\r\\n\\tdisplay: inline-block;\\r\\n\\twhite-space: nowrap;\\r\\n\\tword-wrap: normal;\\r\\n\\tdirection: ltr;\\r\\n\\r\\n\\t/* stylelint-disable-next-line font-family-no-missing-generic-family-keyword */\\r\\n\\tfont-family: \\\"Material Icons\\\";\\r\\n\\tfont-weight: 300;\\r\\n\\tfont-style: normal;\\r\\n\\tfont-size: inherit;\\r\\n\\r\\n\\t/* stylelint-disable property-no-vendor-prefix */\\r\\n\\t-webkit-font-feature-settings: \\\"liga\\\";\\r\\n\\t-webkit-font-smoothing: antialiased;\\r\\n\\t/* stylelint-enable */\\r\\n\\r\\n\\t&:empty\\r\\n\\t{\\r\\n\\t\\tdisplay: none;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { templateController, autoinject, BoundViewFactory, ViewSlot, bindable } from \"aurelia-framework\";\nimport { If } from \"aurelia-templating-resources\";\n\n/**\n * Custom template controller attribute that conditionally renders the element to\n * which it is applied, based on whether the current environment matches one of\n * the specified environments.\n */\n@autoinject\n@templateController\nexport class IfEnvironmentCustomAttribute extends If\n{\n /**\n * Creates a new instance of the type.\n * @param boundViewFactory The `BoundViewFactory` instance for the element.\n * @param viewSlot The `ViewSlot` instance for the element.\n */\n public constructor(boundViewFactory: BoundViewFactory, viewSlot: ViewSlot)\n {\n super(boundViewFactory, viewSlot);\n }\n\n private _bound = false;\n\n /**\n * The condition, represented as a comma-separated list of environments\n * of which one must match, in order for the element to be rendered.\n */\n @bindable({ primaryProperty: true })\n public condition: boolean | string;\n\n /**\n * The swap order to use.\n */\n @bindable\n public swapOrder: \"before\" | \"with\" | \"after\";\n\n /**\n * The caching option to use.\n */\n @bindable\n public cache: boolean | string = true;\n\n /**\n * Called by the framework when the component is binding.\n * @param bindingContext The binding context\n * @param overrideContext The override context.\n */\n public bind(bindingContext: any, overrideContext: any): void\n {\n this.updateCondition();\n\n super.bind(bindingContext, overrideContext);\n\n this._bound = true;\n }\n\n /**\n * Called by the framework when the component is unbinding.\n */\n public unbind(): void\n {\n this._bound = false;\n }\n\n /**\n * Called by the framework when the `condition` property changes.\n * @param newValue The new value.\n */\n public conditionChanged(newValue: any): void\n {\n if (this._bound)\n {\n this.updateCondition();\n\n super.conditionChanged(newValue);\n }\n }\n\n /**\n * Resolves and updates the value of the `condition` property.\n */\n private updateCondition(): void\n {\n if (typeof this.condition === \"string\")\n {\n if (!this.condition || !this.condition.trim())\n {\n this.condition = true;\n }\n else\n {\n const requiredEnvironmants = this.condition.split(/\\s*,\\s*/);\n const currentEnvironmants = ENVIRONMENT.name;\n\n this.condition = requiredEnvironmants.includes(currentEnvironmants);\n }\n }\n }\n}\n","import { autoinject } from \"aurelia-framework\";\r\n\r\n/**\r\n * Represents the indicator to be shown while a view is busy.\r\n */\r\n@autoinject\r\nexport class BusyIndicatorCustomElement\r\n{\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"busy-indicator{display:flex;align-items:center;justify-content:center}busy-indicator .busy-indicator{position:relative;width:48rem;height:48rem;-webkit-animation:busy-indicator 2s infinite;animation:busy-indicator 2s infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes busy-indicator{from{transform:rotate(-360deg)}to{transform:rotate(360deg)}}@keyframes busy-indicator{from{transform:rotate(-360deg)}to{transform:rotate(360deg)}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/indicators/busy-indicator/busy-indicator.scss\"],\"names\":[],\"mappings\":\"AAAA,eAEC,YAAA,CACA,kBAAA,CACA,sBAAA,CAEA,+BAEC,iBAAA,CACA,WAAA,CACA,YAAA,CACA,4CAAA,CAAA,oCAAA,CACA,wCAAA,CAAA,gCAAA,CAGD,kCAEC,KAEC,yBAAA,CAGD,GAEC,wBAAA,CAAA,CATF,0BAEC,KAEC,yBAAA,CAGD,GAEC,wBAAA,CAAA\",\"sourcesContent\":[\"busy-indicator\\r\\n{\\r\\n\\tdisplay: flex;\\r\\n\\talign-items: center;\\r\\n\\tjustify-content: center;\\r\\n\\r\\n\\t.busy-indicator\\r\\n\\t{\\r\\n\\t\\tposition: relative;\\r\\n\\t\\twidth: 48rem;\\r\\n\\t\\theight: 48rem;\\r\\n\\t\\tanimation: busy-indicator 2s infinite;\\r\\n\\t\\tanimation-timing-function: linear;\\r\\n\\t}\\r\\n\\r\\n\\t@keyframes busy-indicator\\r\\n\\t{\\r\\n\\t\\tfrom\\r\\n\\t\\t{\\r\\n\\t\\t\\ttransform: rotate(-360deg);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tto\\r\\n\\t\\t{\\r\\n\\t\\t\\ttransform: rotate(360deg);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable } from \"aurelia-framework\";\r\n\r\n/**\r\n * Represents the indicator to be shown if a view is empty.\r\n */\r\n@autoinject\r\nexport class EmptyIndicatorCustomElement\r\n{\r\n\t/**\r\n\t * The size of the indicator.\r\n\t */\r\n\t@bindable({ defaultValue: \"large\" })\r\n\tpublic size: \"small\" | \"medium\" | \"large\";\r\n\r\n\t/**\r\n\t * The name of the icon, or undefined to show no icon.\r\n\t */\r\n\t@bindable({ defaultValue: \"empty-box\" })\r\n\tpublic icon: string | undefined;\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"empty-indicator{display:flex;align-items:center;justify-content:center}empty-indicator .empty-indicator{display:flex;flex-direction:column;align-items:center;justify-content:center}empty-indicator.--size-small .empty-indicator{height:160rem}empty-indicator.--size-small .empty-indicator-icon{height:60rem;width:60rem;opacity:var(--opacity-faded);margin-bottom:var(--font-base-margin-bottom)}empty-indicator.--size-small .empty-indicator-heading{font:var(--font-large);opacity:var(--opacity-faded)}empty-indicator.--size-small .empty-indicator>[slot=details]{margin-top:var(--font-large-margin-bottom)}empty-indicator.--size-medium .empty-indicator{height:20vh}empty-indicator.--size-medium .empty-indicator-icon{height:80rem;width:80rem;opacity:var(--opacity-faded);margin-bottom:var(--font-large-margin-bottom)}empty-indicator.--size-medium .empty-indicator-heading{font:var(--font-larger);opacity:var(--opacity-faded)}empty-indicator.--size-medium .empty-indicator>[slot=details]{margin-top:var(--font-larger-margin-bottom)}empty-indicator.--size-large .empty-indicator{height:25vh}empty-indicator.--size-large .empty-indicator-icon{height:100rem;width:100rem;opacity:var(--opacity-faded);margin-bottom:var(--font-large-margin-bottom)}empty-indicator.--size-large .empty-indicator-heading{font:var(--font-largest);opacity:var(--opacity-faded)}empty-indicator.--size-large .empty-indicator>[slot=details]{margin-top:var(--font-largest-margin-bottom)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/indicators/empty-indicator/empty-indicator.scss\"],\"names\":[],\"mappings\":\"AAAA,gBAEC,YAAA,CACA,kBAAA,CACA,sBAAA,CAEA,iCAEC,YAAA,CACA,qBAAA,CACA,kBAAA,CACA,sBAAA,CAKA,8CAEC,aAAA,CAGD,mDAEC,YAAA,CACA,WAAA,CACA,4BAAA,CACA,4CAAA,CAGD,sDAEC,sBAAA,CACA,4BAAA,CAGD,6DAEC,0CAAA,CAMD,+CAEC,WAAA,CAGD,oDAEC,YAAA,CACA,WAAA,CACA,4BAAA,CACA,6CAAA,CAGD,uDAEC,uBAAA,CACA,4BAAA,CAGD,8DAEC,2CAAA,CAMD,8CAEC,WAAA,CAGD,mDAEC,aAAA,CACA,YAAA,CACA,4BAAA,CACA,6CAAA,CAGD,sDAEC,wBAAA,CACA,4BAAA,CAGD,6DAEC,4CAAA\",\"sourcesContent\":[\"empty-indicator\\r\\n{\\r\\n\\tdisplay: flex;\\r\\n\\talign-items: center;\\r\\n\\tjustify-content: center;\\r\\n\\r\\n\\t.empty-indicator\\r\\n\\t{\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\tflex-direction: column;\\r\\n\\t\\talign-items: center;\\r\\n\\t\\tjustify-content: center;\\r\\n\\t}\\r\\n\\r\\n\\t&.--size-small\\r\\n\\t{\\r\\n\\t\\t.empty-indicator\\r\\n\\t\\t{\\r\\n\\t\\t\\theight: 160rem;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t.empty-indicator-icon\\r\\n\\t\\t{\\r\\n\\t\\t\\theight: 60rem;\\r\\n\\t\\t\\twidth: 60rem;\\r\\n\\t\\t\\topacity: var(--opacity-faded);\\r\\n\\t\\t\\tmargin-bottom: var(--font-base-margin-bottom);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t.empty-indicator-heading\\r\\n\\t\\t{\\r\\n\\t\\t\\tfont: var(--font-large);\\r\\n\\t\\t\\topacity: var(--opacity-faded);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t.empty-indicator > [slot=\\\"details\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: var(--font-large-margin-bottom);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.--size-medium\\r\\n\\t{\\r\\n\\t\\t.empty-indicator\\r\\n\\t\\t{\\r\\n\\t\\t\\theight: 20vh;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t.empty-indicator-icon\\r\\n\\t\\t{\\r\\n\\t\\t\\theight: 80rem;\\r\\n\\t\\t\\twidth: 80rem;\\r\\n\\t\\t\\topacity: var(--opacity-faded);\\r\\n\\t\\t\\tmargin-bottom: var(--font-large-margin-bottom);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t.empty-indicator-heading\\r\\n\\t\\t{\\r\\n\\t\\t\\tfont: var(--font-larger);\\r\\n\\t\\t\\topacity: var(--opacity-faded);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t.empty-indicator > [slot=\\\"details\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: var(--font-larger-margin-bottom);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.--size-large\\r\\n\\t{\\r\\n\\t\\t.empty-indicator\\r\\n\\t\\t{\\r\\n\\t\\t\\theight: 25vh;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t.empty-indicator-icon\\r\\n\\t\\t{\\r\\n\\t\\t\\theight: 100rem;\\r\\n\\t\\t\\twidth: 100rem;\\r\\n\\t\\t\\topacity: var(--opacity-faded);\\r\\n\\t\\t\\tmargin-bottom: var(--font-large-margin-bottom);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t.empty-indicator-heading\\r\\n\\t\\t{\\r\\n\\t\\t\\tfont: var(--font-largest);\\r\\n\\t\\t\\topacity: var(--opacity-faded);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t.empty-indicator > [slot=\\\"details\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: var(--font-largest-margin-bottom);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\r\n\r\n/**\r\n * Custom element that provides a grid layout for its child elements.\r\n */\r\n@autoinject\r\nexport class GridLayoutCustomElement\r\n{\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"grid-layout{display:block;--card-width: 300rem;--card-height: 160rem;--grid-layout-column-gap: 20rem;--grid-layout-row-gap: 20rem}grid-layout .grid-layout-items{display:flex;flex-wrap:wrap;margin-right:calc(-1 * var(--grid-layout-column-gap));margin-bottom:calc(-1 * var(--grid-layout-row-gap))}grid-layout .grid-layout-items>*{margin-right:var(--grid-layout-column-gap);margin-bottom:var(--grid-layout-row-gap)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/layouts/grid-layout/grid-layout.scss\"],\"names\":[],\"mappings\":\"AAAA,YAEC,aAAA,CAGA,oBAAA,CACA,qBAAA,CAGA,+BAAA,CAGA,4BAAA,CAEA,+BAGC,YAAA,CACA,cAAA,CAGA,qDAAA,CACA,mDAAA,CAGA,iCAEC,0CAAA,CACA,wCAAA\",\"sourcesContent\":[\"grid-layout\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\t// Set the default card size.\\r\\n\\t--card-width: 300rem;\\r\\n\\t--card-height: 160rem;\\r\\n\\r\\n\\t// The distance between each column.\\r\\n\\t--grid-layout-column-gap: 20rem;\\r\\n\\r\\n\\t// The distance between each row.\\r\\n\\t--grid-layout-row-gap: 20rem;\\r\\n\\r\\n\\t.grid-layout-items\\r\\n\\t{\\r\\n\\t\\t// Use horizontal flex layout, with wrapping.\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\tflex-wrap: wrap;\\r\\n\\r\\n\\t\\t// Apply negative margins to compensate for the row and column gap.\\r\\n\\t\\tmargin-right: calc(-1 * var(--grid-layout-column-gap));\\r\\n\\t\\tmargin-bottom: calc(-1 * var(--grid-layout-row-gap));\\r\\n\\r\\n\\t\\t// Set the row and column gap.\\r\\n\\t\\t> *\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-right: var(--grid-layout-column-gap);\\r\\n\\t\\t\\tmargin-bottom: var(--grid-layout-row-gap);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\r\n\r\n/**\r\n * Custom element that provides a list layout for its child elements.\r\n */\r\n@autoinject\r\nexport class ListLayoutCustomElement\r\n{\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"list-layout{display:block;--card-width: 100%;--card-height: 72rem;--list-layout-row-gap: 16rem}list-layout .list-layout-items{display:flex;flex-direction:column}list-layout .list-layout-items>:not(:last-child){margin-bottom:var(--list-layout-row-gap)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/layouts/list-layout/list-layout.scss\"],\"names\":[],\"mappings\":\"AAAA,YAEC,aAAA,CAGA,kBAAA,CACA,oBAAA,CAGA,4BAAA,CAEA,+BAGC,YAAA,CACA,qBAAA,CAGA,iDAEC,wCAAA\",\"sourcesContent\":[\"list-layout\\r\\n{\\r\\n\\tdisplay: block;\\r\\n\\r\\n\\t// Set the default card size.\\r\\n\\t--card-width: 100%;\\r\\n\\t--card-height: 72rem;\\r\\n\\r\\n\\t// The distance between each row.\\r\\n\\t--list-layout-row-gap: 16rem;\\r\\n\\r\\n\\t.list-layout-items\\r\\n\\t{\\r\\n\\t\\t// Use vertical flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\tflex-direction: column;\\r\\n\\r\\n\\t\\t// Set the row gap.\\r\\n\\t\\t> :not(:last-child)\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-bottom: var(--list-layout-row-gap);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { inject, bindable, Optional } from \"aurelia-framework\";\r\nimport { Modal, ModalService } from \"../../../services/modal\";\r\n\r\n/**\r\n * Represents the backdrop for a modal.\r\n *\r\n * ### How to use:\r\n * Place directly within the `template` element of the modal,\r\n * before its content.\r\n */\r\n@inject(ModalService, Optional.of(Modal, true))\r\nexport class ModalBackdropCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param modalService The `ModalService`instance.\r\n\t * @param modal The `Modal` instance representing the modal.\r\n\t */\r\n\tpublic constructor(modalService: ModalService, modal?: Modal)\r\n\t{\r\n\t\tthis._modalService = modalService;\r\n\t\tthis._modal = modal;\r\n\t}\r\n\r\n\tprivate readonly _modalService: ModalService;\r\n\tprivate readonly _modal: Modal | undefined;\r\n\r\n\t/**\r\n\t * True to close the modal when the backdrop is clicked, false to do nothing, or the name of a modal group to\r\n\t * The modal close action to take when the overlay is clicked, where `top` attempts to close\r\n\t * the modal at the top, `all` attempts to close all modals, and `none` does nothing.\r\n\t * The default is `top`.\r\n\t */\r\n\t@bindable({ defaultValue: \"top\" })\r\n\tpublic close: \"top\" | \"all\" | \"none\";\r\n\r\n\t/**\r\n\t * Called when the backdrop is clicked.\r\n\t */\r\n\tprotected async onClick(): Promise\r\n\t{\r\n\t\tconst topModal = this._modalService.modals[this._modalService.modals.length - 1];\r\n\r\n\t\tif (this._modal && this._modal === topModal)\r\n\t\t{\r\n\t\t\tif (this.close === \"all\")\r\n\t\t\t{\r\n\t\t\t\tawait this._modalService.closeAll(\"backdrop-clicked\");\r\n\t\t\t}\r\n\t\t\telse if (this.close === \"top\")\r\n\t\t\t{\r\n\t\t\t\tawait this._modal.close(\"backdrop-clicked\");\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;z-index:var(--z-index-backdrop);background:var(--modal-backdrop-color);pointer-events:initial}modal-backdrop{will-change:opacity;-webkit-animation-fill-mode:both !important;animation-fill-mode:both !important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}compose.au-enter modal-backdrop{opacity:0}compose.au-enter-active modal-backdrop{-webkit-animation:modal-backdrop-enter cubic-bezier(0.3, 0, 0.2, 1);animation:modal-backdrop-enter cubic-bezier(0.3, 0, 0.2, 1);-webkit-animation-duration:var(--animation-duration-medium);animation-duration:var(--animation-duration-medium)}compose.au-leave-active modal-backdrop{-webkit-animation:modal-backdrop-leave cubic-bezier(0, 0, 0, 1);animation:modal-backdrop-leave cubic-bezier(0, 0, 0, 1);-webkit-animation-duration:var(--animation-duration-medium);animation-duration:var(--animation-duration-medium)}@-webkit-keyframes modal-backdrop-enter{100%{opacity:1}}@keyframes modal-backdrop-enter{100%{opacity:1}}@-webkit-keyframes modal-backdrop-leave{100%{opacity:0}}@keyframes modal-backdrop-leave{100%{opacity:0}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/modals/modal-backdrop/modal-backdrop.scss\"],\"names\":[],\"mappings\":\"AAEA,eAGC,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CAGA,+BAAA,CAGA,sCAAA,CAGA,sBAAA,CAKD,eAGC,mBAAA,CAGA,2CAAA,CAAA,mCAAA,CAGA,wBAAA,CAAA,qBAAA,CAAA,oBAAA,CAAA,gBAAA,CAEA,gCAEC,SAAA,CAGD,uCAEC,mEAAA,CAAA,2DAAA,CACA,2DAAA,CAAA,mDAAA,CAGD,uCAEC,+DAAA,CAAA,uDAAA,CACA,2DAAA,CAAA,mDAAA,CAIF,wCAEC,KAEC,SAAA,CAAA,CAJF,gCAEC,KAEC,SAAA,CAAA,CAIF,wCAEC,KAEC,SAAA,CAAA,CAJF,gCAEC,KAEC,SAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\nmodal-backdrop\\r\\n{\\r\\n\\t// Fill the viewport.\\r\\n\\tposition: fixed;\\r\\n\\ttop: 0;\\r\\n\\tleft: 0;\\r\\n\\tright: 0;\\r\\n\\tbottom: 0;\\r\\n\\r\\n\\t// Apply the z-index for backdrops.\\r\\n\\tz-index: var(--z-index-backdrop);\\r\\n\\r\\n\\t// Apply the background for backdrops.\\r\\n\\tbackground: var(--modal-backdrop-color);\\r\\n\\r\\n\\t// Prevent clicks from passing through.\\r\\n\\tpointer-events: initial;\\r\\n}\\r\\n\\r\\n// Animate the backdrop.\\r\\n\\r\\nmodal-backdrop\\r\\n{\\r\\n\\t// Hint that animation will be applied.\\r\\n\\twill-change: opacity;\\r\\n\\r\\n\\t// Prevent glitches at the ends of the animation.\\r\\n\\tanimation-fill-mode: both !important;\\r\\n\\r\\n\\t// Prevent selection.\\r\\n\\tuser-select: none;\\r\\n\\r\\n\\tcompose.au-enter &\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t}\\r\\n\\r\\n\\tcompose.au-enter-active &\\r\\n\\t{\\r\\n\\t\\tanimation: modal-backdrop-enter cubic-bezier(0.3, 0, 0.2, 1);\\r\\n\\t\\tanimation-duration: var(--animation-duration-medium);\\r\\n\\t}\\r\\n\\r\\n\\tcompose.au-leave-active &\\r\\n\\t{\\r\\n\\t\\tanimation: modal-backdrop-leave cubic-bezier(0, 0, 0, 1);\\r\\n\\t\\tanimation-duration: var(--animation-duration-medium);\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes modal-backdrop-enter\\r\\n{\\r\\n\\t100%\\r\\n\\t{\\r\\n\\t\\topacity: 1;\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes modal-backdrop-leave\\r\\n{\\r\\n\\t100%\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { inject, bindable, Optional } from \"aurelia-framework\";\r\nimport { AccentColor } from \"resources/styles\";\r\nimport { Modal } from \"../../../services/modal\";\r\n\r\n/**\r\n * Represents a dialog to be presented in the `modal-view`.\r\n *\r\n * ### How to use:\r\n * Place directly within the `template` element for the dialog view.\r\n * When scoping styles, use a selector such as `modal-dialog[name=\"example\"]`.\r\n */\r\n@inject(Element, Optional.of(Modal, true))\r\nexport class ModalDialogCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element representing the component.\r\n\t * @param modal The `Modal` instance representing the modal.\r\n\t */\r\n\tpublic constructor(element: Element, modal?: Modal)\r\n\t{\r\n\t\tthis.element = element as HTMLElement;\r\n\t\tthis.modal = modal;\r\n\t}\r\n\r\n\t/**\r\n\t * The element representing the component.\r\n\t */\r\n\tprotected readonly element: HTMLElement;\r\n\r\n\t/**\r\n\t * The `Modal` instance representing the modal.\r\n\t */\r\n\tprotected readonly modal: Modal | undefined;\r\n\r\n\t/**\r\n\t * The name of the dialog.\r\n\t * Note that this should be unique among the dialogs in the app.\r\n\t */\r\n\t@bindable\r\n\tpublic name: string;\r\n\r\n\t/**\r\n\t * True to show a close button and close on outside click, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic closeButton: boolean;\r\n\r\n\t/**\r\n\t * True to close when the `Escape` key is pressed, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic closeShortcut: boolean;\r\n\r\n\t/**\r\n\t * The accent of the dialog, or undefined to apply no accent.\r\n\t * The default is undefined.\r\n\t */\r\n\t@bindable\r\n\tpublic accent?: AccentColor;\r\n\r\n\t/**\r\n\t * Whether or not the modal is in splitview with 2 views inside the\r\n\t * dialog horizontally aligned\r\n\t */\r\n\t@bindable\r\n\tpublic splitView?: boolean;\r\n\r\n\t/**\r\n\t * Called when the close button is clicked.\r\n\t */\r\n\tprotected onCloseClick(): void\r\n\t{\r\n\t\tif (this.modal != null)\r\n\t\t{\r\n\t\t\tthis.modal.close();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed.\r\n\t */\r\n\tprotected onKeyDown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\tif (event.key === \"Escape\" && !event.defaultPrevented && this.closeShortcut && this.modal != null)\r\n\t\t{\r\n\t\t\tthis.modal.close();\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-dialog{position:relative;display:flex;z-index:var(--z-index-modal);margin:0 auto;align-self:center;top:calc(var(--modal-dialog-margin-top) - var(--modal-dialog-margin-bottom));left:calc(var(--modal-dialog-margin-left) - var(--modal-dialog-margin-right));min-height:var(--modal-dialog-min-height);max-height:var(--modal-dialog-max-height);min-width:var(--modal-dialog-min-width);max-width:var(--modal-dialog-max-width);overflow:hidden;box-shadow:var(--shadow-modal);background:var(--surface-color);color:var(--surface-text-color)}@media(max-width: 800px){modal-dialog{display:initial}}@media(max-width: 800px){modal-dialog{height:100%}}modal-dialog.split-view{max-width:initial}@media(max-width: 800px){modal-dialog.split-view{display:initial}}modal-dialog.split-view .modal-dialog-content{flex-direction:row;overflow:hidden}@media(max-width: 800px){modal-dialog.split-view .modal-dialog-content{flex-direction:column-reverse;overflow:overlay}}modal-dialog.split-view .modal-dialog-content>*:first-child{width:var(--modal-dialog-min-width);max-width:var(--modal-dialog-max-width);max-height:100%;overflow:overlay;display:flex;flex-direction:column}@media(max-width: 800px){modal-dialog.split-view .modal-dialog-content>*:first-child{width:100%}}modal-dialog.split-view .modal-dialog-content>*:first-child modal-header::before{width:100%}modal-dialog.split-view .modal-dialog-actions button[appearance=icon]{color:#fff}modal-dialog .modal-dialog-content{position:relative;display:flex;flex-direction:column;width:100%;min-height:100%}modal-dialog .modal-dialog-content .modal-content{display:flex;flex-direction:column}modal-dialog .modal-dialog-content modal-header,modal-dialog .modal-dialog-content modal-footer{padding:0 64rem}@media(max-width: 800px){modal-dialog .modal-dialog-content modal-header,modal-dialog .modal-dialog-content modal-footer{padding:0 30rem}}modal-dialog .modal-dialog-content modal-header button[appearance=icon],modal-dialog .modal-dialog-content modal-footer button[appearance=icon]{font-size:24rem}modal-dialog .modal-dialog-content modal-header{padding-top:64rem;padding-bottom:44rem}@media(max-width: 800px){modal-dialog .modal-dialog-content modal-header{padding-top:44rem;padding-bottom:44rem}}modal-dialog .modal-dialog-content modal-header::before{content:\\\"\\\";position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1;background-color:var(--surface-color)}modal-dialog .modal-dialog-content modal-section{clear:both;padding:0 64rem 0 64rem}@media(max-width: 800px){modal-dialog .modal-dialog-content modal-section{padding:0 30rem;flex:1}}modal-dialog .modal-dialog-content modal-footer{margin-top:auto;padding-top:56rem;padding-bottom:56rem;clear:both;background-color:var(--surface-color)}@media(max-width: 800px){modal-dialog .modal-dialog-content modal-footer{padding-top:44rem;padding-bottom:44rem}}modal-dialog .modal-dialog-actions{padding:24rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}modal-dialog .modal-dialog-actions,modal-dialog .modal-dialog-actions>[slot=actions]{position:absolute;top:0;right:0;z-index:2;float:right;align-items:center}@media(max-width: 800px){modal-dialog .modal-dialog-actions,modal-dialog .modal-dialog-actions>[slot=actions]{display:flex}}modal-dialog .modal-dialog-actions button[appearance=icon]{font-size:24rem}modal-dialog[accent]{border-left-width:var(--border-width-thicker);color:inherit}modal-dialog[accent=neutral]{border-color:var(--surface-neutral-border-color)}modal-dialog[accent=primary]{border-color:var(--surface-primary-border-color)}modal-dialog[accent=info]{border-color:var(--surface-info-border-color)}modal-dialog[accent=positive]{border-color:var(--surface-positive-border-color)}modal-dialog[accent=attention]{border-color:var(--surface-attention-border-color)}modal-dialog[accent=negative]{border-color:var(--surface-negative-border-color)}modal-view modal-dialog{will-change:opacity;-webkit-animation-fill-mode:both !important;animation-fill-mode:both !important}modal-view compose.au-enter modal-dialog{opacity:0;overflow:hidden}modal-view compose.au-enter-active modal-dialog{-webkit-animation:modal-dialog-enter cubic-bezier(0.2, 0, 0, 1);animation:modal-dialog-enter cubic-bezier(0.2, 0, 0, 1);-webkit-animation-duration:var(--animation-duration-medium);animation-duration:var(--animation-duration-medium)}modal-view compose.au-leave modal-dialog{box-shadow:var(--modal-dialog-afterglow)}modal-view compose.au-leave-active modal-dialog{-webkit-animation:modal-dialog-leave cubic-bezier(0.2, 0, 0, 1);animation:modal-dialog-leave cubic-bezier(0.2, 0, 0, 1);-webkit-animation-duration:var(--animation-duration-medium);animation-duration:var(--animation-duration-medium)}@-webkit-keyframes modal-dialog-enter{5%{opacity:0}100%{opacity:1}}@keyframes modal-dialog-enter{5%{opacity:0}100%{opacity:1}}@-webkit-keyframes modal-dialog-leave{50%{opacity:0}100%{opacity:0}}@keyframes modal-dialog-leave{50%{opacity:0}100%{opacity:0}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/modals/modal-dialog/modal-dialog.scss\"],\"names\":[],\"mappings\":\"AAEA,aAGC,iBAAA,CACA,YAAA,CAQA,4BAAA,CAGA,aAAA,CACA,iBAAA,CAGA,4EAAA,CACA,6EAAA,CAGA,yCAAA,CACA,yCAAA,CACA,uCAAA,CACA,uCAAA,CAQA,eAAA,CAGA,8BAAA,CAGA,+BAAA,CACA,+BAAA,CAnCA,yBAND,aAQG,eAAA,CAAA,CAoBF,yBA5BD,aA8BG,WAAA,CAAA,CAaF,wBAEC,iBAAA,CAEA,yBAJD,wBAME,eAAA,CAAA,CAGD,8CAEC,kBAAA,CACA,eAAA,CAEA,yBALD,8CAOE,6BAAA,CACA,gBAAA,CAAA,CAGD,4DAEC,mCAAA,CACA,uCAAA,CACA,eAAA,CACA,gBAAA,CACA,YAAA,CACA,qBAAA,CAEA,yBATD,4DAWE,UAAA,CAAA,CAKA,iFAEC,UAAA,CAQH,sEAEC,UAAA,CAKH,mCAEC,iBAAA,CACA,YAAA,CAEA,qBAAA,CAGA,UAAA,CACA,eAAA,CAEA,kDAEC,YAAA,CACA,qBAAA,CAID,gGAMC,eAAA,CAEA,yBARD,gGAUE,eAAA,CAAA,CAGD,gJAGC,eAAA,CAIF,gDAGC,iBAAA,CACA,oBAAA,CAEA,yBAND,gDAQE,iBAAA,CACA,oBAAA,CAAA,CAGD,wDAEC,UAAA,CAEA,iBAAA,CACA,KAAA,CACA,MAAA,CACA,UAAA,CACA,WAAA,CACA,UAAA,CAIA,qCAAA,CAIF,iDAGC,UAAA,CAGA,uBAAA,CAEA,yBARD,iDAUE,eAAA,CACA,MAAA,CAAA,CAIF,gDAEC,eAAA,CAEA,iBAAA,CACA,oBAAA,CASA,UAAA,CAIA,qCAAA,CAXA,yBAPD,gDASE,iBAAA,CACA,oBAAA,CAAA,CAYH,mCAGC,aAAA,CAGA,wBAAA,CAAA,qBAAA,CAAA,oBAAA,CAAA,gBAAA,CAEA,qFAIC,iBAAA,CACA,KAAA,CACA,OAAA,CACA,SAAA,CACA,WAAA,CAUA,kBAAA,CANA,yBAZD,qFAcE,YAAA,CAAA,CAOF,2DAGC,eAAA,CAIF,qBAGC,6CAAA,CAGA,aAAA,CAOA,6BAEC,gDAAA,CAFD,6BAEC,gDAAA,CAFD,0BAEC,6CAAA,CAFD,8BAEC,iDAAA,CAFD,+BAEC,kDAAA,CAFD,8BAEC,iDAAA,CASF,wBAGC,mBAAA,CAGA,2CAAA,CAAA,mCAAA,CAGD,yCAEC,SAAA,CACA,eAAA,CAGD,gDAEC,+DAAA,CAAA,uDAAA,CACA,2DAAA,CAAA,mDAAA,CAGD,yCAGC,wCAAA,CAGD,gDAEC,+DAAA,CAAA,uDAAA,CACA,2DAAA,CAAA,mDAAA,CAIF,sCAEC,GAEC,SAAA,CAGD,KAEC,SAAA,CAAA,CATF,8BAEC,GAEC,SAAA,CAGD,KAEC,SAAA,CAAA,CAIF,sCAEC,IAEC,SAAA,CAGD,KAEC,SAAA,CAAA,CATF,8BAEC,IAEC,SAAA,CAGD,KAEC,SAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\nmodal-dialog\\r\\n{\\r\\n\\t// Allow content to be positioned relative to this element.\\r\\n\\tposition: relative;\\r\\n\\tdisplay: flex;\\r\\n\\r\\n\\t@media ($media-smaller-max)\\r\\n\\t{\\r\\n\\t display: initial;\\r\\n\\t}\\r\\n\\r\\n\\t// Apply the z-index for modals.\\r\\n\\tz-index: var(--z-index-modal);\\r\\n\\r\\n\\t// Center the dialog.\\r\\n\\tmargin: 0 auto;\\r\\n\\talign-self: center;\\r\\n\\r\\n\\t// Offset the dialog according to its margin.\\r\\n\\ttop: calc(var(--modal-dialog-margin-top) - var(--modal-dialog-margin-bottom));\\r\\n\\tleft: calc(var(--modal-dialog-margin-left) - var(--modal-dialog-margin-right));\\r\\n\\r\\n\\t// Limit the size of the dialog.\\r\\n\\tmin-height: var(--modal-dialog-min-height);\\r\\n\\tmax-height: var(--modal-dialog-max-height);\\r\\n\\tmin-width: var(--modal-dialog-min-width);\\r\\n\\tmax-width: var(--modal-dialog-max-width);\\r\\n\\r\\n\\t@media ($media-smaller-max)\\r\\n\\t{\\r\\n\\t height: 100%;\\r\\n\\t}\\r\\n\\r\\n\\t// Hide overflow by default, so we get rounded borders.\\r\\n\\toverflow: hidden;\\r\\n\\r\\n\\t// Apply a shadow to the dialog.\\r\\n\\tbox-shadow: var(--shadow-modal);\\r\\n\\r\\n\\t// Apply surface style.\\r\\n\\tbackground: var(--surface-color);\\r\\n\\tcolor: var(--surface-text-color);\\r\\n\\r\\n\\t&.split-view\\r\\n\\t{\\r\\n\\t\\tmax-width: initial;\\r\\n\\r\\n\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t{\\r\\n\\t\\t\\tdisplay: initial;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t.modal-dialog-content\\r\\n\\t\\t{\\r\\n\\t\\t\\tflex-direction: row;\\r\\n\\t\\t\\toverflow: hidden;\\r\\n\\r\\n\\t\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tflex-direction: column-reverse;\\r\\n\\t\\t\\t\\toverflow: overlay;\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t> *:first-child\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\twidth: var(--modal-dialog-min-width);\\r\\n\\t\\t\\t\\tmax-width: var(--modal-dialog-max-width);\\r\\n\\t\\t\\t\\tmax-height: 100%;\\r\\n\\t\\t\\t\\toverflow: overlay;\\r\\n\\t\\t\\t\\tdisplay: flex;\\r\\n\\t\\t\\t\\tflex-direction: column;\\r\\n\\r\\n\\t\\t\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\twidth: 100%;\\r\\n\\t\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t\\tmodal-header\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\t&::before\\r\\n\\t\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\t\\twidth: 100%;\\r\\n\\t\\t\\t\\t\\t}\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t.modal-dialog-actions\\r\\n\\t\\t{\\r\\n\\t\\t\\tbutton[appearance=\\\"icon\\\"]\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tcolor: white;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.modal-dialog-content\\r\\n\\t{\\r\\n\\t\\tposition: relative;\\r\\n\\t\\tdisplay: flex;\\r\\n\\r\\n\\t\\tflex-direction: column;\\r\\n\\r\\n\\t\\t// Set the size of the content area.\\r\\n\\t\\twidth: 100%;\\r\\n\\t\\tmin-height: 100%;\\r\\n\\r\\n\\t\\t.modal-content\\r\\n\\t\\t{\\r\\n\\t\\t\\tdisplay: flex;\\r\\n\\t\\t\\tflex-direction: column;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t// Provide defaults for sectioning elements.\\r\\n\\t\\tmodal-header,\\r\\n\\t\\tmodal-footer\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply padding to header and footer.\\r\\n\\t\\t\\t// Note that we use padding instead of margin,\\r\\n\\t\\t\\t// to enable sticky positioning.\\r\\n\\t\\t\\tpadding: 0 64rem;\\r\\n\\r\\n\\t\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tpadding: 0 30rem;\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\tbutton[appearance=\\\"icon\\\"]\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Provide default icon size.\\r\\n\\t\\t\\t\\tfont-size: 24rem;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tmodal-header\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply bottom and top padding header.\\r\\n\\t\\t\\tpadding-top: 64rem;\\r\\n\\t\\t\\tpadding-bottom: 44rem;\\r\\n\\r\\n\\t\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tpadding-top: 44rem;\\r\\n\\t\\t\\t\\tpadding-bottom: 44rem;\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t&::before\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tcontent: \\\"\\\";\\r\\n\\r\\n\\t\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\t\\ttop: 0;\\r\\n\\t\\t\\t\\tleft: 0;\\r\\n\\t\\t\\t\\twidth: 100%;\\r\\n\\t\\t\\t\\theight: 100%;\\r\\n\\t\\t\\t\\tz-index: -1;\\r\\n\\r\\n\\t\\t\\t\\t// Apply the surface color to the header and footer,\\r\\n\\t\\t\\t\\t// so they cover any content scrolling under them.\\r\\n\\t\\t\\t\\tbackground-color: var(--surface-color);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tmodal-section\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Ensure the element clears the actions at the top of the dialog.\\r\\n\\t\\t\\tclear: both;\\r\\n\\r\\n\\t\\t\\t// Apply horizontal padding to sections.\\r\\n\\t\\t\\tpadding: 0 64rem 0 64rem;\\r\\n\\r\\n\\t\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tpadding: 0 30rem;\\r\\n\\t\\t\\t\\tflex: 1;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tmodal-footer\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: auto;\\r\\n\\t\\t\\t// Apply bottom and top padding footer.\\r\\n\\t\\t\\tpadding-top: 56rem;\\r\\n\\t\\t\\tpadding-bottom: 56rem;\\r\\n\\r\\n\\t\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tpadding-top: 44rem;\\r\\n\\t\\t\\t\\tpadding-bottom: 44rem;\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t// Ensure the element clears the actions at the top of the dialog.\\r\\n\\t\\t\\tclear: both;\\r\\n\\r\\n\\t\\t\\t// Apply the surface color to the header and footer,\\r\\n\\t\\t\\t// so they cover any content scrolling under them.\\r\\n\\t\\t\\tbackground-color: var(--surface-color);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.modal-dialog-actions\\r\\n\\t{\\r\\n\\t\\t// Apply padding.\\r\\n\\t\\tpadding: 24rem;\\r\\n\\r\\n\\t\\t// Prevent selection.\\r\\n\\t\\tuser-select: none;\\r\\n\\r\\n\\t\\t&,\\r\\n\\t\\t> [slot=\\\"actions\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Position at the top-right corner of the dialog.\\r\\n\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\ttop: 0;\\r\\n\\t\\t\\tright: 0;\\r\\n\\t\\t\\tz-index: 2;\\r\\n\\t\\t\\tfloat: right;\\r\\n\\r\\n\\t\\t\\t// Use horizontal flex layout.\\r\\n\\r\\n\\t\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tdisplay: flex;\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\t// Center items vertically.\\r\\n\\t\\t\\talign-items: center;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tbutton[appearance=\\\"icon\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Provide default icon size.\\r\\n\\t\\t\\tfont-size: 24rem;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&[accent]\\r\\n\\t{\\r\\n\\t\\t// Apply an edge to the dialog.\\r\\n\\t\\tborder-left-width: var(--border-width-thicker);\\r\\n\\r\\n\\t\\t// Ensure the accent only affects the edge, and not the content.\\r\\n\\t\\tcolor: inherit;\\r\\n\\t}\\r\\n\\r\\n\\t// Add accent color support for the edge.\\r\\n\\r\\n\\t@each $accent in $accents\\r\\n\\t{\\r\\n\\t\\t&[accent=\\\"#{$accent}\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\tborder-color: var(--surface-#{$accent}-border-color);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\\r\\n// Animate the dialog.\\r\\n\\r\\nmodal-dialog\\r\\n{\\r\\n\\tmodal-view &\\r\\n\\t{\\r\\n\\t\\t// Hint that animation will be applied.\\r\\n\\t\\twill-change: opacity;\\r\\n\\r\\n\\t\\t// Prevent glitches at the ends of the animation.\\r\\n\\t\\tanimation-fill-mode: both !important;\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-enter &\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t\\toverflow: hidden;\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-enter-active &\\r\\n\\t{\\r\\n\\t\\tanimation: modal-dialog-enter cubic-bezier(0.2, 0, 0, 1);\\r\\n\\t\\tanimation-duration: var(--animation-duration-medium);\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-leave &\\r\\n\\t{\\r\\n\\t\\t// Replace the shadow with an afterglow to smoothe the edge and reduce ghosting.\\r\\n\\t\\tbox-shadow: var(--modal-dialog-afterglow);\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-leave-active &\\r\\n\\t{\\r\\n\\t\\tanimation: modal-dialog-leave cubic-bezier(0.2, 0, 0, 1);\\r\\n\\t\\tanimation-duration: var(--animation-duration-medium);\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes modal-dialog-enter\\r\\n{\\r\\n\\t5%\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t}\\r\\n\\r\\n\\t100%\\r\\n\\t{\\r\\n\\t\\topacity: 1;\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes modal-dialog-leave\\r\\n{\\r\\n\\t50%\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t}\\r\\n\\r\\n\\t100%\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\r\n\r\n/**\r\n * Represents the footer of a modal.\r\n */\r\n@autoinject\r\nexport class ModalFooterCustomElement\r\n{\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-footer{position:relative;display:flex}modal-footer.margin,modal-footer.margin-top{margin-top:var(--font-large-margin-top)}modal-footer.margin,modal-footer.margin-bottom{margin-bottom:var(--font-large-margin-top)}modal-footer.margin-double,modal-footer.margin-double-top{margin-top:calc(2 * var(--font-large-margin-top))}modal-footer.margin-double,modal-footer.margin-double-bottom{margin-bottom:calc(2 * var(--font-large-margin-top))}modal-footer [slot=buttons]{width:100%;display:flex}@media(max-width: 800px){modal-footer [slot=buttons]{flex-direction:column-reverse}modal-footer [slot=buttons] button{margin:0}modal-footer [slot=buttons] button:not(:last-child){margin-top:16rem}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/modals/modal-footer/modal-footer.scss\"],\"names\":[],\"mappings\":\"AAEA,aAGC,iBAAA,CAGA,YAAA,CAIC,4CAEC,uCAAA,CAGD,+CAEC,0CAAA,CAMD,0DAEC,iDAAA,CAGD,6DAEC,oDAAA,CAIF,4BAEC,UAAA,CACA,YAAA,CAEA,yBALD,4BAOE,6BAAA,CAEA,mCAEC,QAAA,CAEA,oDAEC,gBAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\nmodal-footer\\r\\n{\\r\\n\\t// Allow content to be positioned relative to this element.\\r\\n\\tposition: relative;\\r\\n\\r\\n\\t// Use flex layout.\\r\\n\\tdisplay: flex;\\r\\n\\r\\n\\t&.margin\\r\\n\\t{\\r\\n\\t\\t&, &-top\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: var(--font-large-margin-top);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&, &-bottom\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-bottom: var(--font-large-margin-top);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.margin-double\\r\\n\\t{\\r\\n\\t\\t&, &-top\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: calc(2 * var(--font-large-margin-top));\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&, &-bottom\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-bottom: calc(2 * var(--font-large-margin-top));\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t[slot=\\\"buttons\\\"]\\r\\n\\t{\\r\\n\\t\\twidth: 100%;\\r\\n\\t\\tdisplay: flex;\\r\\n\\r\\n\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t{\\r\\n\\t\\t\\tflex-direction: column-reverse;\\r\\n\\r\\n\\t\\t\\tbutton\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tmargin: 0;\\r\\n\\r\\n\\t\\t\\t\\t&:not(:last-child)\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tmargin-top: 16rem;\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\r\n\r\n/**\r\n * Represents the header of a modal.\r\n */\r\n@autoinject\r\nexport class ModalHeaderCustomElement\r\n{\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-header{position:relative;display:flex;flex-direction:column}modal-header.margin,modal-header.margin-top{margin-top:var(--font-large-margin-top)}modal-header.margin,modal-header.margin-bottom{margin-bottom:var(--font-large-margin-top)}modal-header.margin-double,modal-header.margin-double-top{margin-top:calc(2 * var(--font-large-margin-top))}modal-header.margin-double,modal-header.margin-double-bottom{margin-bottom:calc(2 * var(--font-large-margin-top))}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/modals/modal-header/modal-header.scss\"],\"names\":[],\"mappings\":\"AAEA,aAGC,iBAAA,CAGA,YAAA,CACA,qBAAA,CAIC,4CAEC,uCAAA,CAGD,+CAEC,0CAAA,CAMD,0DAEC,iDAAA,CAGD,6DAEC,oDAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\nmodal-header\\r\\n{\\r\\n\\t// Allow content to be positioned relative to this element.\\r\\n\\tposition: relative;\\r\\n\\r\\n\\t// Use vertical flex layout.\\r\\n\\tdisplay: flex;\\r\\n\\tflex-direction: column;\\r\\n\\r\\n\\t&.margin\\r\\n\\t{\\r\\n\\t\\t&, &-top\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: var(--font-large-margin-top);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&, &-bottom\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-bottom: var(--font-large-margin-top);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.margin-double\\r\\n\\t{\\r\\n\\t\\t&, &-top\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: calc(2 * var(--font-large-margin-top));\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&, &-bottom\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-bottom: calc(2 * var(--font-large-margin-top));\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable } from \"aurelia-framework\";\r\nimport { ModalService, Modal } from \"../../../services/modal\";\r\n\r\nimport \"./modal-href.scss\";\r\n\r\n/**\r\n * Custom attribute that makes the element to which it is applied\r\n * open or toggle the specified modal when clicked.\r\n *\r\n * ### How to use:\r\n * Place on the element that should open or toggle a modal when clicked,\r\n * and specify the modal to open in the options.\r\n */\r\n@autoinject\r\nexport class ModalHrefCustomAttribute\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element to which the attribute is attached.\r\n\t * @param modalService The `ModalService` instance.\r\n\t */\r\n\tpublic constructor(element: Element, modalService: ModalService)\r\n\t{\r\n\t\tthis._element = element as HTMLElement | SVGElement;\r\n\t\tthis._modalService = modalService;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement | SVGElement;\r\n\tprivate readonly _modalService: ModalService;\r\n\tprivate _modal: Modal | undefined;\r\n\r\n\t/**\r\n\t * The name of the modal to launch, or undefined to do nothing.\r\n\t * Note that the modal must be registered with the `ModalService`,\r\n\t * otherwise an error will be thrown when the element is clicked.\r\n\t */\r\n\t@bindable\r\n\tpublic modal?: string;\r\n\r\n\t/**\r\n\t * The model to pass to the `activate` life cycle method of the component.\r\n\t */\r\n\t@bindable\r\n\tpublic readonly model?: any;\r\n\r\n\t/**\r\n\t * True to toggle between opening and closing the modal, false to always open the modal.\r\n\t * The default is false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic toggle: boolean;\r\n\r\n\t/**\r\n\t * Called by the framework when the element is attached.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\tthis._element.addEventListener(\"click\", (event: MouseEvent) =>\r\n\t\t{\r\n\t\t\tif (!event.defaultPrevented)\r\n\t\t\t{\r\n\t\t\t\tthis.onElementClick(event);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the element is clicked.\r\n\t * Opens or toggles the specified modal.\r\n\t */\r\n\tprivate async onElementClick(event: MouseEvent): Promise\r\n\t{\r\n\t\t// Don't handle the event if it originated from an anchor with an href nested inside the element.\r\n\t\tif (event.target !== this._element && event.target instanceof HTMLAnchorElement && event.target.hasAttribute(\"href\"))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Don't handle the event if default has been prevented.\r\n\t\tif (event.defaultPrevented)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tevent.preventDefault();\r\n\r\n\t\tif (!this.modal)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ttry\r\n\t\t{\r\n\t\t\tif (this.toggle && this._modal != null)\r\n\t\t\t{\r\n\t\t\t\tawait this._modal.close();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis._modal = this._modalService.open(this.modal, this.model);\r\n\t\t\t\tawait this._modal.promise;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfinally\r\n\t\t{\r\n\t\t\tthis._modal = undefined;\r\n\t\t}\r\n\t}\r\n}\r\n","import { autoinject, bindable } from \"aurelia-framework\";\n\n@autoinject\nexport class ModalImageCustomElement\n{\n\n\t/**\n\t * True if the section is expanded, otherwise false.\n\t */\n\t@bindable\n\tpublic imageUrl: string;\n}\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-image{width:472rem;flex-grow:1;background-size:cover;background-position:center;display:flex;flex-direction:column;padding:32rem 48rem}@media(max-width: 800px){modal-image{width:100%;height:50vh;padding:24rem 32rem}}modal-image [slot=image-subtitle]{color:#fff;margin-top:auto}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/modals/modal-image/modal-image.scss\"],\"names\":[],\"mappings\":\"AAEA,YAEC,YAAA,CACA,WAAA,CACA,qBAAA,CACA,0BAAA,CACA,YAAA,CACA,qBAAA,CACA,mBAAA,CAEA,yBAVD,YAYE,UAAA,CACA,WAAA,CACA,mBAAA,CAAA,CAGD,kCAEC,UAAA,CACA,eAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\n\\nmodal-image\\n{\\n\\twidth: 472rem;\\n\\tflex-grow: 1;\\n\\tbackground-size: cover;\\n\\tbackground-position: center;\\n\\tdisplay: flex;\\n\\tflex-direction: column;\\n\\tpadding: 32rem 48rem;\\n\\n\\t@media ($media-smaller-max)\\n\\t{\\n\\t\\twidth: 100%;\\n\\t\\theight: 50vh;\\n\\t\\tpadding: 24rem 32rem;\\n\\t}\\n\\n\\t[slot=\\\"image-subtitle\\\"]\\n\\t{\\n\\t\\tcolor: white;\\n\\t\\tmargin-top: auto;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { inject, bindable, Optional } from \"aurelia-framework\";\r\nimport { Modal } from \"../../../services/modal\";\r\n\r\n/**\r\n * Represents a dialog to be presented in the `modal-view`.\r\n *\r\n * ### How to use:\r\n * Place directly within the `template` element for the dialog view.\r\n * When scoping styles, use a selector such as `modal-overlay[name=\"example\"]`.\r\n */\r\n@inject(Element, Optional.of(Modal, true))\r\nexport class ModalOverlayCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element representing the component.\r\n\t * @param modal The `Modal` instance representing the modal.\r\n\t */\r\n\tpublic constructor(element: Element, modal?: Modal)\r\n\t{\r\n\t\tthis.modal = modal;\r\n\t\tthis.element = element as HTMLElement;\r\n\t}\r\n\r\n\t/**\r\n\t * The element representing the component.\r\n\t */\r\n\tprotected readonly element: HTMLElement;\r\n\r\n\t/**\r\n\t * The `Modal` instance representing the modal.\r\n\t */\r\n\tprotected readonly modal: Modal | undefined;\r\n\r\n\t/**\r\n\t * The name of the overlay.\r\n\t * Note that this should be unique among the overlays in the app.\r\n\t */\r\n\t@bindable\r\n\tpublic name: string;\r\n\r\n\t/**\r\n\t * True to show a close button and close on outside click, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic closeButton: boolean;\r\n\r\n\t/**\r\n\t * True to close when the `Escape` key is pressed, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic closeShortcut: boolean;\r\n\r\n\t/**\r\n\t * Called when the close button is clicked.\r\n\t */\r\n\tprotected onCloseClick(): void\r\n\t{\r\n\t\tif (this.modal != null)\r\n\t\t{\r\n\t\t\tthis.modal.close();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed.\r\n\t */\r\n\tprotected onKeyDown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\tif (event.key === \"Escape\" && !event.defaultPrevented && this.closeShortcut && this.modal != null)\r\n\t\t{\r\n\t\t\tthis.modal.close();\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-overlay{position:relative;flex-grow:1;z-index:var(--z-index-modal);overflow:hidden;border-color:var(--border-color);background:var(--surface-color);color:var(--surface-text-color)}modal-overlay .modal-overlay-content{position:absolute;top:0;right:0;width:calc(100% - var(--modal-overlay-actions-width));min-height:100%;display:flex;flex-direction:column;padding-right:36rem;z-index:1}modal-overlay .modal-overlay-content modal-header,modal-overlay .modal-overlay-content modal-section,modal-overlay .modal-overlay-content modal-footer{flex-shrink:0}modal-overlay .modal-overlay-content modal-header{padding-top:44rem;padding-bottom:36rem}modal-overlay .modal-overlay-content modal-footer{margin-top:auto;padding-top:36rem;padding-bottom:44rem}modal-overlay .modal-overlay-actions{position:sticky;top:0;width:var(--modal-overlay-actions-width);min-height:100%;display:flex;flex-direction:column;align-items:center;padding:35rem 20rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}modal-overlay .modal-overlay-actions>*{margin-bottom:12rem}modal-overlay .modal-overlay-actions button[appearance=icon]{font-size:24rem}modal-view modal-overlay,modal-view app-sidebar{will-change:opacity;-webkit-animation-fill-mode:both !important;animation-fill-mode:both !important}modal-view compose.au-enter modal-overlay,modal-view compose.au-enter app-sidebar{opacity:0;overflow:hidden}modal-view compose.au-enter-active modal-overlay,modal-view compose.au-enter-active app-sidebar{-webkit-animation:modal-overlay-enter cubic-bezier(0.2, 0, 0, 1);animation:modal-overlay-enter cubic-bezier(0.2, 0, 0, 1);-webkit-animation-duration:var(--animation-duration-medium);animation-duration:var(--animation-duration-medium)}modal-view compose.au-leave modal-overlay,modal-view compose.au-leave app-sidebar{box-shadow:var(--modal-overlay-afterglow)}modal-view compose.au-leave-active modal-overlay,modal-view compose.au-leave-active app-sidebar{-webkit-animation:modal-overlay-leave cubic-bezier(0.2, 0, 0, 1);animation:modal-overlay-leave cubic-bezier(0.2, 0, 0, 1);-webkit-animation-duration:var(--animation-duration-medium);animation-duration:var(--animation-duration-medium)}@-webkit-keyframes modal-overlay-enter{50%{opacity:1}100%{opacity:1}}@keyframes modal-overlay-enter{50%{opacity:1}100%{opacity:1}}@-webkit-keyframes modal-overlay-leave{100%{opacity:0}}@keyframes modal-overlay-leave{100%{opacity:0}}modal-overlay>*{will-change:opacity;-webkit-animation-fill-mode:both !important;animation-fill-mode:both !important}modal-view compose.au-enter modal-overlay>*{opacity:0}modal-view compose.au-enter-active modal-overlay>*{-webkit-animation:modal-overlay-content-enter cubic-bezier(0.2, 0, 0, 1);animation:modal-overlay-content-enter cubic-bezier(0.2, 0, 0, 1);-webkit-animation-duration:var(--animation-duration-medium);animation-duration:var(--animation-duration-medium)}modal-view compose.au-leave-active modal-overlay>*{-webkit-animation:modal-overlay-content-leave cubic-bezier(0.2, 0, 0, 1);animation:modal-overlay-content-leave cubic-bezier(0.2, 0, 0, 1);-webkit-animation-duration:var(--animation-duration-medium);animation-duration:var(--animation-duration-medium)}@-webkit-keyframes modal-overlay-content-enter{100%{opacity:1}}@keyframes modal-overlay-content-enter{100%{opacity:1}}@-webkit-keyframes modal-overlay-content-leave{25%{opacity:0}100%{opacity:0}}@keyframes modal-overlay-content-leave{25%{opacity:0}100%{opacity:0}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/modals/modal-overlay/modal-overlay.scss\"],\"names\":[],\"mappings\":\"AAEA,cAGC,iBAAA,CAGA,WAAA,CAGA,4BAAA,CAGA,eAAA,CAGA,gCAAA,CACA,+BAAA,CACA,+BAAA,CAEA,qCAIC,iBAAA,CACA,KAAA,CACA,OAAA,CAGA,qDAAA,CACA,eAAA,CAGA,YAAA,CACA,qBAAA,CAGA,mBAAA,CAGA,SAAA,CAIA,uJAKC,aAAA,CAGD,kDAIC,iBAAA,CACA,oBAAA,CAGD,kDAGC,eAAA,CAIA,iBAAA,CACA,oBAAA,CAIF,qCAGC,eAAA,CACA,KAAA,CAGA,wCAAA,CACA,eAAA,CAGA,YAAA,CACA,qBAAA,CAGA,kBAAA,CAGA,mBAAA,CAGA,wBAAA,CAAA,qBAAA,CAAA,oBAAA,CAAA,gBAAA,CAEA,uCAGC,mBAAA,CAGD,6DAGC,eAAA,CAUF,gDAGC,mBAAA,CAGA,2CAAA,CAAA,mCAAA,CAGD,kFAEC,SAAA,CACA,eAAA,CAGD,gGAEC,gEAAA,CAAA,wDAAA,CACA,2DAAA,CAAA,mDAAA,CAGD,kFAGC,yCAAA,CAGD,gGAEC,gEAAA,CAAA,wDAAA,CACA,2DAAA,CAAA,mDAAA,CAIF,uCAEC,IAEC,SAAA,CAGD,KAEC,SAAA,CAAA,CATF,+BAEC,IAEC,SAAA,CAGD,KAEC,SAAA,CAAA,CAIF,uCAEC,KAEC,SAAA,CAAA,CAJF,+BAEC,KAEC,SAAA,CAAA,CAMF,gBAGC,mBAAA,CAGA,2CAAA,CAAA,mCAAA,CAEA,4CAEC,SAAA,CAGD,mDAEC,wEAAA,CAAA,gEAAA,CACA,2DAAA,CAAA,mDAAA,CAGD,mDAEC,wEAAA,CAAA,gEAAA,CACA,2DAAA,CAAA,mDAAA,CAIF,+CAEC,KAEC,SAAA,CAAA,CAJF,uCAEC,KAEC,SAAA,CAAA,CAIF,+CAEC,IAEC,SAAA,CAGD,KAEC,SAAA,CAAA,CATF,uCAEC,IAEC,SAAA,CAGD,KAEC,SAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\nmodal-overlay\\r\\n{\\r\\n\\t// Allow content to be positioned relative to this element.\\r\\n\\tposition: relative;\\r\\n\\r\\n\\t// Fill the available space.\\r\\n\\tflex-grow: 1;\\r\\n\\r\\n\\t// Apply the z-index for modals.\\r\\n\\tz-index: var(--z-index-modal);\\r\\n\\r\\n\\t// Hide overflow by default.\\r\\n\\toverflow: hidden;\\r\\n\\r\\n\\t// Apply surface style.\\r\\n\\tborder-color: var(--border-color);\\r\\n\\tbackground: var(--surface-color);\\r\\n\\tcolor: var(--surface-text-color);\\r\\n\\r\\n\\t.modal-overlay-content\\r\\n\\t{\\r\\n\\t\\t// Position at the top-right and allow content to\\r\\n\\t\\t// be positioned relative to this element.\\r\\n\\t\\tposition: absolute;\\r\\n\\t\\ttop: 0;\\r\\n\\t\\tright: 0;\\r\\n\\r\\n\\t\\t// Set the size of the content area.\\r\\n\\t\\twidth: calc(100% - var(--modal-overlay-actions-width));\\r\\n\\t\\tmin-height: 100%;\\r\\n\\r\\n\\t\\t// Use vertical flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\tflex-direction: column;\\r\\n\\r\\n\\t\\t// Apply horizontal padding.\\r\\n\\t\\tpadding-right: 36rem;\\r\\n\\r\\n\\t\\t// Ensure content is always above the modal actions.\\r\\n\\t\\tz-index: 1;\\r\\n\\r\\n\\t\\t// Provide defaults for sectioning elements.\\r\\n\\r\\n\\t\\tmodal-header,\\r\\n\\t\\tmodal-section,\\r\\n\\t\\tmodal-footer\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Prevent shrinking by default.\\r\\n\\t\\t\\tflex-shrink: 0;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tmodal-header\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply padding.\\r\\n\\t\\t\\t// Note that we use padding instead of margin, to enable sticky positioning.\\r\\n\\t\\t\\tpadding-top: 44rem;\\r\\n\\t\\t\\tpadding-bottom: 36rem;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tmodal-footer\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Push the footer to the bottom by default.\\r\\n\\t\\t\\tmargin-top: auto;\\r\\n\\r\\n\\t\\t\\t// Apply padding.\\r\\n\\t\\t\\t// Note that we use padding instead of margin, to enable sticky positioning.\\r\\n\\t\\t\\tpadding-top: 36rem;\\r\\n\\t\\t\\tpadding-bottom: 44rem;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.modal-overlay-actions\\r\\n\\t{\\r\\n\\t\\t// Keep the actions in place when overlay is scrolled.\\r\\n\\t\\tposition: sticky;\\r\\n\\t\\ttop: 0;\\r\\n\\r\\n\\t\\t// Set the size of the action area.\\r\\n\\t\\twidth: var(--modal-overlay-actions-width);\\r\\n\\t\\tmin-height: 100%;\\r\\n\\r\\n\\t\\t// Use vertical flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\tflex-direction: column;\\r\\n\\r\\n\\t\\t// Center items horizontally.\\r\\n\\t\\talign-items: center;\\r\\n\\r\\n\\t\\t// Apply padding.\\r\\n\\t\\tpadding: 35rem 20rem;\\r\\n\\r\\n\\t\\t// Prevent selection.\\r\\n\\t\\tuser-select: none;\\r\\n\\r\\n\\t\\t> *\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Provide default item spacing.\\r\\n\\t\\t\\tmargin-bottom: 12rem;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tbutton[appearance=\\\"icon\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Provide default icon size.\\r\\n\\t\\t\\tfont-size: 24rem;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\\r\\n// Animate the overlay and app-sidebar.\\r\\n\\r\\nmodal-overlay,\\r\\napp-sidebar\\r\\n{\\r\\n\\tmodal-view &\\r\\n\\t{\\r\\n\\t\\t// Hint that animation will be applied.\\r\\n\\t\\twill-change: opacity;\\r\\n\\r\\n\\t\\t// Prevent glitches at the ends of the animation.\\r\\n\\t\\tanimation-fill-mode: both !important;\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-enter &\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t\\toverflow: hidden;\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-enter-active &\\r\\n\\t{\\r\\n\\t\\tanimation: modal-overlay-enter cubic-bezier(0.2, 0, 0, 1);\\r\\n\\t\\tanimation-duration: var(--animation-duration-medium);\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-leave &\\r\\n\\t{\\r\\n\\t\\t// Replace the shadow with an afterglow to smoothe the edge and reduce ghosting.\\r\\n\\t\\tbox-shadow: var(--modal-overlay-afterglow);\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-leave-active &\\r\\n\\t{\\r\\n\\t\\tanimation: modal-overlay-leave cubic-bezier(0.2, 0, 0, 1);\\r\\n\\t\\tanimation-duration: var(--animation-duration-medium);\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes modal-overlay-enter\\r\\n{\\r\\n\\t50%\\r\\n\\t{\\r\\n\\t\\topacity: 1;\\r\\n\\t}\\r\\n\\r\\n\\t100%\\r\\n\\t{\\r\\n\\t\\topacity: 1;\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes modal-overlay-leave\\r\\n{\\r\\n\\t100%\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t}\\r\\n}\\r\\n\\r\\n// Animate the content of the overlay.\\r\\n\\r\\nmodal-overlay > *\\r\\n{\\r\\n\\t// Hint that animation will be applied.\\r\\n\\twill-change: opacity;\\r\\n\\r\\n\\t// Prevent glitches at the ends of the animation.\\r\\n\\tanimation-fill-mode: both !important;\\r\\n\\r\\n\\tmodal-view compose.au-enter &\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-enter-active &\\r\\n\\t{\\r\\n\\t\\tanimation: modal-overlay-content-enter cubic-bezier(0.2, 0, 0, 1);\\r\\n\\t\\tanimation-duration: var(--animation-duration-medium);\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-leave-active &\\r\\n\\t{\\r\\n\\t\\tanimation: modal-overlay-content-leave cubic-bezier(0.2, 0, 0, 1);\\r\\n\\t\\tanimation-duration: var(--animation-duration-medium);\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes modal-overlay-content-enter\\r\\n{\\r\\n\\t100%\\r\\n\\t{\\r\\n\\t\\topacity: 1;\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes modal-overlay-content-leave\\r\\n{\\r\\n\\t25%\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t}\\r\\n\\r\\n\\t100%\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { inject, bindable, Optional } from \"aurelia-framework\";\r\nimport { Modal } from \"../../../services/modal\";\r\n\r\n/**\r\n * Represents a modal panel to be presented in the `modal-view`.\r\n *\r\n * ### How to use:\r\n * Place directly within the `template` element for the panel view.\r\n * When scoping styles, use a selector such as `modal-panel[name=\"example\"]`.\r\n */\r\n@inject(Element, Optional.of(Modal, true))\r\nexport class ModalPanelCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element representing the component.\r\n\t * @param modal The `Modal` instance representing the modal.\r\n\t */\r\n\tpublic constructor(element: Element, modal?: Modal)\r\n\t{\r\n\t\tthis.element = element as HTMLElement;\r\n\t\tthis.modal = modal;\r\n\t}\r\n\r\n\t/**\r\n\t * The element representing the component.\r\n\t */\r\n\tprotected readonly element: HTMLElement;\r\n\r\n\t/**\r\n\t * The `Modal` instance representing the modal.\r\n\t */\r\n\tprotected readonly modal: Modal | undefined;\r\n\r\n\t/**\r\n\t * The name of the panel.\r\n\t * Note that this should be unique among the panels in the app.\r\n\t */\r\n\t@bindable\r\n\tpublic name: string;\r\n\r\n\t/**\r\n\t * True to show a close button and close on outside click, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic closeButton: boolean;\r\n\r\n\t/**\r\n\t * The position of the panel relative to the viewport.\r\n\t */\r\n\t@bindable({ defaultValue: \"left\" })\r\n\tpublic position: \"left\" | \"right\";\r\n\r\n\t/**\r\n\t * True to close when the `Escape` key is pressed, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic closeShortcut: boolean;\r\n\r\n\t/**\r\n\t * Called when the close button is clicked.\r\n\t */\r\n\tprotected onCloseClick(): void\r\n\t{\r\n\t\tif (this.modal != null)\r\n\t\t{\r\n\t\t\tthis.modal.close();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed.\r\n\t */\r\n\tprotected onKeyDown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\tif (event.key === \"Escape\" && !event.defaultPrevented && this.closeShortcut && this.modal != null)\r\n\t\t{\r\n\t\t\tthis.modal.close();\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-panel{position:absolute;top:0;bottom:0;z-index:var(--z-index-modal);min-width:var(--modal-panel-min-width);max-width:var(--modal-panel-max-width);border-radius:var(--border-radius-large);margin:var(--modal-panel-margin);overflow:hidden;background:var(--surface-color);color:var(--surface-text-color);box-shadow:var(--shadow-modal)}modal-panel.--left{left:0}modal-panel.--right{right:0}modal-panel .modal-panel-content{position:absolute;top:0;width:calc(100% - var(--modal-panel-actions-width));min-height:100%;display:flex;flex-direction:column;z-index:1}modal-panel .modal-panel-content modal-header,modal-panel .modal-panel-content modal-section,modal-panel .modal-panel-content modal-footer{flex-shrink:0}modal-panel .modal-panel-content modal-header{margin-bottom:36rem}modal-panel .modal-panel-content modal-footer{margin-top:auto}modal-panel.--left .modal-panel-content{padding:36rem 48rem 36rem 0;right:0}modal-panel.--right .modal-panel-content{padding:36rem 0 36rem 48rem;left:0}modal-panel .modal-panel-actions{position:sticky;top:0;width:var(--modal-panel-actions-width);min-height:100%;display:flex;flex-direction:column;align-items:center;padding:30rem 20rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}modal-panel .modal-panel-actions>*,modal-panel .modal-panel-actions>[slot=actions]>*{margin-bottom:18rem}modal-panel .modal-panel-actions button[appearance=icon]{font-size:24rem}modal-panel.--left .modal-panel-actions{float:left}modal-panel.--right .modal-panel-actions{float:right}modal-panel.--left{--modal-panel-origin-transform: translateX(calc(-100% + var(--app-sidebar-width) * 0.5))}modal-panel.--right{--modal-panel-origin-transform: translateX(calc(+100% + var(--app-sidebar-width) * 0.5))}modal-view compose.au-enter modal-panel{transform:var(--modal-panel-origin-transform);opacity:0;overflow:hidden;will-change:opacity,transform,filter}modal-view compose.au-enter-active modal-panel{-webkit-animation:modal-panel-enter cubic-bezier(0.2, 0, 0.1, 1);animation:modal-panel-enter cubic-bezier(0.2, 0, 0.1, 1);-webkit-animation-duration:var(--animation-duration-medium);animation-duration:var(--animation-duration-medium);-webkit-animation-delay:10ms;animation-delay:10ms;-webkit-animation-fill-mode:both;animation-fill-mode:both}modal-view compose.au-leave modal-panel{box-shadow:var(--modal-panel-afterglow);will-change:opacity,transform,filter}modal-view compose.au-leave-active modal-panel{-webkit-animation:modal-panel-leave cubic-bezier(0.2, 0, 0.2, 0.5);animation:modal-panel-leave cubic-bezier(0.2, 0, 0.2, 0.5);-webkit-animation-duration:var(--animation-duration-medium);animation-duration:var(--animation-duration-medium);-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes modal-panel-enter{30%{opacity:1}50%,to{transform:translateX(0);opacity:1}}@keyframes modal-panel-enter{30%{opacity:1}50%,to{transform:translateX(0);opacity:1}}@-webkit-keyframes modal-panel-leave{40%{opacity:1}100%{transform:var(--modal-panel-origin-transform);opacity:0}}@keyframes modal-panel-leave{40%{opacity:1}100%{transform:var(--modal-panel-origin-transform);opacity:0}}modal-panel>*{will-change:opacity;-webkit-animation-fill-mode:both !important;animation-fill-mode:both !important}modal-view compose.au-enter modal-panel>*{opacity:0}modal-view compose.au-enter-active modal-panel>*{-webkit-animation:modal-panel-content-enter cubic-bezier(0.2, 0, 0, 1);animation:modal-panel-content-enter cubic-bezier(0.2, 0, 0, 1);-webkit-animation-duration:var(--animation-duration-medium);animation-duration:var(--animation-duration-medium)}modal-view compose.au-leave-active modal-panel>*{-webkit-animation:modal-panel-content-leave cubic-bezier(0.2, 0, 0, 1);animation:modal-panel-content-leave cubic-bezier(0.2, 0, 0, 1);-webkit-animation-duration:var(--animation-duration-medium);animation-duration:var(--animation-duration-medium)}@-webkit-keyframes modal-panel-content-enter{100%{opacity:1}}@keyframes modal-panel-content-enter{100%{opacity:1}}@-webkit-keyframes modal-panel-content-leave{50%{opacity:.1}100%{opacity:0}}@keyframes modal-panel-content-leave{50%{opacity:.1}100%{opacity:0}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/modals/modal-panel/modal-panel.scss\"],\"names\":[],\"mappings\":\"AAEA,YAGC,iBAAA,CACA,KAAA,CACA,QAAA,CAeA,4BAAA,CAGA,sCAAA,CACA,sCAAA,CAGA,wCAAA,CACA,gCAAA,CAGA,eAAA,CAGA,+BAAA,CACA,+BAAA,CAGA,8BAAA,CA/BA,mBAGC,MAAA,CAGD,oBAGC,OAAA,CAwBD,iCAIC,iBAAA,CACA,KAAA,CAGA,mDAAA,CACA,eAAA,CAGA,YAAA,CACA,qBAAA,CAGA,SAAA,CAIA,2IAKC,aAAA,CAGD,8CAGC,mBAAA,CAGD,8CAGC,eAAA,CAIF,wCAGC,2BAAA,CAGA,OAAA,CAGD,yCAGC,2BAAA,CAGA,MAAA,CAGD,iCAGC,eAAA,CACA,KAAA,CAGA,sCAAA,CACA,eAAA,CAGA,YAAA,CACA,qBAAA,CAGA,kBAAA,CAGA,mBAAA,CAGA,wBAAA,CAAA,qBAAA,CAAA,oBAAA,CAAA,gBAAA,CAEA,qFAIC,mBAAA,CAGD,yDAGC,eAAA,CAIF,wCAGC,UAAA,CAGD,yCAGC,WAAA,CAQD,mBAGC,wFAAA,CAGD,oBAGC,wFAAA,CAGD,wCAEC,6CAAA,CACA,SAAA,CACA,eAAA,CAGA,oCAAA,CAGD,+CAEC,gEAAA,CAAA,wDAAA,CACA,2DAAA,CAAA,mDAAA,CAKA,4BAAA,CAAA,oBAAA,CAGA,gCAAA,CAAA,wBAAA,CAGD,wCAGC,uCAAA,CAGA,oCAAA,CAGD,+CAEC,kEAAA,CAAA,0DAAA,CACA,2DAAA,CAAA,mDAAA,CAGA,gCAAA,CAAA,wBAAA,CAIF,qCAEC,IAEC,SAAA,CAGD,OAEC,uBAAA,CACA,SAAA,CAAA,CAVF,6BAEC,IAEC,SAAA,CAGD,OAEC,uBAAA,CACA,SAAA,CAAA,CAIF,qCAEC,IAEC,SAAA,CAGD,KAEC,6CAAA,CACA,SAAA,CAAA,CAVF,6BAEC,IAEC,SAAA,CAGD,KAEC,6CAAA,CACA,SAAA,CAAA,CAMF,cAGC,mBAAA,CAGA,2CAAA,CAAA,mCAAA,CAEA,0CAEC,SAAA,CAGD,iDAEC,sEAAA,CAAA,8DAAA,CACA,2DAAA,CAAA,mDAAA,CAGD,iDAEC,sEAAA,CAAA,8DAAA,CACA,2DAAA,CAAA,mDAAA,CAIF,6CAEC,KAEC,SAAA,CAAA,CAJF,qCAEC,KAEC,SAAA,CAAA,CAIF,6CAEC,IAEC,UAAA,CAGD,KAEC,SAAA,CAAA,CATF,qCAEC,IAEC,UAAA,CAGD,KAEC,SAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\nmodal-panel\\r\\n{\\r\\n\\t// Position the panel, and allow content to be positioned relative to this element.\\r\\n\\tposition: absolute;\\r\\n\\ttop: 0;\\r\\n\\tbottom: 0;\\r\\n\\r\\n\\t&.--left\\r\\n\\t{\\r\\n\\t\\t// Position on the right side of the viewport.\\r\\n\\t\\tleft: 0;\\r\\n\\t}\\r\\n\\r\\n\\t&.--right\\r\\n\\t{\\r\\n\\t\\t// Position on the right side of the viewport.\\r\\n\\t\\tright: 0;\\r\\n\\t}\\r\\n\\r\\n\\t// Apply the z-index for modals.\\r\\n\\tz-index: var(--z-index-modal);\\r\\n\\r\\n\\t// Limit the size of the panel.\\r\\n\\tmin-width: var(--modal-panel-min-width);\\r\\n\\tmax-width: var(--modal-panel-max-width);\\r\\n\\r\\n\\t// Apply a border to the panel.\\r\\n\\tborder-radius: var(--border-radius-large);\\r\\n\\tmargin: var(--modal-panel-margin);\\r\\n\\r\\n\\t// Hide overflow by default, so we get rounded borders.\\r\\n\\toverflow: hidden;\\r\\n\\r\\n\\t// Apply surface style.\\r\\n\\tbackground: var(--surface-color);\\r\\n\\tcolor: var(--surface-text-color);\\r\\n\\r\\n\\t// Apply a shadow to the panel.\\r\\n\\tbox-shadow: var(--shadow-modal);\\r\\n\\r\\n\\t.modal-panel-content\\r\\n\\t{\\r\\n\\t\\t// Position at the top and allow content to\\r\\n\\t\\t// be positioned relative to this element.\\r\\n\\t\\tposition: absolute;\\r\\n\\t\\ttop: 0;\\r\\n\\r\\n\\t\\t// Set the size of the content area.\\r\\n\\t\\twidth: calc(100% - var(--modal-panel-actions-width));\\r\\n\\t\\tmin-height: 100%;\\r\\n\\r\\n\\t\\t// Use vertical flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\tflex-direction: column;\\r\\n\\r\\n\\t\\t// Ensure content is always above the modal actions.\\r\\n\\t\\tz-index: 1;\\r\\n\\r\\n\\t\\t// Provide defaults for sectioning elements.\\r\\n\\r\\n\\t\\tmodal-header,\\r\\n\\t\\tmodal-section,\\r\\n\\t\\tmodal-footer\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Prevent shrinking by default.\\r\\n\\t\\t\\tflex-shrink: 0;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tmodal-header\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply default margin.\\r\\n\\t\\t\\tmargin-bottom: 36rem;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tmodal-footer\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Push the footer to the bottom by default.\\r\\n\\t\\t\\tmargin-top: auto;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.--left .modal-panel-content\\r\\n\\t{\\r\\n\\t\\t// Apply padding, making room for the actions.\\r\\n\\t\\tpadding: 36rem 48rem 36rem 0;\\r\\n\\r\\n\\t\\t// Position the content to the right.\\r\\n\\t\\tright: 0;\\r\\n\\t}\\r\\n\\r\\n\\t&.--right .modal-panel-content\\r\\n\\t{\\r\\n\\t\\t// Apply padding, making room for the actions.\\r\\n\\t\\tpadding: 36rem 0 36rem 48rem;\\r\\n\\r\\n\\t\\t// Position the content to the left.\\r\\n\\t\\tleft: 0;\\r\\n\\t}\\r\\n\\r\\n\\t.modal-panel-actions\\r\\n\\t{\\r\\n\\t\\t// Keep the actions in place when panel is scrolled.\\r\\n\\t\\tposition: sticky;\\r\\n\\t\\ttop: 0;\\r\\n\\r\\n\\t\\t// Set the size of the action area.\\r\\n\\t\\twidth: var(--modal-panel-actions-width);\\r\\n\\t\\tmin-height: 100%;\\r\\n\\r\\n\\t\\t// Use vertical flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\tflex-direction: column;\\r\\n\\r\\n\\t\\t// Center items horizontally.\\r\\n\\t\\talign-items: center;\\r\\n\\r\\n\\t\\t// Apply padding.\\r\\n\\t\\tpadding: 30rem 20rem;\\r\\n\\r\\n\\t\\t// Prevent selection.\\r\\n\\t\\tuser-select: none;\\r\\n\\r\\n\\t\\t> *,\\r\\n\\t\\t> [slot=\\\"actions\\\"] > *\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Provide default item spacing.\\r\\n\\t\\t\\tmargin-bottom: 18rem;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tbutton[appearance=\\\"icon\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Provide default icon size.\\r\\n\\t\\t\\tfont-size: 24rem;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.--left .modal-panel-actions\\r\\n\\t{\\r\\n\\t\\t// Position on the right side of the panel.\\r\\n\\t\\tfloat: left;\\r\\n\\t}\\r\\n\\r\\n\\t&.--right .modal-panel-actions\\r\\n\\t{\\r\\n\\t\\t// Position on the right side of the panel.\\r\\n\\t\\tfloat: right;\\r\\n\\t}\\r\\n}\\r\\n\\r\\n// Animate the panel.\\r\\n\\r\\nmodal-panel\\r\\n{\\r\\n\\t&.--left\\r\\n\\t{\\r\\n\\t\\t// The transform to apply to the panel before it enters and after it leaves.\\r\\n\\t\\t--modal-panel-origin-transform: translateX(calc(-100% + var(--app-sidebar-width) * 0.5));\\r\\n\\t}\\r\\n\\r\\n\\t&.--right\\r\\n\\t{\\r\\n\\t\\t// The transform to apply to the panel before it enters and after it leaves.\\r\\n\\t\\t--modal-panel-origin-transform: translateX(calc(+100% + var(--app-sidebar-width) * 0.5));\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-enter &\\r\\n\\t{\\r\\n\\t\\ttransform: var(--modal-panel-origin-transform);\\r\\n\\t\\topacity: 0;\\r\\n\\t\\toverflow: hidden;\\r\\n\\r\\n\\t\\t// Hint that animation will be applied.\\r\\n\\t\\twill-change: opacity, transform, filter;\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-enter-active &\\r\\n\\t{\\r\\n\\t\\tanimation: modal-panel-enter cubic-bezier(0.2, 0, 0.1, 1);\\r\\n\\t\\tanimation-duration: var(--animation-duration-medium);\\r\\n\\r\\n\\t\\t// HACK: This is needed to avoid a bug in Safari, which apparently causes the animation to start before\\r\\n\\t\\t// the width of the element has been calculated, thus causing an incorrect transform to be applied.\\r\\n\\t\\t// We work around this by delaying the animation, so it starts after the width has been calculated.\\r\\n\\t\\tanimation-delay: 10ms;\\r\\n\\r\\n\\t\\t// Prevent glitches at the ends of the animation.\\r\\n\\t\\tanimation-fill-mode: both;\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-leave &\\r\\n\\t{\\r\\n\\t\\t// Replace the shadow with an afterglow to smoothe the edge and reduce ghosting.\\r\\n\\t\\tbox-shadow: var(--modal-panel-afterglow);\\r\\n\\r\\n\\t\\t// Hint that animation will be applied.\\r\\n\\t\\twill-change: opacity, transform, filter;\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-leave-active &\\r\\n\\t{\\r\\n\\t\\tanimation: modal-panel-leave cubic-bezier(0.2, 0, 0.2, 0.5);\\r\\n\\t\\tanimation-duration: var(--animation-duration-medium);\\r\\n\\r\\n\\t\\t// Prevent glitches at the ends of the animation.\\r\\n\\t\\tanimation-fill-mode: both;\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes modal-panel-enter\\r\\n{\\r\\n\\t30%\\r\\n\\t{\\r\\n\\t\\topacity: 1;\\r\\n\\t}\\r\\n\\r\\n\\t50%, to\\r\\n\\t{\\r\\n\\t\\ttransform: translateX(0);\\r\\n\\t\\topacity: 1;\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes modal-panel-leave\\r\\n{\\r\\n\\t40%\\r\\n\\t{\\r\\n\\t\\topacity: 1;\\r\\n\\t}\\r\\n\\r\\n\\t100%\\r\\n\\t{\\r\\n\\t\\ttransform: var(--modal-panel-origin-transform);\\r\\n\\t\\topacity: 0;\\r\\n\\t}\\r\\n}\\r\\n\\r\\n// Animate the content of the panel.\\r\\n\\r\\nmodal-panel > *\\r\\n{\\r\\n\\t// Hint that animation will be applied.\\r\\n\\twill-change: opacity;\\r\\n\\r\\n\\t// Prevent glitches at the ends of the animation.\\r\\n\\tanimation-fill-mode: both !important;\\r\\n\\r\\n\\tmodal-view compose.au-enter &\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-enter-active &\\r\\n\\t{\\r\\n\\t\\tanimation: modal-panel-content-enter cubic-bezier(0.2, 0, 0, 1);\\r\\n\\t\\tanimation-duration: var(--animation-duration-medium);\\r\\n\\t}\\r\\n\\r\\n\\tmodal-view compose.au-leave-active &\\r\\n\\t{\\r\\n\\t\\tanimation: modal-panel-content-leave cubic-bezier(0.2, 0, 0, 1);\\r\\n\\t\\tanimation-duration: var(--animation-duration-medium);\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes modal-panel-content-enter\\r\\n{\\r\\n\\t100%\\r\\n\\t{\\r\\n\\t\\topacity: 1;\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes modal-panel-content-leave\\r\\n{\\r\\n\\t50%\\r\\n\\t{\\r\\n\\t\\topacity: 0.1;\\r\\n\\t}\\r\\n\\r\\n\\t100%\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\r\n\r\n/**\r\n * Represents a section within a modal, which may optionally\r\n * be toggled between an expanded and collapsed state.\r\n */\r\n@autoinject\r\nexport class ModalSectionCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element representing the component.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement;\r\n\r\n\t/**\r\n\t * True if the header slot is empty, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_element.au.controller.view.slots.header.children.length\")\r\n\tprotected get headerSlotEmpty(): boolean\r\n\t{\r\n\t\t// Get elements within the header slot.\r\n\t\tconst elements = (this._element as any).au.controller.view.slots.header.children as HTMLElement[];\r\n\r\n\t\t// Determine whether any non-comment elements exist.\r\n\t\treturn !elements.some(e => e.nodeType !== 8);\r\n\t}\r\n\r\n\t/**\r\n\t * True if the default slot is empty, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_element.au.controller.view.slots['__au-default-slot-key__'].children.length\")\r\n\tprotected get defaultSlotEmpty(): boolean\r\n\t{\r\n\t\t// Get elements within the default slot.\r\n\t\tconst elements = (this._element as any).au.controller.view.slots[\"__au-default-slot-key__\"].children as HTMLElement[];\r\n\r\n\t\t// Determine whether any non-comment elements exist.\r\n\t\treturn !elements.some(e => e.nodeType !== 8);\r\n\t}\r\n\r\n\t/**\r\n\t * True if the section is expanded, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic expanded: boolean;\r\n\r\n\t/**\r\n\t * True to allow the section to be toggled between expanded and collapsed,\r\n\t * otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic toggle: boolean;\r\n\r\n\t/**\r\n\t * True to indicate that the state of the section is invalid,\r\n\t * false to indicate that the state of the section is valid,\r\n\t * or undefined to set the validity based on input validation.\r\n\t */\r\n\t@bindable\r\n\tpublic invalid: boolean | undefined;\r\n\r\n\t/**\r\n\t * Toggles the expanded state of the section.\r\n\t * @returns True to continue, false to prevent default.\r\n\t */\r\n\tprotected onHeaderClick(): boolean\r\n\t{\r\n\t\tif (this.toggle)\r\n\t\t{\r\n\t\t\tthis.expanded = !this.expanded;\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-section{display:flex;flex-direction:column}modal-section .modal-section-header{display:flex;align-items:center;width:100%;opacity:1;cursor:inherit}modal-section .modal-section-header-content{flex-grow:1}modal-section .modal-section-header-toggle{margin-left:auto;line-height:1;transition:color var(--animation-duration-medium),opacity var(--animation-duration-medium);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}modal-section .modal-section-content{position:relative;flex-grow:1;display:flex;flex-direction:column}modal-section.--toggle .modal-section-header{cursor:pointer}modal-section.--toggle .modal-section-header:hover .modal-section-header-toggle{color:var(--surface-primary-text-color);opacity:1 !important}modal-section:not(.--header-slot-empty) .modal-section-content{margin-top:var(--font-large-margin-top)}modal-section:not(.--expanded).--invalid{color:var(--surface-negative-text-color)}modal-section.margin,modal-section.margin-top{margin-top:var(--font-large-margin-top)}modal-section.margin,modal-section.margin-bottom{margin-bottom:var(--font-large-margin-top)}modal-section.margin-double,modal-section.margin-double-top{margin-top:calc(2 * var(--font-large-margin-top))}modal-section.margin-double,modal-section.margin-double-bottom{margin-bottom:calc(2 * var(--font-large-margin-top))}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/modals/modal-section/modal-section.scss\"],\"names\":[],\"mappings\":\"AAEA,cAGC,YAAA,CACA,qBAAA,CAEA,oCAGC,YAAA,CACA,kBAAA,CAGA,UAAA,CAGA,SAAA,CAGA,cAAA,CAGD,4CAGC,WAAA,CAGD,2CAGC,gBAAA,CAGA,aAAA,CAGA,0FACC,CAID,wBAAA,CAAA,qBAAA,CAAA,oBAAA,CAAA,gBAAA,CAGD,qCAGC,iBAAA,CAGA,WAAA,CAGA,YAAA,CACA,qBAAA,CAGD,6CAGC,cAAA,CAEA,gFAGC,uCAAA,CACA,oBAAA,CAIF,+DAGC,uCAAA,CAGD,yCAIC,wCAAA,CAKA,8CAEC,uCAAA,CAGD,iDAEC,0CAAA,CAMD,4DAEC,iDAAA,CAGD,+DAEC,oDAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\nmodal-section\\r\\n{\\r\\n\\t// Use vertical flex layout.\\r\\n\\tdisplay: flex;\\r\\n\\tflex-direction: column;\\r\\n\\r\\n\\t.modal-section-header\\r\\n\\t{\\r\\n\\t\\t// Use horizontal flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\talign-items: center;\\r\\n\\r\\n\\t\\t// Fill the available width.\\r\\n\\t\\twidth: 100%;\\r\\n\\r\\n\\t\\t// Ensure full opacity, even when the button is disabled.\\r\\n\\t\\topacity: 1;\\r\\n\\r\\n\\t\\t// Use default cursor, unless toggling is enabled.\\r\\n\\t\\tcursor: inherit;\\r\\n\\t}\\r\\n\\r\\n\\t.modal-section-header-content\\r\\n\\t{\\r\\n\\t\\t// Fill the available width.\\r\\n\\t\\tflex-grow: 1;\\r\\n\\t}\\r\\n\\r\\n\\t.modal-section-header-toggle\\r\\n\\t{\\r\\n\\t\\t// Push to the right.\\r\\n\\t\\tmargin-left: auto;\\r\\n\\r\\n\\t\\t// Ensure correct vertical alignment of text and icon.\\r\\n\\t\\tline-height: 1;\\r\\n\\r\\n\\t\\t// Animate changes.\\r\\n\\t\\ttransition:\\r\\n\\t\\t\\tcolor var(--animation-duration-medium),\\r\\n\\t\\t\\topacity var(--animation-duration-medium);\\r\\n\\r\\n\\t\\t// Prevent selection.\\r\\n\\t\\tuser-select: none;\\r\\n\\t}\\r\\n\\r\\n\\t.modal-section-content\\r\\n\\t{\\r\\n\\t\\t// Allow content to be positioned relative to this element.\\r\\n\\t\\tposition: relative;\\r\\n\\r\\n\\t\\t// Fill the available width.\\r\\n\\t\\tflex-grow: 1;\\r\\n\\r\\n\\t\\t// Use vertical flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\tflex-direction: column;\\r\\n\\t}\\r\\n\\r\\n\\t&.--toggle .modal-section-header\\r\\n\\t{\\r\\n\\t\\t// Use cursor to indicate the header is clickable.\\r\\n\\t\\tcursor: pointer;\\r\\n\\r\\n\\t\\t&:hover .modal-section-header-toggle\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Highlight toggle when hovered.\\r\\n\\t\\t\\tcolor: var(--surface-primary-text-color);\\r\\n\\t\\t\\topacity: 1 !important;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--header-slot-empty) .modal-section-content\\r\\n\\t{\\r\\n\\t\\t// Apply spacing between the header and the content.\\r\\n\\t\\tmargin-top: var(--font-large-margin-top);\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--expanded).--invalid\\r\\n\\t{\\r\\n\\t\\t// Use negative accent color if the section is invalid.\\r\\n\\t\\t// Note that this will be overridden if the section is expanded.\\r\\n\\t\\tcolor: var(--surface-negative-text-color);\\r\\n\\t}\\r\\n\\r\\n\\t&.margin\\r\\n\\t{\\r\\n\\t\\t&, &-top\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: var(--font-large-margin-top);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&, &-bottom\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-bottom: var(--font-large-margin-top);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.margin-double\\r\\n\\t{\\r\\n\\t\\t&, &-top\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: calc(2 * var(--font-large-margin-top));\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&, &-bottom\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-bottom: calc(2 * var(--font-large-margin-top));\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, computedFrom } from \"aurelia-framework\";\r\nimport { Compose } from \"aurelia-templating-resources\";\r\nimport { ModalService, Modal } from \"../../../services/modal\";\r\n\r\n/**\r\n * Represents the stack of modal view currently being presented.\r\n *\r\n * ### How to use:\r\n * Place directly within the root view of the app, after the root `router-view` element.\r\n * Inject the `ModalService` instance where needed, and use it to open modals.\r\n */\r\n@autoinject\r\nexport class ModalViewCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param modalService The `ModalService` instance.\r\n\t */\r\n\tpublic constructor(modalService: ModalService)\r\n\t{\r\n\t\tthis.modalService = modalService;\r\n\t}\r\n\r\n\t/**\r\n\t * The modal service, managing the stack of modals currently being presented.\r\n\t */\r\n\tprotected modalService: ModalService;\r\n\r\n\t/**\r\n\t * Gets the modal currently at the top of the stack.\r\n\t */\r\n\t@computedFrom(\"modalService.modals.length\")\r\n\tprotected get topModal(): Modal | undefined\r\n\t{\r\n\t\treturn this.modalService.modals[this.modalService.modals.length - 1];\r\n\t}\r\n\r\n\t/**\r\n\t * Called when an event is captured before reaching the modal.\r\n\t * If the modal is not at the top, this stops the event from propagating.\r\n\t * @param modal The modal for which the event was captured.\r\n\t * @returns True if the event should be allowed to continue, otherwise false.\r\n\t */\r\n\tprotected onEventCaptured(modal: Modal): boolean\r\n\t{\r\n\t\tif (modal !== this.topModal || modal.busy)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Called for each modal, to get the model to pass to the `activate` method of the modal component,\r\n\t * to enrich the modal with a reference to the `compose` element, and to register the modal in the\r\n\t * container associated with the `compose` element.\r\n\t * @param modal The modal being presented.\r\n\t * @param compose The `compose` component presenting the modal.\r\n\t * @returns The model to pass to the `activate` method of the modal component.\r\n\t */\r\n\tprotected getModel(modal: Modal, compose: Compose): Modal\r\n\t{\r\n\t\t// Store a reference to the `compose` element on the modal.\r\n\t\t// This allows the modal to access the life cycle methods on the component being presented.\r\n\t\tmodal.compose = compose;\r\n\r\n\t\t// Register the modal in the container associated with the `compose` element.\r\n\t\t// This allows the modal to be injected into the component being presented.\r\n\t\t(compose as any).container.registerInstance(Modal, modal);\r\n\r\n\t\treturn modal.model;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"modal-view>compose{position:fixed;top:0;left:0;right:0;bottom:0;z-index:var(--z-index-modal);display:flex;pointer-events:none;will-change:opacity}modal-view>compose:not(.--disabled)>*{pointer-events:initial}modal-view>compose.au-enter-active{-webkit-animation:modal-view-compose-enter;animation:modal-view-compose-enter;-webkit-animation-duration:var(--animation-duration-medium);animation-duration:var(--animation-duration-medium)}modal-view>compose.au-enter-active *{pointer-events:none !important}modal-view>compose.au-leave-active{-webkit-animation:modal-view-compose-leave;animation:modal-view-compose-leave;-webkit-animation-duration:var(--animation-duration-medium);animation-duration:var(--animation-duration-medium)}modal-view>compose.au-leave-active *{pointer-events:none !important}@-webkit-keyframes modal-view-compose-enter{to{--animation-trigger: not-a-real-value}}@keyframes modal-view-compose-enter{to{--animation-trigger: not-a-real-value}}@-webkit-keyframes modal-view-compose-leave{to{--animation-trigger: not-a-real-value}}@keyframes modal-view-compose-leave{to{--animation-trigger: not-a-real-value}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/modals/modal-view/modal-view.scss\"],\"names\":[],\"mappings\":\"AAIC,mBAGC,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CAGA,4BAAA,CAGA,YAAA,CAGA,mBAAA,CAGA,mBAAA,CAEA,sCAGC,sBAAA,CAGD,mCAEC,0CAAA,CAAA,kCAAA,CACA,2DAAA,CAAA,mDAAA,CAEA,qCAGC,8BAAA,CAIF,mCAEC,0CAAA,CAAA,kCAAA,CACA,2DAAA,CAAA,mDAAA,CAEA,qCAGC,8BAAA,CAMJ,4CAEC,GAKC,qCAAA,CAAA,CAPF,oCAEC,GAKC,qCAAA,CAAA,CAIF,4CAEC,GAKC,qCAAA,CAAA,CAPF,oCAEC,GAKC,qCAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\nmodal-view\\r\\n{\\r\\n\\t> compose\\r\\n\\t{\\r\\n\\t\\t// Fill the viewport.\\r\\n\\t\\tposition: fixed;\\r\\n\\t\\ttop: 0;\\r\\n\\t\\tleft: 0;\\r\\n\\t\\tright: 0;\\r\\n\\t\\tbottom: 0;\\r\\n\\r\\n\\t\\t// Apply the z-index for modals.\\r\\n\\t\\tz-index: var(--z-index-modal);\\r\\n\\r\\n\\t\\t// Use horizontal flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\r\\n\\t\\t// Allow clicks to pass through, as the `compose` element is just the presenter.\\r\\n\\t\\tpointer-events: none;\\r\\n\\r\\n\\t\\t// Hint that animation will be applied.\\r\\n\\t\\twill-change: opacity;\\r\\n\\r\\n\\t\\t&:not(.--disabled) > *\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Prevent clicks from passing through the modal at the top.\\r\\n\\t\\t\\tpointer-events: initial;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&.au-enter-active\\r\\n\\t\\t{\\r\\n\\t\\t\\tanimation: modal-view-compose-enter;\\r\\n\\t\\t\\tanimation-duration: var(--animation-duration-medium);\\r\\n\\r\\n\\t\\t\\t*\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Prevent pointer events and hover effects while the modal is animating.\\r\\n\\t\\t\\t\\tpointer-events: none !important;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&.au-leave-active\\r\\n\\t\\t{\\r\\n\\t\\t\\tanimation: modal-view-compose-leave;\\r\\n\\t\\t\\tanimation-duration: var(--animation-duration-medium);\\r\\n\\r\\n\\t\\t\\t*\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Prevent pointer events and hover effects while the modal is animating.\\r\\n\\t\\t\\t\\tpointer-events: none !important;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes modal-view-compose-enter\\r\\n{\\r\\n\\tto\\r\\n\\t{\\r\\n\\t\\t// This is needed to ensure the animation events are triggered.\\r\\n\\t\\t// Without it, the `aurelia-animator-css` plugin will misbehave.\\r\\n\\t\\t// Note that the enter and leave animations cannot be the same.\\r\\n\\t\\t--animation-trigger: not-a-real-value;\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes modal-view-compose-leave\\r\\n{\\r\\n\\tto\\r\\n\\t{\\r\\n\\t\\t// This is needed to ensure the animation events are triggered.\\r\\n\\t\\t// Without it, the `aurelia-animator-css` plugin will misbehave.\\r\\n\\t\\t// Note that the enter and leave animations cannot be the same.\\r\\n\\t\\t--animation-trigger: not-a-real-value;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable } from \"aurelia-framework\";\r\nimport { IDisposable } from \"shared/types\";\r\nimport { EventManager } from \"shared/utilities\";\r\n\r\n/**\r\n * Represents a busy overlay that covers its parent element, and optionally hides its contents.\r\n * Note that the parent element must be positioned.\r\n */\r\n@autoinject\r\nexport class BusyOverlayCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element to which this attribute is applied.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\t}\r\n\r\n\tprivate readonly _eventManager = new EventManager(this);\r\n\tprivate readonly _element: HTMLElement;\r\n\tprivate _parentElement: HTMLElement;\r\n\tprivate _xScrollElement: HTMLElement;\r\n\tprivate _yScrollElement: HTMLElement;\r\n\tprivate _scheduledUpdateHandle: any;\r\n\tprivate _eventSubscription: IDisposable;\r\n\r\n\t/**\r\n\t * The element containing the busy indicator.\r\n\t * This will be continuously resized to fit the visible area\r\n\t * of the element in which this component is located.\r\n\t */\r\n\tprotected busyOverlayContainerElement: HTMLElement;\r\n\r\n\t/**\r\n\t * True to use a opaque overlay that hides the contents of the parent element,\r\n\t * false to use a semi-transparent overlay that allows the content to shine through.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic opaque: boolean;\r\n\r\n\t/**\r\n\t * True to apply a fade-in animation, otherwise false.\r\n\t * This can help mitigate flashing if the overlay is quickly removed.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic animate: boolean;\r\n\r\n\t/**\r\n\t * True to apply delay before the fade-in animation, otherwise false.\r\n\t * This can help mitigate flashing if the overlay is quickly removed.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic delay: boolean;\r\n\r\n\t/**\r\n\t * Called by the framework when the element is attached.\r\n\t * Starts the scheduling of size updates.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\t// Get the parent element.\r\n\t\t// This must be stored, as we need it when the componen is detached.\r\n\t\tthis._parentElement = this._element.parentElement as HTMLElement;\r\n\r\n\t\t// Prevent interaction with the parent element.\r\n\t\tthis._parentElement.inert = true;\r\n\r\n\t\t// Find the scroll parent or parents.\r\n\t\tthis._xScrollElement = this.findScrollParent(true, true, false);\r\n\t\tthis._yScrollElement = this.findScrollParent(true, false, true);\r\n\r\n\t\t// Begin scheduling size updates.\r\n\t\tthis.beginUpdatingSize();\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the element is detached.\r\n\t * Stops the scheduling of size updates.\r\n\t */\r\n\tpublic detached(): void\r\n\t{\r\n\t\t// Stop scheduling size updates.\r\n\t\tcancelAnimationFrame(this._scheduledUpdateHandle);\r\n\r\n\t\t// Dispose event listeners.\r\n\t\tthis._eventManager.removeEventListeners();\r\n\r\n\t\t// Allow interaction with the parent element.\r\n\t\tthis._parentElement.inert = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Schedules a size update on every animation frame, until the component is detached.\r\n\t */\r\n\tprivate beginUpdatingSize(): void\r\n\t{\r\n\t\tthis._scheduledUpdateHandle = requestAnimationFrame(() =>\r\n\t\t{\r\n\t\t\tthis.busyOverlayContainerElement.style.height = `${this.getVisibleHeight()}px`;\r\n\t\t\tthis.busyOverlayContainerElement.style.width = `${this.getVisibleWidth()}px`;\r\n\r\n\t\t\tif (this._xScrollElement === this._element.parentElement)\r\n\t\t\t{\r\n\t\t\t\tthis._element.style.top = `${this._xScrollElement.scrollTop}px`;\r\n\t\t\t\tthis._element.style.height = `${this.getVisibleHeight()}px`;\r\n\t\t\t\tthis.blockScrolling();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis._element.style.top = \"\";\r\n\t\t\t\tthis._element.style.height = \"\";\r\n\t\t\t}\r\n\r\n\t\t\tif (this._yScrollElement === this._element.parentElement)\r\n\t\t\t{\r\n\t\t\t\tthis._element.style.left = `${this._xScrollElement.scrollLeft}px`;\r\n\t\t\t\tthis._element.style.width = `${this.getVisibleWidth()}px`;\r\n\t\t\t\tthis.blockScrolling();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis._element.style.left = \"\";\r\n\t\t\t\tthis._element.style.width = \"\";\r\n\t\t\t}\r\n\r\n\t\t\tif (this._xScrollElement !== this._element.parentElement && this._yScrollElement !== this._element.parentElement)\r\n\t\t\t{\r\n\t\t\t\tthis.unblockScrolling();\r\n\t\t\t}\r\n\r\n\t\t\tthis.beginUpdatingSize();\r\n\t\t});\r\n\t}\r\n\r\n\t// TODO: Consider refactoring the below methods out into a shared helper library.\r\n\r\n\t/**\r\n\t * Finds the closest ancestor element that is scrollable.\r\n\t * @param includeHidden True to include elements with hidden overflow, otherwise false.\r\n\t * @param overflowX True to require horizontal scrolling, false to not consider this axis.\r\n\t * @param overflowY True to require vertical scrolling, false to not consider this axis.\r\n\t * @returns The closest ancestor element that is scrollable.\r\n\t */\r\n\tprivate findScrollParent(includeHidden = true, overflowX = true, overflowY = true): HTMLElement\r\n\t{\r\n\t\t// Based on port of the JQuery `scrollParent` method.\r\n\t\t// See: https://stackoverflow.com/a/42543908\r\n\r\n\t\tlet style = getComputedStyle(this._element);\r\n\t\tconst excludeStaticParent = style.position === \"absolute\";\r\n\t\tconst overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/;\r\n\r\n\t\tif (style.position === \"fixed\")\r\n\t\t{\r\n\t\t\treturn document.documentElement;\r\n\t\t}\r\n\r\n\t\tlet parent: HTMLElement | null = this._element;\r\n\r\n\t\twhile (parent != null)\r\n\t\t{\r\n\t\t\tstyle = getComputedStyle(parent);\r\n\r\n\t\t\tif (excludeStaticParent && style.position === \"static\")\r\n\t\t\t{\r\n\t\t\t\tparent = parent.parentElement;\r\n\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif (overflowRegex.test(`${style.overflow} ${overflowX && style.overflowX} ${overflowY && style.overflowY}`))\r\n\t\t\t{\r\n\t\t\t\treturn parent;\r\n\t\t\t}\r\n\r\n\t\t\tparent = parent.parentElement;\r\n\t\t}\r\n\r\n\t\treturn document.documentElement;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the width of the visible area of the element in which this component is located.\r\n\t */\r\n\tprivate getVisibleWidth(): number\r\n\t{\r\n\t\tif (this._xScrollElement === this._element.parentElement)\r\n\t\t{\r\n\t\t\treturn this._xScrollElement.offsetWidth;\r\n\t\t}\r\n\r\n\t\tconst scrollElementWidth = this._xScrollElement.offsetWidth;\r\n\t\tconst scrollElementLeftToElementLeft = Math.max(this._element.parentElement!.getBoundingClientRect().left, 0);\r\n\t\tconst scrollElementLeftToElementRight = Math.max(Math.min(this._element.parentElement!.getBoundingClientRect().right, scrollElementWidth), 0);\r\n\r\n\t\treturn scrollElementLeftToElementRight - scrollElementLeftToElementLeft;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the height of the visible area of the element in which this component is located.\r\n\t */\r\n\tprivate getVisibleHeight(): number\r\n\t{\r\n\t\tif (this._yScrollElement === this._element.parentElement)\r\n\t\t{\r\n\t\t\treturn this._yScrollElement.offsetHeight;\r\n\t\t}\r\n\r\n\t\tconst scrollElementHeight = this._yScrollElement.offsetHeight;\r\n\t\tconst scrollElementTopToElementTop = Math.max(this._element.parentElement!.getBoundingClientRect().top, 0);\r\n\t\tconst scrollElementTopToElementBottom = Math.max(Math.min(this._element.parentElement!.getBoundingClientRect().bottom, scrollElementHeight), 0);\r\n\r\n\t\treturn scrollElementTopToElementBottom - scrollElementTopToElementTop;\r\n\t}\r\n\r\n\t/**\r\n\t * Block scrolling by preventing default on the relevant DOM events.\r\n\t */\r\n\tprivate blockScrolling(): void\r\n\t{\r\n\t\tif (this._eventSubscription == null)\r\n\t\t{\r\n\t\t\t// Add event listener to prevent scrolling.\r\n\t\t\tthis._eventSubscription = this._eventManager.addEventListener(this._element, [\"wheel\", \"touchstart\", \"pointerdown\"],\r\n\t\t\t\t(event: Event) => event.preventDefault(), { passive: false, capture: true });\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Unblocks scrolling by disposing the relevant event subscriptions.\r\n\t */\r\n\tprivate unblockScrolling(): void\r\n\t{\r\n\t\tif (this._eventSubscription != null)\r\n\t\t{\r\n\t\t\tthis._eventSubscription.dispose();\r\n\t\t}\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"busy-overlay{--busy-overlay-color: var(--surface-color);--busy-overlay-opacity: 0.95;--busy-overlay-message-max-width: 65%;--busy-overlay-message-text-align: center;position:absolute;top:0;left:0;right:0;bottom:0;z-index:var(--z-index-backdrop)}busy-overlay::before{content:\\\"\\\";position:absolute;top:0;left:0;right:0;bottom:0;opacity:var(--busy-overlay-opacity);background:var(--busy-overlay-color)}busy-overlay.--animate{-webkit-animation:fade-in ease-in both;animation:fade-in ease-in both}busy-overlay.--animate:not(.--delay){-webkit-animation-duration:var(--animation-duration-short);animation-duration:var(--animation-duration-short);-webkit-animation-delay:.04s;animation-delay:.04s}busy-overlay.--animate.--delay{-webkit-animation-duration:var(--animation-duration-medium);animation-duration:var(--animation-duration-medium);-webkit-animation-delay:var(--animation-delay-busy);animation-delay:var(--animation-delay-busy)}busy-overlay.--opaque::before{opacity:1}busy-overlay .busy-overlay-inner{position:sticky;left:0;top:0;display:flex;flex-direction:column;justify-content:center;align-items:center;overflow:hidden}busy-overlay .busy-overlay-message{text-align:var(--busy-overlay-message-text-align);max-width:var(--busy-overlay-message-max-width)}busy-overlay .busy-overlay-message:empty{display:none}busy-overlay busy-indicator{--busy-indicator-max-width: 50%;--busy-indicator-max-height: 50%;--busy-indicator-stroke-width: 4rem;--busy-indicator-color: #000000;--busy-indicator-opacity: 0.05}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/overlays/busy-overlay/busy-overlay.scss\"],\"names\":[],\"mappings\":\"AAAA,aAEC,0CAAA,CACA,4BAAA,CACA,qCAAA,CACA,yCAAA,CAGA,iBAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CAGA,+BAAA,CAEA,qBAEC,UAAA,CAGA,iBAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CAGA,mCAAA,CACA,oCAAA,CAGD,uBAGC,sCAAA,CAAA,8BAAA,CAGD,qCAEC,0DAAA,CAAA,kDAAA,CACA,4BAAA,CAAA,oBAAA,CAGD,+BAEC,2DAAA,CAAA,mDAAA,CACA,mDAAA,CAAA,2CAAA,CAGD,8BAGC,SAAA,CAGD,iCAKC,eAAA,CACA,MAAA,CACA,KAAA,CAGA,YAAA,CACA,qBAAA,CAGA,sBAAA,CACA,kBAAA,CAGA,eAAA,CAGD,mCAGC,iDAAA,CAGA,+CAAA,CAEA,yCAIC,YAAA,CAIF,4BAEC,+BAAA,CACA,gCAAA,CACA,mCAAA,CACA,+BAAA,CACA,8BAAA\",\"sourcesContent\":[\"busy-overlay\\r\\n{\\r\\n\\t--busy-overlay-color: var(--surface-color);\\r\\n\\t--busy-overlay-opacity: 0.95;\\r\\n\\t--busy-overlay-message-max-width: 65%;\\r\\n\\t--busy-overlay-message-text-align: center;\\r\\n\\r\\n\\t// Fill the available space.\\r\\n\\tposition: absolute;\\r\\n\\ttop: 0;\\r\\n\\tleft: 0;\\r\\n\\tright: 0;\\r\\n\\tbottom: 0;\\r\\n\\r\\n\\t// Apply the z-index for backdrops.\\r\\n\\tz-index: var(--z-index-backdrop);\\r\\n\\r\\n\\t&::before\\r\\n\\t{\\r\\n\\t\\tcontent: \\\"\\\";\\r\\n\\r\\n\\t\\t// Fill the available space.\\r\\n\\t\\tposition: absolute;\\r\\n\\t\\ttop: 0;\\r\\n\\t\\tleft: 0;\\r\\n\\t\\tright: 0;\\r\\n\\t\\tbottom: 0;\\r\\n\\r\\n\\t\\t// Set the color and opacity.\\r\\n\\t\\topacity: var(--busy-overlay-opacity);\\r\\n\\t\\tbackground: var(--busy-overlay-color);\\r\\n\\t}\\r\\n\\r\\n\\t&.--animate\\r\\n\\t{\\r\\n\\t\\t// Apply the fade-in animation, if enabled.\\r\\n\\t\\tanimation: fade-in ease-in both;\\r\\n\\t}\\r\\n\\r\\n\\t&.--animate:not(.--delay)\\r\\n\\t{\\r\\n\\t\\tanimation-duration: var(--animation-duration-short);\\r\\n\\t\\tanimation-delay: 0.04s;\\r\\n\\t}\\r\\n\\r\\n\\t&.--animate.--delay\\r\\n\\t{\\r\\n\\t\\tanimation-duration: var(--animation-duration-medium);\\r\\n\\t\\tanimation-delay: var(--animation-delay-busy);\\r\\n\\t}\\r\\n\\r\\n\\t&.--opaque::before\\r\\n\\t{\\r\\n\\t\\t// Make the background opaque, if enabled.\\r\\n\\t\\topacity: 1;\\r\\n\\t}\\r\\n\\r\\n\\t.busy-overlay-inner\\r\\n\\t{\\r\\n\\t\\t// Note: The size of this element will be set programmatically.\\r\\n\\r\\n\\t\\t// Stick to the top-left corner.\\r\\n\\t\\tposition: sticky;\\r\\n\\t\\tleft: 0;\\r\\n\\t\\ttop: 0;\\r\\n\\r\\n\\t\\t// Use vertical flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\tflex-direction: column;\\r\\n\\r\\n\\t\\t// Center content.\\r\\n\\t\\tjustify-content: center;\\r\\n\\t\\talign-items: center;\\r\\n\\r\\n\\t\\t// Prevent overflow.\\r\\n\\t\\toverflow: hidden;\\r\\n\\t}\\r\\n\\r\\n\\t.busy-overlay-message\\r\\n\\t{\\r\\n\\t\\t// Center the text.\\r\\n\\t\\ttext-align: var(--busy-overlay-message-text-align);\\r\\n\\r\\n\\t\\t// Limit the width of the message.\\r\\n\\t\\tmax-width: var(--busy-overlay-message-max-width);\\r\\n\\r\\n\\t\\t&:empty\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Hide the message if it has no content, so its margin\\r\\n\\t\\t\\t// does not affect the position of the `busy-indicator`.\\r\\n\\t\\t\\tdisplay: none;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\tbusy-indicator\\r\\n\\t{\\r\\n\\t\\t--busy-indicator-max-width: 50%;\\r\\n\\t\\t--busy-indicator-max-height: 50%;\\r\\n\\t\\t--busy-indicator-stroke-width: 4rem;\\r\\n\\t\\t--busy-indicator-color: #000000;\\r\\n\\t\\t--busy-indicator-opacity: 0.05;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable } from \"aurelia-framework\";\r\nimport { AppRouter } from \"aurelia-router\";\r\n\r\nimport \"./page-href.scss\";\r\n\r\n/**\r\n * Custom attribute that navigates to the specified page when the element is clicked.\r\n *\r\n * ### How to use:\r\n * Place on the element that should trigger navigation when clicked,\r\n * and specify the path to navigate to in the options.\r\n */\r\n@autoinject\r\nexport class PageHrefCustomAttribute\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element to which this attribute is applied.\r\n\t * @param router The `Router` instance.\r\n\t */\r\n\tpublic constructor(element: Element, router: AppRouter)\r\n\t{\r\n\t\tthis._element = element as HTMLElement | SVGElement;\r\n\t\tthis._router = router;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement | SVGElement;\r\n\tprivate readonly _router: AppRouter;\r\n\r\n\t/**\r\n\t * The path to navigate to when the element is clicked,\r\n\t * or undefined to do nothing.\r\n\t */\r\n\t@bindable\r\n\tpublic path?: string;\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t */\r\n\tpublic attached(): void\r\n\t{\r\n\t\tthis._element.addEventListener(\"click\", (event: MouseEvent) =>\r\n\t\t{\r\n\t\t\tif (!event.defaultPrevented)\r\n\t\t\t{\r\n\t\t\t\tthis.onElementClick(event);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `path` property changes.\r\n\t */\r\n\tprotected pathChanged(): void\r\n\t{\r\n\t\tif (this._element instanceof HTMLAnchorElement)\r\n\t\t{\r\n\t\t\tif (this.path != null)\r\n\t\t\t{\r\n\t\t\t\tthis._element.setAttribute(\"href\", this.path);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis._element.removeAttribute(\"href\");\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the element is clicked.\r\n\t * Navigates to the specified path.\r\n\t */\r\n\tprivate async onElementClick(event: MouseEvent): Promise\r\n\t{\r\n\t\t// Don't handle the event if it originated from an anchor with an href nested inside the element.\r\n\t\tif (event.target !== this._element && event.target instanceof HTMLAnchorElement && event.target.hasAttribute(\"href\"))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Don't handle the event if default has been prevented.\r\n\t\tif (event.defaultPrevented)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tevent.preventDefault();\r\n\r\n\t\tif (this.path == null)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._router.navigate(this.path);\r\n\t}\r\n}\r\n","import { autoinject, bindable } from \"aurelia-framework\";\r\n\r\n/**\r\n * Represents a container for the primary content of a page.\r\n *\r\n * ### How to use:\r\n * Place directly within the view being presented int the `router-view`.\r\n * When scoping styles, use a selector such as `page[name=\"example\"]`.\r\n */\r\n@autoinject\r\nexport class PageCustomElement\r\n{\r\n\t/**\r\n\t * Called by the framework when the component is attached to the DOM\r\n\t */\r\n\t public attached(): void\r\n\t{\r\n\t\tif (document.getElementsByTagName(\"page-cta\").length > 0)\r\n\t\t{\r\n\t\t\tthis.ctaPage = true;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * The name of the page.\r\n\t * Note that this should be unique among the pages in the app.\r\n\t */\r\n\t@bindable\r\n\tpublic name: string;\r\n\r\n\t/**\r\n\t * If the page should indicate it is busy.\r\n\t */\r\n\t@bindable\r\n\tpublic busy: boolean;\r\n\r\n\t@bindable\r\n\tpublic ctaPage: boolean;\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"page{position:relative;display:flex;flex-grow:1;justify-content:center;min-width:0;margin-top:var(--layout-top-menu-height);padding:0 40rem;overflow-y:auto;overflow-y:overlay;overflow-x:hidden}@media(max-width: 1080px){page{padding:0 20rem}}page.--busy{overflow:hidden}page busy-indicator{position:absolute;width:100%;height:100%;background-color:var(--palette-color-background);z-index:var(--z-index-sticky)}page .content-wrapper{padding-top:84rem;max-width:100%;width:1080rem;display:flex;flex-direction:column}@media(max-width: 1080px){page .content-wrapper{padding-top:36rem}}page .content-wrapper:after{content:\\\"\\\";padding-top:130rem;width:100%}@media(max-width: 1080px){page .content-wrapper:after{padding-top:100rem}}@media(max-width: 1080px){page.cta-page .content-wrapper:after{padding-top:120rem}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/page/page/page.scss\"],\"names\":[],\"mappings\":\"AAEA,KAGC,iBAAA,CAGA,YAAA,CAGA,WAAA,CACA,sBAAA,CAGA,WAAA,CAGA,wCAAA,CAGA,eAAA,CAGA,eAAA,CACA,kBAAA,CAEA,iBAAA,CAEA,0BA3BD,KA6BE,eAAA,CAAA,CAGD,YAEC,eAAA,CAGD,oBAEC,iBAAA,CACA,UAAA,CACA,WAAA,CACA,gDAAA,CACA,6BAAA,CAGD,sBAEC,iBAAA,CACA,cAAA,CACA,aAAA,CACA,YAAA,CACA,qBAAA,CAEA,0BARD,sBAUE,iBAAA,CAAA,CAID,4BAEC,UAAA,CACA,kBAAA,CACA,UAAA,CAEA,0BAND,4BAQE,kBAAA,CAAA,CAWA,0BAFD,qCAIE,kBAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\npage\\r\\n{\\r\\n\\t// Allow content to be positioned relative to this element.\\r\\n\\tposition: relative;\\r\\n\\r\\n\\t// Use horizontal flex layout.\\r\\n\\tdisplay: flex;\\r\\n\\r\\n\\t// Fill the available space and center the content.\\r\\n\\tflex-grow: 1;\\r\\n\\tjustify-content: center;\\r\\n\\r\\n\\t// Allow the element to shrink.\\r\\n\\tmin-width: 0;\\r\\n\\r\\n\\t// Allow the page to be visible outside the app top menu area\\r\\n\\tmargin-top: var(--layout-top-menu-height);\\r\\n\\r\\n\\t// Create space around the element\\r\\n\\tpadding: 0 40rem;\\r\\n\\r\\n\\t// Enable scrolling\\r\\n\\toverflow-y: auto;\\r\\n\\toverflow-y: overlay;\\r\\n\\r\\n\\toverflow-x: hidden;\\r\\n\\r\\n\\t@media ($media-small-max)\\r\\n\\t{\\r\\n\\t\\tpadding: 0 20rem;\\r\\n\\t}\\r\\n\\r\\n\\t&.--busy\\r\\n\\t{\\r\\n\\t\\toverflow: hidden;\\r\\n\\t}\\r\\n\\r\\n\\tbusy-indicator\\r\\n\\t{\\r\\n\\t\\tposition: absolute;\\r\\n\\t\\twidth: 100%;\\r\\n\\t\\theight: 100%;\\r\\n\\t\\tbackground-color: var(--palette-color-background);\\r\\n\\t\\tz-index: var(--z-index-sticky);\\r\\n\\t}\\r\\n\\r\\n\\t.content-wrapper\\r\\n\\t{\\r\\n\\t\\tpadding-top: 84rem;\\r\\n\\t\\tmax-width: 100%;\\r\\n\\t\\twidth: 1080rem;\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\tflex-direction: column;\\r\\n\\r\\n\\t\\t@media ($media-small-max)\\r\\n\\t\\t{\\r\\n\\t\\t\\tpadding-top: 36rem;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t// Hack to get a bottom padding\\r\\n\\t\\t&:after\\r\\n\\t\\t{\\r\\n\\t\\t\\tcontent: \\\"\\\";\\r\\n\\t\\t\\tpadding-top: 130rem;\\r\\n\\t\\t\\twidth: 100%;\\r\\n\\r\\n\\t\\t\\t@media ($media-small-max)\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tpadding-top: 100rem;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.cta-page\\r\\n\\t{\\r\\n\\t\\t.content-wrapper\\r\\n\\t\\t{\\r\\n\\t\\t\\t&:after\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t@media ($media-small-max)\\r\\n\\t\\t\\t\\t{\\r\\n\\t\\t\\t\\t\\tpadding-top: 120rem;\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\r\n\r\n/**\r\n * Represents the footer of a toast.\r\n */\r\n@autoinject\r\nexport class ToastFooterCustomElement\r\n{\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"toast-footer{position:relative;display:flex;flex-direction:column}toast-footer.margin,toast-footer.margin-top{margin-top:var(--font-large-margin-top)}toast-footer.margin,toast-footer.margin-bottom{margin-bottom:var(--font-large-margin-top)}toast-footer.margin-double,toast-footer.margin-double-top{margin-top:calc(2 * var(--font-large-margin-top))}toast-footer.margin-double,toast-footer.margin-double-bottom{margin-bottom:calc(2 * var(--font-large-margin-top))}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/toasts/toast-footer/toast-footer.scss\"],\"names\":[],\"mappings\":\"AAEA,aAGC,iBAAA,CAGA,YAAA,CACA,qBAAA,CAIC,4CAEC,uCAAA,CAGD,+CAEC,0CAAA,CAMD,0DAEC,iDAAA,CAGD,6DAEC,oDAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ntoast-footer\\r\\n{\\r\\n\\t// Allow content to be positioned relative to this element.\\r\\n\\tposition: relative;\\r\\n\\r\\n\\t// Use vertical flex layout.\\r\\n\\tdisplay: flex;\\r\\n\\tflex-direction: column;\\r\\n\\r\\n\\t&.margin\\r\\n\\t{\\r\\n\\t\\t&, &-top\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: var(--font-large-margin-top);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&, &-bottom\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-bottom: var(--font-large-margin-top);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.margin-double\\r\\n\\t{\\r\\n\\t\\t&, &-top\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: calc(2 * var(--font-large-margin-top));\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&, &-bottom\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-bottom: calc(2 * var(--font-large-margin-top));\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\r\n\r\n/**\r\n * Represents the header of a toast.\r\n */\r\n@autoinject\r\nexport class ToastHeaderCustomElement\r\n{\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"toast-header{position:relative;display:flex;flex-direction:column}@media(max-width: 800px){toast-header{font-size:var(--font-small-font-size);line-height:var(--font-small-line-height)}}toast-header.margin,toast-header.margin-top{margin-top:var(--font-large-margin-top)}toast-header.margin,toast-header.margin-bottom{margin-bottom:var(--font-large-margin-top)}toast-header.margin-double,toast-header.margin-double-top{margin-top:calc(2 * var(--font-large-margin-top))}toast-header.margin-double,toast-header.margin-double-bottom{margin-bottom:calc(2 * var(--font-large-margin-top))}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/toasts/toast-header/toast-header.scss\"],\"names\":[],\"mappings\":\"AAEA,aAGC,iBAAA,CAGA,YAAA,CACA,qBAAA,CAEA,yBATD,aAWE,qCAAA,CACA,yCAAA,CAAA,CAKA,4CAEC,uCAAA,CAGD,+CAEC,0CAAA,CAMD,0DAEC,iDAAA,CAGD,6DAEC,oDAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ntoast-header\\r\\n{\\r\\n\\t// Allow content to be positioned relative to this element.\\r\\n\\tposition: relative;\\r\\n\\r\\n\\t// Use vertical flex layout.\\r\\n\\tdisplay: flex;\\r\\n\\tflex-direction: column;\\r\\n\\r\\n\\t@media ($media-smaller-max)\\r\\n\\t{\\r\\n\\t\\tfont-size: var(--font-small-font-size);\\r\\n\\t\\tline-height: var(--font-small-line-height);\\r\\n\\t}\\r\\n\\r\\n\\t&.margin\\r\\n\\t{\\r\\n\\t\\t&, &-top\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: var(--font-large-margin-top);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&, &-bottom\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-bottom: var(--font-large-margin-top);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.margin-double\\r\\n\\t{\\r\\n\\t\\t&, &-top\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: calc(2 * var(--font-large-margin-top));\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&, &-bottom\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-bottom: calc(2 * var(--font-large-margin-top));\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\r\n\r\n/**\r\n * Represents a section within a toast, which may optionally\r\n * be toggled between an expanded and collapsed state.\r\n */\r\n@autoinject\r\nexport class ToastSectionCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element representing the component.\r\n\t */\r\n\tpublic constructor(element: Element)\r\n\t{\r\n\t\tthis._element = element as HTMLElement;\r\n\t}\r\n\r\n\tprivate readonly _element: HTMLElement;\r\n\r\n\t/**\r\n\t * True if the header slot is empty, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_element.au.controller.view.slots.header.children.length\")\r\n\tprotected get headerSlotEmpty(): boolean\r\n\t{\r\n\t\t// Get elements within the header slot.\r\n\t\tconst elements = (this._element as any).au.controller.view.slots.header.children as HTMLElement[];\r\n\r\n\t\t// Determine whether any non-comment elements exist.\r\n\t\treturn !elements.some(e => e.nodeType !== 8);\r\n\t}\r\n\r\n\t/**\r\n\t * True if the default slot is empty, otherwise false.\r\n\t */\r\n\t@computedFrom(\"_element.au.controller.view.slots['__au-default-slot-key__'].children.length\")\r\n\tprotected get defaultSlotEmpty(): boolean\r\n\t{\r\n\t\t// Get elements within the default slot.\r\n\t\tconst elements = (this._element as any).au.controller.view.slots[\"__au-default-slot-key__\"].children as HTMLElement[];\r\n\r\n\t\t// Determine whether any non-comment elements exist.\r\n\t\treturn !elements.some(e => e.nodeType !== 8);\r\n\t}\r\n\r\n\t/**\r\n\t * True if the section is expanded, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true, defaultBindingMode: bindingMode.twoWay })\r\n\tpublic expanded: boolean;\r\n\r\n\t/**\r\n\t * True to allow the section to be toggled between expanded and collapsed,\r\n\t * otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic toggle: boolean;\r\n\r\n\t/**\r\n\t * True to indicate that the state of the section is invalid,\r\n\t * false to indicate that the state of the section is valid,\r\n\t * or undefined to set the validity based on input validation.\r\n\t */\r\n\t@bindable\r\n\tpublic invalid: boolean | undefined;\r\n\r\n\t/**\r\n\t * Toggles the expanded state of the section.\r\n\t * @returns True to continue, false to prevent default.\r\n\t */\r\n\tprotected onHeaderClick(): boolean\r\n\t{\r\n\t\tif (this.toggle)\r\n\t\t{\r\n\t\t\tthis.expanded = !this.expanded;\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"toast-section{display:flex;flex-direction:column}toast-section .toast-section-header{display:flex;align-items:center;width:100%;opacity:1;cursor:inherit}toast-section .toast-section-header-content{flex-grow:1;font-weight:300}toast-section .toast-section-header-toggle{margin-left:auto;line-height:1;transition:color var(--animation-duration-medium),opacity var(--animation-duration-medium);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}toast-section .toast-section-content{position:relative;flex-grow:1;display:flex;flex-direction:column}toast-section.--toggle .toast-section-header{cursor:pointer}toast-section.--toggle .toast-section-header:hover .toast-section-header-toggle{color:var(--surface-primary-text-color);opacity:1 !important}toast-section:not(.--header-slot-empty) .toast-section-content{margin-top:var(--font-base-margin-top)}toast-section:not(.--expanded).--invalid{color:var(--surface-negative-text-color)}toast-section.margin,toast-section.margin-top{margin-top:var(--font-large-margin-top)}toast-section.margin,toast-section.margin-bottom{margin-bottom:var(--font-large-margin-top)}toast-section.margin-double,toast-section.margin-double-top{margin-top:calc(2 * var(--font-large-margin-top))}toast-section.margin-double,toast-section.margin-double-bottom{margin-bottom:calc(2 * var(--font-large-margin-top))}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/toasts/toast-section/toast-section.scss\"],\"names\":[],\"mappings\":\"AAEA,cAGC,YAAA,CACA,qBAAA,CAEA,oCAGC,YAAA,CACA,kBAAA,CAGA,UAAA,CAGA,SAAA,CAGA,cAAA,CAGD,4CAGC,WAAA,CAIA,eAAA,CAGD,2CAGC,gBAAA,CAGA,aAAA,CAGA,0FACC,CAID,wBAAA,CAAA,qBAAA,CAAA,oBAAA,CAAA,gBAAA,CAGD,qCAGC,iBAAA,CAGA,WAAA,CAGA,YAAA,CACA,qBAAA,CAGD,6CAGC,cAAA,CAEA,gFAGC,uCAAA,CACA,oBAAA,CAIF,+DAGC,sCAAA,CAGD,yCAIC,wCAAA,CAKA,8CAEC,uCAAA,CAGD,iDAEC,0CAAA,CAMD,4DAEC,iDAAA,CAGD,+DAEC,oDAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ntoast-section\\r\\n{\\r\\n\\t// Use vertical flex layout.\\r\\n\\tdisplay: flex;\\r\\n\\tflex-direction: column;\\r\\n\\r\\n\\t.toast-section-header\\r\\n\\t{\\r\\n\\t\\t// Use horizontal flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\talign-items: center;\\r\\n\\r\\n\\t\\t// Fill the available width.\\r\\n\\t\\twidth: 100%;\\r\\n\\r\\n\\t\\t// Ensure full opacity, even when the button is disabled.\\r\\n\\t\\topacity: 1;\\r\\n\\r\\n\\t\\t// Use default cursor, unless toggling is enabled.\\r\\n\\t\\tcursor: inherit;\\r\\n\\t}\\r\\n\\r\\n\\t.toast-section-header-content\\r\\n\\t{\\r\\n\\t\\t// Fill the available width.\\r\\n\\t\\tflex-grow: 1;\\r\\n\\r\\n\\t\\t// TODO: This should probably be a standard font style.\\r\\n\\t\\t// Use heavier font weight to differentiate the section from normal text.\\r\\n\\t\\tfont-weight: 300;\\r\\n\\t}\\r\\n\\r\\n\\t.toast-section-header-toggle\\r\\n\\t{\\r\\n\\t\\t// Push to the right.\\r\\n\\t\\tmargin-left: auto;\\r\\n\\r\\n\\t\\t// Ensure correct vertical alignment of text and icon.\\r\\n\\t\\tline-height: 1;\\r\\n\\r\\n\\t\\t// Animate changes.\\r\\n\\t\\ttransition:\\r\\n\\t\\t\\tcolor var(--animation-duration-medium),\\r\\n\\t\\t\\topacity var(--animation-duration-medium);\\r\\n\\r\\n\\t\\t// Prevent selection.\\r\\n\\t\\tuser-select: none;\\r\\n\\t}\\r\\n\\r\\n\\t.toast-section-content\\r\\n\\t{\\r\\n\\t\\t// Allow content to be positioned relative to this element.\\r\\n\\t\\tposition: relative;\\r\\n\\r\\n\\t\\t// Fill the available width.\\r\\n\\t\\tflex-grow: 1;\\r\\n\\r\\n\\t\\t// Use vertical flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\tflex-direction: column;\\r\\n\\t}\\r\\n\\r\\n\\t&.--toggle .toast-section-header\\r\\n\\t{\\r\\n\\t\\t// Use cursor to indicate the header is clickable.\\r\\n\\t\\tcursor: pointer;\\r\\n\\r\\n\\t\\t&:hover .toast-section-header-toggle\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Highlight toggle when hovered.\\r\\n\\t\\t\\tcolor: var(--surface-primary-text-color);\\r\\n\\t\\t\\topacity: 1 !important;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--header-slot-empty) .toast-section-content\\r\\n\\t{\\r\\n\\t\\t// Apply spacing between the header and the content.\\r\\n\\t\\tmargin-top: var(--font-base-margin-top);\\r\\n\\t}\\r\\n\\r\\n\\t&:not(.--expanded).--invalid\\r\\n\\t{\\r\\n\\t\\t// Use negative accent color if the section is invalid.\\r\\n\\t\\t// Note that this will be overridden if the section is expanded.\\r\\n\\t\\tcolor: var(--surface-negative-text-color);\\r\\n\\t}\\r\\n\\r\\n\\t&.margin\\r\\n\\t{\\r\\n\\t\\t&, &-top\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: var(--font-large-margin-top);\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&, &-bottom\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-bottom: var(--font-large-margin-top);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t&.margin-double\\r\\n\\t{\\r\\n\\t\\t&, &-top\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-top: calc(2 * var(--font-large-margin-top));\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&, &-bottom\\r\\n\\t\\t{\\r\\n\\t\\t\\tmargin-bottom: calc(2 * var(--font-large-margin-top));\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { autoinject } from \"aurelia-framework\";\r\nimport { Compose } from \"aurelia-templating-resources\";\r\nimport { ToastService, Toast } from \"../../../services/toast\";\r\n\r\n/**\r\n * Represents the stack of toast view currently being presented.\r\n *\r\n * ### How to use:\r\n * Place directly within the root view of the app, after the root `router-view` element.\r\n * Inject the `ToastService` instance where needed, and use it to open toasts.\r\n */\r\n@autoinject\r\nexport class ToastViewCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param toastService The `ToastService` instance.\r\n\t */\r\n\tpublic constructor(toastService: ToastService)\r\n\t{\r\n\t\tthis.toastService = toastService;\r\n\t}\r\n\r\n\t/**\r\n\t * The toast service, managing the stack of toasts currently being presented.\r\n\t */\r\n\tprotected toastService: ToastService;\r\n\r\n\t/**\r\n\t * Called for each toast, to get the model to pass to the `activate` method of the toast component,\r\n\t * to enrich the toast with a reference to the `compose` element, and to register the toast in the\r\n\t * container associated with the `compose` element.\r\n\t * @param toast The toast being presented.\r\n\t * @param compose The `compose` component presenting the toast.\r\n\t * @returns The model to pass to the `activate` method of the toast component.\r\n\t */\r\n\tprotected getModel(toast: Toast, compose: Compose): Toast\r\n\t{\r\n\t\t// Store a reference to the `compose` element on the toast.\r\n\t\t// This allows the toast to access the life cycle methods on the component being presented.\r\n\t\ttoast.compose = compose;\r\n\r\n\t\t// Register the toast in the container associated with the `compose` element.\r\n\t\t// This allows the toast to be injected into the component being presented.\r\n\t\t(compose as any).container.registerInstance(Toast, toast);\r\n\r\n\t\treturn toast.model;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"toast-view{--private-toast-backdrop-opacity: var(--toast-backdrop-opacity, 0);position:fixed;top:0;left:var(--side-menu-width);right:0;max-height:100%;z-index:var(--z-index-toast);padding:0 16rem;padding-bottom:calc(2 * var(--toast-margin-right) + var(--font-large-font-size));display:flex;flex-direction:column;align-items:center;pointer-events:none}@media(max-width: 800px){toast-view{left:0;padding:0 12rem 12rem}}toast-view .toast-view-clear-all{position:relative;font-size:var(--font-large-font-size);line-height:1;padding:14rem 14rem 14rem 16rem;margin-top:var(--toast-margin-top);margin-right:var(--toast-margin-right);border:0 solid var(--border-color);border-radius:var(--border-radius-medium);box-shadow:var(--shadow-toast);background:var(--surface-color);color:var(--surface-text-color);z-index:var(--z-index-toast)}toast-view .toast-view-clear-all button{overflow:visible;position:relative;z-index:var(--z-index-toast);padding:0 14rem;pointer-events:initial}toast-view .toast-view-clear-all span{padding:0 4rem}toast-view>compose{position:relative;display:flex;pointer-events:none}@media(max-width: 800px){toast-view>compose{width:100%}}toast-view>compose:not(.--disabled)>*{pointer-events:initial}toast-view>compose.au-enter{--private-toast-backdrop-opacity: 0}toast-view>compose.au-enter-active{-webkit-animation:toast-view-compose-enter;animation:toast-view-compose-enter;-webkit-animation-duration:var(--animation-duration-long);animation-duration:var(--animation-duration-long);--private-toast-backdrop-opacity: var(--toast-backdrop-opacity)}toast-view>compose.au-enter-active *{pointer-events:none !important}toast-view>compose.au-leave-active{-webkit-animation:toast-view-compose-leave;animation:toast-view-compose-leave;-webkit-animation-duration:var(--animation-duration-long);animation-duration:var(--animation-duration-long);--private-toast-backdrop-opacity: 0}toast-view>compose.au-leave-active *{pointer-events:none !important}toast-view>compose>*{z-index:var(--z-index-toast)}toast-view .toast-view-clear-all::before{content:\\\"\\\";z-index:var(--z-index-backdrop);position:absolute;left:-8rem;width:100%;height:1em;box-shadow:0 0 14rem 14rem var(--surface-color);background:var(--surface-color);border-radius:var(--border-radius-medium);opacity:var(--private-toast-backdrop-opacity)}toast-view>compose::before{content:\\\"\\\";z-index:var(--z-index-backdrop);position:absolute;top:var(--toast-margin-top);width:calc(100% - 1.5 * var(--toast-margin-right));height:calc(100% - var(--toast-margin-top));box-shadow:0 0 14rem 14rem var(--surface-color);background:var(--surface-color);border-radius:var(--border-radius-medium);opacity:var(--private-toast-backdrop-opacity);transition:opacity calc(var(--animation-duration-long) / 2)}@-webkit-keyframes toast-view-compose-enter{to{--animation-trigger: not-a-real-value}}@keyframes toast-view-compose-enter{to{--animation-trigger: not-a-real-value}}@-webkit-keyframes toast-view-compose-leave{to{--animation-trigger: not-a-real-value}}@keyframes toast-view-compose-leave{to{--animation-trigger: not-a-real-value}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/toasts/toast-view/toast-view.scss\"],\"names\":[],\"mappings\":\"AAEA,WAEC,kEAAA,CAGA,cAAA,CACA,KAAA,CACA,2BAAA,CACA,OAAA,CACA,eAAA,CAGA,4BAAA,CAGA,eAAA,CACA,gFAAA,CAGA,YAAA,CACA,qBAAA,CACA,kBAAA,CAGA,mBAAA,CAEA,yBA1BD,WA4BE,MAAA,CACA,qBAAA,CAAA,CAGD,iCAGC,iBAAA,CAGA,qCAAA,CACA,aAAA,CAGA,+BAAA,CAGA,kCAAA,CACA,sCAAA,CAGA,kCAAA,CACA,yCAAA,CAGA,8BAAA,CAGA,+BAAA,CACA,+BAAA,CAGA,4BAAA,CAEA,wCAEC,gBAAA,CAGA,iBAAA,CAGA,4BAAA,CAGA,eAAA,CAGA,sBAAA,CAGD,sCAGC,cAAA,CAIF,mBAGC,iBAAA,CAGA,YAAA,CAGA,mBAAA,CAEA,yBAXD,mBAaE,UAAA,CAAA,CAGD,sCAGC,sBAAA,CAGD,4BAEC,mCAAA,CAGD,mCAEC,0CAAA,CAAA,kCAAA,CACA,yDAAA,CAAA,iDAAA,CAEA,+DAAA,CAEA,qCAGC,8BAAA,CAIF,mCAEC,0CAAA,CAAA,kCAAA,CACA,yDAAA,CAAA,iDAAA,CAEA,mCAAA,CAEA,qCAGC,8BAAA,CAIF,qBAGC,4BAAA,CAIF,yCAEC,UAAA,CAGA,+BAAA,CAIA,iBAAA,CACA,UAAA,CACA,UAAA,CACA,UAAA,CAIA,+CAAA,CACA,+BAAA,CACA,yCAAA,CAGA,6CAAA,CAGD,2BAEC,UAAA,CAGA,+BAAA,CAIA,iBAAA,CACA,2BAAA,CACA,kDAAA,CACA,2CAAA,CAIA,+CAAA,CACA,+BAAA,CACA,yCAAA,CAGA,6CAAA,CAGA,2DAAA,CAIF,4CAEC,GAKC,qCAAA,CAAA,CAPF,oCAEC,GAKC,qCAAA,CAAA,CAIF,4CAEC,GAKC,qCAAA,CAAA,CAPF,oCAEC,GAKC,qCAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ntoast-view\\r\\n{\\r\\n\\t--private-toast-backdrop-opacity: var(--toast-backdrop-opacity, 0);\\r\\n\\r\\n\\t// Position in the middle of the viewport.\\r\\n\\tposition: fixed;\\r\\n\\ttop: 0;\\r\\n\\tleft: var(--side-menu-width);\\r\\n\\tright: 0;\\r\\n\\tmax-height: 100%;\\r\\n\\r\\n\\t// Apply the z-index for toasts.\\r\\n\\tz-index: var(--z-index-toast);\\r\\n\\r\\n\\t// Apply spacing at the left and bottom, to prevent clipping of the shadow.\\r\\n\\tpadding: 0 16rem;\\r\\n\\tpadding-bottom: calc(2 * var(--toast-margin-right) + var(--font-large-font-size));\\r\\n\\r\\n\\t// Use vertical flex layout.\\r\\n\\tdisplay: flex;\\r\\n\\tflex-direction: column;\\r\\n\\talign-items: center;\\r\\n\\r\\n\\t// Disable pointer events so the container does not block clicks.\\r\\n\\tpointer-events: none;\\r\\n\\r\\n\\t@media ($media-smaller-max)\\r\\n\\t{\\r\\n\\t\\tleft: 0;\\r\\n\\t\\tpadding: 0 12rem 12rem;\\r\\n\\t}\\r\\n\\r\\n\\t.toast-view-clear-all\\r\\n\\t{\\r\\n\\t\\t// Allow content to be positioned relative to this element.\\r\\n\\t\\tposition: relative;\\r\\n\\r\\n\\t\\t// Use same font size as the heading of the toasts.\\r\\n\\t\\tfont-size: var(--font-large-font-size);\\r\\n\\t\\tline-height: 1;\\r\\n\\r\\n\\t\\t// Apply half the padding applied to the toasts.\\r\\n\\t\\tpadding: 14rem 14rem 14rem 16rem;\\r\\n\\r\\n\\t\\t// Align the clear icon with the close icons of the toasts.\\r\\n\\t\\tmargin-top: var(--toast-margin-top);\\r\\n\\t\\tmargin-right: var(--toast-margin-right);\\r\\n\\r\\n\\t\\t// Apply a border to the toast.\\r\\n\\t\\tborder: 0 solid var(--border-color);\\r\\n\\t\\tborder-radius: var(--border-radius-medium);\\r\\n\\r\\n\\t\\t// Apply a shadow to the toast.\\r\\n\\t\\tbox-shadow: var(--shadow-toast);\\r\\n\\r\\n\\t\\t// Apply surface style.\\r\\n\\t\\tbackground: var(--surface-color);\\r\\n\\t\\tcolor: var(--surface-text-color);\\r\\n\\r\\n\\t\\t// Apply the z-index for toasts.\\r\\n\\t\\tz-index: var(--z-index-toast);\\r\\n\\r\\n\\t\\tbutton\\r\\n\\t\\t{\\r\\n\\t\\t\\toverflow: visible;\\r\\n\\r\\n\\t\\t\\t// Allow positioning using z-index.\\r\\n\\t\\t\\tposition: relative;\\r\\n\\r\\n\\t\\t\\t// Apply the z-index for toasts.\\r\\n\\t\\t\\tz-index: var(--z-index-toast);\\r\\n\\r\\n\\t\\t\\t// Align with the close icons on the toasts.\\r\\n\\t\\t\\tpadding: 0 14rem;\\r\\n\\r\\n\\t\\t\\t// Allow clicks on the button.\\r\\n\\t\\t\\tpointer-events: initial;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tspan\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply spacing before and after the text.\\r\\n\\t\\t\\tpadding: 0 4rem;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t> compose\\r\\n\\t{\\r\\n\\t\\t// Allow content to be positioned relative to this element.\\r\\n\\t\\tposition: relative;\\r\\n\\r\\n\\t\\t// Use horizontal flex layout.\\r\\n\\t\\tdisplay: flex;\\r\\n\\r\\n\\t\\t// Allow clicks to pass through, as the `compose` element is just the presenter.\\r\\n\\t\\tpointer-events: none;\\r\\n\\r\\n\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t{\\r\\n\\t\\t\\twidth: 100%;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&:not(.--disabled) > *\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Prevent clicks from passing through the toast at the top.\\r\\n\\t\\t\\tpointer-events: initial;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&.au-enter\\r\\n\\t\\t{\\r\\n\\t\\t\\t--private-toast-backdrop-opacity: 0;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&.au-enter-active\\r\\n\\t\\t{\\r\\n\\t\\t\\tanimation: toast-view-compose-enter;\\r\\n\\t\\t\\tanimation-duration: var(--animation-duration-long);\\r\\n\\r\\n\\t\\t\\t--private-toast-backdrop-opacity: var(--toast-backdrop-opacity);\\r\\n\\r\\n\\t\\t\\t*\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Prevent pointer events and hover effects while the toast is animating.\\r\\n\\t\\t\\t\\tpointer-events: none !important;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t&.au-leave-active\\r\\n\\t\\t{\\r\\n\\t\\t\\tanimation: toast-view-compose-leave;\\r\\n\\t\\t\\tanimation-duration: var(--animation-duration-long);\\r\\n\\r\\n\\t\\t\\t--private-toast-backdrop-opacity: 0;\\r\\n\\r\\n\\t\\t\\t*\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Prevent pointer events and hover effects while the toast is animating.\\r\\n\\t\\t\\t\\tpointer-events: none !important;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t> *\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Apply the z-index for toasts.\\r\\n\\t\\t\\tz-index: var(--z-index-toast);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.toast-view-clear-all::before\\r\\n\\t{\\r\\n\\t\\tcontent: \\\"\\\";\\r\\n\\r\\n\\t\\t// Apply the same z-index for as for backdrops.\\r\\n\\t\\tz-index: var(--z-index-backdrop);\\r\\n\\r\\n\\t\\t// Apply an overlay behind the toast view, to reduce\\r\\n\\t\\t// the visibility of the content behind it.\\r\\n\\t\\tposition: absolute;\\r\\n\\t\\tleft: -8rem;\\r\\n\\t\\twidth: 100%;\\r\\n\\t\\theight: 1em;\\r\\n\\r\\n\\t\\t// Apply a backdrop and shadow with the same color as the parent surface,\\r\\n\\t\\t// to reduce the visibility of the content behind the toast.\\r\\n\\t\\tbox-shadow: 0 0 14rem 14rem var(--surface-color);\\r\\n\\t\\tbackground: var(--surface-color);\\r\\n\\t\\tborder-radius: var(--border-radius-medium);\\r\\n\\r\\n\\t\\t// Set the opacity of the backdrop.\\r\\n\\t\\topacity: var(--private-toast-backdrop-opacity);\\r\\n\\t}\\r\\n\\r\\n\\t> compose::before\\r\\n\\t{\\r\\n\\t\\tcontent: \\\"\\\";\\r\\n\\r\\n\\t\\t// Apply the same z-index for as for backdrops.\\r\\n\\t\\tz-index: var(--z-index-backdrop);\\r\\n\\r\\n\\t\\t// Apply an overlay behind the toast view, to reduce\\r\\n\\t\\t// the visibility of the content behind it.\\r\\n\\t\\tposition: absolute;\\r\\n\\t\\ttop: var(--toast-margin-top);\\r\\n\\t\\twidth: calc(100% - 1.5 * var(--toast-margin-right));\\r\\n\\t\\theight: calc(100% - var(--toast-margin-top));\\r\\n\\r\\n\\t\\t// Apply a backdrop and shadow with the same color as the parent surface,\\r\\n\\t\\t// to reduce the visibility of the content behind the toast.\\r\\n\\t\\tbox-shadow: 0 0 14rem 14rem var(--surface-color);\\r\\n\\t\\tbackground: var(--surface-color);\\r\\n\\t\\tborder-radius: var(--border-radius-medium);\\r\\n\\r\\n\\t\\t// Set the opacity of the backdrop.\\r\\n\\t\\topacity: var(--private-toast-backdrop-opacity);\\r\\n\\r\\n\\t\\t// Animate opacity changes.\\r\\n\\t\\ttransition: opacity calc(var(--animation-duration-long) / 2);\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes toast-view-compose-enter\\r\\n{\\r\\n\\tto\\r\\n\\t{\\r\\n\\t\\t// This is needed to ensure the animation events are triggered.\\r\\n\\t\\t// Without it, the `aurelia-animator-css` plugin will misbehave.\\r\\n\\t\\t// Note that the enter and leave animations cannot be the same.\\r\\n\\t\\t--animation-trigger: not-a-real-value;\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes toast-view-compose-leave\\r\\n{\\r\\n\\tto\\r\\n\\t{\\r\\n\\t\\t// This is needed to ensure the animation events are triggered.\\r\\n\\t\\t// Without it, the `aurelia-animator-css` plugin will misbehave.\\r\\n\\t\\t// Note that the enter and leave animations cannot be the same.\\r\\n\\t\\t--animation-trigger: not-a-real-value;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { inject, bindable, Optional } from \"aurelia-framework\";\r\nimport { AccentColor } from \"resources/styles\";\r\nimport { Toast } from \"../../../services/toast\";\r\n\r\n/**\r\n * Represents a toast to be presented in the `toast-view`.\r\n *\r\n * ### How to use:\r\n * Place directly within the `template` element for the toast view.\r\n * When scoping styles, use a selector such as `toast[name=\"example\"]`.\r\n */\r\n@inject(Element, Optional.of(Toast, true))\r\nexport class ToastCustomElement\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param element The element representing the component.\r\n\t * @param toast The `Toast` instance representing the toast.\r\n\t */\r\n\tpublic constructor(element: Element, toast?: Toast)\r\n\t{\r\n\t\tthis.element = element as HTMLElement;\r\n\t\tthis.toast = toast;\r\n\t}\r\n\r\n\t/**\r\n\t * The element representing the component.\r\n\t */\r\n\tprotected readonly element: HTMLElement;\r\n\r\n\t/**\r\n\t * The `Toast` instance representing the toast.\r\n\t */\r\n\tprotected readonly toast: Toast | undefined;\r\n\r\n\t/**\r\n\t * The name of the dialog.\r\n\t * Note that this should be unique among the dialogs in the app.\r\n\t */\r\n\t@bindable\r\n\tpublic name: string;\r\n\r\n\t/**\r\n\t * True to show a close button and close on outside click, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic closeButton: boolean;\r\n\r\n\t/**\r\n\t * True to close when the `Escape` key is pressed, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic closeShortcut: boolean;\r\n\r\n\t/**\r\n\t * The accent of the dialog, or undefined to apply no accent.\r\n\t * The default is undefined.\r\n\t */\r\n\t@bindable\r\n\tpublic accent?: AccentColor;\r\n\r\n\t/**\r\n\t * Name of a custom icon used for the toast\r\n\t */\r\n\t@bindable\r\n\tpublic icon?: string;\r\n\r\n\t/**\r\n\t * Called when the close button is clicked.\r\n\t */\r\n\tprotected onCloseClick(): void\r\n\t{\r\n\t\tif (this.toast != null)\r\n\t\t{\r\n\t\t\tthis.toast.close();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a key is pressed.\r\n\t */\r\n\tprotected onKeyDown(event: KeyboardEvent): boolean\r\n\t{\r\n\t\tif (event.key === \"Escape\" && !event.defaultPrevented && this.closeShortcut && this.toast != null)\r\n\t\t{\r\n\t\t\tthis.toast.close();\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"toast{position:relative;min-height:var(--toast-min-height);max-height:var(--toast-max-height);max-width:var(--toast-max-width);margin-top:var(--toast-margin-top);overflow:hidden;box-shadow:var(--shadow-toast);background:var(--surface-color);color:var(--surface-text-color);display:flex;align-items:center}toast[accent=negative]{background-color:var(--palette-color-negative-light)}toast[accent=negative] .toast-content toast-header,toast[accent=negative] .toast-content toast-footer{color:var(--palette-color-negative)}toast[accent=neutral] .toast-icon{background-color:var(--palette-color-neutral-light)}toast[accent=primary] .toast-icon{background-color:var(--palette-color-primary-light)}toast[accent=info] .toast-icon{background-color:var(--palette-color-info-light)}toast[accent=positive] .toast-icon{background-color:var(--palette-color-positive-light)}toast[accent=attention] .toast-icon{background-color:var(--palette-color-attention-light)}toast[accent=negative] .toast-icon{background-color:var(--palette-color-negative-light)}@media(max-width: 800px){toast{flex:1;align-items:center}}toast .toast-content{position:relative;flex:1;min-height:100%;padding:20rem 24rem;display:flex;align-items:center}@media(max-width: 800px){toast .toast-content{flex:1 0 0;padding:12rem 12rem}}toast .toast-content toast-header,toast .toast-content toast-footer{color:var(--surface-text-color)}@media(max-width: 800px){toast .toast-content toast-header,toast .toast-content toast-footer{padding-left:12rem}}toast .toast-content toast-header button[appearance=icon],toast .toast-content toast-footer button[appearance=icon]{font-size:24rem}toast .toast-content toast-header{position:sticky;top:0;z-index:1}toast .toast-content toast-header::before{content:\\\"\\\";position:absolute;top:0;left:0;width:200%;height:100%;z-index:-1}toast .toast-content toast-section{clear:both;padding:0 28rem 0 32rem}toast .toast-content toast-footer{clear:both;position:sticky;bottom:0;background-color:var(--surface-color);-webkit-mask-image:linear-gradient(to top, white 0%, rgba(255, 255, 255, 0.95) 65%, rgba(255, 255, 255, 0.8) 80%, rgba(255, 255, 255, 0) 100%);mask-image:linear-gradient(to top, white 0%, rgba(255, 255, 255, 0.95) 65%, rgba(255, 255, 255, 0.8) 80%, rgba(255, 255, 255, 0) 100%)}toast .toast-icon{height:100%;width:70rem;display:flex;align-items:center;justify-content:center;flex-shrink:0}@media(max-width: 800px){toast .toast-icon{height:100%;width:44rem}}toast .toast-icon icon{font-size:48rem}@media(max-width: 800px){toast .toast-icon icon{font-size:32rem}}toast-view toast{will-change:opacity,transform,margin-top;-webkit-animation-fill-mode:both !important;animation-fill-mode:both !important}toast-view compose.au-enter toast{opacity:0;margin-top:calc(-1 * var(--toast-max-height));transform:translateY(calc(-1 * var(--toast-max-height)));overflow:hidden}toast-view compose.au-enter-active toast{-webkit-animation:toast-enter cubic-bezier(0.2, 0, 0.1, 1);animation:toast-enter cubic-bezier(0.2, 0, 0.1, 1);-webkit-animation-duration:var(--animation-duration-long);animation-duration:var(--animation-duration-long)}toast-view compose.au-leave toast{box-shadow:var(--toast-afterglow)}toast-view compose.au-leave-active toast{-webkit-animation:toast-leave cubic-bezier(0.2, 0, 0.2, 0.5);animation:toast-leave cubic-bezier(0.2, 0, 0.2, 0.5);-webkit-animation-duration:var(--animation-duration-long);animation-duration:var(--animation-duration-long)}@-webkit-keyframes toast-enter{0%{margin-top:calc(-1 * var(--toast-max-height))}15%{opacity:0;margin-top:var(--toast-margin-top)}40%{opacity:1}60%,to{margin-top:var(--toast-margin-top);opacity:1;transform:translateY(0)}}@keyframes toast-enter{0%{margin-top:calc(-1 * var(--toast-max-height))}15%{opacity:0;margin-top:var(--toast-margin-top)}40%{opacity:1}60%,to{margin-top:var(--toast-margin-top);opacity:1;transform:translateY(0)}}@-webkit-keyframes toast-leave{20%{opacity:1}40%{margin-top:var(--toast-margin-top)}50%{opacity:0;transform:translateY(calc(-1 * var(--toast-max-height)))}55%,to{margin-top:calc(-1 * var(--toast-max-height));opacity:0;transform:translateY(calc(-1 * var(--toast-max-height)))}}@keyframes toast-leave{20%{opacity:1}40%{margin-top:var(--toast-margin-top)}50%{opacity:0;transform:translateY(calc(-1 * var(--toast-max-height)))}55%,to{margin-top:calc(-1 * var(--toast-max-height));opacity:0;transform:translateY(calc(-1 * var(--toast-max-height)))}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/shared/framework/components/toasts/toast/toast.scss\"],\"names\":[],\"mappings\":\"AAEA,MAGC,iBAAA,CAGA,kCAAA,CACA,kCAAA,CACA,gCAAA,CAGA,kCAAA,CAGA,eAAA,CAGA,8BAAA,CAGA,+BAAA,CACA,+BAAA,CAEA,YAAA,CACA,kBAAA,CAEA,uBAEC,oDAAA,CAGC,sGAGC,mCAAA,CAUD,kCAEC,mDAAA,CAFD,kCAEC,mDAAA,CAFD,+BAEC,gDAAA,CAFD,mCAEC,oDAAA,CAFD,oCAEC,qDAAA,CAFD,mCAEC,oDAAA,CAKH,yBAnDD,MAqDE,MAAA,CACA,kBAAA,CAAA,CAGD,qBAEC,iBAAA,CAGA,MAAA,CACA,eAAA,CACA,mBAAA,CAEA,YAAA,CACA,kBAAA,CAEA,yBAZD,qBAcE,UAAA,CACA,mBAAA,CAAA,CAKD,oEAGC,+BAAA,CAEA,yBALD,oEAOE,kBAAA,CAAA,CAGD,oHAGC,eAAA,CAIF,kCAGC,eAAA,CACA,KAAA,CACA,SAAA,CAEA,0CAEC,UAAA,CAEA,iBAAA,CACA,KAAA,CACA,MAAA,CACA,UAAA,CACA,WAAA,CACA,UAAA,CAIF,mCAGC,UAAA,CAGA,uBAAA,CAGD,kCAGC,UAAA,CAGA,eAAA,CACA,QAAA,CAIA,qCAAA,CAGA,8IAAA,CAAA,sIAAA,CAUF,kBAEC,WAAA,CACA,WAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,aAAA,CAEA,yBATD,kBAWE,WAAA,CACA,WAAA,CAAA,CAGD,uBAEC,eAAA,CAEA,yBAJD,uBAME,eAAA,CAAA,CAqBH,iBAGC,wCAAA,CAGA,2CAAA,CAAA,mCAAA,CAGD,kCAEC,SAAA,CACA,6CAAA,CACA,wDAAA,CACA,eAAA,CAGD,yCAEC,0DAAA,CAAA,kDAAA,CACA,yDAAA,CAAA,iDAAA,CAGD,kCAGC,iCAAA,CAGD,yCAEC,4DAAA,CAAA,oDAAA,CACA,yDAAA,CAAA,iDAAA,CAIF,+BAEC,GAEC,6CAAA,CAGD,IAEC,SAAA,CACA,kCAAA,CAGD,IAEC,SAAA,CAGD,OAEC,kCAAA,CACA,SAAA,CACA,uBAAA,CAAA,CAtBF,uBAEC,GAEC,6CAAA,CAGD,IAEC,SAAA,CACA,kCAAA,CAGD,IAEC,SAAA,CAGD,OAEC,kCAAA,CACA,SAAA,CACA,uBAAA,CAAA,CAIF,+BAEC,IAEC,SAAA,CAGD,IAEC,kCAAA,CAGD,IAEC,SAAA,CACA,wDAAA,CAGD,OAEC,6CAAA,CACA,SAAA,CACA,wDAAA,CAAA,CAtBF,uBAEC,IAEC,SAAA,CAGD,IAEC,kCAAA,CAGD,IAEC,SAAA,CACA,wDAAA,CAGD,OAEC,6CAAA,CACA,SAAA,CACA,wDAAA,CAAA\",\"sourcesContent\":[\"@import \\\"resources/index\\\";\\r\\n\\r\\ntoast\\r\\n{\\r\\n\\t// Allow content to be positioned relative to this element.\\r\\n\\tposition: relative;\\r\\n\\r\\n\\t// Limit the size of the toast.\\r\\n\\tmin-height: var(--toast-min-height);\\r\\n\\tmax-height: var(--toast-max-height);\\r\\n\\tmax-width: var(--toast-max-width);\\r\\n\\r\\n\\t// Add spacing between toasts.\\r\\n\\tmargin-top: var(--toast-margin-top);\\r\\n\\r\\n\\t// Hide overflow by default, so we get rounded borders.\\r\\n\\toverflow: hidden;\\r\\n\\r\\n\\t// Apply a shadow to the toast.\\r\\n\\tbox-shadow: var(--shadow-toast);\\r\\n\\r\\n\\t// Apply surface style.\\r\\n\\tbackground: var(--surface-color);\\r\\n\\tcolor: var(--surface-text-color);\\r\\n\\r\\n\\tdisplay: flex;\\r\\n\\talign-items: center;\\r\\n\\r\\n\\t&[accent=\\\"negative\\\"]\\r\\n\\t{\\r\\n\\t\\tbackground-color: var(--palette-color-negative-light);\\r\\n\\t\\t.toast-content\\r\\n\\t\\t{\\r\\n\\t\\t\\ttoast-header,\\r\\n\\t\\t\\ttoast-footer\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tcolor: var(--palette-color-negative);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t// Add accent color support.\\r\\n\\t@each $accent in $accents\\r\\n\\t{\\r\\n\\t\\t&[accent=\\\"#{$accent}\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\t.toast-icon\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tbackground-color: var(--palette-color-#{$accent}-light);\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t@media ($media-smaller-max)\\r\\n\\t{\\r\\n\\t\\tflex: 1;\\r\\n\\t\\talign-items: center;\\r\\n\\t}\\r\\n\\r\\n\\t.toast-content\\r\\n\\t{\\r\\n\\t\\tposition: relative;\\r\\n\\r\\n\\t\\t// Set the size of the content area.\\r\\n\\t\\tflex: 1;\\r\\n\\t\\tmin-height: 100%;\\r\\n\\t\\tpadding: 20rem 24rem;\\r\\n\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\talign-items: center;\\r\\n\\r\\n\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t{\\r\\n\\t\\t\\tflex: 1 0 0;\\r\\n\\t\\t\\tpadding: 12rem 12rem;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t// Provide defaults for sectioning elements.\\r\\n\\r\\n\\t\\ttoast-header,\\r\\n\\t\\ttoast-footer\\r\\n\\t\\t{\\r\\n\\t\\t\\tcolor: var(--surface-text-color);\\r\\n\\r\\n\\t\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tpadding-left: 12rem;\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t\\tbutton[appearance=\\\"icon\\\"]\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\t// Provide default icon size.\\r\\n\\t\\t\\t\\tfont-size: 24rem;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\ttoast-header\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Stick to the top.\\r\\n\\t\\t\\tposition: sticky;\\r\\n\\t\\t\\ttop: 0;\\r\\n\\t\\t\\tz-index: 1;\\r\\n\\r\\n\\t\\t\\t&::before\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tcontent: \\\"\\\";\\r\\n\\r\\n\\t\\t\\t\\tposition: absolute;\\r\\n\\t\\t\\t\\ttop: 0;\\r\\n\\t\\t\\t\\tleft: 0;\\r\\n\\t\\t\\t\\twidth: 200%;\\r\\n\\t\\t\\t\\theight: 100%;\\r\\n\\t\\t\\t\\tz-index: -1;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\ttoast-section\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Ensure the element clears the actions at the top of the toast.\\r\\n\\t\\t\\tclear: both;\\r\\n\\r\\n\\t\\t\\t// Apply horizontal padding to sections.\\r\\n\\t\\t\\tpadding: 0 28rem 0 32rem;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\ttoast-footer\\r\\n\\t\\t{\\r\\n\\t\\t\\t// Ensure the element clears the actions at the top of the toast.\\r\\n\\t\\t\\tclear: both;\\r\\n\\r\\n\\t\\t\\t// Stick to the bottom.\\r\\n\\t\\t\\tposition: sticky;\\r\\n\\t\\t\\tbottom: 0;\\r\\n\\r\\n\\t\\t\\t// Apply the surface color to the header and footer,\\r\\n\\t\\t\\t// so they cover any content scrolling under them.\\r\\n\\t\\t\\tbackground-color: var(--surface-color);\\r\\n\\r\\n\\t\\t\\t// Apply a mask to fade out the background.\\r\\n\\t\\t\\tmask-image: linear-gradient(\\r\\n\\t\\t\\t\\tto top,\\r\\n\\t\\t\\t\\trgba(#ffffff, 1) 0%,\\r\\n\\t\\t\\t\\trgba(#ffffff, 0.95) 65%,\\r\\n\\t\\t\\t\\trgba(#ffffff, 0.8) 80%,\\r\\n\\t\\t\\t\\trgba(#ffffff, 0) 100%\\r\\n\\t\\t\\t);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t.toast-icon\\r\\n\\t{\\r\\n\\t\\theight: 100%;\\r\\n\\t\\twidth: 70rem;\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\talign-items: center;\\r\\n\\t\\tjustify-content: center;\\r\\n\\t\\tflex-shrink: 0;\\r\\n\\r\\n\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t{\\r\\n\\t\\t\\theight: 100%;\\r\\n\\t\\t\\twidth: 44rem;\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\ticon\\r\\n\\t\\t{\\r\\n\\t\\t\\tfont-size: 48rem;\\r\\n\\r\\n\\t\\t\\t@media ($media-smaller-max)\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t\\tfont-size: 32rem;\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\r\\n\\t// Add accent color support for the edge.\\r\\n\\t@each $accent in $accents\\r\\n\\t{\\r\\n\\t\\t&[accent=\\\"#{$accent}\\\"]\\r\\n\\t\\t{\\r\\n\\t\\t\\t.toast-icon\\r\\n\\t\\t\\t{\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\\r\\n// Animate the toast.\\r\\n\\r\\ntoast\\r\\n{\\r\\n\\ttoast-view &\\r\\n\\t{\\r\\n\\t\\t// Hint that animation will be applied.\\r\\n\\t\\twill-change: opacity, transform, margin-top;\\r\\n\\r\\n\\t\\t// Prevent glitches at the ends of the animation.\\r\\n\\t\\tanimation-fill-mode: both !important;\\r\\n\\t}\\r\\n\\r\\n\\ttoast-view compose.au-enter &\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t\\tmargin-top: calc(-1 * var(--toast-max-height));\\r\\n\\t\\ttransform: translateY(calc(-1 * var(--toast-max-height)));\\r\\n\\t\\toverflow: hidden;\\r\\n\\t}\\r\\n\\r\\n\\ttoast-view compose.au-enter-active &\\r\\n\\t{\\r\\n\\t\\tanimation: toast-enter cubic-bezier(0.2, 0, 0.1, 1);\\r\\n\\t\\tanimation-duration: var(--animation-duration-long);\\r\\n\\t}\\r\\n\\r\\n\\ttoast-view compose.au-leave &\\r\\n\\t{\\r\\n\\t\\t// Replace the shadow with an afterglow to smoothe the edge and reduce ghosting.\\r\\n\\t\\tbox-shadow: var(--toast-afterglow);\\r\\n\\t}\\r\\n\\r\\n\\ttoast-view compose.au-leave-active &\\r\\n\\t{\\r\\n\\t\\tanimation: toast-leave cubic-bezier(0.2, 0, 0.2, 0.5);\\r\\n\\t\\tanimation-duration: var(--animation-duration-long);\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes toast-enter\\r\\n{\\r\\n\\t0%\\r\\n\\t{\\r\\n\\t\\tmargin-top: calc(-1 * var(--toast-max-height));\\r\\n\\t}\\r\\n\\r\\n\\t15%\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t\\tmargin-top: var(--toast-margin-top);\\r\\n\\t}\\r\\n\\r\\n\\t40%\\r\\n\\t{\\r\\n\\t\\topacity: 1;\\r\\n\\t}\\r\\n\\r\\n\\t60%, to\\r\\n\\t{\\r\\n\\t\\tmargin-top: var(--toast-margin-top);\\r\\n\\t\\topacity: 1;\\r\\n\\t\\ttransform: translateY(0);\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes toast-leave\\r\\n{\\r\\n\\t20%\\r\\n\\t{\\r\\n\\t\\topacity: 1;\\r\\n\\t}\\r\\n\\r\\n\\t40%\\r\\n\\t{\\r\\n\\t\\tmargin-top: var(--toast-margin-top);\\r\\n\\t}\\r\\n\\r\\n\\t50%\\r\\n\\t{\\r\\n\\t\\topacity: 0;\\r\\n\\t\\ttransform: translateY(calc(-1 * var(--toast-max-height)));\\r\\n\\t}\\r\\n\\r\\n\\t55%, to\\r\\n\\t{\\r\\n\\t\\tmargin-top: calc(-1 * var(--toast-max-height));\\r\\n\\t\\topacity: 0;\\r\\n\\t\\ttransform: translateY(calc(-1 * var(--toast-max-height)));\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { Container, autoinject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\r\nimport { EventManager } from \"shared/utilities\";\r\nimport { Validator } from \"./validator\";\r\nimport { ValidationTrigger, ValidationReason } from \"./validation-trigger\";\r\n\r\n/**\r\n * Represents an event that may trigger validation,\r\n * extended with validation specific state.\r\n */\r\ninterface IValidationTriggerEvent extends Event\r\n{\r\n\t/**\r\n\t * The promise for the validation run triggered by this event,\r\n\t * or undefined if no validation has been triggered.\r\n\t */\r\n\t__validationPromise?: Promise;\r\n}\r\n\r\n/**\r\n * Represents a controller for the validators within the element to\r\n * which it is applied, managing trigger event subscriptions and\r\n * aggregate validation state.\r\n *\r\n * This interface represents the public API of a validation, and\r\n * should be used as the type for any references to a validation\r\n * attribute instance.\r\n */\r\nexport interface IValidation\r\n{\r\n\t/**\r\n\t * True to enable this validation, false to disable this validation,\r\n\t * or undefined to inherit the enabled state from the parent validation.\r\n\t *\r\n\t * If no parent validation exists, the computed default is true.\r\n\t *\r\n\t * Note that if the parent validation is disabled, this validation will\r\n\t * be disabled too, regardless of the value of this property.\r\n\t */\r\n\tenabled: boolean | undefined;\r\n\r\n\t/**\r\n\t * True to validate on trigger events, false to not validate on trigger\r\n\t * events, null to let child validations and validators decide themselves,\r\n\t * or undefined to inherit the active state from the parent validation.\r\n\t *\r\n\t * If no parent validation exists, the computed default is null.\r\n\t *\r\n\t * Note that if the parent validation is inactive, this validation will\r\n\t * be inactive too, regardless of the value of this property.\r\n\t */\r\n\tactive: boolean | null | undefined;\r\n\r\n\t/**\r\n\t * The trigger to use for this validation, or undefined to\r\n\t * inherit the trigger from the parent validation.\r\n\t *\r\n\t * If no parent validation exists, the computed default is `input`.\r\n\t */\r\n\ttrigger: ValidationReason | undefined;\r\n\r\n\t/**\r\n\t * True if validation failed, false if validation succeeded,\r\n\t * or undefined if this validation is computed as disabled,\r\n\t * or if validation has not yet run.\r\n\t */\r\n\tinvalid: boolean | undefined;\r\n\r\n\t/**\r\n\t * Validate by running all validators attached to this validation subtree.\r\n\t * Note that validators will only run for validations that are enabled,\r\n\t * with no disabled parent validator.\r\n\t * @param reason The reason for the validation run.\r\n\t * @returns A promise that will be resolved with true if validation\r\n\t * succeeded, otherwise false.\r\n\t */\r\n\tvalidate(reason?: ValidationReason): Promise;\r\n\r\n\t/**\r\n\t * Resets this validation and all child validations and validators\r\n\t * to the default validity state.\r\n\t */\r\n\treset(): void;\r\n}\r\n\r\n/**\r\n * Represents a custom attribute, which acts as a controller for the\r\n * validators within the element to which it is applied, managing\r\n * trigger event subscriptions and aggregate validation state.\r\n */\r\n@autoinject\r\nexport class ValidationCustomAttribute implements IValidation\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param container The `Container` instance associated with the component.\r\n\t */\r\n\tpublic constructor(container: Container)\r\n\t{\r\n\t\tthis.element = container.get(Element) as HTMLElement;\r\n\t}\r\n\r\n\tprivate readonly _eventManager = new EventManager(this);\r\n\tprivate _validationPromise: Promise | undefined;\r\n\r\n\t/**\r\n\t * The element representing the component.\r\n\t */\r\n\tprotected readonly element: HTMLElement;\r\n\r\n\t/**\r\n\t * The parent validation of this validation,\r\n\t * or undefined if no parent validation exists.\r\n\t */\r\n\tprotected parentValidation: ValidationCustomAttribute | undefined;\r\n\r\n\t/**\r\n\t * The child validations of this validation.\r\n\t */\r\n\tprotected readonly childValidations: ValidationCustomAttribute[] = [];\r\n\r\n\t/**\r\n\t * The validators managed by this validation.\r\n\t */\r\n\tprotected readonly validators: Validator[] = [];\r\n\r\n\t/**\r\n\t * True to enable this validation, false to disable this validation,\r\n\t * or undefined to inherit the enabled state from the parent validation.\r\n\t *\r\n\t * If no parent validation exists, the computed default is true.\r\n\t *\r\n\t * Note that if the parent validation is disabled, this validation will\r\n\t * be disabled too, regardless of the value of this property.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic enabled: boolean | undefined;\r\n\r\n\t/**\r\n\t * True to validate on trigger events, false to not validate on trigger\r\n\t * events, null to let child validations and validators decide themselves,\r\n\t * or undefined to inherit the active state from the parent validation.\r\n\t *\r\n\t * If no parent validation exists, the computed default is null.\r\n\t *\r\n\t * Note that if the parent validation is inactive, this validation will\r\n\t * be inactive too, regardless of the value of this property.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic active: boolean | null | undefined;\r\n\r\n\t/**\r\n\t * The trigger to use for this validation, or undefined to\r\n\t * inherit the trigger from the parent validation.\r\n\t *\r\n\t * If no parent validation exists, the computed default is `input`.\r\n\t */\r\n\t@bindable({ defaultValue: undefined })\r\n\tpublic trigger: ValidationTrigger | undefined;\r\n\r\n\t/**\r\n\t * True if validation failed, false if validation succeeded,\r\n\t * or undefined if this validation is computed as disabled,\r\n\t * or if validation has not yet run.\r\n\t */\r\n\t@bindable({ defaultBindingMode: bindingMode.fromView })\r\n\tpublic invalid: boolean | undefined;\r\n\r\n\t/**\r\n\t * The enabled state specified for this validation, or inherited from the parent validation.\r\n\t * If no enabled state is specified and no parent validation exists, the default is true.\r\n\t */\r\n\t@computedFrom(\"enabled\", \"parentValidation.computedEnabled\")\r\n\tpublic get computedEnabled(): boolean\r\n\t{\r\n\t\tif (this.parentValidation != null)\r\n\t\t{\r\n\t\t\tif (!this.parentValidation.computedEnabled)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.enabled !== undefined)\r\n\t\t\t{\r\n\t\t\t\treturn this.enabled;\r\n\t\t\t}\r\n\r\n\t\t\treturn this.parentValidation.computedEnabled;\r\n\t\t}\r\n\r\n\t\tif (this.enabled !== undefined)\r\n\t\t{\r\n\t\t\treturn this.enabled;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * The active state specified for this validation, or inherited from the parent validation.\r\n\t * If no active state is specified and no parent validation exists, the default is null.\r\n\t */\r\n\t@computedFrom(\"active\", \"parentValidation.computedActive\")\r\n\tpublic get computedActive(): boolean | null\r\n\t{\r\n\t\tif (this.parentValidation != null)\r\n\t\t{\r\n\t\t\tif (this.parentValidation.computedActive === false)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.active !== undefined)\r\n\t\t\t{\r\n\t\t\t\treturn this.active;\r\n\t\t\t}\r\n\r\n\t\t\treturn this.parentValidation.computedActive;\r\n\t\t}\r\n\r\n\t\tif (this.active !== undefined)\r\n\t\t{\r\n\t\t\treturn this.active;\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * The trigger specified for this validation, or inherited from the parent validation.\r\n\t * If no trigger is specified and no parent validation exists, the default is `input`.\r\n\t */\r\n\t@computedFrom(\"trigger\", \"parentValidation.computedTrigger\")\r\n\tpublic get computedTrigger(): ValidationTrigger\r\n\t{\r\n\t\tif (this.trigger != null)\r\n\t\t{\r\n\t\t\treturn this.trigger;\r\n\t\t}\r\n\r\n\t\tif (this.parentValidation != null)\r\n\t\t{\r\n\t\t\treturn this.parentValidation.computedTrigger;\r\n\t\t}\r\n\r\n\t\treturn \"input\";\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t * Attaches this validation to its parent validation, adds trigger event listeners,\r\n\t * and if this validation is computed as enabled and active, runs it immediately.\r\n\t * @returns A promise that will be resolved immediately, or when validation completes.\r\n\t */\r\n\tpublic async attached(): Promise\r\n\t{\r\n\t\t// Try to get the parent validation of this validation, if any.\r\n\r\n\t\tlet parentElement = this.element.parentElement as any;\r\n\r\n\t\twhile (this.parentValidation == null && parentElement != null)\r\n\t\t{\r\n\t\t\tthis.parentValidation = parentElement.au?.validation?.viewModel;\r\n\t\t\tparentElement = parentElement.parentElement;\r\n\t\t}\r\n\r\n\t\t// Attach to the parent validation.\r\n\t\tif (this.parentValidation != null)\r\n\t\t{\r\n\t\t\tthis.parentValidation.attachValidation(this);\r\n\t\t}\r\n\r\n\t\t// Listen for trigger events.\r\n\t\tthis._eventManager.addEventListener(this.element, \"input\", event => this.onTriggerEvent(event));\r\n\t\tthis._eventManager.addEventListener(this.element, \"change\", event => this.onTriggerEvent(event));\r\n\r\n\t\t// If enabled and active, validate immediately.\r\n\t\tif (this.computedEnabled && this.computedActive)\r\n\t\t{\r\n\t\t\tawait this.validate(\"attached\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is detached.\r\n\t * Detaches this validation from its parent validation and disposes all event listeners.\r\n\t */\r\n\tpublic detached(): void\r\n\t{\r\n\t\tthis._eventManager.removeEventListeners();\r\n\r\n\t\tif (this.parentValidation != null)\r\n\t\t{\r\n\t\t\tthis.parentValidation.detachValidation(this);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a child validation is attached.\r\n\t * Adds the specified validation as a child of this validation.\r\n\t * @param validation The child validation to attach.\r\n\t */\r\n\tpublic attachValidation(validation: ValidationCustomAttribute): void\r\n\t{\r\n\t\tthis.childValidations.push(validation);\r\n\t\tthis.update();\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a child validation is detached.\r\n\t * Removes the specified validation as a child of this validation.\r\n\t * @param validation The child validation to detach.\r\n\t */\r\n\tpublic detachValidation(validation: ValidationCustomAttribute): void\r\n\t{\r\n\t\tthis.childValidations.splice(this.childValidations.indexOf(validation), 1);\r\n\t\tthis.update();\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a validator is attached.\r\n\t * Adds the specified validator to this validation.\r\n\t * @param validation The validator to attach.\r\n\t */\r\n\tpublic attachValidator(validator: Validator): void\r\n\t{\r\n\t\tthis.validators.push(validator);\r\n\t\tthis.update();\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a validator is detached.\r\n\t * Removes the specified validator from this validation.\r\n\t * @param validation The validator to remove.\r\n\t */\r\n\tpublic detachValidator(validator: Validator): void\r\n\t{\r\n\t\tthis.validators.splice(this.validators.indexOf(validator), 1);\r\n\t\tthis.update();\r\n\t}\r\n\r\n\t/**\r\n\t * Validate by running all validators attached to this validation subtree.\r\n\t * Note that validators will only run for validations that are enabled,\r\n\t * with no disabled parent validator.\r\n\t * @param reason The reason for the validation run.\r\n\t * @param recursive True to run validators in the entire subtree, false to only run validators attached to this validation.\r\n\t * @returns A promise that will be resolved with true if validation succeeded, otherwise false.\r\n\t */\r\n\tpublic async validate(reason?: ValidationReason, recursive = true): Promise\r\n\t{\r\n\t\t// Wait for any pending validation runs to complete, to avoid race conditions.\r\n\t\twhile (this._validationPromise != null)\r\n\t\t{\r\n\t\t\tawait this._validationPromise?.catch();\r\n\t\t}\r\n\r\n\t\t// If this validation is computed as disabled, or if the trigger is an event and this\r\n\t\t// validation is computed as inactive, just return true.\r\n\t\tif (!this.computedEnabled)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// Run the child validations and validators, collecting their promises.\r\n\t\tconst validationPromises =\r\n\t\t[\r\n\t\t\t...this.childValidations.map(validation =>\r\n\t\t\t{\r\n\t\t\t\treturn recursive\r\n\t\t\t\t\t? validation.validate(reason)\r\n\t\t\t\t\t: Promise.resolve(!validation.invalid);\r\n\t\t\t}),\r\n\r\n\t\t\t...this.validators.map(validator =>\r\n\t\t\t{\r\n\t\t\t\tconst shouldValidate =\r\n\r\n\t\t\t\t\t// Always run if the validation run was triggered programmatically.\r\n\t\t\t\t\treason == null && validator.computedEnabled ||\r\n\r\n\t\t\t\t\t// Only run validators that are enabled and active in response to events.\r\n\t\t\t\t\tvalidator.computedEnabled && validator.computedActive &&\r\n\t\t\t\t\t(\r\n\t\t\t\t\t\t// Run if the trigger matches a trigger specified on,\r\n\t\t\t\t\t\t// or inherited by, the validator.\r\n\t\t\t\t\t\tvalidator.computedTrigger === reason ||\r\n\r\n\t\t\t\t\t\t// Run if the validator is already in the invalid state.\r\n\t\t\t\t\t\t// This ensures immediate feedback when an error is corrected.\r\n\t\t\t\t\t\tvalidator.invalid\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\tif (shouldValidate)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn validator.validate(reason);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn Promise.resolve(!validator.invalid);\r\n\t\t\t})\r\n\t\t];\r\n\r\n\t\t// Store a promise for the validation run.\r\n\t\tthis._validationPromise = Promise.all(validationPromises)\r\n\r\n\t\t\t.then(validationResults =>\r\n\t\t\t{\r\n\t\t\t\t// Clear the validation promise.\r\n\t\t\t\tthis._validationPromise = undefined;\r\n\r\n\t\t\t\t// Update the validity state of the validation, but only if the validation is still enabled\r\n\t\t\t\t// and the validity state has not yet been set. This check is needed, because new validators\r\n\t\t\t\t// may have been attached, and updated the validity state, after the validation run started.\r\n\t\t\t\tif (this.invalid == null && this.computedEnabled)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.invalid = validationResults.some(valid => !valid);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn !this.invalid;\r\n\t\t\t})\r\n\r\n\t\t\t.catch(error =>\r\n\t\t\t{\r\n\t\t\t\t// Ensure the validation promise is always cleared after it settles.\r\n\t\t\t\tthis._validationPromise = undefined;\r\n\r\n\t\t\t\tthrow error;\r\n\t\t\t});\r\n\r\n\t\t// Return the validation promise.\r\n\t\treturn this._validationPromise;\r\n\t}\r\n\r\n\t/**\r\n\t * Resets this validation and all child validations and validators\r\n\t * to the default validity state, then updates the ancestor validations.\r\n\t */\r\n\tpublic reset(): void\r\n\t{\r\n\t\tfor (const validation of this.childValidations)\r\n\t\t{\r\n\t\t\tvalidation.reset();\r\n\t\t}\r\n\r\n\t\tfor (const validator of this.validators)\r\n\t\t{\r\n\t\t\tvalidator.reset();\r\n\t\t}\r\n\r\n\t\tthis.invalid = undefined;\r\n\r\n\t\t// Note:\r\n\t\t// Resetting the validators will trigger the necessary tree update.\r\n\t}\r\n\r\n\t/**\r\n\t * Called by validators when their `invalid` state changes.\r\n\t * Queries the child validations and validators to update the `invalid` state of this validation,\r\n\t * then calls `update` on the parant validation, thereby propagating the change up the tree.\r\n\t */\r\n\tpublic update(): void\r\n\t{\r\n\t\tif (!this.computedEnabled)\r\n\t\t{\r\n\t\t\tthis.invalid = undefined;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.invalid =\r\n\t\t\t\tthis.validators.filter(v => v.enabled !== false).some(v => !!v.invalid) ||\r\n\t\t\t\tthis.childValidations.filter(v => v.enabled !== false).some(v => !!v.invalid);\r\n\t\t}\r\n\r\n\t\tif (this.parentValidation != null)\r\n\t\t{\r\n\t\t\tthis.parentValidation.update();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `enabled` property changes.\r\n\t * Ensures the validation is reset if the value changes to false, and run\r\n\t * if the value changes to true and the `enabled` trigger is specified.\r\n\t */\r\n\tprotected enabledChanged(): void\r\n\t{\r\n\t\tif (this.enabled)\r\n\t\t{\r\n\t\t\tif (this.computedEnabled && this.computedActive)\r\n\t\t\t{\r\n\t\t\t\tthis.validate(\"enabled\");\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.reset();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Called when a trigger event occurs.\r\n\t * Starts a new validation run, if this is the first validation to handle the event.\r\n\t * @param event The trigger event.\r\n\t */\r\n\tprivate onTriggerEvent(event: IValidationTriggerEvent): void\r\n\t{\r\n\t\tevent.__validationPromise = this.validate(event.type as ValidationTrigger, event.__validationPromise == null);\r\n\t}\r\n}\r\n","import { bindable, containerless } from \"aurelia-framework\";\r\nimport { Operation } from \"shared/utilities\";\r\nimport { Validator } from \"../../validator\";\r\nimport { ValidationReason } from \"../../validation-trigger\";\r\n\r\n/**\r\n * Represents a validator that validates by calling a function.\r\n * Note that the function may be async, and that an `AbortSignal` is provided,\r\n * that will be triggered if a new validation run starts.\r\n *\r\n * Note that a value of undefined is always considered valid.\r\n */\r\n@containerless\r\nexport class AsyncValidatorCustomElement extends Validator\r\n{\r\n\t/**\r\n\t * The most recent operation, if any.\r\n\t */\r\n\tprotected operation: Operation | undefined;\r\n\r\n\t/**\r\n\t * The function that should be called to validate the value,\r\n\t * or undefined to disable this requirement. This function\r\n\t * should return true if validation succeeded, otherwise false.\r\n\t * @param params.signal The abort signal, which will be triggered if a new validation run starts.\r\n\t * @returns A promise that resolves\r\n\t */\r\n\t@bindable\r\n\tpublic function: (params:\r\n\t{\r\n\t\t/**\r\n\t\t * The abort signal, which will be triggered if a new validation run starts.\r\n\t\t */\r\n\t\tsignal: AbortSignal;\r\n\r\n\t}) => Promise;\r\n\r\n\t/**\r\n\t * Called by the validation when this validator should run.\r\n\t * @param reason The reason for the validation run.\r\n\t * @returns A promise that will be resolved with true if validation succeeded, otherwise false.\r\n\t */\r\n\tpublic async validate(reason: ValidationReason): Promise\r\n\t{\r\n\t\tif (this.operation != null)\r\n\t\t{\r\n\t\t\tthis.operation.abort();\r\n\t\t}\r\n\r\n\t\tif (this.function == null)\r\n\t\t{\r\n\t\t\tthis.invalid = false;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.operation = new Operation(async signal =>\r\n\t\t\t{\r\n\t\t\t\ttry\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.invalid = !await this.function({ signal });\r\n\t\t\t\t}\r\n\t\t\t\tcatch (error)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (this.computedEnabled)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis.invalid = true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthrow error;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tawait this.operation.promise.catch(() => undefined);\r\n\t\t}\r\n\r\n\t\treturn !this.invalid;\r\n\t}\r\n\r\n\t/**\r\n\t * Resets this validator to the default validity state, then updates the ancestor validations.\r\n\t */\r\n\tpublic reset(): void\r\n\t{\r\n\t\t// Abort any pending operation.\r\n\t\tif (this.operation?.pending)\r\n\t\t{\r\n\t\t\tthis.operation.abort();\r\n\t\t}\r\n\r\n\t\tsuper.reset();\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","import { containerless, bindable } from \"aurelia-framework\";\r\nimport { Validator } from \"../../validator\";\r\nimport { ValidationReason } from \"../../validation-trigger\";\r\n\r\n/**\r\n * Represents a validator whose validity is bound to a view model property,\r\n * but not applied to the validation until the validator actually runs.\r\n * Use this to validate e.g. dependencies between inputs.\r\n */\r\n@containerless\r\nexport class CustomValidatorCustomElement extends Validator\r\n{\r\n\t/**\r\n\t * True if the validation should succeed, false if validation should fail.\r\n\t */\r\n\t@bindable\r\n\tpublic valid: boolean;\r\n\r\n\t/**\r\n\t * Called by the validation when this validator should run.\r\n\t * @param reason The reason for the validation run.\r\n\t * @returns A promise that will be resolved with true if validation succeeded, otherwise false.\r\n\t */\r\n\tpublic async validate(reason: ValidationReason): Promise\r\n\t{\r\n\t\tthis.invalid = !this.valid;\r\n\r\n\t\treturn this.valid;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","import { containerless, bindable, noView } from \"aurelia-framework\";\r\nimport { Validator } from \"../../validator\";\r\nimport { ValidationReason } from \"../../validation-trigger\";\r\n\r\n/**\r\n * Represents a validator that runs a dependent validator whenever this validator runs.\r\n * Use this to trigger validation of dependencies between inputs.\r\n */\r\n@noView\r\n@containerless\r\nexport class DependentValidatorCustomElement extends Validator\r\n{\r\n\t/**\r\n\t * The dependent validator, or validators, that should be run when this validator runs.\r\n\t * If any dependent validator is invalid, this validator will become invalid too.\r\n\t */\r\n\t@bindable\r\n\tpublic validators: Validator | Validator[] | undefined;\r\n\r\n\t/**\r\n\t * True to set the validity of this validator, based on the validity of the dependent validators, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic setValidity: boolean;\r\n\r\n\t/**\r\n\t * Called by the validation when this validator should run.\r\n\t * @param reason The reason for the validation run.\r\n\t * @returns A promise that will be resolved with true if validation succeeded, otherwise false.\r\n\t */\r\n\tpublic async validate(reason: ValidationReason): Promise\r\n\t{\r\n\t\tlet valid = false;\r\n\r\n\t\tif (this.validators == null)\r\n\t\t{\r\n\t\t\tvalid = true;\r\n\t\t}\r\n\t\telse if (this.validators instanceof Validator)\r\n\t\t{\r\n\t\t\tif (this.validators.computedEnabled)\r\n\t\t\t{\r\n\t\t\t\tvalid = await this.validators.validate(\"dependency\");\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tvalid = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (this.validators instanceof Validator)\r\n\t\t{\r\n\t\t\tconst results = await Promise.all(this.validators.filter(v => v.computedEnabled).map(v => v.validate(\"dependency\")));\r\n\r\n\t\t\tvalid = results.some(r => r);\r\n\t\t}\r\n\r\n\t\tif (this.setValidity)\r\n\t\t{\r\n\t\t\tthis.invalid = !valid;\r\n\r\n\t\t\treturn valid;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n","import { bindable, containerless } from \"aurelia-framework\";\r\nimport { Validator } from \"../../validator\";\r\nimport { ValidationReason } from \"../../validation-trigger\";\r\n\r\nconst preventDefault = (event: Event) => event.preventDefault();\r\n\r\n/**\r\n * Represents a validator that validates that a standard input element does not contain\r\n * an invalid value, as determined by the validation built into the input element.\r\n */\r\n@containerless\r\nexport class InputValidatorCustomElement extends Validator\r\n{\r\n\t/**\r\n\t * The input to validate.\r\n\t */\r\n\t@bindable\r\n\tpublic input: HTMLInputElement;\r\n\r\n\t/**\r\n\t * Called by the framework when the component is attached.\r\n\t */\r\n\tpublic async attached(): Promise\r\n\t{\r\n\t\t// Prevent the browser validation UI from appearing.\r\n\t\tthis.input.addEventListener(\"invalid\", preventDefault, true);\r\n\r\n\t\treturn super.attached();\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the component is detached.\r\n\t */\r\n\tpublic async detached(): Promise\r\n\t{\r\n\t\t// Prevent the browser validation UI from appearing.\r\n\t\tthis.input.removeEventListener(\"invalid\", preventDefault, true);\r\n\r\n\t\treturn super.attached();\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the validation when this validator should run.\r\n\t * @param reason The reason for the validation run.\r\n\t * @returns A promise that will be resolved with true if validation succeeded, otherwise false.\r\n\t */\r\n\tpublic async validate(reason: ValidationReason): Promise\r\n\t{\r\n\t\tthis.invalid = !this.input.validity.valid;\r\n\r\n\t\treturn !this.invalid;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","import { containerless } from \"aurelia-framework\";\r\nimport { Validator } from \"../../validator\";\r\nimport { ValidationReason } from \"../../validation-trigger\";\r\n\r\n/**\r\n * Represents a validator that is always invalid.\r\n * Use this to manually add validation errors, such as errors received from an API.\r\n */\r\n@containerless\r\nexport class InvalidValidatorCustomElement extends Validator\r\n{\r\n\t/**\r\n\t * Called by the validation when this validator should run.\r\n\t * @param reason The reason for the validation run.\r\n\t * @returns A promise that will be resolved with true if validation succeeded, otherwise false.\r\n\t */\r\n\tpublic async validate(reason: ValidationReason): Promise\r\n\t{\r\n\t\tthis.invalid = true;\r\n\r\n\t\treturn false;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","import { bindable, containerless } from \"aurelia-framework\";\r\nimport { Validator } from \"../../validator\";\r\nimport { ValidationReason } from \"../../validation-trigger\";\r\n\r\n/**\r\n * Represents a validator that validates that the length of\r\n * a `string`, `number`, `Array`, `Set` or `Map`, or any object that has a `length` property of type `number`,\r\n * satisfies the specified range requirements.\r\n *\r\n * Note that a value of undefined is always considered valid.\r\n */\r\n@containerless\r\nexport class LengthValidatorCustomElement extends Validator\r\n{\r\n\t/**\r\n\t * The value to validate, or undefined.\r\n\t */\r\n\t@bindable\r\n\tpublic value: { length: number } | number | any[] | Set | Map | undefined;\r\n\r\n\t/**\r\n\t * The min length, or undefined to disable this requirement.\r\n\t */\r\n\t@bindable\r\n\tpublic min: number | undefined;\r\n\r\n\t/**\r\n\t * The max length, or undefined to disable this requirement.\r\n\t */\r\n\t@bindable\r\n\tpublic max: number | undefined;\r\n\r\n\t/**\r\n\t * Called by the validation when this validator should run.\r\n\t * @param reason The reason for the validation run.\r\n\t * @returns A promise that will be resolved with true if validation succeeded, otherwise false.\r\n\t */\r\n\tpublic async validate(reason: ValidationReason): Promise\r\n\t{\r\n\t\tif (this.value == null)\r\n\t\t{\r\n\t\t\tthis.invalid = false;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tconst length =\r\n\t\t\t\tthis.value instanceof Array ? this.value.length :\r\n\t\t\t\tthis.value instanceof Set ? this.value.size :\r\n\t\t\t\tthis.value instanceof Map ? this.value.size :\r\n\t\t\t\tthis.value.toString().length;\r\n\r\n\t\t\tthis.invalid =\r\n\t\t\t\tthis.min != null && length < this.min ||\r\n\t\t\t\tthis.max != null && length > this.max;\r\n\t\t}\r\n\r\n\t\treturn !this.invalid;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","import { bindable, containerless } from \"aurelia-framework\";\r\nimport { Validator } from \"../../validator\";\r\nimport { ValidationReason } from \"../../validation-trigger\";\r\n\r\n/**\r\n * Represents a validator that validates that\r\n * a `string`\r\n * matches the specified pattern.\r\n *\r\n * Note that a value of undefined is always considered valid.\r\n */\r\n@containerless\r\nexport class PatternValidatorCustomElement extends Validator\r\n{\r\n\tprivate _pattern: RegExp | undefined;\r\n\r\n\t/**\r\n\t * The value to validate, or undefined.\r\n\t */\r\n\t@bindable\r\n\tpublic value: string | undefined;\r\n\r\n\t/**\r\n\t * The pattern to match, or undefined to disable this requirement.\r\n\t */\r\n\t@bindable\r\n\tpublic pattern: string | RegExp | undefined;\r\n\r\n\t/**\r\n\t * True to invert the validation, meaning that a valid input is one that does not match the pattern.\r\n\t */\r\n\t@bindable({ defaultValue: false })\r\n\tpublic invert: boolean;\r\n\r\n\t/**\r\n\t * Called by the validation when this validator should run.\r\n\t * @param reason The reason for the validation run.\r\n\t * @returns A promise that will be resolved with true if validation succeeded, otherwise false.\r\n\t */\r\n\tpublic async validate(reason: ValidationReason): Promise\r\n\t{\r\n\t\tif (this.value == null)\r\n\t\t{\r\n\t\t\tthis.invalid = false;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tconst match = this._pattern != null && !this._pattern.test(this.value);\r\n\r\n\t\t\tthis.invalid = this.invert ? !match : match;\r\n\t\t}\r\n\r\n\t\treturn !this.invalid;\r\n\t}\r\n\r\n\t/**\r\n\t * Called by the framework when the `pattern`property changes.\r\n\t */\r\n\tprotected patternChanged(): void\r\n\t{\r\n\t\tthis._pattern =\r\n\t\t\t!this.pattern ? undefined :\r\n\t\t\tthis.pattern instanceof RegExp ? this.pattern :\r\n\t\t\tnew RegExp(this.pattern);\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","import { bindable, containerless } from \"aurelia-framework\";\r\nimport { Validator } from \"../../validator\";\r\nimport { ValidationReason } from \"../../validation-trigger\";\r\n\r\n/**\r\n * Represents a validator that validates that\r\n * a `number`, or any object that has a `valueOf()` method that returns a `number`,\r\n * satisfies the specified range requirements.\r\n *\r\n * Note that a value of undefined is always considered valid.\r\n */\r\n@containerless\r\nexport class RangeValidatorCustomElement extends Validator\r\n{\r\n\t/**\r\n\t * True if the value is outside the range, otherwise false.\r\n\t */\r\n\tprotected invalidValue = false;\r\n\r\n\t/**\r\n\t * True if the value is not a multiple of the step size, otherwise false.\r\n\t */\r\n\tprotected invalidStep = false;\r\n\r\n\t/**\r\n\t * The value to validate, or undefined.\r\n\t */\r\n\t@bindable\r\n\tpublic value: { valueOf(): number } | undefined;\r\n\r\n\t/**\r\n\t * The min value, or undefined to disable this requirement.\r\n\t */\r\n\t@bindable\r\n\tpublic min: { valueOf(): number } | undefined;\r\n\r\n\t/**\r\n\t * The max value, or undefined to disable this requirement.\r\n\t */\r\n\t@bindable\r\n\tpublic max: { valueOf(): number } | undefined;\r\n\r\n\t/**\r\n\t * The step size of which the value must be a multiple, or undefined to disable this requirement.\r\n\t */\r\n\t@bindable\r\n\tpublic step: { valueOf(): number } | undefined;\r\n\r\n\t/**\r\n\t * True to include the min value as a valid value, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic minInclusive: boolean | undefined;\r\n\r\n\t/**\r\n\t * True to include the max value as a valid value, otherwise false.\r\n\t */\r\n\t@bindable({ defaultValue: true })\r\n\tpublic maxInclusive: boolean | undefined;\r\n\r\n\t/**\r\n\t * Called by the validation when this validator should run.\r\n\t * @param reason The reason for the validation run.\r\n\t * @returns A promise that will be resolved with true if validation succeeded, otherwise false.\r\n\t */\r\n\tpublic async validate(reason: ValidationReason): Promise\r\n\t{\r\n\t\tif (this.value == null)\r\n\t\t{\r\n\t\t\tthis.invalid = false;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tconst value = this.value.valueOf();\r\n\r\n\t\t\tthis.invalidValue =\r\n\t\t\t\tthis.min != null && (this.minInclusive ? value < this.min.valueOf() : value <= this.min.valueOf()) ||\r\n\t\t\t\tthis.max != null && (this.maxInclusive ? value > this.max.valueOf() : value >= this.max.valueOf());\r\n\r\n\t\t\tthis.invalidStep = this.step != null && value % this.step.valueOf() !== 0;\r\n\r\n\t\t\tthis.invalid = this.invalidValue || this.invalidStep;\r\n\t\t}\r\n\r\n\t\treturn !this.invalid;\r\n\t}\r\n\r\n\t/**\r\n\t * Resets this validator to the default validity state, then updates the ancestor validations.\r\n\t */\r\n\tpublic reset(): void\r\n\t{\r\n\t\tthis.invalidValue = false;\r\n\t\tthis.invalidStep = false;\r\n\r\n\t\tsuper.reset();\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","import { bindable, containerless } from \"aurelia-framework\";\r\nimport { Validator } from \"../../validator\";\r\nimport { ValidationReason } from \"../../validation-trigger\";\r\n\r\n/**\r\n * Represents a validator that validates that a value is not undefined.\r\n */\r\n@containerless\r\nexport class RequiredValidatorCustomElement extends Validator\r\n{\r\n\t/**\r\n\t * The value to validate.\r\n\t */\r\n\t@bindable\r\n\tpublic value: any;\r\n\r\n\t/**\r\n\t * Called by the validation when this validator should run.\r\n\t * @param reason The reason for the validation run.\r\n\t * @returns A promise that will be resolved with true if validation succeeded, otherwise false.\r\n\t */\r\n\tpublic async validate(reason: ValidationReason): Promise\r\n\t{\r\n\t\tthis.invalid = this.value === undefined || this.value === \"\";\r\n\r\n\t\treturn !this.invalid;\r\n\t}\r\n}\r\n","// Module\nvar code = \" \";\n// Exports\nmodule.exports = code;","type Value = Iterable | Iterable<[TKey, TValue]> | null | undefined;\r\n\r\n/**\r\n * Represents a that tests whether an item should be included in the output of the `filter` value converter.\r\n * @param item The being tested by the value converter.\r\n * @param args Any additional arguments that were passed to the value converter.\r\n * @returns True to include the item, otherwise false.\r\n */\r\nexport type FilterTestFunc = ((item: any, ...args: any[]) => boolean) | undefined;\r\n\r\n/**\r\n * Value converter that filters an iterable to only those items that pass the specified test.\r\n */\r\nexport class FilterValueConverter\r\n{\r\n\t/**\r\n\t * Converts the value for use in the view.\r\n\t * @param value The iterable containing the items.\r\n\t * @param testFunc The function that should be used to test each item, or undefined to apply no filter.\r\n\t * @param args The arguments to pass to the test function, in addition to the value being tested.\r\n\t * @returns A new iterable, containing the filtered items.\r\n\t */\r\n\tpublic toView(value: Value, testFunc: FilterTestFunc, ...args: any[]): Value\r\n\t{\r\n\t\tif (value == null || testFunc == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tif (value instanceof Array)\r\n\t\t{\r\n\t\t\treturn value.filter(v => testFunc(v, ...args));\r\n\t\t}\r\n\r\n\t\tif (value instanceof Set)\r\n\t\t{\r\n\t\t\treturn new Set(Array.from(value).filter(v => testFunc(v, ...args)));\r\n\t\t}\r\n\r\n\t\tif (value instanceof Map)\r\n\t\t{\r\n\t\t\treturn new Map(Array.from(value).filter(v => testFunc(v, ...args)));\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"The 'value' argument must be of type 'Array', 'Set' or 'Map'.\");\r\n\t}\r\n}\r\n","/**\r\n * Value converter that converts between a value and its JSON representation.\r\n */\r\nexport class JsonValueConverter\r\n{\r\n\t/**\r\n\t * Converts the value for use in the view.\r\n\t * @param value The value to convert to a JSON string.\r\n\t * @param replacer The replacer function to use.\r\n\t * @param space The number of spaces to use when indenting.\r\n\t * @param breakBeforeBlock True to add a line break before an opening brace or bracket, otherwise false.\r\n\t * @returns The JSON string representing the value.\r\n\t */\r\n\tpublic toView(value: any, replacer?: (this: any, key: string, value: any) => any, space = 4, breakBeforeBlock = true): string\r\n\t{\r\n\t\tif (value === undefined)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tlet json = JSON.stringify(value, replacer, space);\r\n\r\n\t\tif (breakBeforeBlock)\r\n\t\t{\r\n\t\t\tjson = json.replace(/^(\\s*)(.*?:) (\\{|\\[)$/m, \"$1$2\\n$1$3\");\r\n\t\t}\r\n\r\n\t\treturn json;\r\n\t}\r\n\r\n\t/**\r\n\t * Converts the value for use in the model.\r\n\t * @param value The JSON string to parse.\r\n\t * @param replacer The replacer function to use.\r\n\t * @returns The value represented by the JSON string.\r\n\t */\r\n\tpublic fromView(value: string, replacer?: (this: any, key: string, value: any) => any): any\r\n\t{\r\n\t\tif (!value)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\treturn JSON.parse(value, replacer);\r\n\t}\r\n}\r\n","import { MapObject } from \"shared/types\";\r\n\r\n/**\r\n * Represents a value converter that maps a sequence of items to a new `Array`,\r\n * containing the values of the specified property on each item in the sequence.\r\n */\r\nexport class MapValueConverter\r\n{\r\n\t/**\r\n\t * Converts the value for use in the view.\r\n\t * @param value The iterable containing the items.\r\n\t * @param key The key on each item from which to get the value.\r\n\t * @returns A new `Array` containing the values of the specified property on each item in the sequence.\r\n\t */\r\n\tpublic toView(value: Iterable, key: string | ((item: any) => any), skipUndefined?: boolean): any[];\r\n\r\n\t/**\r\n\t * Converts the value for use in the view.\r\n\t * @param value The iterable containing the items.\r\n\t * @param func The function to call with each item to get the value.\r\n\t * @returns A new `Array` containing the values of the specified property on each item in the sequence.\r\n\t */\r\n\tpublic toView(value: Iterable, func: string | ((item: any) => any), skipUndefined?: boolean): any[];\r\n\r\n\tpublic toView(value: Iterable, keyOrFunc: string | ((item: any) => any), skipUndefined = true): any[]\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tconst mappedItems: any[] = [];\r\n\r\n\t\tfor (const item of value)\r\n\t\t{\r\n\t\t\tif (item === undefined && skipUndefined)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tlet mappedItem: any;\r\n\r\n\t\t\tif (keyOrFunc instanceof Function)\r\n\t\t\t{\r\n\t\t\t\tmappedItem = keyOrFunc(item);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tmappedItem = item[keyOrFunc];\r\n\t\t\t}\r\n\r\n\t\t\tif (mappedItem === undefined && !skipUndefined)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tmappedItems.push(mappedItem);\r\n\t\t}\r\n\r\n\t\treturn mappedItems;\r\n\t}\r\n}\r\n","type Value = Iterable | Iterable<[TKey, TValue]> | null | undefined;\r\n\r\n/**\r\n * Value converter that reverses the order of the items in an iterable.\r\n */\r\nexport class ReverseValueConverter\r\n{\r\n\t/**\r\n\t * Converts the value for use in the view.\r\n\t * @param value The iterable containing the items.\r\n\t * @returns A new iterable, containing the items in reverse order.\r\n\t */\r\n\tpublic toView(value: Value): Value\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tif (value instanceof Array)\r\n\t\t{\r\n\t\t\treturn value.slice().reverse();\r\n\t\t}\r\n\r\n\t\tif (value instanceof Set)\r\n\t\t{\r\n\t\t\treturn new Set(Array.from(value).reverse());\r\n\t\t}\r\n\r\n\t\tif (value instanceof Map)\r\n\t\t{\r\n\t\t\treturn new Map(Array.from(value).reverse());\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"The 'value' argument must be of type 'Array', 'Set' or 'Map'.\");\r\n\t}\r\n}\r\n","/**\r\n * Value converter that multiplies the scales the model value by the specified factor.\r\n */\r\nexport class ScaleValueConverter\r\n{\r\n\t/**\r\n\t * Converts the value for use in the view.\r\n\t * @param value The value to scale.\r\n\t * @param factor The factor by which the value should scaled.\r\n\t * @returns The value, multiplied by the specified factor.\r\n\t */\r\n\tpublic toView(value: number | undefined | null, factor: number): number | undefined | null\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\treturn value * factor;\r\n\t}\r\n\r\n\t/**\r\n\t * Converts the value for use in the model.\r\n\t * @param value The value to scale.\r\n\t * @param factor The factor by which the value should scaled.\r\n\t * @returns The value, divided by the specified factor.\r\n\t */\r\n\tpublic fromView(value: number | undefined | null, factor: number): number | undefined | null\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\treturn value / factor;\r\n\t}\r\n}\r\n","type Value = Iterable | Iterable<[TKey, TValue]> | null | undefined;\r\n\r\n/**\r\n * Value converter that skips up to the specified number of items in an iterable.\r\n */\r\nexport class SkipValueConverter\r\n{\r\n\t/**\r\n\t * Converts the value for use in the view.\r\n\t * @param value The iterable containing the items.\r\n\t * @param count The number of items to skip, or undefined to skip no items.\r\n\t * @returns A new iterable, containing the remaining items.\r\n\t */\r\n\tpublic toView(value: Value, count: number): Value\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tif (value instanceof Array)\r\n\t\t{\r\n\t\t\treturn value.slice(count);\r\n\t\t}\r\n\r\n\t\tif (value instanceof Set)\r\n\t\t{\r\n\t\t\treturn new Set(Array.from(value).slice(count));\r\n\t\t}\r\n\r\n\t\tif (value instanceof Map)\r\n\t\t{\r\n\t\t\treturn new Map(Array.from<[TKey, TValue]>(value).slice(count));\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"The 'value' argument must be of type 'Array', 'Set' or 'Map'.\");\r\n\t}\r\n}\r\n","type Value = Iterable | Iterable<[TKey, TValue]> | null | undefined;\r\n\r\n/**\r\n * Value converter that takes at most the specified number of items from an iterable.\r\n */\r\nexport class TakeValueConverter\r\n{\r\n\t/**\r\n\t * Converts the value for use in the view.\r\n\t * @param value The iterable containing the items.\r\n\t * @param count The max number of items to take, or undefined to take all items.\r\n\t * @returns A new iterable, containing the items taken.\r\n\t */\r\n\tpublic toView(value: Value, count?: number): Value\r\n\t{\r\n\t\tif (value == null || count == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tif (count < 0)\r\n\t\t{\r\n\t\t\tthrow new Error(\"The 'count' argument must be positive.\");\r\n\t\t}\r\n\r\n\t\tif (value instanceof Array)\r\n\t\t{\r\n\t\t\treturn value.slice(0, count);\r\n\t\t}\r\n\r\n\t\tif (value instanceof Set)\r\n\t\t{\r\n\t\t\treturn new Set(Array.from(value).slice(0, count));\r\n\t\t}\r\n\r\n\t\tif (value instanceof Map)\r\n\t\t{\r\n\t\t\treturn new Map(Array.from(value).slice(0, count));\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"The 'value' argument must be of type 'Array', 'Set' or 'Map'.\");\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { DateTime, Duration } from \"luxon\";\r\n\r\n/**\r\n * Represents a value converter that gets or sets the time of the day, represented\r\n * as a `Duration` instance, of a `DateTime` instance. Use this when binding the\r\n * value of a `time-input` componet to a `DateTime` instance.\r\n */\r\n@autoinject\r\nexport class TimeOfDayValueConverter\r\n{\r\n\tprivate _dateTime: DateTime | undefined | null;\r\n\tprivate _duration: Duration | undefined | null;\r\n\r\n\t/**\r\n\t * Converts the value for use in the view.\r\n\t * @param value The value to convert.\r\n\t * @returns A `Duration` instance representing the time of day of the specified date.\r\n\t */\r\n\tpublic toView(value: DateTime | undefined | null): Duration | null | undefined\r\n\t{\r\n\t\tthis._dateTime = value;\r\n\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tconst duration = value.diff(value.startOf(\"day\")).shiftTo(\"hours\", \"minutes\", \"seconds\", \"milliseconds\");\r\n\r\n\t\treturn duration.toString() === this._duration?.toString() ? this._duration : this._duration = duration;\r\n\t}\r\n\r\n\t/**\r\n\t * Converts the value for use in the model.\r\n\t * @param value The value to convert.\r\n\t * @param date The date on which the return value should be based, or undefined to use the last converted date.\r\n\t * @returns A `DateTime` instance representing the most recent date, with the specified time of day.\r\n\t */\r\n\tpublic fromView(value: Duration | undefined | null, date?: DateTime): DateTime | null | undefined\r\n\t{\r\n\t\tif (this._dateTime == null && date == null)\r\n\t\t{\r\n\t\t\tthrow new Error(\"Cannot convert a time of day to date and time, when no date has been set.\");\r\n\t\t}\r\n\r\n\t\tif (value === undefined)\r\n\t\t{\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\tif (value === null)\r\n\t\t{\r\n\t\t\t// The value null indicates that the input is invalid, but we don't\r\n\t\t\t// to pass that to the model, as doing so would also clear the date.\r\n\t\t\treturn this._dateTime;\r\n\t\t}\r\n\r\n\t\tconst dateTime = (date ?? this._dateTime)!.startOf(\"day\").plus(value);\r\n\r\n\t\treturn dateTime.toString() === this._dateTime?.toString() ? this._dateTime : this._dateTime = dateTime;\r\n\t}\r\n}\r\n","/**\r\n * Value converter that removes leading and trailing whitespace from a string.\r\n */\r\nexport class TrimValueConverter\r\n{\r\n\t/**\r\n\t * Converts the value for use in the view.\r\n\t * @param value The string to trim.\r\n\t * @returns The trimmed string.\r\n\t */\r\n\tpublic toView(value: string): string\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\treturn value.trim();\r\n\t}\r\n}\r\n","import { FrameworkConfiguration, PLATFORM } from \"aurelia-framework\";\r\nimport { FocusService } from \"./services/focus\";\r\n\r\n/**\r\n * Configures the feature.\r\n * @param use The `FrameworkConfiguration` instance.\r\n */\r\nexport function configure(use: FrameworkConfiguration): void\r\n{\r\n\tuse.globalResources(\r\n\t[\r\n\t\t// Components\r\n\t\tPLATFORM.moduleName(\"./components/behaviors/autofocus/autofocus\"),\r\n\t\tPLATFORM.moduleName(\"./components/behaviors/empty/empty\"),\r\n\t\tPLATFORM.moduleName(\"./components/behaviors/empty-value/empty-value\"),\r\n\t\tPLATFORM.moduleName(\"./components/behaviors/forward-focus/forward-focus\"),\r\n\t\tPLATFORM.moduleName(\"./components/behaviors/intersection/intersection\"),\r\n\t\tPLATFORM.moduleName(\"./components/behaviors/scroll/scroll\"),\r\n\t\tPLATFORM.moduleName(\"./components/behaviors/scroll-sentinel/scroll-sentinel\"),\r\n\t\tPLATFORM.moduleName(\"./components/behaviors/surface/surface\"),\r\n\t\tPLATFORM.moduleName(\"./components/behaviors/trap-focus/trap-focus\"),\r\n\t\tPLATFORM.moduleName(\"./components/cards/card/card\"),\r\n\t\tPLATFORM.moduleName(\"./components/cards/card-skeleton/card-skeleton\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/buttons/select-button/select-button\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/dropdown/dropdown\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/dropdown/dropdown-icon\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/inputs/color-input/color-input\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/inputs/date-input/date-input\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/inputs/date-time-input/date-time-input\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/inputs/email-input/email-input\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/inputs/number-input/number-input\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/inputs/password-input/password-input\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/inputs/phone-input/phone-input\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/inputs/search-input/search-input\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/inputs/select-input/select-input\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/inputs/slug-input/slug-input\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/inputs/tags-input/tags-input\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/inputs/tags-input/tag\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/inputs/text-input/text-input\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/inputs/time-input/time-input\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/inputs/url-input/url-input\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/navigation/path-nav/path-nav\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/navigation/tab-nav/tab-nav\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/navigation/tab-nav/tab\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/navigation/tree-nav/tree-nav\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/pickers/color-picker/color-picker\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/pickers/date-picker/date-picker\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/pickers/item-picker/item-picker\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/pickers/item-picker/item\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/toggles/toggle-group/toggle-group\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/toggles/check-toggle/check-toggle\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/toggles/radio-toggle/radio-toggle\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/toggles/switch-toggle/switch-toggle\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/toolbar/toolbar\"),\r\n\t\tPLATFORM.moduleName(\"./components/controls/toolbar/toolbar-group\"),\r\n\t\tPLATFORM.moduleName(\"./components/data-table/data-table\"),\r\n\t\tPLATFORM.moduleName(\"./components/data-table/data-table-cell\"),\r\n\t\tPLATFORM.moduleName(\"./components/data-table/data-table-headers\"),\r\n\t\tPLATFORM.moduleName(\"./components/data-table/data-table-pager\"),\r\n\t\tPLATFORM.moduleName(\"./components/data-table/data-table-row\"),\r\n\t\tPLATFORM.moduleName(\"./components/data-table/data-table-details\"),\r\n\t\tPLATFORM.moduleName(\"./components/icons/badge/badge\"),\r\n\t\tPLATFORM.moduleName(\"./components/icons/icon/icon\"),\r\n\t\tPLATFORM.moduleName(\"./components/icons/md-icon/md-icon\"),\r\n\t\tPLATFORM.moduleName(\"./components/icons/md-icon/md-icon-stack\"),\r\n\t\tPLATFORM.moduleName(\"./components/if-environment/if-environment\"),\r\n\t\tPLATFORM.moduleName(\"./components/indicators/busy-indicator/busy-indicator\"),\r\n\t\tPLATFORM.moduleName(\"./components/indicators/empty-indicator/empty-indicator\"),\r\n\t\tPLATFORM.moduleName(\"./components/layouts/grid-layout/grid-layout\"),\r\n\t\tPLATFORM.moduleName(\"./components/layouts/list-layout/list-layout\"),\r\n\t\tPLATFORM.moduleName(\"./components/modals/modal-backdrop/modal-backdrop\"),\r\n\t\tPLATFORM.moduleName(\"./components/modals/modal-dialog/modal-dialog\"),\r\n\t\tPLATFORM.moduleName(\"./components/modals/modal-footer/modal-footer\"),\r\n\t\tPLATFORM.moduleName(\"./components/modals/modal-header/modal-header\"),\r\n\t\tPLATFORM.moduleName(\"./components/modals/modal-image/modal-image\"),\r\n\t\tPLATFORM.moduleName(\"./components/modals/modal-href/modal-href\"),\r\n\t\tPLATFORM.moduleName(\"./components/modals/modal-overlay/modal-overlay\"),\r\n\t\tPLATFORM.moduleName(\"./components/modals/modal-panel/modal-panel\"),\r\n\t\tPLATFORM.moduleName(\"./components/modals/modal-section/modal-section\"),\r\n\t\tPLATFORM.moduleName(\"./components/modals/modal-view/modal-view\"),\r\n\t\tPLATFORM.moduleName(\"./components/overlays/busy-overlay/busy-overlay\"),\r\n\t\tPLATFORM.moduleName(\"./components/page/page/page\"),\r\n\t\tPLATFORM.moduleName(\"./components/page/page-href/page-href\"),\r\n\t\tPLATFORM.moduleName(\"./components/toasts/toast/toast\"),\r\n\t\tPLATFORM.moduleName(\"./components/toasts/toast-footer/toast-footer\"),\r\n\t\tPLATFORM.moduleName(\"./components/toasts/toast-header/toast-header\"),\r\n\t\tPLATFORM.moduleName(\"./components/toasts/toast-section/toast-section\"),\r\n\t\tPLATFORM.moduleName(\"./components/toasts/toast-view/toast-view\"),\r\n\t\tPLATFORM.moduleName(\"./components/validation/validation\"),\r\n\t\tPLATFORM.moduleName(\"./components/validation/validators/async-validator/async-validator\"),\r\n\t\tPLATFORM.moduleName(\"./components/validation/validators/custom-validator/custom-validator\"),\r\n\t\tPLATFORM.moduleName(\"./components/validation/validators/dependent-validator/dependent-validator\"),\r\n\t\tPLATFORM.moduleName(\"./components/validation/validators/invalid-validator/invalid-validator\"),\r\n\t\tPLATFORM.moduleName(\"./components/validation/validators/length-validator/length-validator\"),\r\n\t\tPLATFORM.moduleName(\"./components/validation/validators/input-validator/input-validator\"),\r\n\t\tPLATFORM.moduleName(\"./components/validation/validators/pattern-validator/pattern-validator\"),\r\n\t\tPLATFORM.moduleName(\"./components/validation/validators/range-validator/range-validator\"),\r\n\t\tPLATFORM.moduleName(\"./components/validation/validators/required-validator/required-validator\"),\r\n\r\n\t\t// Converters\r\n\t\tPLATFORM.moduleName(\"./converters/filter/filter\"),\r\n\t\tPLATFORM.moduleName(\"./converters/json/json\"),\r\n\t\tPLATFORM.moduleName(\"./converters/map/map\"),\r\n\t\tPLATFORM.moduleName(\"./converters/reverse/reverse\"),\r\n\t\tPLATFORM.moduleName(\"./converters/scale/scale\"),\r\n\t\tPLATFORM.moduleName(\"./converters/skip/skip\"),\r\n\t\tPLATFORM.moduleName(\"./converters/take/take\"),\r\n\t\tPLATFORM.moduleName(\"./converters/time-of-day/time-of-day\"),\r\n\t\tPLATFORM.moduleName(\"./converters/trim/trim\")\r\n\t]);\r\n\r\n\t// Instantiate the focus service, as it needs to track keyboard and mouse events.\r\n\tuse.container.get(FocusService);\r\n}\r\n\r\n// Components\r\nexport * from \"./components/behaviors/autofocus/autofocus\";\r\nexport * from \"./components/behaviors/empty/empty\";\r\nexport * from \"./components/behaviors/empty-value/empty-value\";\r\nexport * from \"./components/behaviors/forward-focus/forward-focus\";\r\nexport * from \"./components/behaviors/intersection/intersection\";\r\nexport * from \"./components/behaviors/scroll/scroll\";\r\nexport * from \"./components/behaviors/scroll-sentinel/scroll-sentinel\";\r\nexport * from \"./components/behaviors/surface/surface\";\r\nexport * from \"./components/behaviors/trap-focus/trap-focus\";\r\nexport * from \"./components/cards/card/card\";\r\nexport * from \"./components/cards/card-skeleton/card-skeleton\";\r\nexport * from \"./components/controls/buttons/select-button/select-button\";\r\nexport * from \"./components/controls/control\";\r\nexport * from \"./components/controls/buttons/select-button/select-button\";\r\nexport * from \"./components/controls/dropdown/dropdown\";\r\nexport * from \"./components/controls/dropdown/dropdown-icon\";\r\nexport * from \"./components/controls/inputs/input\";\r\nexport * from \"./components/controls/inputs/color-input/color-input\";\r\nexport * from \"./components/controls/inputs/date-input/date-input\";\r\nexport * from \"./components/controls/inputs/date-time-input/date-time-input\";\r\nexport * from \"./components/controls/inputs/email-input/email-input\";\r\nexport * from \"./components/controls/inputs/number-input/number-input\";\r\nexport * from \"./components/controls/inputs/password-input/password-input\";\r\nexport * from \"./components/controls/inputs/phone-input/phone-input\";\r\nexport * from \"./components/controls/inputs/search-input/search-input\";\r\nexport * from \"./components/controls/inputs/select-input/select-input\";\r\nexport * from \"./components/controls/inputs/slug-input/slug-input\";\r\nexport * from \"./components/controls/inputs/tags-input/tags-input\";\r\nexport * from \"./components/controls/inputs/tags-input/tag\";\r\nexport * from \"./components/controls/inputs/text-input/text-input\";\r\nexport * from \"./components/controls/inputs/time-input/time-input\";\r\nexport * from \"./components/controls/inputs/url-input/url-input\";\r\nexport * from \"./components/controls/navigation/path-nav/path-nav\";\r\nexport * from \"./components/controls/navigation/tab-nav/tab-nav\";\r\nexport * from \"./components/controls/navigation/tab-nav/tab\";\r\nexport * from \"./components/controls/navigation/tree-nav/tree-nav\";\r\nexport * from \"./components/controls/pickers/color-picker/color-picker\";\r\nexport * from \"./components/controls/pickers/date-picker/date-picker\";\r\nexport * from \"./components/controls/pickers/item-picker/item-picker\";\r\nexport * from \"./components/controls/pickers/item-picker/item\";\r\nexport * from \"./components/controls/toggles/toggle\";\r\nexport * from \"./components/controls/toggles/toggle-group/toggle-group\";\r\nexport * from \"./components/controls/toggles/check-toggle/check-toggle\";\r\nexport * from \"./components/controls/toggles/radio-toggle/radio-toggle\";\r\nexport * from \"./components/controls/toggles/switch-toggle/switch-toggle\";\r\nexport * from \"./components/controls/toolbar/toolbar\";\r\nexport * from \"./components/controls/toolbar/toolbar-group\";\r\nexport * from \"./components/data-table/data-table\";\r\nexport * from \"./components/data-table/data-table-cell\";\r\nexport * from \"./components/data-table/data-table-headers\";\r\nexport * from \"./components/data-table/data-table-pager\";\r\nexport * from \"./components/data-table/data-table-row\";\r\nexport * from \"./components/data-table/data-table-details\";\r\nexport * from \"./components/filter/filter\";\r\nexport * from \"./components/icons/badge/badge\";\r\nexport * from \"./components/icons/icon/icon\";\r\nexport * from \"./components/icons/md-icon/md-icon\";\r\nexport * from \"./components/icons/md-icon/md-icon-stack\";\r\nexport * from \"./components/indicators/busy-indicator/busy-indicator\";\r\nexport * from \"./components/indicators/empty-indicator/empty-indicator\";\r\nexport * from \"./components/layouts/grid-layout/grid-layout\";\r\nexport * from \"./components/layouts/list-layout/list-layout\";\r\nexport * from \"./components/modals/modal-backdrop/modal-backdrop\";\r\nexport * from \"./components/modals/modal-dialog/modal-dialog\";\r\nexport * from \"./components/modals/modal-footer/modal-footer\";\r\nexport * from \"./components/modals/modal-header/modal-header\";\r\nexport * from \"./components/modals/modal-href/modal-href\";\r\nexport * from \"./components/modals/modal-overlay/modal-overlay\";\r\nexport * from \"./components/modals/modal-panel/modal-panel\";\r\nexport * from \"./components/modals/modal-section/modal-section\";\r\nexport * from \"./components/modals/modal-view/modal-view\";\r\nexport * from \"./components/overlays/busy-overlay/busy-overlay\";\r\nexport * from \"./components/page/page/page\";\r\nexport * from \"./components/page/page-href/page-href\";\r\nexport * from \"./components/toasts/toast/toast\";\r\nexport * from \"./components/toasts/toast-footer/toast-footer\";\r\nexport * from \"./components/toasts/toast-header/toast-header\";\r\nexport * from \"./components/toasts/toast-section/toast-section\";\r\nexport * from \"./components/toasts/toast-view/toast-view\";\r\nexport * from \"./components/validation/validation\";\r\nexport * from \"./components/validation/validators/async-validator/async-validator\";\r\nexport * from \"./components/validation/validators/custom-validator/custom-validator\";\r\nexport * from \"./components/validation/validators/dependent-validator/dependent-validator\";\r\nexport * from \"./components/validation/validators/invalid-validator/invalid-validator\";\r\nexport * from \"./components/validation/validators/length-validator/length-validator\";\r\nexport * from \"./components/validation/validators/input-validator/input-validator\";\r\nexport * from \"./components/validation/validators/pattern-validator/pattern-validator\";\r\nexport * from \"./components/validation/validators/range-validator/range-validator\";\r\nexport * from \"./components/validation/validators/required-validator/required-validator\";\r\n\r\n// Converters\r\nexport * from \"./converters/filter/filter\";\r\nexport * from \"./converters/json/json\";\r\nexport * from \"./converters/map/map\";\r\nexport * from \"./converters/reverse/reverse\";\r\nexport * from \"./converters/scale/scale\";\r\nexport * from \"./converters/skip/skip\";\r\nexport * from \"./converters/take/take\";\r\nexport * from \"./converters/time-of-day/time-of-day\";\r\nexport * from \"./converters/trim/trim\";\r\n\r\n// Services\r\nexport * from \"./services/focus\";\r\nexport * from \"./services/modal\";\r\nexport * from \"./services/theme\";\r\nexport * from \"./services/toast\";\r\n","import { FrameworkConfiguration } from \"aurelia-framework\";\r\nimport { DeviceService } from \"./device\";\r\nimport { HistoryHelper } from \"./history\";\r\nimport { LogNavigation } from \"./logging\";\r\nimport { SentryEvents, SentryApiHandler } from \"./sentry\";\r\n\r\n/**\r\n * Configures the feature.\r\n * @param use The `FrameworkConfiguration` instance.\r\n */\r\nexport function configure(use: FrameworkConfiguration): void\r\n{\r\n\t// Instantiate services.\r\n\tuse.container.get(DeviceService);\r\n\tuse.container.get(HistoryHelper);\r\n\tuse.container.get(LogNavigation);\r\n\tuse.container.get(SentryEvents);\r\n\tuse.container.get(SentryApiHandler);\r\n}\r\n\r\nexport * from \"./api-client\";\r\nexport * from \"./cookies\";\r\nexport * from \"./history\";\r\nexport * from \"./logging\";\r\nexport * from \"./prerender\";\r\nexport * from \"./templating\";\r\nexport * from \"./workers\";\r\n","import { textCase, TextCase } from \"shared/utilities\";\r\n\r\n/**\r\n * Represents a value converter that converts a string from one text case to another.\r\n */\r\nexport class CaseValueConverter\r\n{\r\n\t/**\r\n\t * Converts the specified strings into a single string in the specified text case.\r\n\t * @param value The strings to convert.\r\n\t * @param toTextCase The text case to which the text should be converted.\r\n\t * @param localized True to use the rules of the current locale when upper-casing or lower-casing, otherwise false. The default is false.\r\n\t * @param aggressive True to aggressively normalize casing and whitespace, false to apply only essential changes, leaving remaining characters unchanged.\r\n\t * The default is false, which means whitespace will be preserved or converted if possible, and no characters will be lower-cased when converting to\r\n\t * 'Title Case' or 'Sentence case', thus making those operations less invasive and more performant.\r\n\t * @returns The converted text.\r\n\t */\r\n\tpublic toView(value: string[], toTextCase: TextCase, localized?: boolean, aggressive?: boolean): string;\r\n\r\n\t/**\r\n\t * Converts the specified space-separated text to the specified text case.\r\n\t * @param value The space-separated text to convert.\r\n\t * @param toTextCase The text case to which the text should be converted.\r\n\t * @param localized True to use the rules of the current locale when upper-casing or lower-casing, otherwise false. The default is false.\r\n\t * @param aggressive True to aggressively normalize casing and whitespace, false to apply only essential changes, leaving remaining characters unchanged.\r\n\t * The default is false, which means whitespace will be preserved or converted if possible, and no characters will be lower-cased when converting to\r\n\t * 'Title Case' or 'Sentence case', thus making those operations less invasive and more performant.\r\n\t * @returns The converted text.\r\n\t */\r\n\tpublic toView(value: string, toTextCase: TextCase, localized?: boolean, aggressive?: boolean): string;\r\n\r\n\t/**\r\n\t * Converts the specified text from the specified text case to the specified text case.\r\n\t * @param value The text to convert.\r\n\t * @param fromTextCase The text case from which the text should be converted.\r\n\t * @param toTextCase The text case to which the text should be converted.\r\n\t * @param localized True to use the rules of the current locale when upper-casing or lower-casing, otherwise false. The default is false.\r\n\t * @param aggressive True to aggressively normalize casing and whitespace, false to apply only essential changes, leaving remaining characters unchanged.\r\n\t * The default is false, which means whitespace will be preserved or converted if possible, and no characters will be lower-cased when converting to\r\n\t * 'Title Case' or 'Sentence case', thus making those operations less invasive and more performant.\r\n\t * @returns The converted text.\r\n\t */\r\n\tpublic toView(value: string, fromTextCase: TextCase, toTextCase: TextCase, localized?: boolean, aggressive?: boolean): string;\r\n\r\n\tpublic toView(...args: any[]): string\r\n\t{\r\n\t\tif (args[0] == null)\r\n\t\t{\r\n\t\t\treturn args[0];\r\n\t\t}\r\n\r\n\t\tif (typeof args[0] === \"string\" && typeof args[2] !== \"string\")\r\n\t\t{\r\n\t\t\treturn this.toView(args[0], \"space\", args[1], args[2], args[3]);\r\n\t\t}\r\n\r\n\t\treturn textCase.apply(null, args);\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { LocaleService } from \"../../services/locale\";\r\nimport { ICurrencyValue } from \"shared/types\";\r\nimport { roundNumber } from \"shared/utilities\";\r\n\r\n// The cache in which number formats will be stored.\r\nconst numberFormatCache = new Map();\r\n\r\n/**\r\n * The supported currency display values.\r\n */\r\ntype CurrencyDisplay = \"symbol\" | \"code\" | \"name\" | \"none\";\r\n\r\n/**\r\n * Represents a value converter that formats a number value as a localized currency string.\r\n * See the `Intl.NumberFormat` API for details such as default values.\r\n */\r\n@autoinject\r\nexport class CurrencyValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param localeService The `LocaleService` instance.\r\n\t */\r\n\tpublic constructor(localeService: LocaleService)\r\n\t{\r\n\t\tthis._localeService = localeService;\r\n\t}\r\n\r\n\tprivate readonly _localeService: LocaleService;\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\"];\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized currency string with default number of fraction digits.\r\n\t * @param value The currency value to format.\r\n\t * @param currencyDisplay The dispaly format to use. The default is `symbol`.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: ICurrencyValue | undefined | null, currencyDisplay?: CurrencyDisplay): string | null | undefined;\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized currency string with the specified number of fraction digits.\r\n\t * @param value The currency value to format.\r\n\t * @param fractionDigits The number of fraction digits to use, `auto` to choose automatically, or undefined to use the default.\r\n\t * @param currencyDisplay The dispaly format to use. The default is `symbol`.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: ICurrencyValue | undefined | null, fractionDigits: \"auto\" | number | undefined, currencyDisplay?: CurrencyDisplay): string | null | undefined;\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized currency string with the specified number of fraction digits.\r\n\t * @param value The currency value to format.\r\n\t * @param minimumFractionDigits The minimum number of fraction digits to use, `auto` to choose automatically, or undefined to use the default.\r\n\t * @param maximumFractionDigits The maximum number of fraction digits to use, or undefined to use the default.\r\n\t * @param currencyDisplay The dispaly format to use. The default is `symbol`.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: ICurrencyValue | undefined | null, minimumFractionDigits: \"auto\" | number | undefined, maximumFractionDigits: number | undefined, currencyDisplay?: CurrencyDisplay): string | null | undefined;\r\n\r\n\tpublic toView(...args: any[]): string | null | undefined\r\n\t{\r\n\t\tif (args[0] == null)\r\n\t\t{\r\n\t\t\treturn args[0];\r\n\t\t}\r\n\r\n\t\tif (args[0].currencyCode == null || args[0].amount == null || isNaN(args[0].amount))\r\n\t\t{\r\n\t\t\tthrow new Error(\"Invalid currency value.\");\r\n\t\t}\r\n\r\n\t\t// Define the formatting options.\r\n\t\tconst numberFormatOptions =\r\n\t\t{\r\n\t\t\tstyle: \"currency\",\r\n\t\t\tcurrency: args[0].currencyCode,\r\n\t\t\tcurrencyDisplay:\r\n\t\t\t\ttypeof args[3] === \"string\" && args[3] !== \"none\" ? args[3] :\r\n\t\t\t\ttypeof args[2] === \"string\" && args[2] !== \"none\" ? args[2] :\r\n\t\t\t\ttypeof args[1] === \"string\" && args[1] !== \"none\" && args[1] !== \"auto\" ? args[1] :\r\n\t\t\t\tundefined\r\n\t\t};\r\n\r\n\t\t// Get the locale code, including any unicode extension.\r\n\t\tconst localeCodeWithExtension = this._localeService.locale.codeWithUnicodeExtension;\r\n\r\n\t\t// Create the format, based on what we know so far.\r\n\t\t// Note that this may not be the format we actually end up using,\r\n\t\t// but we need it to resolve the min and max fraction digits.\r\n\t\tlet numberFormat = this.getNumberFormat(localeCodeWithExtension,\r\n\t\t{\r\n\t\t\t...numberFormatOptions,\r\n\r\n\t\t\tminimumFractionDigits:\r\n\t\t\t\ttypeof args[1] === \"number\" ? args[1] :\r\n\t\t\t\tundefined,\r\n\r\n\t\t\tmaximumFractionDigits:\r\n\t\t\t\ttypeof args[2] === \"number\" ? args[2] :\r\n\t\t\t\ttypeof args[1] === \"number\" ? args[1] :\r\n\t\t\t\tundefined\r\n\t\t});\r\n\r\n\t\t// If we should format the number without any currency info,\r\n\t\t// change the formatting style to `decimal`.\r\n\t\tif (args[args.length - 1] === \"none\")\r\n\t\t{\r\n\t\t\tnumberFormatOptions.style = \"decimal\";\r\n\t\t}\r\n\r\n\t\t// Should we only show the fraction if it is non-zero?\r\n\t\tif (args[1] === \"auto\")\r\n\t\t{\r\n\t\t\t// Get the resolved format options.\r\n\t\t\tconst resolvedOptions = numberFormat.resolvedOptions();\r\n\r\n\t\t\t// Round the amount to the resolved max fraction digits.\r\n\t\t\tconst roundedAmount = roundNumber(args[0].amount, resolvedOptions.maximumFractionDigits);\r\n\r\n\t\t\t// Do we have a non-zero fraction?\r\n\t\t\tif (roundedAmount % 1 !== 0)\r\n\t\t\t{\r\n\t\t\t\t// Create a new format with the resolved max fraction digits.\r\n\t\t\t\tnumberFormat = this.getNumberFormat(localeCodeWithExtension,\r\n\t\t\t\t{\r\n\t\t\t\t\t...numberFormatOptions,\r\n\t\t\t\t\tmaximumFractionDigits: resolvedOptions.maximumFractionDigits\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t// Create a new format with zero min fraction digits.\r\n\t\t\t\tnumberFormat = this.getNumberFormat(localeCodeWithExtension,\r\n\t\t\t\t{\r\n\t\t\t\t\t...numberFormatOptions,\r\n\t\t\t\t\tminimumFractionDigits: 0\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Was the formatting style changed?\r\n\t\telse if (args[1] === \"none\")\r\n\t\t{\r\n\t\t\t// Create a new format with the modified style.\r\n\t\t\tnumberFormat = this.getNumberFormat(localeCodeWithExtension, numberFormatOptions);\r\n\t\t}\r\n\r\n\t\t// Format the value.\r\n\t\treturn numberFormat.format(args[0].amount);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets or creates the specified number format.\r\n\t * @param localeCode The locale code to use.\r\n\t * @param options The options to use.\r\n\t * @returns The specified number format.\r\n\t */\r\n\tprivate getNumberFormat(localeCode: string, options: Intl.NumberFormatOptions): Intl.NumberFormat\r\n\t{\r\n\t\tconst cacheKey = `${localeCode}|${JSON.stringify(options)}`;\r\n\t\tlet numberFormat = numberFormatCache.get(cacheKey);\r\n\r\n\t\tif (numberFormat == null)\r\n\t\t{\r\n\t\t\tnumberFormat = new Intl.NumberFormat(localeCode, options);\r\n\t\t\tnumberFormatCache.set(cacheKey, numberFormat);\r\n\t\t}\r\n\r\n\t\treturn numberFormat;\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { DateTimeRange } from \"shared/types\";\r\nimport { DateStyle, DateValueConverter } from \"../date/date\";\r\n\r\n/**\r\n * Represents a value converter that formats a date and time range value as a localized date range string.\r\n */\r\n@autoinject\r\nexport class DateRangeValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param dateValueConverter The `DateValueConverter` instance.\r\n\t */\r\n\tpublic constructor(dateValueConverter: DateValueConverter)\r\n\t{\r\n\t\tthis._dateValueConverter = dateValueConverter;\r\n\t}\r\n\r\n\tprivate readonly _dateValueConverter: DateValueConverter;\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\"];\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized date and time range string, using the specified style.\r\n\t * @param value The value to format.\r\n\t * @param style The style to use. The default is `short`.\r\n\t * @param convert True to convert to the current time zone, otherwise false. The default is true.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: DateTimeRange, style?: DateStyle, convert?: boolean): string | null | undefined\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tconst from = this._dateValueConverter.toView(value.from, style, convert);\r\n\t\tconst to = this._dateValueConverter.toView(value.to, style, convert);\r\n\r\n\t\treturn `${from || \"\"} – ${to || \"\"}`.trim();\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { DateTimeRange } from \"shared/types\";\r\nimport { DateTimeStyle, DateTimeValueConverter } from \"../date-time/date-time\";\r\nimport { TimeValueConverter } from \"../time/time\";\r\n\r\n/**\r\n * Represents a value converter that formats a date and time range value as a localized date and time range string.\r\n */\r\n@autoinject\r\nexport class DateTimeRangeValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param dateTimeValueConverter The `DateTimeValueConverter` instance.\r\n\t * @param timeValueConverter The `TimeValueConverter` instance.\r\n\t */\r\n\tpublic constructor(dateTimeValueConverter: DateTimeValueConverter, timeValueConverter: TimeValueConverter)\r\n\t{\r\n\t\tthis._dateTimeValueConverter = dateTimeValueConverter;\r\n\t\tthis._timeValueConverter = timeValueConverter;\r\n\t}\r\n\r\n\tprivate readonly _dateTimeValueConverter: DateTimeValueConverter;\r\n\tprivate readonly _timeValueConverter: TimeValueConverter;\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\"];\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized date and time range string, using the specified style.\r\n\t * @param value The value to format.\r\n\t * @param style The style to use. The default is `short`.\r\n\t * @param convert True to convert to the current time zone, otherwise false. The default is true.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: DateTimeRange, style?: DateTimeStyle, convert?: boolean): string | null | undefined\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tconst includeToDate =\r\n\t\t\tvalue.from != null &&\r\n\t\t\tvalue.to != null &&\r\n\t\t\tvalue.to.diff(value.from).as(\"day\") > 1;\r\n\r\n\t\tconst from = this._dateTimeValueConverter.toView(value.from, style, convert);\r\n\r\n\t\tconst to = includeToDate\r\n\t\t\t? this._dateTimeValueConverter.toView(value.to, style, convert)\r\n\t\t\t: this._timeValueConverter.toView(value.to, \"narrow\", convert);\r\n\r\n\t\treturn `${from || \"\"} – ${to || \"\"}`.trim();\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { DateTime, LocaleOptions, DateTimeFormatOptions } from \"luxon\";\r\nimport { LocaleService } from \"../../services/locale\";\r\n\r\n// The available formats.\r\nconst dateTimeStyles =\r\n{\r\n\t\"narrow\": DateTime.DATETIME_SHORT,\r\n\t\"short\": DateTime.DATETIME_MED,\r\n\t\"medium\": DateTime.DATETIME_FULL,\r\n\t\"long\": DateTime.DATETIME_HUGE\r\n};\r\n\r\n/**\r\n * Represents the supported date-time style values.\r\n */\r\nexport type DateTimeStyle = keyof typeof dateTimeStyles;\r\n\r\n/**\r\n * Represents a value converter that formats a date and time value as a localized date and time string.\r\n */\r\n@autoinject\r\nexport class DateTimeValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param localeService The `LocaleService` instance.\r\n\t */\r\n\tpublic constructor(localeService: LocaleService)\r\n\t{\r\n\t\tthis._localeService = localeService;\r\n\t}\r\n\r\n\tprivate readonly _localeService: LocaleService;\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\"];\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized date and time string, using the specified style.\r\n\t * @param value The value to format.\r\n\t * @param style The style to use. The default is `narrow`.\r\n\t * @param convert True to convert to the current time zone, otherwise false. The default is true.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: DateTime | undefined | null, style?: DateTimeStyle, convert = true): string | null | undefined\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\t// Get the locale code, including any unicode extension.\r\n\t\tconst localeCodeWithExtension = this._localeService.locale.codeWithUnicodeExtension;\r\n\r\n\t\tconst valueToFormat = convert ? value.toLocal() : value;\r\n\r\n\t\tconst formatOptions: LocaleOptions & DateTimeFormatOptions =\r\n\t\t{\r\n\t\t\t...dateTimeStyles[style || \"narrow\"],\r\n\t\t\tlocale: localeCodeWithExtension,\r\n\t\t\thour12: false\r\n\t\t};\r\n\r\n\t\treturn valueToFormat.toLocaleString(formatOptions)\r\n\r\n\t\t\t// HACK: Fix common format errors in the browser locale data.\r\n\t\t\t.replace(/(^|\\s)24:/, \"$100:\")\r\n\t\t\t.replace(\"24시\", \"0시\");\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { DateTime, LocaleOptions, DateTimeFormatOptions } from \"luxon\";\r\nimport { LocaleService } from \"../../services/locale\";\r\n\r\n// The available formats.\r\nconst dateStyles =\r\n{\r\n\t\"narrow\": DateTime.DATE_SHORT,\r\n\t\"short\": DateTime.DATE_MED,\r\n\t\"medium\": DateTime.DATE_FULL,\r\n\t\"long\": DateTime.DATE_HUGE\r\n};\r\n\r\n/**\r\n * Represents the supported date style values.\r\n */\r\nexport type DateStyle = keyof typeof dateStyles;\r\n\r\n/**\r\n * Represents a value converter that formats a date as a localized date string.\r\n */\r\n@autoinject\r\nexport class DateValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param localeService The `LocaleService` instance.\r\n\t */\r\n\tpublic constructor(localeService: LocaleService)\r\n\t{\r\n\t\tthis._localeService = localeService;\r\n\t}\r\n\r\n\tprivate readonly _localeService: LocaleService;\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\"];\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the date component of the specified value as a localized date string, using the specified style.\r\n\t * @param value The value to format.\r\n\t * @param style The style to use. The default is `narrow`.\r\n\t * @param convert True to convert to the current time zone, otherwise false. The default is true.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: DateTime | undefined | null, style?: DateStyle, convert = true): string | null | undefined\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\t// Get the locale code, including any unicode extension.\r\n\t\tconst localeCodeWithExtension = this._localeService.locale.codeWithUnicodeExtension;\r\n\r\n\t\tconst valueToFormat = convert ? value.toLocal() : value;\r\n\r\n\t\tconst formatOptions: LocaleOptions & DateTimeFormatOptions =\r\n\t\t{\r\n\t\t\t...dateStyles[style || \"narrow\"],\r\n\t\t\tlocale: localeCodeWithExtension\r\n\t\t};\r\n\r\n\t\treturn valueToFormat.toLocaleString(formatOptions);\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { Duration } from \"luxon\";\r\nimport { TemplateStringParser, TemplateString } from \"shared/infrastructure\";\r\nimport durationFormatStrings from \"./resources/strings/duration-format.json\";\r\n\r\n/**\r\n * Represents the supported duration style values.\r\n */\r\nexport type DurationStyle = \"narrow\" | \"long\";\r\n\r\n/**\r\n * Represents a value converter that formats a duration as a localized duration string.\r\n */\r\n@autoinject\r\nexport class DurationValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param templateStringParser The `TemplateStringParser` instance.\r\n\t */\r\n\tpublic constructor(templateStringParser: TemplateStringParser)\r\n\t{\r\n\t\tfor (const key of Object.keys(durationFormatStrings))\r\n\t\t{\r\n\t\t\tthis._formats.set(key, templateStringParser.parse(durationFormatStrings[key]));\r\n\t\t}\r\n\t}\r\n\r\n\tprivate readonly _formats = new Map();\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\"];\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized duration string.\r\n\t * @param value The value to format.\r\n\t * @param style The style to use. The default is `narrow`.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: Duration | undefined | null, style: DurationStyle = \"narrow\"): string | null | undefined\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tlet parts: any;\r\n\r\n\t\tif (style === \"narrow\")\r\n\t\t{\r\n\t\t\tparts = value.shiftTo(\"years\", \"days\", \"hours\", \"minutes\", \"seconds\").toObject();\r\n\r\n\t\t\tif (parts.years && parts.days)\r\n\t\t\t{\r\n\t\t\t\treturn this.format(style, \"years,days\", parts);\r\n\t\t\t}\r\n\r\n\t\t\tif (parts.years)\r\n\t\t\t{\r\n\t\t\t\treturn this.format(style, \"years\", parts);\r\n\t\t\t}\r\n\r\n\t\t\tif (parts.days && parts.hours)\r\n\t\t\t{\r\n\t\t\t\treturn this.format(style, \"days,hours\", parts);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (style === \"long\")\r\n\t\t{\r\n\t\t\tparts = value.shiftTo(\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\").toObject();\r\n\r\n\t\t\tif (parts.years && parts.months)\r\n\t\t\t{\r\n\t\t\t\treturn this.format(style, \"years,months\", parts);\r\n\t\t\t}\r\n\r\n\t\t\tif (parts.years)\r\n\t\t\t{\r\n\t\t\t\treturn this.format(style, \"years\", parts);\r\n\t\t\t}\r\n\r\n\t\t\tif (parts.months && parts.days)\r\n\t\t\t{\r\n\t\t\t\treturn this.format(style, \"months,days\", parts);\r\n\t\t\t}\r\n\r\n\t\t\tif (parts.months)\r\n\t\t\t{\r\n\t\t\t\treturn this.format(style, \"months\", parts);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (parts.days)\r\n\t\t{\r\n\t\t\treturn this.format(style, \"days\", parts);\r\n\t\t}\r\n\r\n\t\tif (parts.days && parts.hours)\r\n\t\t{\r\n\t\t\treturn this.format(style, \"days,hours\", parts);\r\n\t\t}\r\n\r\n\t\tif (parts.days)\r\n\t\t{\r\n\t\t\treturn this.format(style, \"days\", parts);\r\n\t\t}\r\n\r\n\t\tif (parts.hours && parts.minutes)\r\n\t\t{\r\n\t\t\treturn this.format(style, \"hours,minutes\", parts);\r\n\t\t}\r\n\r\n\t\tif (parts.hours)\r\n\t\t{\r\n\t\t\treturn this.format(style, \"hours\", parts);\r\n\t\t}\r\n\r\n\t\tif (parts.minutes && parts.seconds)\r\n\t\t{\r\n\t\t\treturn this.format(style, \"minutes,seconds\", parts);\r\n\t\t}\r\n\r\n\t\tif (parts.minutes)\r\n\t\t{\r\n\t\t\treturn this.format(style, \"minutes\", parts);\r\n\t\t}\r\n\r\n\t\tif (parts.seconds)\r\n\t\t{\r\n\t\t\treturn this.format(style, \"seconds\", parts);\r\n\t\t}\r\n\r\n\t\treturn this.format(style, \"seconds\", parts);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the localized duration string in the specified style and format,\r\n\t * based on the specified value parts.\r\n\t * @param style The style to use.\r\n\t * @param format The format to use.\r\n\t * @param parts The value parts to format.\r\n\t * @returns The localized duration string.\r\n\t */\r\n\tprivate format(style: DurationStyle, format: string, parts: object): string | undefined\r\n\t{\r\n\t\treturn this._formats.get(`${style}:${format}`)!.evaluate(parts);\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { LocaleService } from \"../../services/locale\";\r\n\r\n// The cache in which number formats will be stored.\r\nconst listFormatCache = new Map();\r\n\r\n/**\r\n * The supported list style values.\r\n */\r\nexport type ListStyle = \"narrow\" | \"short\" | \"long\";\r\n\r\n/**\r\n * The supported list type values.\r\n */\r\nexport type ListType = \"conjunction\" | \"disjunction\" | \"unit\";\r\n\r\n/**\r\n * Represents a value converter that formats a sequence of items as a string representing a localized list.\r\n * See the `Intl.ListFormat` API for details.\r\n */\r\n@autoinject\r\nexport class ListValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param localeService The `LocaleService` instance.\r\n\t */\r\n\tpublic constructor(localeService: LocaleService)\r\n\t{\r\n\t\tthis._localeService = localeService;\r\n\t}\r\n\r\n\tprivate readonly _localeService: LocaleService;\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\"];\r\n\r\n\t/**\r\n\t * Converts a value for use in the View,\r\n\t * formatting the specified sequence of items as a localized list.\r\n\t * @param value The items to format as a list.\r\n\t * @param style The list style to use. The default is `long`.\r\n\t * @param type The type of list to produce. The default is `conjunction`.\r\n\t * @returns A localized string representing the sequence of items.\r\n\t */\r\n\tpublic toView(value: Iterable | null | undefined, style: ListStyle, type: ListType): string | null | undefined\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\t// Get the locale code, including any unicode extension.\r\n\t\tconst localeCodeWithExtension = this._localeService.locale.codeWithUnicodeExtension;\r\n\r\n\t\tconst listFormat = this.getListFormat(localeCodeWithExtension,\r\n\t\t{\r\n\t\t\tstyle, type\r\n\t\t});\r\n\r\n\t\tconst stringArray = (value instanceof Array ? value : [...value]).map(item => item.toString());\r\n\r\n\t\treturn listFormat.format(stringArray);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets or creates the specified list format.\r\n\t * @param localeCode The locale code to use.\r\n\t * @param options The options to use.\r\n\t * @returns The specified list format.\r\n\t */\r\n\tprivate getListFormat(localeCode: string, options: Intl.ListFormatOptions): Intl.ListFormat\r\n\t{\r\n\t\tconst cacheKey = `${localeCode}|${JSON.stringify(options)}`;\r\n\t\tlet listFormat = listFormatCache.get(cacheKey);\r\n\r\n\t\tif (listFormat == null)\r\n\t\t{\r\n\t\t\tlistFormat = new Intl.ListFormat(localeCode, options);\r\n\t\t\tlistFormatCache.set(cacheKey, listFormat);\r\n\t\t}\r\n\r\n\t\treturn listFormat;\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { LocaleService } from \"../../services/locale\";\r\n\r\n// The cache in which number formats will be stored.\r\nconst numberFormatCache = new Map();\r\n\r\n/**\r\n * Represents a value converter that formats a number value as a localized number string.\r\n * See the `Intl.NumberFormat` API for details such as default values.\r\n */\r\n@autoinject\r\nexport class NumberValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param localeService The `LocaleService` instance.\r\n\t */\r\n\tpublic constructor(localeService: LocaleService)\r\n\t{\r\n\t\tthis._localeService = localeService;\r\n\t}\r\n\r\n\tprivate readonly _localeService: LocaleService;\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\"];\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized number string with default number of fraction digits.\r\n\t * @param value The value to format.\r\n\t * @param useGrouping True to use grouping, false to not use grouping, or undefined to use the default.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: number | undefined | null, useGrouping?: boolean): string | null | undefined;\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized number string with the specified number of fraction digits.\r\n\t * @param value The value to format.\r\n\t * @param fractionDigits The number of fraction digits to use, null to apply no limit, or undefined to use the default.\r\n\t * @param useGrouping True to use grouping, false to not use grouping, or undefined to use the default.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: number | undefined | null, fractionDigits: number | null | undefined, useGrouping?: boolean): string | null | undefined;\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized number string with the specified number of fraction digits.\r\n\t * @param value The value to format.\r\n\t * @param minimumFractionDigits The minimum number of fraction digits to use, null to apply no limit, or undefined to use the default.\r\n\t * @param maximumFractionDigits The maximum number of fraction digits to use, null to apply no limit, or undefined to use the default.\r\n\t * @param useGrouping True to use grouping, false to not use grouping, or undefined to use the default.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: number | undefined | null, minimumFractionDigits: number | undefined, maximumFractionDigits: number | undefined | null, useGrouping?: boolean): string | null | undefined;\r\n\r\n\tpublic toView(...args: any[]): string | null | undefined\r\n\t{\r\n\t\tif (args[0] == null || isNaN(args[0]))\r\n\t\t{\r\n\t\t\treturn args[0];\r\n\t\t}\r\n\r\n\t\t// Get the locale code, including any unicode extension.\r\n\t\tconst localeCodeWithExtension = this._localeService.locale.codeWithUnicodeExtension;\r\n\r\n\t\tconst numberFormat = this.getNumberFormat(localeCodeWithExtension,\r\n\t\t{\r\n\t\t\tstyle: \"decimal\",\r\n\t\t\tminimumFractionDigits: typeof args[1] === \"number\" || args[1] === null ? args[1] : undefined,\r\n\t\t\tmaximumFractionDigits: typeof args[2] === \"number\" || args.length >= 3 ? args[2] : typeof args[1] === \"number\" || args[1] === null ? args[1] : undefined,\r\n\t\t\tuseGrouping: typeof args[args.length - 1] === \"boolean\" ? args[args.length - 1] : undefined\r\n\t\t});\r\n\r\n\t\treturn numberFormat.format(args[0]);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets or creates the specified number format.\r\n\t * @param localeCode The locale code to use.\r\n\t * @param options The options to use.\r\n\t * @returns The specified number format.\r\n\t */\r\n\tprivate getNumberFormat(localeCode: string, options: Intl.NumberFormatOptions): Intl.NumberFormat\r\n\t{\r\n\t\tconst cacheKey = `${localeCode}|${JSON.stringify(options)}`;\r\n\t\tlet numberFormat = numberFormatCache.get(cacheKey);\r\n\r\n\t\tif (numberFormat == null)\r\n\t\t{\r\n\t\t\tconst resolvedOptions = { ...options };\r\n\r\n\t\t\tif (resolvedOptions.minimumFractionDigits === null)\r\n\t\t\t{\r\n\t\t\t\tresolvedOptions.minimumFractionDigits = 0;\r\n\t\t\t}\r\n\r\n\t\t\tif (resolvedOptions.maximumFractionDigits === null)\r\n\t\t\t{\r\n\t\t\t\tresolvedOptions.maximumFractionDigits = 20;\r\n\t\t\t}\r\n\r\n\t\t\tnumberFormat = new Intl.NumberFormat(localeCode, resolvedOptions);\r\n\t\t\tnumberFormatCache.set(cacheKey, numberFormat);\r\n\t\t}\r\n\r\n\t\treturn numberFormat;\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { LocaleService } from \"../../services/locale\";\r\n\r\n// The cache in which number formats will be stored.\r\nconst numberFormatCache = new Map();\r\n\r\n/**\r\n * Represents a value converter that formats a number value as a localized percent string.\r\n * See the `Intl.NumberFormat` API for details such as default values.\r\n */\r\n@autoinject\r\nexport class PercentValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param localeService The `LocaleService` instance.\r\n\t */\r\n\tpublic constructor(localeService: LocaleService)\r\n\t{\r\n\t\tthis._localeService = localeService;\r\n\t}\r\n\r\n\tprivate readonly _localeService: LocaleService;\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\"];\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized percent string with default number of fraction digits.\r\n\t * @param value The value to format.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: number | undefined | null): string | null | undefined;\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized percent string with the specified number of fraction digits.\r\n\t * @param value The value to format.\r\n\t * @param fractionDigits The number of fraction digits to use, or undefined to use the default.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: number | undefined | null, fractionDigits: number | undefined): string | null | undefined;\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized percent string with the specified number of fraction digits.\r\n\t * @param value The value to format.\r\n\t * @param minimumFractionDigits The minimum number of fraction digits to use, or undefined to use the default.\r\n\t * @param maximumFractionDigits The maximum number of fraction digits to use, or undefined to use the default.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: number | undefined | null, minimumFractionDigits: number | undefined, maximumFractionDigits: number | undefined): string | null | undefined;\r\n\r\n\tpublic toView(...args: any[]): string | null | undefined\r\n\t{\r\n\t\tif (args[0] == null || isNaN(args[0]))\r\n\t\t{\r\n\t\t\treturn args[0];\r\n\t\t}\r\n\r\n\t\t// Get the locale code, including any unicode extension.\r\n\t\tconst localeCodeWithExtension = this._localeService.locale.codeWithUnicodeExtension;\r\n\r\n\t\tconst numberFormat = this.getNumberFormat(localeCodeWithExtension,\r\n\t\t{\r\n\t\t\tstyle: \"percent\",\r\n\t\t\tminimumFractionDigits: args[1],\r\n\t\t\tmaximumFractionDigits: args.length > 2 ? args[2] : args[1]\r\n\t\t});\r\n\r\n\t\treturn numberFormat.format(args[0]);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets or creates the specified number format.\r\n\t * @param localeCode The locale code to use.\r\n\t * @param options The options to use.\r\n\t * @returns The specified number format.\r\n\t */\r\n\tprivate getNumberFormat(localeCode: string, options: Intl.NumberFormatOptions): Intl.NumberFormat\r\n\t{\r\n\t\tconst cacheKey = `${localeCode}|${JSON.stringify(options)}`;\r\n\t\tlet numberFormat = numberFormatCache.get(cacheKey);\r\n\r\n\t\tif (numberFormat == null)\r\n\t\t{\r\n\t\t\tnumberFormat = new Intl.NumberFormat(localeCode, options);\r\n\t\t\tnumberFormatCache.set(cacheKey, numberFormat);\r\n\t\t}\r\n\r\n\t\treturn numberFormat;\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { IPhoneNumber } from \"shared/types\";\r\n\r\nimport { parsePhoneNumber } from \"libphonenumber-js/min\";\r\n\r\n/**\r\n * Represents the supported phone number style values.\r\n */\r\nexport type PhoneStyle = \"national\" | \"international\" | \"e.164\" | \"rfc3966\" | \"idd\";\r\n\r\n/**\r\n * Represents a value converter that formats a phone number according to its country.\r\n */\r\n@autoinject\r\nexport class PhoneValueConverter\r\n{\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the value as a phone number, with or without the country calling code.\r\n\t * @param value The value to format.\r\n\t * @param style The style to use. The default is `international`.\r\n\t * @returns A string representing the formatted phone number.\r\n\t */\r\n\tpublic toView(value: IPhoneNumber | string | undefined | null, style: PhoneStyle = \"international\"): string | null | undefined\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tlet valueToFormat: string;\r\n\r\n\t\tif (typeof value === \"string\")\r\n\t\t{\r\n\t\t\tvalueToFormat = value;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tvalueToFormat = \"\";\r\n\r\n\t\t\tif (value.countryCallingCode)\r\n\t\t\t{\r\n\t\t\t\tvalueToFormat += `+${value.countryCallingCode} `;\r\n\t\t\t}\r\n\r\n\t\t\tif (value.nationalNumber)\r\n\t\t\t{\r\n\t\t\t\tvalueToFormat += value.nationalNumber;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\ttry\r\n\t\t{\r\n\t\t\tconst phoneNumber = parsePhoneNumber(valueToFormat, (value as any).countryCode);\r\n\r\n\t\t\treturn phoneNumber.format(style.toUpperCase() as any);\r\n\t\t}\r\n\t\tcatch (error)\r\n\t\t{\r\n\t\t\tconsole.error(error);\r\n\r\n\t\t\treturn valueToFormat;\r\n\t\t}\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { LocaleService } from \"../../services/locale\";\r\n\r\n// The cache in which plural rules will be stored.\r\nconst pluralRulesCache = new Map();\r\n\r\n/**\r\n * Represents a value converter that selects the appropiate form of a string, based on the plural category of a number.\r\n */\r\n@autoinject\r\nexport class PluralValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param localeService The `LocaleService` instance.\r\n\t */\r\n\tpublic constructor(localeService: LocaleService)\r\n\t{\r\n\t\tthis._localeService = localeService;\r\n\t}\r\n\r\n\tprivate readonly _localeService: LocaleService;\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\"];\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * selecting the appropiate form of the specified string, based on the plural category of the specified number.\r\n\t * @param value The number for which the plural category will be determined.\r\n\t * @param strings The plural forms of the string, listed in the order specified for the locale.\r\n\t * @returns The appropiate form of the string.\r\n\t */\r\n\tpublic toView(value: number | null | undefined, ...strings: string[]): string | null | undefined\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\t// Get the locale code, including any unicode extension.\r\n\t\tconst localeCodeWithExtension = this._localeService.locale.codeWithUnicodeExtension;\r\n\r\n\t\tconst pluralRules = this.getPluralRules(localeCodeWithExtension);\r\n\t\tconst pluralCategories = pluralRules.resolvedOptions().pluralCategories;\r\n\r\n\t\tif (strings.length !== pluralCategories.length)\r\n\t\t{\r\n\t\t\tthrow new Error(\"The number of arguments do not match the number of plural forms for the current locale.\");\r\n\t\t}\r\n\r\n\t\tconst pluralCategory = pluralRules.select(value);\r\n\t\tconst pluralCategoryIndex = pluralCategories.indexOf(pluralCategory);\r\n\r\n\t\treturn strings[pluralCategoryIndex];\r\n\t}\r\n\r\n\t/**\r\n\t * Gets or creates the specified plural rules.\r\n\t * @param localeCode The locale code to use.\r\n\t * @returns The specified plural rules.\r\n\t */\r\n\tprivate getPluralRules(localeCode: string): Intl.PluralRules\r\n\t{\r\n\t\tconst cacheKey = `${localeCode}`;\r\n\t\tlet pluralRules = pluralRulesCache.get(cacheKey);\r\n\r\n\t\tif (pluralRules == null)\r\n\t\t{\r\n\t\t\tpluralRules = new Intl.PluralRules(localeCode);\r\n\t\t\tpluralRulesCache.set(cacheKey, pluralRules);\r\n\t\t}\r\n\r\n\t\treturn pluralRules;\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { DateTime, ToRelativeCalendarOptions } from \"luxon\";\r\nimport { LocaleService } from \"../../services/locale\";\r\n\r\n/**\r\n * Represents a value converter that formats a date as a localized, relative date string.\r\n */\r\n@autoinject\r\nexport class RelativeDateValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param localeService The `LocaleService` instance.\r\n\t */\r\n\tpublic constructor(localeService: LocaleService)\r\n\t{\r\n\t\tthis._localeService = localeService;\r\n\t}\r\n\r\n\tprivate readonly _localeService: LocaleService;\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\", \"time-changed\"];\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized, relative date string.\r\n\t * @param value The value to format.\r\n\t * @returns A localized string representing the value, relative to the current date.\r\n\t */\r\n\tpublic toView(value: DateTime | undefined | null): string | null | undefined\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\t// Get the locale code, including any unicode extension.\r\n\t\tconst localeCodeWithExtension = this._localeService.locale.codeWithUnicodeExtension;\r\n\r\n\t\tconst formatOptions: ToRelativeCalendarOptions =\r\n\t\t{\r\n\t\t\tlocale: localeCodeWithExtension\r\n\t\t};\r\n\r\n\t\treturn value.toRelativeCalendar(formatOptions);\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { DateTime, ToRelativeOptions, ToRelativeUnit } from \"luxon\";\r\nimport { LocaleService } from \"../../services/locale\";\r\n\r\n/**\r\n * Represents a value converter that formats a date as a localized, relative time string.\r\n */\r\n@autoinject\r\nexport class RelativeTimeValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param localeService The `LocaleService` instance.\r\n\t */\r\n\tpublic constructor(localeService: LocaleService)\r\n\t{\r\n\t\tthis._localeService = localeService;\r\n\t}\r\n\r\n\tprivate readonly _localeService: LocaleService;\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\", \"time-changed\"];\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized, relative time string.\r\n\t * @param value The value to format.\r\n\t * @param unit The unit to use. The default is choosen automatically based on the value.\r\n\t * @param padding The padding in milliseconds, used when determining when to round the result up or down. The default is 100.\r\n\t * @returns A localized string representing the value, relative to the current time.\r\n\t */\r\n\tpublic toView(value: DateTime | undefined | null, unit?: ToRelativeUnit, padding?: number): string | null | undefined\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\t// Get the locale code, including any unicode extension.\r\n\t\tconst localeCodeWithExtension = this._localeService.locale.codeWithUnicodeExtension;\r\n\r\n\t\tconst formatOptions: ToRelativeOptions =\r\n\t\t{\r\n\t\t\tlocale: localeCodeWithExtension,\r\n\t\t\tunit,\r\n\t\t\tpadding: padding != null ? padding : 100\r\n\t\t};\r\n\r\n\t\treturn value.toRelative(formatOptions);\r\n\t}\r\n}\r\n","import { MapObject } from \"shared/types\";\r\n\r\n/**\r\n * Represents a value converter that takes a key, and selects the corresponding value\r\n * from a `Map`, `Object` or `Array`, or a default value, if specified. Use this to\r\n * e.g. choose a word based on the grammatical gender of another word.\r\n */\r\nexport class SelectValueConverter\r\n{\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * selecting the value for the specified key, or the default value, if specified,\r\n\t * @param key The key for which a value should be selected.\r\n\t * @param values The values from which to select.\r\n\t * @returns The value for the specified key, or the default value, if specified.\r\n\t * @throws If the key is not found in `values` and no `defaultValue` is specified.\r\n\t */\r\n\tpublic toView(key: any, values: Map | MapObject | T[], defaultValue?: T): T\r\n\t{\r\n\t\tif (values == null)\r\n\t\t{\r\n\t\t\tthrow new Error(\"The 'values' argument is required.\");\r\n\t\t}\r\n\r\n\t\tif (values instanceof Map)\r\n\t\t{\r\n\t\t\tif (values.has(key))\r\n\t\t\t{\r\n\t\t\t\treturn values.get(key)!;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif (key in values)\r\n\t\t\t{\r\n\t\t\t\treturn (values as any)[key];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (defaultValue !== undefined)\r\n\t\t{\r\n\t\t\treturn defaultValue;\r\n\t\t}\r\n\r\n\t\tthrow new Error(`Could not find a value for the key '${key}' and no default is specified.`);\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { DateTimeRange, TimeRange } from \"shared/types\";\r\nimport { TimeValueConverter } from \"../time/time\";\r\n\r\n/**\r\n * Represents a value converter that formats a date and time range value as a localized date range string.\r\n */\r\n@autoinject\r\nexport class TimeRangeValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param timeValueConverter The `TimeValueConverter` instance.\r\n\t */\r\n\tpublic constructor(timeValueConverter: TimeValueConverter)\r\n\t{\r\n\t\tthis._timeValueConverter = timeValueConverter;\r\n\t}\r\n\r\n\tprivate readonly _timeValueConverter: TimeValueConverter;\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\"];\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the specified value as a localized date and time range string, using the specified style.\r\n\t * @param value The value to format.\r\n\t * @param style The style to use. The default is `short`.\r\n\t * @param convert True to convert to the current time zone, otherwise false. The default is true.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: DateTimeRange | TimeRange, convert?: boolean): string | null | undefined\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tconst from = this._timeValueConverter.toView(value.from, \"narrow\", convert);\r\n\t\tconst to = this._timeValueConverter.toView(value.to, \"narrow\", convert);\r\n\r\n\t\treturn `${from || \"\"} – ${to || \"\"}`.trim();\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { DateTime, LocaleOptions, DateTimeFormatOptions, Duration } from \"luxon\";\r\nimport { LocaleService } from \"../../services/locale\";\r\n\r\n// The available formats.\r\nconst timeStyles =\r\n{\r\n\t\"narrow\": DateTime.TIME_SIMPLE,\r\n\t\"short\": DateTime.TIME_WITH_SECONDS,\r\n\t\"medium\": DateTime.TIME_WITH_SHORT_OFFSET,\r\n\t\"long\": DateTime.TIME_WITH_LONG_OFFSET\r\n};\r\n\r\n/**\r\n * Represents the supported time style values.\r\n */\r\nexport type TimeStyle = keyof typeof timeStyles;\r\n\r\n/**\r\n * Represents a value converter that formats a date as a localized date string.\r\n */\r\n@autoinject\r\nexport class TimeValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param localeService The `LocaleService` instance.\r\n\t */\r\n\tpublic constructor(localeService: LocaleService)\r\n\t{\r\n\t\tthis._localeService = localeService;\r\n\t}\r\n\r\n\tprivate readonly _localeService: LocaleService;\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\"];\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the time component of the specified value as a localized time string.\r\n\t * @param value The value to format.\r\n\t * @param style The style to use. The default is `narrow`.\r\n\t * @param convert True to convert to the current time zone, otherwise false. The default is true.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: DateTime | Duration | undefined | null, style?: TimeStyle, convert = true): string | null | undefined\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\t// Get the locale code, including any unicode extension.\r\n\t\tconst localeCodeWithExtension = this._localeService.locale.codeWithUnicodeExtension;\r\n\r\n\t\tconst valueToFormat =\r\n\t\t\tvalue instanceof Duration ? DateTime.utc().startOf(\"day\").plus(value) :\r\n\t\t\tvalue instanceof DateTime && convert ? value.toLocal() : value;\r\n\r\n\t\tconst formatOptions: LocaleOptions & DateTimeFormatOptions =\r\n\t\t{\r\n\t\t\t...timeStyles[style || \"narrow\"],\r\n\t\t\tlocale: localeCodeWithExtension,\r\n\t\t\thour12: false\r\n\t\t};\r\n\r\n\t\treturn valueToFormat.toLocaleString(formatOptions)\r\n\r\n\t\t\t// HACK: Fix common format errors in the browser locale data.\r\n\t\t\t.replace(/(^|\\s)24:/, \"$100:\")\r\n\t\t\t.replace(\"24시\", \"0시\");\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { DateTime } from \"luxon\";\r\nimport { WeekdayValueConverter, WeekdayStyle } from \"../weekday/weekday\";\r\nimport { ListValueConverter } from \"../list/list\";\r\nimport { textCase } from \"shared/utilities\";\r\n\r\n/**\r\n * Represents a value converter that formats a sequence of dates or ISO weekday numbers as a localized sequence of weekday names.\r\n */\r\n@autoinject\r\nexport class WeekdayListValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param weekdayValueConverter The `WeekdayValueConverter` instance.\r\n\t * @param listValueConverter The `ListValueConverter` instance.\r\n\t */\r\n\tpublic constructor(weekdayValueConverter: WeekdayValueConverter, listValueConverter: ListValueConverter)\r\n\t{\r\n\t\tthis._weekdayValueConverter = weekdayValueConverter;\r\n\t\tthis._listValueConverter = listValueConverter;\r\n\t}\r\n\r\n\tprivate readonly _weekdayValueConverter: WeekdayValueConverter;\r\n\tprivate readonly _listValueConverter: ListValueConverter;\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\"];\r\n\r\n\t/**\r\n\t * Converts a value for use in the View,\r\n\t * formatting the specified sequence of dates or ISO weekday numbers as a localized sequence of weekday names, using the specified style.\r\n\t * @param value The items to format as a list.\r\n\t * @param style The style to use. The default is `long`.\r\n\t * @param convert True to convert to the current time zone, otherwise false. The default is true.\r\n\t * @returns A localized string representing the sequence of items.\r\n\t */\r\n\tpublic toView(value: (DateTime | number)[] | undefined | null, style: WeekdayStyle = \"long\", convert = true): string | null | undefined\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\treturn this._listValueConverter.toView(value.map(v => textCase([this._weekdayValueConverter.toView(v, style, convert)!], \"sentence\")), \"short\", \"unit\");\r\n\t}\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport { DateTime, LocaleOptions, DateTimeFormatOptions, Info } from \"luxon\";\r\nimport { LocaleService } from \"../../services/locale\";\r\n\r\n/**\r\n * Represents the supported weekday style values.\r\n */\r\nexport type WeekdayStyle = \"narrow\" | \"short\" | \"long\";\r\n\r\n/**\r\n * Represents a value converter that formats a date or ISO weekday number as a localized weekday string.\r\n */\r\n@autoinject\r\nexport class WeekdayValueConverter\r\n{\r\n\t/**\r\n\t * Creates a new instance of the type.\r\n\t * @param localeService The `LocaleService` instance.\r\n\t */\r\n\tpublic constructor(localeService: LocaleService)\r\n\t{\r\n\t\tthis._localeService = localeService;\r\n\t}\r\n\r\n\tprivate readonly _localeService: LocaleService;\r\n\r\n\t/**\r\n\t * The signals that should trigger a binding update.\r\n\t */\r\n\tpublic readonly signals = [\"locale-changed\"];\r\n\r\n\t/**\r\n\t * Converts the value for use in the view,\r\n\t * formatting the value as a localized weekday, using the specified style.\r\n\t * @param value The value to format, which may be a `DateTime` or an ISO weekday number in the range [1, 7].\r\n\t * @param style The style to use. The default is `long`.\r\n\t * @param convert True to convert to the current time zone, otherwise false. The default is true.\r\n\t * @returns A localized string representing the value.\r\n\t */\r\n\tpublic toView(value: DateTime | number | undefined | null, style: WeekdayStyle = \"long\", convert = true): string | null | undefined\r\n\t{\r\n\t\tif (value == null)\r\n\t\t{\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tif (typeof value === \"number\")\r\n\t\t{\r\n\t\t\treturn Info.weekdays(style)[value - 1];\r\n\t\t}\r\n\r\n\t\t// Get the locale code, including any unicode extension.\r\n\t\tconst localeCodeWithExtension = this._localeService.locale.codeWithUnicodeExtension;\r\n\r\n\t\tconst valueToFormat = convert ? value.toLocal() : value;\r\n\r\n\t\tconst formatOptions: LocaleOptions & DateTimeFormatOptions =\r\n\t\t{\r\n\t\t\tlocale: localeCodeWithExtension,\r\n\t\t\tweekday: style\r\n\t\t};\r\n\r\n\t\treturn valueToFormat.toLocaleString(formatOptions);\r\n\t}\r\n}\r\n","import { FrameworkConfiguration, PLATFORM, signalBindings } from \"aurelia-framework\";\r\n\r\n/**\r\n * Configures the feature.\r\n * @param use The `FrameworkConfiguration` instance.\r\n */\r\nexport function configure(use: FrameworkConfiguration): void\r\n{\r\n\tuse.globalResources(\r\n\t[\r\n\t\t// Converters.\r\n\t\tPLATFORM.moduleName(\"./converters/case/case\"),\r\n\t\tPLATFORM.moduleName(\"./converters/currency/currency\"),\r\n\t\tPLATFORM.moduleName(\"./converters/date/date\"),\r\n\t\tPLATFORM.moduleName(\"./converters/date-range/date-range\"),\r\n\t\tPLATFORM.moduleName(\"./converters/date-time/date-time\"),\r\n\t\tPLATFORM.moduleName(\"./converters/date-time-range/date-time-range\"),\r\n\t\tPLATFORM.moduleName(\"./converters/duration/duration\"),\r\n\t\tPLATFORM.moduleName(\"./converters/list/list\"),\r\n\t\tPLATFORM.moduleName(\"./converters/number/number\"),\r\n\t\tPLATFORM.moduleName(\"./converters/percent/percent\"),\r\n\t\tPLATFORM.moduleName(\"./converters/plural/plural\"),\r\n\t\tPLATFORM.moduleName(\"./converters/phone/phone\"),\r\n\t\tPLATFORM.moduleName(\"./converters/relative-date/relative-date\"),\r\n\t\tPLATFORM.moduleName(\"./converters/relative-time/relative-time\"),\r\n\t\tPLATFORM.moduleName(\"./converters/select/select\"),\r\n\t\tPLATFORM.moduleName(\"./converters/time/time\"),\r\n\t\tPLATFORM.moduleName(\"./converters/time-range/time-range\"),\r\n\t\tPLATFORM.moduleName(\"./converters/weekday/weekday\"),\r\n\t\tPLATFORM.moduleName(\"./converters/weekday-list/weekday-list\")\r\n\t]);\r\n\r\n\t// Signal time-dependent value converters to update every second.\r\n\tsetInterval(() => signalBindings(\"time-changed\"), 1000);\r\n}\r\n\r\n// Converters.\r\nexport * from \"./converters/case/case\";\r\nexport * from \"./converters/currency/currency\";\r\nexport * from \"./converters/date/date\";\r\nexport * from \"./converters/date-range/date-range\";\r\nexport * from \"./converters/date-time/date-time\";\r\nexport * from \"./converters/date-time-range/date-time-range\";\r\nexport * from \"./converters/duration/duration\";\r\nexport * from \"./converters/list/list\";\r\nexport * from \"./converters/number/number\";\r\nexport * from \"./converters/percent/percent\";\r\nexport * from \"./converters/plural/plural\";\r\nexport * from \"./converters/phone/phone\";\r\nexport * from \"./converters/relative-date/relative-date\";\r\nexport * from \"./converters/relative-time/relative-time\";\r\nexport * from \"./converters/select/select\";\r\nexport * from \"./converters/time/time\";\r\nexport * from \"./converters/time-range/time-range\";\r\nexport * from \"./converters/weekday/weekday\";\r\nexport * from \"./converters/weekday-list/weekday-list\";\r\n\r\n// Services.\r\nexport * from \"./services/locale\";\r\nexport * from \"./services/currency\";\r\n\r\n// Types.\r\nexport * from \"./types/date-format\";\r\nexport * from \"./types/number-format\";\r\nexport * from \"./types/time-format\";\r\n"],"sourceRoot":""}