{"version":3,"file":"app-a2c80d4a.981ca8458d389c9a476a.bundle.js","mappings":";;;;;;;;;;;;;;;;;;;;AAAA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;;AAGA;AACA;AASA;AAHA;AAAA;AAOA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAGA;AACA;AACA;AACA;;AAGA;AACA;AACA;AAIA;AAEA;AACA;AAIA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChGA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AAAA;;AAIA;AACA;AAiBA;AAdA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;;AAGA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAGA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAAA;AAAA;AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;AC7QA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAKA;AACA;;AAGA;AACA;AAQA;AALA;AAAA;AACA;AACA;AAIA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;AAGA;AACA;AAEA;AACA;AAEA;AAEA;AAAA;AAAA;AAAA;AACA;;AAGA;AACA;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AAAA;;AAIA;AACA;AAqBA;AAXA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAWA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAAA;AAAA;AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChOA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AAIA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;;AAIA;AACA;AA6BA;AAlBA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAAA;AAAA;AAAA;AACA;AACA;;AAGA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;;;;;;;;;;;AC7cA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA","sources":["webpack://latinera/./sources/screens/public/confirm-action.js","webpack://latinera/./sources/screens/public/log-in.js","webpack://latinera/./sources/screens/public/logged-out.js","webpack://latinera/./sources/screens/public/reset-password.js","webpack://latinera/./sources/screens/public/sign-up.js","webpack://latinera/./sources/screens/public/confirm-action.html","webpack://latinera/./sources/screens/public/log-in.html","webpack://latinera/./sources/screens/public/logged-out.html","webpack://latinera/./sources/screens/public/reset-password.html","webpack://latinera/./sources/screens/public/sign-up.html"],"sourcesContent":["// Define the view-model for the \"confirm-action\" screen\n\n// Import library modules\nimport { inject } from \"aurelia-framework\";\nimport { I18N } from \"aurelia-i18n\";\n\n// Import utility modules\nimport { generate as generateArray } from \"utilities/array\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { localesData } from \"parameters/locale\";\n\n// Import service modules\nimport UserService from \"services/user\";\n\n// Define internal parameters\nconst actionVerbs = [ \"accept\", \"refuse\" ];\nconst actionNames = [ \"activate-user\", \"reset-pwd\", \"delete-user\" ];\nconst actionStatuses = [ \"success\", \"failure\" ];\nconst uiLocaleCodes = localesData\n .filter(({ uiEnabled }) => uiEnabled)\n .map(({ code: localeCode }) => localeCode);\n\n\n// Export the \"ConfirmAction\" class\n@inject(\n I18N,\n UserService\n)\nexport class ConfirmAction {\n\n // Local attributes\n i18nParams = i18nParams;\n\n constructor(\n i18n,\n userService\n ) {\n this.i18n = i18n;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n canActivate(actionData) {\n const {\n av: actionVerb = \"\",\n an: actionName = \"\",\n as: actionStatus = \"\",\n ul: uiLocaleCode = this.userService.uiLocaleCode\n } = actionData;\n return actionVerbs.includes(actionVerb) &&\n actionNames.includes(actionName) &&\n actionStatuses.includes(actionStatus) &&\n uiLocaleCodes.includes(uiLocaleCode);\n }\n\n async activate(actionData) {\n const {\n av: actionVerb = \"\",\n an: actionName = \"\",\n as: actionStatus = \"\",\n ul: uiLocaleCode = this.userService.uiLocaleCode\n } = actionData;\n await this.i18n.setLocale(uiLocaleCode);\n this.actionVerb = actionVerb;\n this.actionName = actionName;\n this.actionStatus = actionStatus;\n const baseI18nKey =\n `screens:confirmAction.${actionVerb}.${actionName}.${actionStatus}`;\n this.alertI18nKey = `${baseI18nKey}.alert`;\n this.actionI18nKeys = generateArray(10, (_, index) => index)\n .map(index => `${baseI18nKey}.action.${index}`)\n .filter(actionI18nKey => {\n const actionString = this.i18n.tr(actionI18nKey);\n return !actionString.match(/\\d$/);\n });\n }\n\n\n // Getter and setter methods\n get displaySignUpButton() {\n return this.actionName === \"activate-user\" && (\n (this.actionVerb === \"refuse\" && this.actionStatus === \"success\") ||\n (this.actionVerb === \"accept\" && this.actionStatus === \"failure\")\n );\n }\n\n get displayLogInButton() {\n return (this.actionName === \"activate-user\" && (\n (this.actionVerb === \"refuse\" && this.actionStatus === \"failure\") ||\n (this.actionVerb === \"accept\" && this.actionStatus === \"success\")\n )) || (this.actionName === \"reset-pwd\");\n }\n\n}\n","// Define the view-model for the \"log-in\" screen\n\n// Import library modules\nimport { Validator, ValidateResult } from \"aurelia-validation\";\nimport { computedFrom, inject } from \"aurelia-framework\";\n\n// Import utility modules\nimport { setEventHandlers, unsetEventHandlers } from \"utilities/event\";\nimport { unsetProperties } from \"utilities/object\";\nimport { pause } from \"utilities/promise\";\nimport { clone } from \"utilities/etc\";\nimport { \n capitalizeFirst,\n normalizeEmailAddress \n} from \"utilities/string\";\n\n// Import parameter modules\nimport { rawLogInFormData as defaultRawFormData } from \"parameters/user\";\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { runMode as defaultRunMode } from \"parameters/environment\";\nimport { \n processInputFieldBlurEventAfterMs,\n mockLoadingDataDurationMs\n} from \"parameters/time\";\n\n// Import service modules\nimport EventService from \"services/event\";\nimport UserService from \"services/user\";\n\n// Define internal parameters\nconst allowedUniqueIds = [ \"emailAddress\", \"password\" ]\n .map(allowedUniqueId => `logIn${capitalizeFirst(allowedUniqueId)}`);\nconst eventsData = [\n { name: \"runModeChanged\" }\n];\n\n\n// Export the \"LogIn\" class\n@inject(Validator, EventService, UserService)\nexport class LogIn {\n\n // Local attributes\n emailAddress = \"\";\n formData = {};\n rawFormData = clone(defaultRawFormData);\n isFormDataValid = true;\n savedFormData = null;\n authUsersStatsData = null;\n serverErrorsData = [];\n formErrorsData = [];\n isLoadingData = false;\n fieldsEditedStatuses = {};\n i18nParams = i18nParams;\n runMode = defaultRunMode;\n\n constructor(validator, eventService, userService) {\n this.validator = validator;\n this.eventService = eventService;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n activate({ emailAddress = \"\" }) {\n if (emailAddress) {\n console.info(`Using URL-provided e-mail address \"${emailAddress}\"`);\n this.emailAddress = emailAddress;\n }\n }\n\n async bind() {\n this.eventsSubscriptions = setEventHandlers.call(this, {\n entityName: \"logIn\",\n eventService: this.eventService,\n eventsData\n });\n\n // Fetch auth users' stats\n this.authUsersStatsData = await this.getAuthUsersStats();\n\n // Fills up the emailAddress field passed-in as parameter\n if (this.emailAddress) {\n this.rawFormData.emailAddress = this.emailAddress;\n }\n await this.validateFormData();\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Getter and setter methods\n @computedFrom(\"authUsersStatsData.isLogInEnabled\")\n get isLogInEnabled() {\n const { isLogInEnabled = false } = this.authUsersStatsData || {};\n return isLogInEnabled;\n }\n @computedFrom(\"authUsersStatsData.authUsersCount\")\n get authUsersCount() {\n const { authUsersCount = 0 } = this.authUsersStatsData || {};\n return authUsersCount;\n }\n @computedFrom(\"authUsersStatsData.maxAuthUsersCount\")\n get maxAuthUsersCount() {\n const { maxAuthUsersCount = 0 } = this.authUsersStatsData || {};\n return maxAuthUsersCount;\n }\n @computedFrom(\"authUsersCount\", \"maxAuthUsersCount\", \"isLogInEnabled\")\n get logInDisabledAlertBaseI18nKey() {\n if (!this.isLogInEnabled) {\n return this.authUsersCount <= this.maxAuthUsersCount ?\n \"screens:logIn.alerts.logInDisabledForMaintenance\" : \n \"screens:logIn.alerts.logInDisabledForHeavyLoad\";\n }\n return \"\";\n }\n @computedFrom(\"logInDisabledAlertBaseI18nKey\")\n get logInDisabledAlertTitleI18nKey() {\n return `${this.logInDisabledAlertBaseI18nKey}.title`;\n }\n @computedFrom(\"logInDisabledAlertBaseI18nKey\")\n get logInDisabledAlertBodyI18nKey() {\n return `${this.logInDisabledAlertBaseI18nKey}.body`;\n }\n\n @computedFrom(\"fieldsEditedStatuses.logInEmailAddress\")\n get showEmailAddressDanger() {\n return this.fieldsEditedStatuses.logInEmailAddress || false;\n }\n @computedFrom(\"fieldsEditedStatuses.logInPassword\")\n get showPasswordDanger() {\n return this.fieldsEditedStatuses.logInPassword || false;\n }\n\n\n // Core methods\n async getAuthUsersStats() {\n this.isLoadingData = true;\n if ([\"dev\"].includes(this.runMode)) {\n await pause(mockLoadingDataDurationMs);\n }\n let authUsersStatsData;\n try {\n authUsersStatsData = await this.userService.getAuthUsersStats();\n } catch(error) {\n console.warn(`Error getting auth users' stats from server`);\n return null;\n }\n console.info(`Fetched auth users' stats from server`);\n this.isLoadingData = false;\n return authUsersStatsData;\n }\n\n async validateFormData() {\n this.formData = unsetProperties(this.rawFormData, [\"_schemaId\"]);\n this.formErrorsData = await this.validator.validateObject(this.rawFormData);\n this.updateFormDataValid();\n }\n\n updateFormDataValid() {\n this.isFormDataValid = this.formErrorsData.length === 0 &&\n this.serverErrorsData.length === 0;\n }\n\n setServerError(errorKey) {\n this.serverErrorsData = [ ...this.serverErrorsData, {\n error: new ValidateResult(errorKey, this.rawFormData, \"server\", false)\n }];\n this.updateFormDataValid();\n }\n\n clearServerErrors() {\n this.serverErrorsData = [];\n this.updateFormDataValid();\n }\n\n async openUserSession() {\n this.savedFormData = this.formData;\n try {\n await this.userService.openSession(this.formData);\n } catch(error) {\n const baseErrorMessage = `Error while logging the user in`;\n switch (error.name) {\n case \"AuthenticationError\":\n console.warn(`${baseErrorMessage}: invalid credentials`);\n this.setServerError(\"invalidCredentials\");\n break;\n default:\n console.error(`Unexpected ${baseErrorMessage.toLowerCase()}`, error);\n this.setServerError(\"unexpectedError\");\n }\n return;\n }\n this.clearServerErrors();\n }\n\n\n // Event filers\n filterEventByUniqueId({ uniqueId = \"\" }) {\n return allowedUniqueIds.includes(uniqueId);\n }\n\n // Event handlers\n async handleEmailAddressInputEvent() {\n this.clearServerErrors();\n const uniqueId = `logInEmailAddress`;\n const { emailAddress = \"\" } = this.rawFormData;\n const normalizedEmailAddress = normalizeEmailAddress(emailAddress);\n if (normalizedEmailAddress.length > 0) {\n this.eventService.publish({\n eventName: \"validateValue\",\n eventData: { uniqueId }\n });\n } else {\n this.fieldsEditedStatuses[uniqueId] = false;\n }\n await this.validateFormData();\n }\n async handleEmailAddressBlurEvent() {\n await pause(processInputFieldBlurEventAfterMs);\n const uniqueId = `logInEmailAddress`;\n this.fieldsEditedStatuses[uniqueId] = true;\n const { emailAddress = \"\" } = this.rawFormData;\n const normalizedEmailAddress = normalizeEmailAddress(emailAddress);\n if (normalizedEmailAddress.length > 0) {\n this.rawFormData.emailAddress = normalizedEmailAddress;\n this.eventService.publish({\n eventName: \"validateValue\",\n eventData: { uniqueId }\n });\n }\n await this.validateFormData();\n }\n\n async handlePasswordInputEvent() {\n this.clearServerErrors();\n const uniqueId = `logInPassword`\n const { password = \"\" } = this.rawFormData;\n if (password.length > 0) {\n this.eventService.publish({\n eventName: \"validateValue\",\n eventData: { uniqueId }\n });\n } else {\n this.fieldsEditedStatuses[uniqueId] = false;\n }\n await this.validateFormData();\n }\n async handlePasswordBlurEvent() {\n await pause(processInputFieldBlurEventAfterMs);\n const uniqueId = `logInPassword`\n this.fieldsEditedStatuses[uniqueId] = true;\n const { password = \"\" } = this.rawFormData;\n if (password.length > 0) {\n this.eventService.publish({\n eventName: \"validateValue\",\n eventData: { uniqueId }\n });\n }\n await this.validateFormData();\n }\n\n handleRunModeChangedEvent({ runMode = defaultRunMode }) {\n this.runMode = runMode;\n }\n\n}\n","// Define the view-model for the \"logged-out\" screen\n\n// Import library modules\nimport { computedFrom, inject } from \"aurelia-framework\";\nimport { Router } from \"aurelia-router\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { uiBaseUrl } from \"parameters/environment\";\nimport {\n autoRedirectionTimeoutMs,\n autoRedirectionIntervalMs\n} from \"parameters/time\";\n\n// Import service modules\nimport UserService from \"services/user\";\n\n\n// Export the \"LoggedOut\" class\n@inject(Router, UserService)\nexport class LoggedOut {\n\n // Local attributes\n dashboardRouteHref = \"\";\n autoRedirectionTimeoutMs = autoRedirectionTimeoutMs;\n i18nParams = i18nParams;\n\n constructor(router, userService) {\n this.router = router;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n attached() {\n this.autoRedirectionIntervalId = setInterval(() => {\n this.autoRedirectionTimeoutMs -= autoRedirectionIntervalMs;\n console.debug(`Redirecting to the start screen in ` +\n `${this.autoRedirectionTimeoutSec} seconds`);\n if (this.autoRedirectionTimeoutMs <= 0) {\n clearInterval(this.autoRedirectionIntervalId);\n console.info(`Redirecting to the start screen`);\n this.goToStartScreen();\n }\n }, autoRedirectionIntervalMs);\n }\n\n detached() {\n clearInterval(this.autoRedirectionIntervalId);\n }\n\n\n // Getter and setter methods\n @computedFrom(\"autoRedirectionTimeoutMs\")\n get autoRedirectionTimeoutSec() {\n return this.autoRedirectionTimeoutMs/1000;\n }\n\n @computedFrom(\"autoRedirectionTimeoutSec\")\n get redirectI18nParams() {\n return { ...i18nParams, count: this.autoRedirectionTimeoutSec };\n }\n\n\n // Core mathods\n goToStartScreen() {\n this.router.navigate(uiBaseUrl);\n }\n\n}\n","// Define the view-model for the \"request-reset-password\" screen\n\n// Import library modules\nimport { computedFrom, inject } from \"aurelia-framework\";\nimport { Validator, ValidateResult } from \"aurelia-validation\";\nimport { DialogService } from \"aurelia-dialog\";\nimport { Router } from \"aurelia-router\";\nimport { I18N } from \"aurelia-i18n\";\n\n// Import utility modules\nimport { setEventHandlers, unsetEventHandlers } from \"utilities/event\";\nimport { unsetProperties } from \"utilities/object\";\nimport { pause } from \"utilities/promise\";\nimport { clone } from \"utilities/etc\";\nimport { \n capitalizeFirst,\n normalizeEmailAddress \n} from \"utilities/string\";\n\n// Import parameter modules\nimport { rawResetPasswordFormData as defaultRawFormData } from \"parameters/user\";\nimport { processInputFieldBlurEventAfterMs } from \"parameters/time\";\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { runMode as defaultRunMode } from \"parameters/environment\";\n\n// Import service modules\nimport EventService from \"services/event\";\nimport UserService from \"services/user\";\n\n// Import dialog modules\nimport { ConfirmResetPassword } from \"dialogs/confirm-reset-password\";\nimport { ResetPasswordSuccess } from \"dialogs/reset-password-success\";\n\n// Define internal parameters\nconst allowedUniqueIds = [\"emailAddress\"]\n .map(allowedUniqueId => `resetPassword${capitalizeFirst(allowedUniqueId)}`);\nconst eventsData = [\n { name: \"runModeChanged\" }\n];\n\n\n// Export the \"ResetPassword\" class\n@inject(\n Router,\n I18N,\n DialogService,\n EventService,\n UserService,\n Validator\n)\nexport class ResetPassword {\n\n // Local attributes\n formData = {};\n savedFormData = {};\n rawFormData = clone(defaultRawFormData);\n formDataValid = true;\n serverErrorsData = [];\n formErrorsData = [];\n fieldsEditedStatuses = {};\n i18nParams = i18nParams;\n runMode = defaultRunMode;\n\n constructor(\n router,\n i18n,\n dialogService,\n eventService,\n userService,\n validator\n ) {\n this.router = router;\n this.i18n = i18n;\n this.dialogService = dialogService;\n this.eventService = eventService;\n this.userService = userService;\n this.validator = validator;\n }\n\n\n // Lifecycle methods\n activate({ emailAddress = \"\" }) {\n if (emailAddress) {\n console.info(`Using e-mail address \"${emailAddress}\"`);\n this.emailAddress = emailAddress;\n }\n }\n\n async bind() {\n this.eventsSubscriptions = setEventHandlers.call(this, {\n entityName: \"resetPassword\",\n eventService: this.eventService,\n eventsData\n });\n\n if (this.emailAddress) {\n this.rawFormData.emailAddress = this.emailAddress;\n }\n await this.validateFormData();\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Getter and setter methods\n @computedFrom(\"fieldsEditedStatuses.resetPasswordEmailAddress\")\n get showEmailAddressDanger() {\n return this.fieldsEditedStatuses.resetPasswordEmailAddress || false;\n }\n\n\n // Core methods\n async validateFormData() {\n this.formData = unsetProperties(this.rawFormData, [\"_schemaId\"]);\n this.formErrorsData = await this.validator.validateObject(this.rawFormData);\n this.updateFormDataValid();\n }\n\n updateFormDataValid() {\n this.formDataValid = this.formErrorsData.length === 0 &&\n this.serverErrorsData.length === 0;\n }\n\n setServerError(errorKey) {\n this.serverErrorsData = [ ...this.serverErrorsData, {\n error: new ValidateResult(errorKey, this.rawFormData, \"server\", false)\n }];\n this.updateFormDataValid();\n }\n\n clearServerErrors() {\n this.serverErrorsData = [];\n this.updateFormDataValid();\n }\n\n async resetUserPassword() {\n this.savedFormData = this.formData;\n const confirmResetPasswordDialogOpenResult = await this.dialogService.open({\n viewModel: ConfirmResetPassword,\n model: this.formData,\n //keyboard: [\"Escape\"] // keys that close the dialog\n });\n const confirmResetPasswordDialogCloseResult =\n await confirmResetPasswordDialogOpenResult.closeResult;\n if (confirmResetPasswordDialogCloseResult.wasCancelled) {\n console.info(`User canceled the reset of the password`);\n return;\n }\n try {\n await this.userService.requestResetPassword(this.formData);\n } catch(error) {\n const baseErrorMessage = `Error while re-setting the user's password`;\n switch (error.name) {\n case \"MissingResource\":\n console.warn(`${baseErrorMessage}: unknown e-mail address`);\n this.setServerError(\"unknownEmailAddress\");\n break;\n case \"ConflictingResource\":\n console.warn(`${baseErrorMessage}: previous request pending`);\n this.setServerError(\"pendingPreviousRequest\");\n break;\n default:\n console.error(`Unexpected ${baseErrorMessage.toLowerCase()}`, error);\n this.setServerError(\"unexpectedError\");\n }\n return;\n }\n this.clearServerErrors();\n const passwordResetSuccessDialogOpenResult =\n await this.dialogService.open({\n viewModel: ResetPasswordSuccess,\n model: this.formData,\n //keyboard: [ \"Escape\", \"Enter\" ] // keys that close the dialog\n });\n await passwordResetSuccessDialogOpenResult.closeResult;\n this.router.navigateToRoute(\"logIn\");\n }\n\n\n // Event filters\n filterEventByUniqueId({ uniqueId = \"\" }) {\n return allowedUniqueIds.includes(uniqueId);\n }\n\n // Event handlers\n async handleEmailAddressInputEvent() {\n this.clearServerErrors();\n const uniqueId = `resetPasswordEmailAddress`;\n const { emailAddress = \"\" } = this.rawFormData;\n const normalizedEmailAddress = normalizeEmailAddress(emailAddress);\n if (normalizedEmailAddress.length > 0) {\n this.eventService.publish({\n eventName: \"validateValue\",\n eventData: { uniqueId }\n });\n } else {\n this.fieldsEditedStatuses[uniqueId] = false;\n }\n await this.validateFormData();\n }\n async handleEmailAddressBlurEvent() {\n await pause(processInputFieldBlurEventAfterMs);\n const uniqueId = `resetPasswordEmailAddress`;\n this.fieldsEditedStatuses[uniqueId] = true;\n const { emailAddress = \"\" } = this.rawFormData;\n const normalizedEmailAddress = normalizeEmailAddress(emailAddress);\n if (normalizedEmailAddress.length > 0) {\n this.rawFormData.emailAddress = normalizedEmailAddress;\n this.eventService.publish({\n eventName: \"validateValue\",\n eventData: { uniqueId }\n });\n }\n await this.validateFormData();\n }\n\n handleRunModeChangedEvent({ runMode = defaultRunMode }) {\n this.runMode = runMode;\n }\n\n}\n","// Define the view-model for the \"sign-up\" screen\n\n// Import library modules\nimport { Validator, ValidateResult } from \"aurelia-validation\";\nimport { computedFrom, inject } from \"aurelia-framework\";\nimport { DialogService } from \"aurelia-dialog\";\nimport { Router } from \"aurelia-router\";\nimport { I18N } from \"aurelia-i18n\";\n\n// Import utility modules\nimport { unsetProperties, unsetFalsyProperties } from \"utilities/object\";\nimport { setEventHandlers, unsetEventHandlers } from \"utilities/event\";\nimport { generate as generateArray } from \"utilities/array\";\nimport { normalizeWords } from \"utilities/sentence\";\nimport { getCurrentYear } from \"utilities/time\";\nimport { pause } from \"utilities/promise\";\nimport { clone } from \"utilities/etc\";\nimport { \n capitalizeFirst,\n normalizeEmailAddress,\n optimizeSpaces \n} from \"utilities/string\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { autohidePasswordAfterMs } from \"parameters/time\";\nimport { runMode as defaultRunMode } from \"parameters/environment\";\nimport {\n rawSignUpFormData as defaultRawFormData,\n minAgeYears as minUserAge,\n maxAgeYears as maxUserAge,\n genderNames,\n userTypes\n} from \"parameters/user\";\n\n// Import service modules\nimport EventService from \"services/event\";\nimport UserService from \"services/user\";\nimport NotificationService from \"services/notification\";\n\n// Import dialog modules\nimport { TermsOfService } from \"dialogs/terms-of-service\";\nimport { ConfirmSignUp } from \"dialogs/confirm-sign-up\";\nimport { SignUpSuccess } from \"dialogs/sign-up-success\";\n\n// Define internal parameters\nconst allowedUniqueIds = [ \n \"salutation\", \"academicTitle\", \"firstName\", \"middleName\", \"lastName\", \n \"suffixName\", \"displayName\", \"emailAddress\", \"password\", \"password2\" \n].map(allowedUniqueId => `signUp${capitalizeFirst(allowedUniqueId)}`);\nconst eventsData = [\n { name: \"signUpUserTypeChanged\" },\n { name: \"signUpGenderChanged\" },\n { name: \"signUpBirthYearChanged\" },\n { name: \"runModeChanged\" }\n];\n\n\n// Export the \"SignUp\" class\n@inject(\n Router,\n I18N,\n Validator,\n DialogService,\n NotificationService,\n EventService,\n UserService\n)\nexport class SignUp {\n\n // Local attributes\n invitingUserKey = \"\";\n invitingUserDisplayName = \"\";\n rawFormData = clone(defaultRawFormData);\n formData = {};\n savedFormData = {};\n extraFormData = {\n acceptServiceTerms: false\n };\n formDataValid = true;\n showOptionalFormFields = false;\n passwordFieldsType = \"password\";\n serverErrorsData = [];\n formErrorsData = [];\n fieldsEditedStatuses = {};\n i18nParams = i18nParams;\n runMode = defaultRunMode;\n\n constructor(\n router,\n i18n,\n validator,\n dialogService,\n notificationService,\n eventService,\n userService\n ) {\n this.router = router;\n this.i18n = i18n;\n this.validator = validator;\n this.dialogService = dialogService;\n this.notificationService = notificationService;\n this.eventService = eventService;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n activate({ invitingUserKey = \"\", invitingUserDisplayName = \"\" }) {\n if (invitingUserKey && invitingUserDisplayName) {\n console.info(`Received a sign-up invitation ` +\n `by user \"${invitingUserKey}\" (${invitingUserDisplayName})`);\n this.invitingUserKey = invitingUserKey;\n this.invitingUserDisplayName = invitingUserDisplayName;\n }\n }\n\n async bind() {\n this.eventsSubscriptions = setEventHandlers.call(this, {\n entityName: \"signUp\",\n eventService: this.eventService,\n eventsData\n });\n\n if (this.invitingUserKey) {\n this.rawFormData.invitingUserKey = this.invitingUserKey;\n }\n await this.validateFormData();\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Getter and setter methods\n get unspecifiedOptionData() {\n return {\n value: null,\n text: this.i18n.tr(\"main:notSpecified\")\n };\n }\n\n get userTypeOptionsData() {\n const userTypeOptionsData = userTypes.map(userType => {\n return { \n value: userType, \n text: this.i18n.tr(`enums:longUserType.${userType}`)\n };\n });\n return [ this.unspecifiedOptionData, ...userTypeOptionsData ];\n }\n\n get genderOptionsData() {\n const genderOptionsData = genderNames.map(genderName => {\n return { \n value: genderName, \n text: this.i18n.tr(`enums:longPersonGender.${genderName}`)\n };\n });\n return [ this.unspecifiedOptionData, ...genderOptionsData ];\n }\n\n get birthYearOptionsData() {\n const currentYear = getCurrentYear();\n const userAgesCount = maxUserAge - minUserAge;\n const birthYearOptionsData = generateArray(userAgesCount, (_, index) => {\n const birthYear = currentYear - minUserAge - index;\n return { \n value: birthYear, \n text: `${birthYear}` \n };\n });\n return [ this.unspecifiedOptionData, ...birthYearOptionsData ];\n }\n\n @computedFrom(\"rawFormData.password\", \"rawFormData.password2\")\n get showToggleClearTextPasswordButton() {\n const { password = \"\", password2 = \"\" } = this.rawFormData || {};\n return password.length > 0 || password2.length > 0;\n }\n\n @computedFrom(\"invitingUserKey\", \"invitingUserDisplayName\")\n get invitingUserI18nParams() {\n return {\n ...i18nParams,\n invitingUserKey: this.invitingUserKey,\n invitingUserDisplayName: this.invitingUserDisplayName\n };\n }\n\n @computedFrom(\"fieldsEditedStatuses.signUpSalutation\")\n get showSalutationDanger() {\n return this.fieldsEditedStatuses.signUpSalutation || false;\n }\n @computedFrom(\"fieldsEditedStatuses.signUpAcademicTitle\")\n get showAcademicTitleDanger() {\n return this.fieldsEditedStatuses.signUpAcademicTitle || false;\n }\n @computedFrom(\"fieldsEditedStatuses.signUpFirstName\")\n get showFirstNameDanger() {\n return this.fieldsEditedStatuses.signUpFirstName || false;\n }\n @computedFrom(\"fieldsEditedStatuses.signUpMiddleName\")\n get showMiddleNameDanger() {\n return this.fieldsEditedStatuses.signUpMiddleName || false;\n }\n @computedFrom(\"fieldsEditedStatuses.signUpLastName\")\n get showLastNameDanger() {\n return this.fieldsEditedStatuses.signUpLastName || false;\n }\n @computedFrom(\"fieldsEditedStatuses.signUpSuffixName\")\n get showSuffixNameDanger() {\n return this.fieldsEditedStatuses.signUpSuffixName || false;\n }\n @computedFrom(\"fieldsEditedStatuses.signUpDisplayName\")\n get showDisplayNameDanger() {\n return this.fieldsEditedStatuses.signUpDisplayName || false;\n }\n @computedFrom(\"fieldsEditedStatuses.signUpEmailAddress\")\n get showEmailAddressDanger() {\n return this.fieldsEditedStatuses.signUpEmailAddress || false;\n }\n @computedFrom(\"fieldsEditedStatuses.signUpPassword\")\n get showPasswordDanger() {\n return this.fieldsEditedStatuses.signUpPassword || false;\n }\n @computedFrom(\"fieldsEditedStatuses.signUpPassword2\")\n get showPassword2Danger() {\n return this.fieldsEditedStatuses.signUpPassword2 || false;\n }\n\n\n // Core methods\n async validateFormData() {\n const tempFormData = unsetProperties(this.rawFormData, [\"_schemaId\"]);\n this.formData = unsetFalsyProperties(tempFormData);\n this.formErrorsData = await this.validator.validateObject(this.rawFormData);\n this.updateFormDataValid();\n }\n\n updateFormDataValid() {\n this.formDataValid = this.formErrorsData.length === 0 &&\n this.serverErrorsData.length === 0;\n }\n\n setServerError(errorKey) {\n this.serverErrorsData = [ ...this.serverErrorsData, {\n error: new ValidateResult(errorKey, this.rawFormData, \"server\", false)\n }];\n this.updateFormDataValid();\n }\n\n clearServerErrors() {\n this.serverErrorsData = [];\n this.updateFormDataValid();\n }\n\n async requestCreateUser() {\n this.savedFormData = this.formData;\n const confirmSignUpDialogOpenResult = await this.dialogService.open({\n viewModel: ConfirmSignUp,\n model: unsetProperties(this.formData, [ \"password\", \"password2\" ]),\n //keyboard: [\"Escape\"] // keys that close the dialog\n });\n const confirmSignUpDialogCloseResult =\n await confirmSignUpDialogOpenResult.closeResult;\n if (confirmSignUpDialogCloseResult.wasCancelled) {\n console.info(`User canceled the creation of the account`);\n return;\n }\n let createdUserKey;\n try {\n createdUserKey = await this.userService.requestCreate(this.formData);\n } catch(error) {\n const baseErrorMessage = `Error while signing the user up`;\n switch (error.name) {\n case \"ConflictingResource\":\n console.warn(`${baseErrorMessage}: the specified e-mail address ` +\n `is already in use`);\n this.setServerError(\"unavailableEmailAddress\");\n break;\n case \"MissingResource\":\n console.warn(`${baseErrorMessage}: unknown inviting user ` +\n `\"${this.invitingUserKey}\"`);\n this.setServerError(\"invitingUserNotFound\");\n break;\n default:\n console.error(`Unexpected ${baseErrorMessage.toLowerCase()}`, error);\n this.setServerError(\"unexpectedError\");\n }\n return;\n }\n this.clearServerErrors();\n console.debug(`Created temporary account for user \"${createdUserKey}\"`);\n const signUpSuccessDialogOpenResult = await this.dialogService.open({\n viewModel: SignUpSuccess,\n model: unsetProperties(this.formData, [ \"password\", \"password2\" ]),\n //keyboard: [\"Enter\"] // keys that close the dialog\n });\n await signUpSuccessDialogOpenResult.closeResult;\n this.router.navigateToRoute(\"logIn\");\n }\n\n toggleShowOptionalFormFields() {\n this.showOptionalFormFields = !this.showOptionalFormFields;\n }\n\n async togglePasswordFieldType() {\n this.passwordFieldsType = \n this.passwordFieldsType === \"password\" ? \"text\" : \"password\";\n if (this.passwordFieldsType === \"text\") {\n await pause(autohidePasswordAfterMs);\n this.passwordFieldsType = \"password\";\n }\n }\n\n async showServiceTermsDialog() {\n const serviceTermsDialogOpenResult = await this.dialogService.open({\n viewModel: TermsOfService,\n //keyboard: [\"Escape\"] // keys that close the dialog\n });\n await serviceTermsDialogOpenResult.closeResult;\n }\n\n\n // Event filters\n filterEventByUniqueId({ uniqueId = \"\" }) {\n return allowedUniqueIds.includes(uniqueId);\n }\n\n\n // Event handlers\n async handleProfileFieldInputEvent(fieldName = \"\") {\n if (!fieldName) {\n throw new Error(`Missing required \"fieldName\" argument`);\n }\n this.clearServerErrors();\n const uniqueId = `signUp${capitalizeFirst(fieldName)}`;\n const fieldValue = this.rawFormData.profile[fieldName] || \"\";\n const optimizedFieldValue = normalizeWords(optimizeSpaces(fieldValue));\n if (optimizedFieldValue.length > 0) {\n this.eventService.publish({\n eventName: \"validateValue\",\n eventData: { uniqueId }\n });\n } else {\n this.fieldsEditedStatuses[uniqueId] = false;\n }\n await this.validateFormData();\n }\n async handleProfileFieldBlurEvent(fieldName = \"\") {\n if (!fieldName) {\n throw new Error(`Missing required \"fieldName\" argument`);\n }\n const uniqueId = `signUp${capitalizeFirst(fieldName)}`;\n this.fieldsEditedStatuses[uniqueId] = true;\n const fieldValue = this.rawFormData.profile[fieldName] || \"\";\n const optimizedFieldValue = normalizeWords(optimizeSpaces(fieldValue));\n this.rawFormData.profile[fieldName] = optimizedFieldValue;\n if (optimizedFieldValue.length > 0) {\n this.eventService.publish({\n eventName: \"validateValue\",\n eventData: { uniqueId }\n });\n }\n await this.validateFormData();\n }\n\n async handleEmailAddressInputEvent() {\n this.clearServerErrors();\n const uniqueId = `signUpEmailAddress`;\n const { emailAddress: originalEmailAddress } = this.rawFormData.profile;\n const normalizedEmailAddress = normalizeEmailAddress(originalEmailAddress);\n if (normalizedEmailAddress.length > 0) {\n this.eventService.publish({\n eventName: \"validateValue\",\n eventData: { uniqueId }\n });\n } else {\n this.fieldsEditedStatuses[uniqueId] = false;\n }\n await this.validateFormData();\n }\n async handleEmailAddressBlurEvent() {\n const uniqueId = `signUpEmailAddress`;\n this.fieldsEditedStatuses[uniqueId] = true;\n const { emailAddress: originalEmailAddress } = this.rawFormData.profile;\n const normalizedEmailAddress = normalizeEmailAddress(originalEmailAddress);\n this.rawFormData.profile.emailAddress = normalizedEmailAddress;\n if (normalizedEmailAddress.length > 0) {\n this.eventService.publish({\n eventName: \"validateValue\",\n eventData: { uniqueId }\n });\n }\n await this.validateFormData();\n }\n\n async handlePasswordFieldInputEvent(fieldName = \"\") {\n if (!fieldName) {\n throw new Error(`Missing required \"fieldName\" argument`);\n }\n this.clearServerErrors();\n const uniqueId = `signUp${capitalizeFirst(fieldName)}`;\n const fieldValue = this.rawFormData[fieldName] || \"\";\n if (fieldValue.length > 0) {\n this.eventService.publish({\n eventName: \"validateValue\",\n eventData: { uniqueId }\n });\n } else {\n this.fieldsEditedStatuses[uniqueId] = false;\n }\n await this.validateFormData();\n }\n async handlePasswordFieldBlurEvent(fieldName = \"\") {\n if (!fieldName) {\n throw new Error(`Missing required \"fieldName\" argument`);\n }\n const uniqueId = `signUp${capitalizeFirst(fieldName)}`;\n this.fieldsEditedStatuses[uniqueId] = true;\n const fieldValue = this.rawFormData[fieldName] || \"\";\n if (fieldValue.length > 0) {\n this.eventService.publish({\n eventName: \"validateValue\",\n eventData: { uniqueId }\n });\n }\n await this.validateFormData();\n }\n\n async handleSignUpUserTypeChangedEvent({ newValue: userType }) {\n this.rawFormData.profile.userType = userType;\n this.clearServerErrors();\n await this.validateFormData();\n }\n\n async handleSignUpGenderChangedEvent({ newValue: gender }) {\n this.rawFormData.profile.gender = gender;\n this.clearServerErrors();\n await this.validateFormData();\n }\n\n async handleSignUpBirthYearChangedEvent({ newValue: birthYear }) {\n this.rawFormData.profile.birthYear = birthYear;\n this.clearServerErrors();\n await this.validateFormData();\n }\n\n async handleCheckBoxToggledEvent() {\n this.clearServerErrors();\n await this.validateFormData();\n }\n\n handleRunModeChangedEvent({ runMode = defaultRunMode }) {\n this.runMode = runMode;\n }\n\n}\n","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;"],"names":[],"sourceRoot":""}