{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/views/DamageReport.vue?ddc6","webpack:///./src/components/common/UAppLayout.vue?188d","webpack:///./src/views/DamageReportSK.vue?9766","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./src/components/AppFooter.vue?309b","webpack:///./src/views/ResetPasswordVerify.vue?8fdc","webpack:///./src/components/AppHeader.vue?5d50","webpack:///./src/components/common/UStrongPassword.vue?8546","webpack:///./src/assets lazy ^\\.\\/.*\\.svg$ namespace object","webpack:///./src/components/LogOutDialog.vue?f057","webpack:///./src/views/UserProfile.vue?6c57","webpack:///./src/App.vue","webpack:///./src/components/AppHeader.vue","webpack:///./src/components/common/UAppHeader.vue","webpack:///./src/store/ActionTypes.ts","webpack:///./src/store/MutationTypes.ts","webpack:///./src/i18n.ts","webpack:///./src/services/AccountClient.ts","webpack:///./src/dtos/AuthTokenRequestDto.ts","webpack:///./src/model/AuthToken.ts","webpack:///./src/services/TokenClient.ts","webpack:///./src/services/AuthTokenService.ts","webpack:///./src/config/dev.ts","webpack:///./src/config/prod.ts","webpack:///./src/config/test.ts","webpack:///./src/config/local.ts","webpack:///./src/config/index.ts","webpack:///./src/views/ChangePassword.vue","webpack:///./src/dtos/ChangePasswordDto.ts","webpack:///./src/services/SecondFactorClient.ts","webpack:///./src/components/common/UErrorContainer.vue","webpack:///./src/components/common/UErrorContainer.vue?9938","webpack:///./src/components/common/UErrorItem.vue","webpack:///./src/components/common/UErrorItem.vue?fd4c","webpack:///./src/components/common/UStrongPassword.vue","webpack:///./src/validation/StrongPasswordValidator.ts","webpack:///./src/validation/Validators.ts","webpack:///./src/components/common/UStrongPassword.vue?3ae4","webpack:///./src/components/common/UStrongPassword.vue?ce96","webpack:///./src/dtos/AccountDto.ts","webpack:///./src/components/VerificationPrompt.vue","webpack:///./src/components/VerificationPrompt.vue?f6af","webpack:///./src/components/VerificationPrompt.vue?1350","webpack:///./src/dtos/ChangePasswordValidateDto.ts","webpack:///./src/views/ChangePassword.vue?bd28","webpack:///./src/views/ChangePassword.vue?00ee","webpack:///./src/views/ResetPasswordVerify.vue","webpack:///./src/dtos/FinishResetPasswordDto.ts","webpack:///./src/dtos/ResetPasswordDto.ts","webpack:///./src/services/PasswordResetClient.ts","webpack:///./src/dtos/ResetPasswordValidateDto.ts","webpack:///./src/views/ResetPasswordVerify.vue?342a","webpack:///./src/views/ResetPasswordVerify.vue?1bbe","webpack:///./src/views/UserProfile.vue","webpack:///./src/services/BrokerClient.ts","webpack:///./src/components/common/UFloatingLabel.vue","webpack:///./src/components/common/UFloatingLabel.vue?6bad","webpack:///./src/dtos/BrokerDto.ts","webpack:///./src/components/PasswordVerificationPrompt.vue","webpack:///./src/components/PasswordVerificationPrompt.vue?a12c","webpack:///./src/components/PasswordVerificationPrompt.vue?d302","webpack:///./src/services/TilesClient.ts","webpack:///./src/dtos/VerifyEmailUniquenessDto.ts","webpack:///./src/help/GeneralFunction.ts","webpack:///./src/views/UserProfile.vue?2b4c","webpack:///./src/views/UserProfile.vue?f186","webpack:///./src/views/Tiles.vue","webpack:///./src/components/common/UTile.vue","webpack:///./src/dtos/TileCmsDto.ts","webpack:///./src/services/AuditClient.ts","webpack:///./src/dtos/CreateAuditDto.ts","webpack:///./src/components/common/UTile.vue?0637","webpack:///./src/components/common/UTile.vue?d8c1","webpack:///./src/services/ExtraPropertyClient.ts","webpack:///./src/dtos/ExtraPropertyDto.ts","webpack:///./src/components/PasswordExpirationDialog.vue","webpack:///./src/components/PasswordExpirationDialog.vue?ed58","webpack:///./src/components/PasswordExpirationDialog.vue?411b","webpack:///./src/dtos/TilesSequenceDto.ts","webpack:///./src/help/EventBus.ts","webpack:///./src/views/Tiles.vue?be03","webpack:///./src/views/Tiles.vue?1588","webpack:///./src/views/DamageReport.vue","webpack:///./src/views/DamageReport.vue?d78c","webpack:///./src/views/DamageReport.vue?f95b","webpack:///./src/views/DamageReportSK.vue","webpack:///./src/dtos/Agent360Dto.ts","webpack:///./src/services/C360Client.ts","webpack:///./src/views/DamageReportSK.vue?2b36","webpack:///./src/views/DamageReportSK.vue?c78a","webpack:///./src/views/ResetPassword.vue","webpack:///./src/views/ResetPassword.vue?b464","webpack:///./src/views/ResetPassword.vue?15a1","webpack:///./src/views/LogOut.vue","webpack:///./src/views/LogOut.vue?97fb","webpack:///./src/views/LogOut.vue?2e6c","webpack:///./src/types/WebSocketMessageTypes.ts","webpack:///./src/router/index.ts","webpack:///./src/dtos/WebSocketDto.ts","webpack:///./src/model/Message.ts","webpack:///./src/dtos/WebSocketDtoAck.ts","webpack:///./src/help/WebSocketFunctions.ts","webpack:///./src/services/LoginService.ts","webpack:///./src/dtos/InitAppDto.ts","webpack:///./src/services/RecaptchaClient.ts","webpack:///./src/store/index.ts","webpack:///./src/components/common/UAppHeader.vue?0aa0","webpack:///./src/components/common/UAppHeader.vue?35fb","webpack:///./src/components/common/UIconButton.vue","webpack:///./src/components/common/UIcon.vue","webpack:///./src/components/common/UIdleTimer.vue","webpack:///./src/components/common/UIdleTimer.vue?b68b","webpack:///./src/components/common/UIdleTimer.vue?edbf","webpack:///./src/components/common/UIcon.vue?236c","webpack:///./src/components/common/UIcon.vue?e81e","webpack:///./src/components/common/UIconButton.vue?197b","webpack:///./src/components/common/UIconButton.vue?bd44","webpack:///./src/components/AppHeader.vue?cd58","webpack:///./src/components/AppHeader.vue?efcd","webpack:///./src/components/AppFooter.vue","webpack:///./src/components/AppFooter.vue?f086","webpack:///./src/components/AppFooter.vue?36eb","webpack:///./src/components/common/UAppLayout.vue","webpack:///./src/components/common/UAppLayout.vue?8d78","webpack:///./src/components/common/UAppLayout.vue?6018","webpack:///./src/App.vue?3acc","webpack:///./src/App.vue?dfb6","webpack:///./src/components/LogOutDialog.vue","webpack:///./src/components/LogOutDialog.vue?5fc3","webpack:///./src/components/LogOutDialog.vue?971e","webpack:///./src/components/BaseLabel.vue","webpack:///./src/components/BaseLabel.vue?47fe","webpack:///./src/components/BaseLabel.vue?8e54","webpack:///./src/main.ts","webpack:///./src/components/PasswordVerificationPrompt.vue?2d4c","webpack:///./src/components/PasswordExpirationDialog.vue?3186","webpack:///./src/components/VerificationPrompt.vue?b35f"],"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","jsonpScriptSrc","p","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","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","window","oldJsonpFunction","slice","map","webpackContext","req","id","webpackContextResolve","code","keys","webpackAsyncContext","then","ids","backgroundName","bgName","header","ref","footer","autoZIndex","position","baseZIndex","closable","showHeader","style","visible","pretimeoutDialogIsVissible","label","stayLoggedIn","class","banner","to","image","isMobile","isLoggedIn","firstName","lastName","isImpersonification","showTimer","showLogoutDialogClick","tooltip","toggleMenu","aria-haspopup","aria-controls","model","menuItems","popup","showLogoutDialog","logout","time","ActionTypes","MutationTypes","messages","currentLocale","find","str","includes","navigator","language","i18n","legacy","locale","fallbackLocale","a","this","RESOURCE_ACCOUNTS","verificationData","patch","headers","errorMessages","Map","global","put","post","init","assign","accessToken","refreshToken","validTo","RESOURCE_TOKEN","supressErrorMessage","client","redirectUri","getToken","res","access_token","refresh_token","getValidTo","expires_in","duration","Date","setMinutes","getMinutes","apiUrl","authUrl","authRedirectUri","damageReportUrl","damageReportUrlBaseSK","wsUrl","envName","isTest","isProduction","isDevelopment","prod","test","dev","local","for","changePassword","v$","$invalid","placeholder","origPass","$dirty","$model","disabled","saving","secondFactorMissing","required","form","newPass","minPasswordLength","newPassVerify","passwordsMatch","severity","href","$router","loading","icon","loadingIcon","iconPos","showVerifyPrompt","continueSaving","$event","resendVerificationCode","displayModal","login","recaptchaToken","secondaryEmailChange","RESOURCE_SECOND_FACTORS","errorMessage","render","val","modelValue","onChanged","strongPasswordValidation","strongPasswordMessage","HasDigit","HasLower","HasUpper","AllLetterOrDigit","Array","from","every","Score","password","StrongPasswordValidator","components","UErrorContainer","UErrorItem","props","String","Boolean","Number","emits","setup","emit","rules","$touch","__scopeId","isVisible","modal","displayCountDownButton","countDownText","resendButtonDisabled","token","submit","autofocus","interval","resendButtonText","resendButtonTextTimer","set","startTimer","clearInterval","minutes","seconds","timer","setInterval","parseInt","toString","UStrongPassword","VerificationPrompt","secFactor","toast","router","store","useStore","userId","state","user","accountClient","account","verificationCodeSent","verifyPrompt","useSecondFactorVerification","reCaptcha","getRecaptchaToken","getters","isRecaptchaEnabled","recaptchaLoaded","executeRecaptcha","add","summary","detail","meta","content","getMe","username","email","usePasswordConfirmation","getSecondFactors","authenticate","changePasswordVerify","originalPassword","newPassword","verificationToken","life","valid","validateMyNewPassword","resetTokenValid","height","savingIcon","resetPasswordUrl","redirectToLogIn","RESOURCE_PASSWORD_RESET","route","resetClient","PasswordResetClient","secondFactorClient","resetToken","loginService","baseUrl","getFullPath","path","endsWith","startsWith","substring","tilesPath","fullPath","resetPassworPath","query","verify","tokenValid","finish","twoFactorToken","validate","fullName","saveChanges","emailInvalid","isSSO","readonly","birthDateFormated","IsUserFromInternalDistribution","emailChanged","hasHCLRight","secondaryEmail","phoneNumber","phoneNumberIsEditable","phoneNumberValid","broker","crn","showPasswordVerifyPrompt","modalMessage","displaySecondaryModal","secondaryModalMessage","typeInput","showPassword","computed","sequenceDataDto","text","indexOf","checkEmailOrderingSuffix","replace","checkEmailSuffix","suffix","UFloatingLabel","PasswordVerificationPrompt","general","origAccount","tiles","mobileValidate","phone","mobileNumber","getType","secondaryEmailValid","RegExp","emailValidStyle","toLowerCase","cutEmail","loadMe","commit","setUser","isSecondaryEmailEditationOk","some","x","applicationName","getAll","getById","brokerId","birthDate","Intl","DateTimeFormat","format","updatedAccount","technicalAccount","verifyEmailUniquenessDto","verifyMyNewEmailUniqueness","loginname","oldEmail","$reset","brokerNumber","sortModeEnabled","tag","list","increaseRerenderKey","item","element","block-link","tileData","reRenderKey","tile","saveSequenceToDB","returnInitialArrayState","dialogUserProfileButtonLabel","showPhoneNumberIsCorrectButton","confirmPhoneNumber","checkPhoneMessage","hasHCLRightAndEmptySecondaryEmail","hidden","continueDialogButtonIsHidden","secondaryEmailDialogVisible","tileStyle","$props","blockLink","pushUri","tileImageStyle","tileImage","tileName","getTooltipByBrowserLanguage","RESOURCE_AUDIT","auditClient","tileUri","url","color","colorHover","width","makeSvgObject","URL","createObjectURL","Blob","isEmpty","getNameByBrowserLanguage","nameSk","nameEn","createAuditDto","auditType","callerApplicationId","description","userAccountId","createAudit","open","openInSameWindow","focus","tooltipCZ","tooltipSK","tooltipEN","extraname","exactMatch","passwordExpirationDate","toLocaleDateString","events","eventName","fn","forEach","UTile","draggable","tilesClient","initialTiles","dialog","extraPropertyClient","phoneNumberValidated","extraName","getNumberOfDaysToSecondFactor","secondFactorActivationDate","diff","Math","abs","getTime","diffDays","ceil","on","numberOfDaysToSecondFactor","phoneNumberIsEditableUntil","setDate","getDate","showCheckPhoneDialog","respone","daysCount","date","setShowCheckPhoneDialog","showPasswordExpirationWarning","showPasswordExpirationDialog","dialogRef","PasswordExpirationDialog","dismissableMask","templates","onClick","close","extraPropertyDto","app","secondaryEmailDialogDate","methods","tilesSequenceData","JSON","stringify","tilesSubsequenceDto","SaveTilesSequence","buttons","button","method","action","reportUri","personalNumber","base64Url","split","base64","jsonPayload","decodeURIComponent","atob","charCodeAt","join","parse","acquisition_number","startDamage","RESOURCE_C360","urlReplace","c360Agent","load","defaultNS","c360Client","getAgent","mounted","emailSent","passwordExpiredMessage","startPasswordReset","encodeURIComponent","currentRoute","expired","WebSocketMessageTypes","routes","redirect","component","Tiles","background","UserProfile","DamageReport","DamageReportSK","ChangePassword","ResetPassword","ResetPasswordVerify","LogOut","history","now","messageType","messageId","socket","isConnected","sessionState","principalUsername","dispatch","tryRefreshToken","webSocketDto","crypto","randomUUID","application","ssoSessionId","json","logToConsoleEnabled","log","main","config","globalProperties","$socket","send","saveMessage","bye","$disconnect","webSocketAckDto","ack","replyTo","tokenService","returnUri","location","getAuthUrl","getReturnUrl","sendMessage","loginOut","authType","clientId","params","logOutPath","recaptchaClient","recaptchaEnabled","impersonification","sso","reconnectError","userSource","authSrc","lastActivity","lastWSPing","fromOrig","isUserLoggedIn","pingActivity","mutations","removeUser","setToken","tokenAccess","obj","session_state","principal_username","user_source","auth_src","initApp","setRecaptcha","setImpersonification","setSSO","SOCKET_ONOPEN","currentTarget","SOCKET_ONCLOSE","SOCKET_ONERROR","SOCKET_ONMESSAGE","SOCKET_RECONNECT","count","info","SOCKET_RECONNECT_ERROR","actions","getUser","refreshed","catch","getRecaptchaStatus","getRecaptchaStatusForCurrentNetwork","year","month","day","hour","minute","second","imgClass","imgPath","display","idleLimit","defaultCounter","counter","decreaseTime","wsPretimeoutTimeoutInSeconds","pretimeout","resetCounter","idleLimitInSeconds","recordActivity","ev","addEventListener","removeEventListener","UIdleTimer","default","UIcon","UAppHeader","UIconButton","menu","items","command","toggle","resetTimer","screen","getFullYear","haNodeIdentifier","appVersion","curr","_","UAppLayout","AppHeader","AppFooter","helloMessageId","startPingTimer","wsPingTimeoutInSeconds","ping","title","instance","hideBadge","findIndex","storedMessage","sendAckMessage","exc","hello","appMounted","pathToConfig","origin","App","getErrorMessage","response","BaseLabel","directive","use","recaptchaSiteKey","siteKey","loaderOptions","useRecaptchaNet","wsEnabled","connectManually","reconnection","reconnectionAttempts","reconnectionDelay","mount","defaults","baseURL","interceptors","auth","Authorization","status","responseURL","errorCode","$toast","msg","isoDateFormat","handleDates","body","beforeEach","next","$dialog","LogOutDialog","$","appContext","$connect"],"mappings":"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","file":"js/app.b7e7bcc1.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\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-2d0aa57c\":\"1a855a3f\",\"chunk-2d0af4d9\":\"7454fc34\",\"chunk-2d0b8b5b\":\"4a573c03\",\"chunk-2d0c80f1\":\"10bf9ad8\",\"chunk-2d0cc987\":\"d827910d\",\"chunk-2d0e1839\":\"e90bfab8\"}[chunkId] + \".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 = window[\"webpackJsonp\"] = window[\"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([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./DamageReport.vue?vue&type=style&index=0&id=1a6b7879&scoped=true&lang=scss\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./UAppLayout.vue?vue&type=style&index=0&id=857987da&lang=scss&scoped=true\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./DamageReportSK.vue?vue&type=style&index=0&id=1261b791&scoped=true&lang=scss\"","var map = {\n\t\"./af\": \"2bfb\",\n\t\"./af.js\": \"2bfb\",\n\t\"./ar\": \"8e73\",\n\t\"./ar-dz\": \"a356\",\n\t\"./ar-dz.js\": \"a356\",\n\t\"./ar-kw\": \"423e\",\n\t\"./ar-kw.js\": \"423e\",\n\t\"./ar-ly\": \"1cfd\",\n\t\"./ar-ly.js\": \"1cfd\",\n\t\"./ar-ma\": \"0a84\",\n\t\"./ar-ma.js\": \"0a84\",\n\t\"./ar-sa\": \"8230\",\n\t\"./ar-sa.js\": \"8230\",\n\t\"./ar-tn\": \"6d83\",\n\t\"./ar-tn.js\": \"6d83\",\n\t\"./ar.js\": \"8e73\",\n\t\"./az\": \"485c\",\n\t\"./az.js\": \"485c\",\n\t\"./be\": \"1fc1\",\n\t\"./be.js\": \"1fc1\",\n\t\"./bg\": \"84aa\",\n\t\"./bg.js\": \"84aa\",\n\t\"./bm\": \"a7fa\",\n\t\"./bm.js\": \"a7fa\",\n\t\"./bn\": \"9043\",\n\t\"./bn-bd\": \"9686\",\n\t\"./bn-bd.js\": \"9686\",\n\t\"./bn.js\": \"9043\",\n\t\"./bo\": \"d26a\",\n\t\"./bo.js\": \"d26a\",\n\t\"./br\": \"6887\",\n\t\"./br.js\": \"6887\",\n\t\"./bs\": \"2554\",\n\t\"./bs.js\": \"2554\",\n\t\"./ca\": \"d716\",\n\t\"./ca.js\": \"d716\",\n\t\"./cs\": \"3c0d\",\n\t\"./cs.js\": \"3c0d\",\n\t\"./cv\": \"03ec\",\n\t\"./cv.js\": \"03ec\",\n\t\"./cy\": \"9797\",\n\t\"./cy.js\": \"9797\",\n\t\"./da\": \"0f14\",\n\t\"./da.js\": \"0f14\",\n\t\"./de\": \"b469\",\n\t\"./de-at\": \"b3eb\",\n\t\"./de-at.js\": \"b3eb\",\n\t\"./de-ch\": \"bb71\",\n\t\"./de-ch.js\": \"bb71\",\n\t\"./de.js\": \"b469\",\n\t\"./dv\": \"598a\",\n\t\"./dv.js\": \"598a\",\n\t\"./el\": \"8d47\",\n\t\"./el.js\": \"8d47\",\n\t\"./en-au\": \"0e6b\",\n\t\"./en-au.js\": \"0e6b\",\n\t\"./en-ca\": \"3886\",\n\t\"./en-ca.js\": \"3886\",\n\t\"./en-gb\": \"39a6\",\n\t\"./en-gb.js\": \"39a6\",\n\t\"./en-ie\": \"e1d3\",\n\t\"./en-ie.js\": \"e1d3\",\n\t\"./en-il\": \"7333\",\n\t\"./en-il.js\": \"7333\",\n\t\"./en-in\": \"ec2e\",\n\t\"./en-in.js\": \"ec2e\",\n\t\"./en-nz\": \"6f50\",\n\t\"./en-nz.js\": \"6f50\",\n\t\"./en-sg\": \"b7e9\",\n\t\"./en-sg.js\": \"b7e9\",\n\t\"./eo\": \"65db\",\n\t\"./eo.js\": \"65db\",\n\t\"./es\": \"898b\",\n\t\"./es-do\": \"0a3c\",\n\t\"./es-do.js\": \"0a3c\",\n\t\"./es-mx\": \"b5b7\",\n\t\"./es-mx.js\": \"b5b7\",\n\t\"./es-us\": \"55c9\",\n\t\"./es-us.js\": \"55c9\",\n\t\"./es.js\": \"898b\",\n\t\"./et\": \"ec18\",\n\t\"./et.js\": \"ec18\",\n\t\"./eu\": \"0ff2\",\n\t\"./eu.js\": \"0ff2\",\n\t\"./fa\": \"8df4\",\n\t\"./fa.js\": \"8df4\",\n\t\"./fi\": \"81e9\",\n\t\"./fi.js\": \"81e9\",\n\t\"./fil\": \"d69a\",\n\t\"./fil.js\": \"d69a\",\n\t\"./fo\": \"0721\",\n\t\"./fo.js\": \"0721\",\n\t\"./fr\": \"9f26\",\n\t\"./fr-ca\": \"d9f8\",\n\t\"./fr-ca.js\": \"d9f8\",\n\t\"./fr-ch\": \"0e49\",\n\t\"./fr-ch.js\": \"0e49\",\n\t\"./fr.js\": \"9f26\",\n\t\"./fy\": \"7118\",\n\t\"./fy.js\": \"7118\",\n\t\"./ga\": \"5120\",\n\t\"./ga.js\": \"5120\",\n\t\"./gd\": \"f6b4\",\n\t\"./gd.js\": \"f6b4\",\n\t\"./gl\": \"8840\",\n\t\"./gl.js\": \"8840\",\n\t\"./gom-deva\": \"aaf2\",\n\t\"./gom-deva.js\": \"aaf2\",\n\t\"./gom-latn\": \"0caa\",\n\t\"./gom-latn.js\": \"0caa\",\n\t\"./gu\": \"e0c5\",\n\t\"./gu.js\": \"e0c5\",\n\t\"./he\": \"c7aa\",\n\t\"./he.js\": \"c7aa\",\n\t\"./hi\": \"dc4d\",\n\t\"./hi.js\": \"dc4d\",\n\t\"./hr\": \"4ba9\",\n\t\"./hr.js\": \"4ba9\",\n\t\"./hu\": \"5b14\",\n\t\"./hu.js\": \"5b14\",\n\t\"./hy-am\": \"d6b6\",\n\t\"./hy-am.js\": \"d6b6\",\n\t\"./id\": \"5038\",\n\t\"./id.js\": \"5038\",\n\t\"./is\": \"0558\",\n\t\"./is.js\": \"0558\",\n\t\"./it\": \"6e98\",\n\t\"./it-ch\": \"6f12\",\n\t\"./it-ch.js\": \"6f12\",\n\t\"./it.js\": \"6e98\",\n\t\"./ja\": \"079e\",\n\t\"./ja.js\": \"079e\",\n\t\"./jv\": \"b540\",\n\t\"./jv.js\": \"b540\",\n\t\"./ka\": \"201b\",\n\t\"./ka.js\": \"201b\",\n\t\"./kk\": \"6d79\",\n\t\"./kk.js\": \"6d79\",\n\t\"./km\": \"e81d\",\n\t\"./km.js\": \"e81d\",\n\t\"./kn\": \"3e92\",\n\t\"./kn.js\": \"3e92\",\n\t\"./ko\": \"22f8\",\n\t\"./ko.js\": \"22f8\",\n\t\"./ku\": \"2421\",\n\t\"./ku.js\": \"2421\",\n\t\"./ky\": \"9609\",\n\t\"./ky.js\": \"9609\",\n\t\"./lb\": \"440c\",\n\t\"./lb.js\": \"440c\",\n\t\"./lo\": \"b29d\",\n\t\"./lo.js\": \"b29d\",\n\t\"./lt\": \"26f9\",\n\t\"./lt.js\": \"26f9\",\n\t\"./lv\": \"b97c\",\n\t\"./lv.js\": \"b97c\",\n\t\"./me\": \"293c\",\n\t\"./me.js\": \"293c\",\n\t\"./mi\": \"688b\",\n\t\"./mi.js\": \"688b\",\n\t\"./mk\": \"6909\",\n\t\"./mk.js\": \"6909\",\n\t\"./ml\": \"02fb\",\n\t\"./ml.js\": \"02fb\",\n\t\"./mn\": \"958b\",\n\t\"./mn.js\": \"958b\",\n\t\"./mr\": \"39bd\",\n\t\"./mr.js\": \"39bd\",\n\t\"./ms\": \"ebe4\",\n\t\"./ms-my\": \"6403\",\n\t\"./ms-my.js\": \"6403\",\n\t\"./ms.js\": \"ebe4\",\n\t\"./mt\": \"1b45\",\n\t\"./mt.js\": \"1b45\",\n\t\"./my\": \"8689\",\n\t\"./my.js\": \"8689\",\n\t\"./nb\": \"6ce3\",\n\t\"./nb.js\": \"6ce3\",\n\t\"./ne\": \"3a39\",\n\t\"./ne.js\": \"3a39\",\n\t\"./nl\": \"facd\",\n\t\"./nl-be\": \"db29\",\n\t\"./nl-be.js\": \"db29\",\n\t\"./nl.js\": \"facd\",\n\t\"./nn\": \"b84c\",\n\t\"./nn.js\": \"b84c\",\n\t\"./oc-lnc\": \"167b\",\n\t\"./oc-lnc.js\": \"167b\",\n\t\"./pa-in\": \"f3ff\",\n\t\"./pa-in.js\": \"f3ff\",\n\t\"./pl\": \"8d57\",\n\t\"./pl.js\": \"8d57\",\n\t\"./pt\": \"f260\",\n\t\"./pt-br\": \"d2d4\",\n\t\"./pt-br.js\": \"d2d4\",\n\t\"./pt.js\": \"f260\",\n\t\"./ro\": \"972c\",\n\t\"./ro.js\": \"972c\",\n\t\"./ru\": \"957c\",\n\t\"./ru.js\": \"957c\",\n\t\"./sd\": \"6784\",\n\t\"./sd.js\": \"6784\",\n\t\"./se\": \"ffff\",\n\t\"./se.js\": \"ffff\",\n\t\"./si\": \"eda5\",\n\t\"./si.js\": \"eda5\",\n\t\"./sk\": \"7be6\",\n\t\"./sk.js\": \"7be6\",\n\t\"./sl\": \"8155\",\n\t\"./sl.js\": \"8155\",\n\t\"./sq\": \"c8f3\",\n\t\"./sq.js\": \"c8f3\",\n\t\"./sr\": \"cf1e\",\n\t\"./sr-cyrl\": \"13e9\",\n\t\"./sr-cyrl.js\": \"13e9\",\n\t\"./sr.js\": \"cf1e\",\n\t\"./ss\": \"52bd\",\n\t\"./ss.js\": \"52bd\",\n\t\"./sv\": \"5fbd\",\n\t\"./sv.js\": \"5fbd\",\n\t\"./sw\": \"74dc\",\n\t\"./sw.js\": \"74dc\",\n\t\"./ta\": \"3de5\",\n\t\"./ta.js\": \"3de5\",\n\t\"./te\": \"5cbb\",\n\t\"./te.js\": \"5cbb\",\n\t\"./tet\": \"576c\",\n\t\"./tet.js\": \"576c\",\n\t\"./tg\": \"3b1b\",\n\t\"./tg.js\": \"3b1b\",\n\t\"./th\": \"10e8\",\n\t\"./th.js\": \"10e8\",\n\t\"./tk\": \"5aff\",\n\t\"./tk.js\": \"5aff\",\n\t\"./tl-ph\": \"0f38\",\n\t\"./tl-ph.js\": \"0f38\",\n\t\"./tlh\": \"cf75\",\n\t\"./tlh.js\": \"cf75\",\n\t\"./tr\": \"0e81\",\n\t\"./tr.js\": \"0e81\",\n\t\"./tzl\": \"cf51\",\n\t\"./tzl.js\": \"cf51\",\n\t\"./tzm\": \"c109\",\n\t\"./tzm-latn\": \"b53d\",\n\t\"./tzm-latn.js\": \"b53d\",\n\t\"./tzm.js\": \"c109\",\n\t\"./ug-cn\": \"6117\",\n\t\"./ug-cn.js\": \"6117\",\n\t\"./uk\": \"ada2\",\n\t\"./uk.js\": \"ada2\",\n\t\"./ur\": \"5294\",\n\t\"./ur.js\": \"5294\",\n\t\"./uz\": \"2e8c\",\n\t\"./uz-latn\": \"010e\",\n\t\"./uz-latn.js\": \"010e\",\n\t\"./uz.js\": \"2e8c\",\n\t\"./vi\": \"2921\",\n\t\"./vi.js\": \"2921\",\n\t\"./x-pseudo\": \"fd7e\",\n\t\"./x-pseudo.js\": \"fd7e\",\n\t\"./yo\": \"7f33\",\n\t\"./yo.js\": \"7f33\",\n\t\"./zh-cn\": \"5c3a\",\n\t\"./zh-cn.js\": \"5c3a\",\n\t\"./zh-hk\": \"49ab\",\n\t\"./zh-hk.js\": \"49ab\",\n\t\"./zh-mo\": \"3a6c\",\n\t\"./zh-mo.js\": \"3a6c\",\n\t\"./zh-tw\": \"90ea\",\n\t\"./zh-tw.js\": \"90ea\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"4678\";","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./AppFooter.vue?vue&type=style&index=0&id=4b4349d5&scoped=true&lang=scss\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./ResetPasswordVerify.vue?vue&type=style&index=0&id=c02cda70&lang=scss&scoped=true\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./AppHeader.vue?vue&type=style&index=0&id=143b386b&lang=scss&scoped=true\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./UStrongPassword.vue?vue&type=style&index=0&id=0ec49a26&lang=scss&scoped=true\"","var map = {\n\t\"./logo_unihub.svg\": [\n\t\t\"7b80\",\n\t\t\"chunk-2d0e1839\"\n\t],\n\t\"./logo_unihubOld.svg\": [\n\t\t\"4f32\",\n\t\t\"chunk-2d0cc987\"\n\t],\n\t\"./logo_unihub_small.svg\": [\n\t\t\"52ec\",\n\t\t\"chunk-2d0c80f1\"\n\t],\n\t\"./logout.svg\": [\n\t\t\"309a\",\n\t\t\"chunk-2d0b8b5b\"\n\t],\n\t\"./menu-burger.svg\": [\n\t\t\"0e6d\",\n\t\t\"chunk-2d0af4d9\"\n\t],\n\t\"./user-profile.svg\": [\n\t\t\"1139\",\n\t\t\"chunk-2d0aa57c\"\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__.t(id, 7);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = \"7e7b\";\nmodule.exports = webpackAsyncContext;","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./LogOutDialog.vue?vue&type=style&index=0&id=a2f61328&lang=scss&scoped=true\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./UserProfile.vue?vue&type=style&index=0&id=21b7ecf7&scoped=true&lang=scss\"","<template>\r\n <u-app-layout :backgroundName=\"bgName\">\r\n <template v-slot:header>\r\n <app-header ref=\"header\" />\r\n </template>\r\n\r\n <router-view />\r\n <Toast autoZIndex=\"false\" position=\"bottom-left\" baseZIndex=\"999999\"/>\r\n <DynamicDialog />\r\n \r\n <template v-slot:footer>\r\n <app-footer />\r\n </template>\r\n <Dialog position=\"center\" :closable=\"true\" :showHeader=\"true\" :header=\"t('tiles.messages.warning')\" :style=\"{width: '50vw'}\"\r\n\t\t\tv-model:visible=\"pretimeoutDialogIsVissible\" id=\"idDialog\">\r\n\t\t{{t('global.messages.pretimeout')}}\r\n\t\t<template #footer>\r\n\t\t\t<Button label=\"OK\" v-on:click=\"stayLoggedIn()\" />\r\n\t\t</template>\r\n\t</Dialog>\r\n </u-app-layout>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n import { defineComponent, onMounted, ref, computed, watch } from 'vue';\r\n import AppHeader from '@/components/AppHeader.vue';\r\n import AppFooter from '@/components/AppFooter.vue';\r\n import UAppLayout from '@/components/common/UAppLayout.vue';\r\n import { VueReCaptcha, useReCaptcha } from 'vue-recaptcha-v3';\r\n import { useStore } from '@/store';\r\n import { WebSocketMessageTypes } from './types/WebSocketMessageTypes';\r\n import LoginService from './services/LoginService';\r\n import WebSocketFunctions from './help/WebSocketFunctions';\r\n import config from './config';\r\n import { useI18n } from 'vue-i18n';\r\n\r\n export default defineComponent({\r\n components: { UAppLayout, AppHeader, AppFooter },\r\n\r\n setup() {\r\n const { t } = useI18n();\r\n const pretimeoutDialogIsVissible = ref(false);\r\n const bgName = ref(\"\");\r\n const header = ref(null);\r\n const store = useStore();\r\n const loginService = new LoginService();\r\n let helloMessageId = '';\r\n const interval = ref(0);\r\n onMounted(async () => {\r\n document.title = 'Unihub' + config.envName;\r\n if (store.getters.isRecaptchaEnabled) {\r\n const reCaptcha = useReCaptcha();\r\n if (reCaptcha) {\r\n await reCaptcha.recaptchaLoaded();\r\n reCaptcha?.instance.value?.hideBadge();\r\n }\r\n }\r\n });\r\n\r\n async function startPingTimer(): Promise<void> {\r\n clearInterval(interval.value);\r\n let timer = store.state.app.wsPingTimeoutInSeconds ?? 30;\r\n interval.value = setInterval(async function () {\r\n if (--timer < 0) {\r\n timer = store.state.app.wsPingTimeoutInSeconds ?? 30;\r\n if (store.getters.pingActivity) {\r\n await WebSocketFunctions.sendMessage(WebSocketMessageTypes.ping);\r\n pretimeoutDialogIsVissible.value = false;\r\n }\r\n }\r\n }, 1000);\r\n }\r\n\r\n watch(() => store.state.socket.message, function () {\r\n try {\r\n const message = JSON.parse(store.state.socket.message.toString());\r\n\r\n if (helloMessageId && helloMessageId == message.replyTo) {\r\n if (message.ack == true) {\r\n startPingTimer();\r\n }\r\n }else if ( store.state.messages.findIndex(m=>m.id == message.replyTo) > -1){\r\n const storedMessage = store.state.messages.find(m => m.id = message.replyTo);\r\n if(storedMessage && storedMessage.messageType == WebSocketMessageTypes.ping){\r\n store.state.lastWSPing = new Date();\r\n }\r\n }\r\n else if (message && message.user && message.ssoSessionId && message.method && message.application) {\r\n if (store.state.principalUsername == message.user &&\r\n store.state.sessionState == message.ssoSessionId && store.state.messages.findIndex(m=>m.id == message.id) == -1) {\r\n if (message.method == WebSocketMessageTypes.logout) {\r\n WebSocketFunctions.sendAckMessage(message.id);\r\n loginService.logout();\r\n } else if (message.method == WebSocketMessageTypes.ping) {\r\n Object(header.value).resetTimer();\r\n startPingTimer();\r\n store.state.lastWSPing = new Date();\r\n WebSocketFunctions.sendAckMessage(message.id);\r\n } else if (message.method == WebSocketMessageTypes.pretimeout) {\r\n pretimeoutDialogIsVissible.value = true;\r\n WebSocketFunctions.sendAckMessage(message.id);\r\n }\r\n }\r\n }\r\n } catch (exc) {\r\n if (store.state.app.logToConsoleEnabled) {\r\n console.log('APP: ONMESSAGE');\r\n console.error(exc)\r\n }\r\n }\r\n });\r\n\r\n watch(async () => store.state.socket.isConnected, async function () {\r\n try {\r\n if (store.state.socket.isConnected) {\r\n helloMessageId = await WebSocketFunctions.sendMessage(WebSocketMessageTypes.hello);\r\n }\r\n } catch (exc) {\r\n if (store.state.app.logToConsoleEnabled) {\r\n console.log('APP: Hello');\r\n console.error(exc)\r\n }\r\n }\r\n });\r\n \r\n const stayLoggedIn = async () => {\r\n pretimeoutDialogIsVissible.value = false;\r\n await WebSocketFunctions.sendMessage(WebSocketMessageTypes.ping);\r\n };\r\n\r\n return {\r\n bgName,\r\n header,\r\n pretimeoutDialogIsVissible,\r\n t,\r\n stayLoggedIn\r\n }\r\n }\r\n });\r\n</script>","<template>\r\n <u-app-header>\r\n <template v-slot:banner>\r\n <router-link :to=\"to\" >\r\n <suspense>\r\n <u-icon-button :image=\"isMobile() ? 'logo_unihub_small' : 'logo_unihub'\" />\r\n </suspense>\r\n </router-link>\r\n </template>\r\n \r\n <template v-slot:menu v-if=\"isLoggedIn\">\r\n <span class=\"user-name\">\r\n {{ firstName }}<br>{{ lastName }}\r\n <div v-show=\"isImpersonification\">{{ t(\"appHeader.impersonated\")}}</div> \r\n </span>\r\n <router-link to=\"user-profile\">\r\n <u-icon-button image=\"user-profile\" />\r\n </router-link>\r\n <u-icon-button :showTimer=\"true\" image=\"logout\" @click=\"showLogoutDialogClick\" ref=\"timer\" :tooltip=\"t('appHeader.logoutTooltip')\"/>\r\n <div class=\"menuContainer\">\r\n <u-icon-button image=\"menu-burger\" @click=\"toggleMenu\" aria-haspopup=\"true\" aria-controls=\"overlay_menu\" />\r\n <Menu ref=\"menu\" id=\"overlay_menu\" :model=\"menuItems\" :popup=\"true\" />\r\n </div>\r\n </template>\r\n </u-app-header>\r\n\r\n <div class=\"popup-container\" v-if=\"showLogoutDialog\">\r\n <div class=\"popup-inner\">\r\n <span class=\"popup-header\">{{t('tiles.messages.warning')}}</span>\r\n <span class=\"popup-text\">{{t(\"logOut.titles.logoutDialog\")}}</span>\r\n <div class=\"popup-buttons\">\r\n <Button class=\"popup-button\" :label=\"t('logOut.titles.logoutFromAllPOS')\" v-on:click=\"logout\"/>\r\n <Button class=\"popup-button\" :label=\"t('tiles.buttons.cancel')\" v-on:click=\"showLogoutDialog = false\"/>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { computed, defineComponent, ref } from 'vue'\r\nimport UAppHeader from '@/components/common/UAppHeader.vue'\r\nimport UIconButton from '@/components/common/UIconButton.vue'\r\nimport { useStore } from '@/store';\r\nimport LoginService from '@/services/LoginService';\r\nimport { useI18n } from 'vue-i18n';\r\nimport { useRoute } from 'vue-router';\r\nimport EventBus from '@/help/EventBus';\r\n\r\nexport default defineComponent({\r\n components: {UAppHeader, UIconButton},\r\n setup() {\r\n const timer = ref(null);\r\n const store = useStore();\r\n const { t } = useI18n();\r\n const loginService = new LoginService();\r\n const route = useRoute();\r\n const showLogoutDialog = ref(false);\r\n\r\n const firstName = computed(() => store.state.user?.firstName);\r\n const lastName = computed(() => store.state.user?.lastName);\r\n const isLoggedIn = computed(() => store.getters.isUserLoggedIn);\r\n const isImpersonification = computed(() => store.getters.isImpersonification);\r\n const logout = () => {\r\n loginService.logout();\r\n };\r\n const to = computed(() => {\r\n return route.name == \"LogOut\" ? '/LogOut' : '/';\r\n });\r\n\r\n const menu = ref();\r\n const menuItems = ref([\r\n {\r\n items: [\r\n {\r\n label: 'Přeskládat dlaždice',\r\n command: () =>{\r\n EventBus.emit('sortModeEnabled');\r\n }\r\n }\r\n ]\r\n }\r\n ]);\r\n\r\n const toggleMenu = (event: any) => {\r\n menu.value.toggle(event);\r\n };\r\n\r\n function resetTimer(){\r\n Object(timer.value).resetCounter();\r\n }\r\n\r\n function isMobile(){\r\n return screen.width <= 450;\r\n }\r\n\r\n function showLogoutDialogClick(){\r\n showLogoutDialog.value = true;\r\n }\r\n\r\n return {\r\n firstName,\r\n lastName,\r\n isLoggedIn,\r\n logout,\r\n isImpersonification,\r\n t,\r\n to,\r\n timer,\r\n resetTimer,\r\n menuItems,\r\n menu,\r\n toggleMenu,\r\n isMobile,\r\n showLogoutDialog,\r\n showLogoutDialogClick\r\n };\r\n }\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import '@/css-framework/_colors';\r\n@import '@/css-framework/_mixins';\r\n\r\n.menuContainer{\r\n margin-right: 10px;\r\n}\r\n\r\n.logout-dialog-header{\r\n background-color: $color-primary;\r\n}\r\n\r\n.user-name {\r\n font-size: 14pt;\r\n line-height: 14pt;\r\n font-weight: bold;\r\n color: $color-white;\r\n text-align: right;\r\n display: none; // to hide username on narrow screen\r\n\r\n @include media-breakpoint-up(md) {\r\n display: inline-block;\r\n }\r\n\r\n @include media-breakpoint-up(lg) {\r\n font-size: 11pt;\r\n line-height: 11pt;\r\n }\r\n }\r\n\r\n .popup-container{\r\n position: fixed;\r\n background-color: rgba(0, 0, 0, 0.2);\r\n border: 1px solid black;\r\n \r\n z-index: 99;\r\n\r\n top: 25%;\r\n left: 50%;\r\n /* bring your own prefixes */\r\n transform: translate(-50%, -50%);\r\n\r\n width: 90%;\r\n max-width: 750px;\r\n\r\n .popup-inner{\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: #FFF;\r\n }\r\n\r\n .popup-buttons{\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: flex-end;\r\n gap: 1%;\r\n width: 100%;\r\n padding: 2%;\r\n\r\n .popup-button{\r\n padding: .5rem .75rem;\r\n color: $color-white;\r\n background-color: #d41c4c;\r\n border: #d41c4c 1px solid;\r\n\r\n width: 50%;\r\n font-size: calc(12px + 0.4vw);\r\n\r\n\r\n :enabled:hover {\r\n background: $color-info-hover;\r\n border-color: $color-info-hover;\r\n }\r\n }\r\n }\r\n\r\n .popup-header{\r\n width: 100%;\r\n color:#FFF;\r\n background-color: $color-primary;\r\n padding: 1%;\r\n font-size: calc(16px + 0.4vw);\r\n }\r\n\r\n .popup-text{\r\n padding: 2%;\r\n color: $color-primary;\r\n font-size: calc(16px + 0.8vw);\r\n }\r\n }\r\n</style>\r\n","<template>\r\n <header>\r\n <nav class=\"u-navbar\" :style=\"isImpersonification ? 'background: red;' : ''\">\r\n <div class=\"u-app-layout-container\">\r\n <slot name=\"banner\"/>\r\n <div class=\"u-nav-menu\">\r\n <slot name=\"menu\" />\r\n </div> \r\n </div> \r\n </nav>\r\n <div class=\"header-time\"> {{time}}</div>\r\n </header>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { computed, defineComponent, ref } from 'vue'\r\nimport { useStore } from '@/store';\r\n\r\nexport default defineComponent({\r\n setup() {\r\n const store = useStore();\r\n const isImpersonification = computed(() => store.getters.isImpersonification);\r\n const time = ref('');\r\n const interval = setInterval(() => {\r\n time.value = Intl.DateTimeFormat(navigator.language,\r\n {\r\n year: 'numeric',\r\n month: 'numeric',\r\n day: 'numeric',\r\n hour: 'numeric',\r\n minute: 'numeric',\r\n second: 'numeric'\r\n }).format()\r\n }, 1000)\r\n return { isImpersonification, time };\r\n }\r\n})\r\n</script>","export enum ActionTypes {\r\n getUser = \"getUser\",\r\n tryRefreshToken = \"tryRefreshToken\",\r\n getToken = \"getToken\",\r\n getRecaptchaStatus = \"getRecaptchaStatus\",\r\n socketSendMessage = \"socketSendMessage\"\r\n}","export enum MutationTypes {\r\n\tsetUser = \"setUser\",\r\n\tremoveUser = \"removeUser\",\r\n\tsetToken = \"setToken\",\r\n\tsetShowCheckPhoneDialog = \"setShowCheckPhoneDialog\",\r\n\tshowPasswordExpirationDialog = \"showPasswordExpirationDialog\",\r\n\tinitApp = \"initApp\",\r\n\tsetRecaptcha = \"setRecaptcha\",\r\n\tsetImpersonification = \"setImpersonification\",\r\n\tloginOut = \"loginOut\",\r\n\tsetSSO = \"setSSO\",\r\n\tSOCKET_ONOPEN = 'SOCKET_ONOPEN',\r\n\tSOCKET_ONCLOSE = 'SOCKET_ONCLOSE',\r\n\tSOCKET_ONERROR = 'SOCKET_ONERROR',\r\n\tSOCKET_ONMESSAGE = 'SOCKET_ONMESSAGE',\r\n\tSOCKET_RECONNECT = 'SOCKET_RECONNECT',\r\n\tSOCKET_RECONNECT_ERROR = 'SOCKET_RECONNECT_ERROR',\r\n\tsaveMessage = \"saveMessage\"\r\n}","import { createI18n } from 'vue-i18n';\r\n\r\nimport csCZ from '@/locale/cs-CZ.json';\r\nimport skSK from '@/locale/sk-SK.json';\r\nimport enUS from '@/locale/en-US.json';\r\n\r\nconst messages = {\r\n\t'cs-CZ': csCZ,\r\n\t'sk-SK': skSK,\r\n\t'en-US': enUS\r\n}\r\n\r\nconst currentLocale = Object.keys(messages).find(str => str.includes(navigator.language));\r\nexport const i18n = createI18n({\r\n\tlegacy: false,\r\n\tlocale: currentLocale,\r\n\tfallbackLocale: 'cs-CZ',\r\n\tmessages\r\n});","import axios from 'axios';\r\nimport { PatchObject } from 'json-patch-gen';\r\nimport AccountDto from '../dtos/AccountDto';\r\nimport ChangePasswordDto from '../dtos/ChangePasswordDto';\r\nimport SecondFactorDto from '../dtos/SecondFactorDto';\r\nimport { useI18n } from 'vue-i18n';\r\nimport AccountClientMock from './mocks/AccountClientMock';\r\nimport { i18n } from '@/i18n';\r\nimport VerifyEmailUniquenessDto from '../dtos/VerifyEmailUniquenessDto';\r\nimport ChangePasswordValidateDto from '../dtos/ChangePasswordValidateDto';\r\n\r\n\r\nclass AccountClient {\r\n\tprivate readonly RESOURCE_ACCOUNTS = 'Accounts';\r\n\r\n\tpublic async getMe(): Promise<AccountDto> {\r\n\t\treturn (await axios.get(`${this.RESOURCE_ACCOUNTS}/me`)).data;\r\n\t}\r\n\r\n\t\r\n\r\n\tpublic patch(id: string, patch: PatchObject[], verificationData: string): Promise<void> {\r\n\t\treturn axios.patch(`${this.RESOURCE_ACCOUNTS}/${id}`, patch,\r\n\t\t\t{ \r\n\t\t\t\theaders: { \"x-verification-data\": verificationData },\r\n\t\t\t\terrorMessages: new Map([\r\n\t\t\t\t\t[403, i18n.global.t(\"toast.messages.verificationFailed\")],\r\n\t\t\t\t\t[409, i18n.global.t(\"toast.messages.emailAlreadyExists\")]\r\n\t\t\t\t])\r\n\t\t\t});\r\n\t}\r\n\r\n\tpublic async changePasswordVerify(id: string, data: ChangePasswordDto): Promise<void> {\r\n\t\treturn axios.put(`${this.RESOURCE_ACCOUNTS}/${id}/verify-change-password`, data);\r\n\t}\r\n\r\n\tpublic async getSecondFactors(id: string): Promise<SecondFactorDto[]> {\r\n\t\treturn (await axios.get(`${this.RESOURCE_ACCOUNTS}/${id}/second-factors`)).data;\r\n\t}\r\n\r\n\tpublic async verifyMyNewEmailUniqueness(data: VerifyEmailUniquenessDto): Promise<boolean> {\r\n\t\treturn await (await axios.post(`${this.RESOURCE_ACCOUNTS}/me/verify-new-email-uniqueness`, data)).data;\r\n\t}\r\n\r\n\tpublic async validateMyNewPassword(data: ChangePasswordValidateDto): Promise<void> {\r\n\t\treturn await axios.post(`${this.RESOURCE_ACCOUNTS}/me/validate-new-password`, data);\r\n\t}\r\n}\r\n\r\n//export default process.env.NODE_ENV === 'production' ? AccountClient : AccountClientMock\r\nexport default AccountClient","export default class AuthTokenRequestDto {\r\n\tpublic refreshToken = '';\r\n\tpublic redirectUri = '';\r\n\tpublic code = '';\r\n\r\n\tpublic constructor(init?: Partial<AuthTokenRequestDto>) {\r\n Object.assign(this, init);\r\n }\r\n}","export default class AuthToken {\r\n public accessToken: string;\r\n public refreshToken: string;\r\n public validTo: Date;\r\n\r\n constructor(accessToken: string, refreshToken: string, validTo: Date) {\r\n this.accessToken = accessToken\r\n this.refreshToken = refreshToken\r\n this.validTo = validTo\r\n }\r\n}","import axios from 'axios';\r\nimport AuthTokenRequestDto from '../dtos/AuthTokenRequestDto';\r\nimport AuthTokenDto from '../dtos/AuthTokenDto';\r\nimport TokenClientMock from './mocks/TokenClientMock';\r\n\r\nclass TokenClient {\r\n\tprivate RESOURCE_TOKEN = 'keycloak';\r\n\r\n\tpublic async getToken(data: AuthTokenRequestDto): Promise<AuthTokenDto> {\r\n\t\tconst result = await axios.post(`${this.RESOURCE_TOKEN}/token`, data, { supressErrorMessage: true });\r\n\t\treturn result.data;\r\n\t}\r\n\r\n\tpublic async refreshToken(data: AuthTokenRequestDto): Promise<AuthTokenDto> {\r\n\t\tconst result = await axios.post(`${this.RESOURCE_TOKEN}/refreshToken`, data, \r\n\t\t\t{ supressErrorMessage: true });\r\n\r\n\t\treturn result.data;\r\n\t}\r\n}\r\n\r\n//export default process.env.NODE_ENV === 'production' ? TokenClient : TokenClientMock\r\nexport default TokenClient","import AuthTokenRequestDto from '@/dtos/AuthTokenRequestDto';\r\nimport AuthToken from '@/model/AuthToken';\r\nimport TokenClientMock from './mocks/TokenClientMock';\r\nimport TokenClient from './TokenClient';\r\n\r\nexport default class AuthTokenService {\r\n private readonly client: TokenClient;\r\n\r\n constructor() {\r\n this.client = new TokenClient();\r\n }\r\n\r\n public async getToken(code: string, redirectUri: string): Promise<AuthToken> {\r\n const res = await this.client.getToken(new AuthTokenRequestDto({ \r\n code, \r\n redirectUri\r\n }));\r\n\r\n return new AuthToken(res.access_token, res.refresh_token, this.getValidTo(res.expires_in));\r\n }\r\n\r\n public async refreshToken(refreshToken: string): Promise<AuthToken> {\r\n const res = await this.client.refreshToken(new AuthTokenRequestDto({ refreshToken }));\r\n return new AuthToken(res.access_token, res.refresh_token, this.getValidTo(res.expires_in));\r\n }\r\n\r\n private getValidTo(duration: number) {\r\n const validTo = new Date();\r\n validTo.setMinutes(validTo.getMinutes() + (duration / 60) - 1);\r\n\r\n return validTo;\r\n }\r\n}","export default {\r\n apiUrl: \"https://unihub-dev.uniqa.cz/hyperionapi/api\",\r\n authUrl: \"https://login-dev.uniqa.cz/auth/realms/people/protocol/openid-connect\",\r\n authRedirectUri: \"https://unihub-dev.uniqa.cz\",\r\n damageReportUrl: \"https://skody-t.uniqa.cz/form/redirect/\",\r\n damageReportUrlBaseSK: \"https://skody-t.uniqa.sk/\",\r\n wsUrl: \"\",\r\n envName: \"-Dev\" \r\n}","export default {\r\n apiUrl: \"https://unihub.uniqa.cz/hyperionapi/api\",\r\n authUrl: \"https://login.uniqa.cz/auth/realms/people/protocol/openid-connect\",\r\n authRedirectUri: \"https://unihub.uniqa.cz\",\r\n damageReportUrl: \"https://skody.uniqa.cz/form/redirect/\",\r\n damageReportUrlBaseSK: \"https://skody.uniqa.sk/\",\r\n wsUrl: \"\",\r\n envName: \"\" \r\n}","export default {\r\n apiUrl: \"https://unihub-test.uniqa.cz/hyperionapi/api\",\r\n authUrl: \"https://login-test.uniqa.cz/auth/realms/people/protocol/openid-connect\",\r\n authRedirectUri: \"https://unihub-test.uniqa.cz\",\r\n damageReportUrl: \"https://skody-t.uniqa.cz/form/redirect/\",\r\n damageReportUrlBaseSK: \"https://skody-t.uniqa.sk/\",\r\n wsUrl: \"wss://wsocket-test.uniqa.cz/messaging\",\r\n envName: \"-Test\" \r\n}","export default {\r\n apiUrl: \"https://localhost:44365/api\",\r\n //authUrl: \"https://login-dev.uniqa.cz/auth/realms/people/protocol/openid-connect\",\r\n authUrl: \"https://login-test.uniqa.cz/auth/realms/people/protocol/openid-connect\",\r\n authRedirectUri: \"http://localhost:8080\",\r\n damageReportUrl: \"https://skody-t.uniqa.cz/form/redirect/\",\r\n damageReportUrlBaseSK: \"https://skody-t.uniqa.sk/\",\r\n wsUrl: \"wss://wsocket-test.uniqa.cz/messaging\",\r\n envName: \"-Local\" \r\n}\r\n","import dev from \"./dev\";\r\nimport prod from \"./prod\"\r\nimport test from \"./test\"\r\nimport local from \"./local\"\r\n\r\nconst isTest = process.env.NODE_ENV === 'testenv'\r\nconst isProduction = process.env.NODE_ENV === 'production'\r\nconst isDevelopment = process.env.NODE_ENV === 'development'\r\n\r\n\r\nexport default isProduction ? prod : isTest ? test : isDevelopment ? dev : local;","<template>\r\n <div class=\"col-md-4 mx-auto\">\r\n <h1>{{ t(\"changePassword.pageTitle\") }}</h1>\r\n </div>\r\n\r\n <div class=\"col-md-5 col-lg-4 mx-auto u-form\">\r\n <form @submit.prevent=\"changePassword(!v$.$invalid)\">\r\n <div class=\"p-float-label\">\r\n <InputText type=\"password\" \r\n id=\"chng-pass-orig\" \r\n :placeholder=\"t('changePassword.fields.originalPassword')\" \r\n class=\"p-inputtext-lg\"\r\n v-model=\"v$.origPass.$model\"\r\n :class=\"{'p-invalid': v$.origPass.$invalid && v$.origPass.$dirty}\"\r\n :disabled=\"saving || secondFactorMissing\" />\r\n <label for=\"chng-pass-orig\">{{ t(\"changePassword.fields.originalPassword\") }}</label>\r\n </div>\r\n <u-error-container v-if=\"v$.origPass.$invalid && v$.origPass.$dirty\">\r\n <u-error-item v-if=\"v$.origPass.required.$invalid\">\r\n {{ t(\"changePassword.validations.enterOriginalPassword\") }}\r\n </u-error-item>\r\n </u-error-container>\r\n\r\n <u-strong-password v-model=\"form.newPass\" :minPasswordLength=\"minPasswordLength\"\r\n :label=\"t('changePassword.fields.newPassword')\"\r\n :disabled=\"saving || secondFactorMissing\" />\r\n \r\n <div class=\"p-float-label\">\r\n <InputText type=\"password\"\r\n id=\"chng-pass-verify\" \r\n :placeholder=\"t('changePassword.fields.verifyNewPassword')\"\r\n class=\"p-inputtext-lg\"\r\n v-model.trim=\"v$.newPassVerify.$model\"\r\n :class=\"{'p-invalid': v$.newPassVerify.$invalid && v$.newPassVerify.$dirty}\"\r\n :disabled=\"saving || secondFactorMissing\" />\r\n <label for=\"chng-pass-verify\">{{ t(\"changePassword.fields.verifyNewPassword\") }}</label>\r\n </div>\r\n <u-error-container v-if=\"v$.newPassVerify.$invalid && v$.newPassVerify.$dirty\">\r\n <u-error-item v-if=\"v$.newPassVerify.passwordsMatch.$invalid \">\r\n {{ t(\"changePassword.validations.passwordsMismatch\") }}\r\n </u-error-item>\r\n <u-error-item v-if=\"v$.newPassVerify.required.$invalid\">\r\n {{ t(\"changePassword.validations.enterVerifyPassword\") }}\r\n </u-error-item>\r\n </u-error-container>\r\n <Message severity=\"info\" :closable=\"false\">\r\n {{ t(\"changePassword.messages.resetPasswordMessage\") }}\r\n <a href=\"#\" @click=\"$router.push('resetPassword')\">{{t(\"changePassword.messages.resetPassword\")}}</a>\r\n </Message>\r\n <div class=\"d-grid gap-2\">\r\n <Button type=\"submit\"\r\n :label=\"t('changePassword.buttons.submit')\"\r\n class=\"p-button-success\" \r\n :disabled=\"loading || saving || secondFactorMissing\"\r\n :icon=\"loadingIcon\"\r\n\t\t\t\t\t\ticonPos=\"right\" />\r\n </div>\r\n </form>\r\n </div>\r\n <verification-prompt v-model:visible=\"showVerifyPrompt\" @submited=\"continueSaving($event)\" @resendVerificationCode=\"resendVerificationCode()\" ref=\"verifyPrompt\"/>\r\n <Dialog position=\"center\" :closable=\"true\" :showHeader=\"true\" :header=\"t('tiles.messages.warning')\"\r\n v-model:visible=\"displayModal\" id=\"idDialog\">\r\n {{ t(\"changePassword.messages.missing2faError\", { loginname: login}) }}\r\n <template #footer>\r\n <Button label=\"OK\" v-on:click=\"displayModal = false;\" />\r\n </template>\r\n </Dialog>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n import { computed, defineComponent, onMounted, reactive, ref } from 'vue'\r\n import AccountClient from '@/services/AccountClient';\r\n import ChangePasswordDto from '@/dtos/ChangePasswordDto';\r\n import SecondFactorClient from '@/services/SecondFactorClient';\r\n import { useToast } from \"primevue/usetoast\";\r\n import { useRouter } from 'vue-router';\r\n import { required, requiredIf } from '@vuelidate/validators';\r\n import useVuelidate from \"@vuelidate/core\";\r\n import UErrorContainer from \"@/components/common/UErrorContainer.vue\";\r\n import UErrorItem from \"@/components/common/UErrorItem.vue\";\r\n import { useStore } from '@/store';\r\n import UStrongPassword from '@/components/common/UStrongPassword.vue';\r\n import { useI18n } from 'vue-i18n';\r\n import { useHead } from '@vueuse/head';\r\n import AccountDto from '../dtos/AccountDto';\r\n import SecondFactorDto from '@/dtos/SecondFactorDto';\r\n import VerificationPrompt from '@/components/VerificationPrompt.vue';\r\n import ChangePasswordValidateDto from '@/dtos/ChangePasswordValidateDto';\r\n import { VueReCaptcha, useReCaptcha } from 'vue-recaptcha-v3';\r\n import WebSocketFunctions from '../help/WebSocketFunctions';\r\n import { WebSocketMessageTypes } from '@/types/WebSocketMessageTypes';\r\n \r\n export default defineComponent({\r\n components: { UErrorContainer, UErrorItem, UStrongPassword, VerificationPrompt },\r\n setup() {\r\n const toast = useToast();\r\n const router = useRouter();\r\n const store = useStore();\r\n const { t } = useI18n();\r\n const loading = ref(false), saving = ref(false);\r\n const loadingIcon = computed(() => loading.value || saving.value\r\n ? \"pi pi-spin pi-spinner\" : \"\");\r\n const minPasswordLength = ref(10);\r\n const userId = ref(store.state.user?.id ?? \"\");\r\n\r\n const accountClient = new AccountClient();\r\n const account = reactive(new AccountDto());\r\n let secFactor: SecondFactorDto;\r\n const secondFactorMissing = ref(false);\r\n let verificationCodeSent = false;\r\n const verifyPrompt = ref(null);\r\n const showVerifyPrompt = ref(false);\r\n const useSecondFactorVerification = ref(false);\r\n\r\n const reCaptcha = useReCaptcha();\r\n let recaptchaToken = \"\";\r\n const login = ref('');\r\n const displayModal = ref(false);\r\n\r\n const getRecaptchaToken = async () => {\r\n if (!store.getters.isRecaptchaEnabled) {\r\n return true;\r\n }\r\n recaptchaToken = \"\";\r\n // (optional) Wait until recaptcha has been loaded.\r\n if (reCaptcha) {\r\n await reCaptcha.recaptchaLoaded();\r\n recaptchaToken = await reCaptcha.executeRecaptcha('resetPassword');\r\n }\r\n\r\n if (recaptchaToken == null || recaptchaToken == undefined || recaptchaToken == \"\") {\r\n toast.add({\r\n severity: 'error',\r\n summary: t(\"toast.titles.error\"),\r\n detail: t(\"toast.messages.recaptchaError\")\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n const form = reactive({\r\n origPass: \"\",\r\n newPass: \"\",\r\n newPassVerify: \"\"\r\n });\r\n\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: \"noindex\",\r\n },\r\n ],\r\n });\r\n\r\n onMounted(async () => {\r\n try {\r\n loading.value = true;\r\n Object.assign(account, await accountClient.getMe());\r\n login.value = account.username ? account.username : account.email;\r\n if (account.type === \"Service\") {\r\n minPasswordLength.value = 25;\r\n } else {\r\n minPasswordLength.value = 10;\r\n }\r\n\r\n if (account.usePasswordConfirmation) {\r\n useSecondFactorVerification.value = false;\r\n } else {\r\n useSecondFactorVerification.value = true;\r\n secFactor = (await accountClient.getSecondFactors(userId.value))[0];\r\n if (secFactor == null) {\r\n secondFactorMissing.value = true;\r\n displayModal.value = true;\r\n }\r\n }\r\n } catch {\r\n // intercepted by axios\r\n }\r\n\r\n loading.value = false;\r\n });\r\n\r\n const passwordsMatch = () => form.newPass === form.newPassVerify; // TODO duplicated\r\n const rules = {\r\n origPass: { required },\r\n newPassVerify: { required, passwordsMatch }\r\n };\r\n\r\n const v$ = useVuelidate(rules, form);\r\n\r\n const authenticate = async () => {\r\n try {\r\n if (!verificationCodeSent) {\r\n await new SecondFactorClient().authenticate(secFactor.id, recaptchaToken)\r\n Object(verifyPrompt.value).startTimer();\r\n verificationCodeSent = true;\r\n }\r\n showVerifyPrompt.value = true;\r\n } catch {\r\n // intercepted by axios\r\n }\r\n };\r\n\r\n const resendVerificationCode = async () => {\r\n if (!await getRecaptchaToken()) {\r\n return;\r\n }\r\n verificationCodeSent = false;\r\n await authenticate();\r\n };\r\n\r\n const continueSaving = async (verificationData: string) => {\r\n saving.value = true;\r\n\r\n try {\r\n await accountClient.changePasswordVerify(\r\n userId.value,\r\n new ChangePasswordDto({\r\n originalPassword: form.origPass,\r\n newPassword: form.newPass,\r\n verificationToken: verificationData\r\n }));\r\n\r\n if (useSecondFactorVerification.value) {\r\n showVerifyPrompt.value = false;\r\n }\r\n\r\n toast.add({\r\n severity: 'success',\r\n detail: t(\"toast.messages.passwordChangeSuccess\"),\r\n life: 3000\r\n });\r\n\r\n router.push(\"user-profile\");\r\n\r\n } catch {\r\n // intercepted by axios\r\n }\r\n\r\n saving.value = false;\r\n\r\n };\r\n const changePassword = async (valid: boolean) => {\r\n\r\n v$.value.$touch();\r\n if (!valid) {\r\n return;\r\n }\r\n\r\n saving.value = true;\r\n try {\r\n if (useSecondFactorVerification.value) {\r\n try {\r\n await accountClient.validateMyNewPassword(new ChangePasswordValidateDto({\r\n originalPassword: form.origPass,\r\n newPassword: form.newPass\r\n }));\r\n\r\n if (!await getRecaptchaToken()) {\r\n return;\r\n }\r\n await authenticate();\r\n }\r\n catch {\r\n // intercepted by axios\r\n }\r\n } else {\r\n continueSaving(\"\");\r\n }\r\n\r\n } catch {\r\n // intercepted by axios\r\n }\r\n\r\n saving.value = false;\r\n };\r\n return {\r\n form,\r\n v$,\r\n loading,\r\n saving,\r\n loadingIcon,\r\n changePassword,\r\n t,\r\n secondFactorMissing,\r\n showVerifyPrompt,\r\n verifyPrompt,\r\n continueSaving,\r\n resendVerificationCode,\r\n minPasswordLength,\r\n login,\r\n displayModal\r\n };\r\n },\r\n })\r\n</script>","export default class ChangePasswordDto {\r\n\tpublic newPassword = '';\r\n\tpublic originalPassword = '';\r\n\tpublic verificationToken = '';\r\n\r\n\tpublic constructor(init?: Partial<ChangePasswordDto>) {\r\n Object.assign(this, init);\r\n }\r\n}","import { i18n } from '@/i18n';\r\nimport axios from 'axios';\r\nimport SecondFactorDto from '../dtos/SecondFactorDto';\r\nimport SecondFactorClientMock from './mocks/SecondFactorClientMock';\r\n\r\nclass SecondFactorClient {\r\n\tprivate readonly RESOURCE_SECOND_FACTORS = 'SecondFactors';\r\n\r\n\tpublic async authenticate(id: string, recaptchaToken: string, secondaryEmailChange?: boolean): Promise<void> {\r\n\t\treturn axios.post(`${this.RESOURCE_SECOND_FACTORS}/${id}/authenticate?recaptchaToken=${recaptchaToken}`, secondaryEmailChange, \r\n\t\t\t{ headers:{ 'Content-Type': 'application/json'}, errorMessage: i18n.global.t(\"toast.messages.errorSendingVerificationCode\") });\r\n\t}\r\n}\r\n\r\n//export default process.env.NODE_ENV === 'production' ? SecondFactorClient : SecondFactorClientMock\r\nexport default SecondFactorClient","<template>\r\n <ul class=\"u-error-container\">\r\n <slot />\r\n </ul>\r\n</template>","import { render } from \"./UErrorContainer.vue?vue&type=template&id=23015224\"\nconst script = {}\nscript.render = render\n\nexport default script","<template>\r\n <li class=\"p-error\">\r\n <small><slot /></small>\r\n </li>\r\n</template>","import { render } from \"./UErrorItem.vue?vue&type=template&id=b2659d34\"\nconst script = {}\nscript.render = render\n\nexport default script","<template>\r\n <div class=\"p-float-label\">\r\n <InputText type=\"password\" \r\n id=\"strong-pass-value\" \r\n :placeholder=\"label\" \r\n class=\"p-inputtext-lg\" \r\n :modelValue=\"modelValue\"\r\n @update:modelValue=\"onChanged\"\r\n :class=\"{'p-invalid': v$.val.$invalid && v$.val.$dirty}\"\r\n :disabled=\"disabled\" />\r\n <label for=\"strong-pass-value\">{{ label }}</label>\r\n </div>\r\n <u-error-container v-if=\"v$.val.$invalid && v$.val.$dirty\">\r\n <u-error-item v-if=\"v$.val.required.$invalid\">\r\n {{ t(\"strongPassword.messages.enterNewPassword\") }}\r\n </u-error-item>\r\n <u-error-item v-if=\"v$.val.strongPasswordValidation.$invalid\">\r\n {{strongPasswordMessage}}\r\n <ul>\r\n <li>{{t(\"strongPassword.messages.strongPassword2\")}}</li>\r\n <li>{{t(\"strongPassword.messages.strongPassword3\")}}</li>\r\n <li>{{t(\"strongPassword.messages.strongPassword4\")}}</li>\r\n <li>{{t(\"strongPassword.messages.strongPassword5\")}}</li>\r\n </ul>\r\n </u-error-item>\r\n </u-error-container>\r\n <u-error-container v-if=\"v$.val.$dirty\">\r\n <small>{{t(\"changePassword.validations.passwordRules\")}}</small>\r\n </u-error-container>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport {computed, defineComponent, reactive } from 'vue';\r\nimport UErrorContainer from \"@/components/common/UErrorContainer.vue\";\r\nimport UErrorItem from \"@/components/common/UErrorItem.vue\";\r\nimport { required } from '@vuelidate/validators';\r\nimport { strongPassword } from '@/validation/Validators';\r\nimport useVuelidate from '@vuelidate/core';\r\nimport { useI18n } from 'vue-i18n';\r\n\r\nexport default defineComponent({\r\n components: { UErrorContainer, UErrorItem },\r\n props: {\r\n modelValue: String,\r\n label: String,\r\n disabled: Boolean,\r\n minPasswordLength: Number\r\n },\r\n emits: ['update:modelValue'],\r\n\r\n setup(props, { emit }) {\r\n const { t } = useI18n();\r\n const form = reactive({\r\n val: props.modelValue,\r\n })\r\n \r\n const strongPasswordMessage = computed(() => {\r\n return t(\"strongPassword.messages.strongPassword1\", {length: props.minPasswordLength})});\r\n \r\n const strongPasswordValidation = () => strongPassword(form.val, props.minPasswordLength); \r\n const rules = {\r\n val: { required, strongPasswordValidation }\r\n };\r\n\r\n const v$ = useVuelidate(rules, form);\r\n\r\n const onChanged = (event: string) => {\r\n form.val = event;\r\n v$.value.$touch();\r\n emit('update:modelValue', event);\r\n }\r\n\r\n return {\r\n form,\r\n v$,\r\n onChanged,\r\n t,\r\n strongPasswordMessage\r\n }\r\n },\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\nul ul {\r\n list-style-type: initial;\r\n}\r\n</style>","const HasDigit = (str: string) => /\\d/.test(str);\r\nconst HasLower = (str: string) => /[a-z]/.test(str);\r\nconst HasUpper= (str: string) => /[A-Z]/.test(str);\r\nconst AllLetterOrDigit = (str: string) => Array.from(str).every(s => HasUpper(s) || HasLower(s) || HasDigit(s));\r\n\r\nconst Score = (password: string) => \r\n (AllLetterOrDigit(password) ? 0 : 1)\r\n + (HasDigit(password) ? 1 : 0)\r\n + (HasLower(password) ? 1 : 0)\r\n + (HasUpper(password) ? 1 : 0);\r\n\r\nexport default function(password: string, minPasswordLength: number): boolean {\r\n return password.length >= minPasswordLength && Score(password) >= 3; \r\n}","import StrongPasswordValidator from \"./StrongPasswordValidator\";\r\n\r\nexport const strongPassword = function(value: unknown, minPasswordLength: unknown) {\r\n return typeof value === \"string\" && typeof minPasswordLength === \"number\" && StrongPasswordValidator(value, minPasswordLength);\r\n}","\r\nimport {computed, defineComponent, reactive } from 'vue';\r\nimport UErrorContainer from \"@/components/common/UErrorContainer.vue\";\r\nimport UErrorItem from \"@/components/common/UErrorItem.vue\";\r\nimport { required } from '@vuelidate/validators';\r\nimport { strongPassword } from '@/validation/Validators';\r\nimport useVuelidate from '@vuelidate/core';\r\nimport { useI18n } from 'vue-i18n';\r\n\r\nexport default defineComponent({\r\n components: { UErrorContainer, UErrorItem },\r\n props: {\r\n modelValue: String,\r\n label: String,\r\n disabled: Boolean,\r\n minPasswordLength: Number\r\n },\r\n emits: ['update:modelValue'],\r\n\r\n setup(props, { emit }) {\r\n const { t } = useI18n();\r\n const form = reactive({\r\n val: props.modelValue,\r\n })\r\n \r\n const strongPasswordMessage = computed(() => {\r\n return t(\"strongPassword.messages.strongPassword1\", {length: props.minPasswordLength})});\r\n \r\n const strongPasswordValidation = () => strongPassword(form.val, props.minPasswordLength); \r\n const rules = {\r\n val: { required, strongPasswordValidation }\r\n };\r\n\r\n const v$ = useVuelidate(rules, form);\r\n\r\n const onChanged = (event: string) => {\r\n form.val = event;\r\n v$.value.$touch();\r\n emit('update:modelValue', event);\r\n }\r\n\r\n return {\r\n form,\r\n v$,\r\n onChanged,\r\n t,\r\n strongPasswordMessage\r\n }\r\n },\r\n})\r\n","import { render } from \"./UStrongPassword.vue?vue&type=template&id=0ec49a26&scoped=true\"\nimport script from \"./UStrongPassword.vue?vue&type=script&lang=ts\"\nexport * from \"./UStrongPassword.vue?vue&type=script&lang=ts\"\n\nimport \"./UStrongPassword.vue?vue&type=style&index=0&id=0ec49a26&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-0ec49a26\"\n\nexport default script","export default class AccountDto {\r\n\tpublic id = '';\r\n\tpublic firstName = '';\r\n\tpublic lastName = '';\r\n\tpublic birthDate = undefined as Date | undefined;\r\n\tpublic phoneNumber= '';\r\n\tpublic brokerId= '';\r\n\tpublic password= '';\r\n\tpublic email = '';\r\n\tpublic state = '';\r\n\tpublic stateName = '';\r\n\tpublic brokerName = '';\r\n\tpublic verificationToken = '';\r\n\tpublic usePasswordConfirmation = false;\r\n\tpublic phoneNumberIsEditable = false;\r\n\tpublic secondFactorActivationDate = undefined as Date | undefined;\r\n\tpublic username = '';\r\n\tpublic technicalAccount = false;\r\n\tpublic type = '';\r\n\tpublic passwordExpirationDate = '';\r\n\tpublic showPasswordExpirationWarning = false;\r\n\tpublic secondaryEmail = undefined as string | undefined;\r\n\r\n\tpublic constructor(init?: Partial<AccountDto>) {\r\n Object.assign(this, init);\r\n }\r\n}","<template>\r\n <Dialog v-model:visible=\"isVisible\" modal>\r\n <template #header>\r\n <h3>{{ t(\"verificationPrompt.messages.enterVerificationCode\") }}</h3>\r\n </template>\r\n\r\n <div class=\"dialog-body\">\r\n <p>{{ t(\"verificationPrompt.messages.codeSentViaSMS\") }}</p>\r\n <InputText v-model=\"token\" autofocus />\r\n </div>\r\n\r\n <template #footer>\r\n <Button :label=\"countDownText\"\r\n class=\"p-button-small\"\r\n :disabled=\"resendButtonDisabled\"\r\n @click=\"resendVerificationCode\"\r\n v-if=\"displayCountDownButton\" />\r\n <Button :label=\"t('userProfile.buttons.verify')\"\r\n class=\"p-button-small\"\r\n icon=\"pi pi-check\"\r\n :disabled=\"!token\"\r\n @click=\"submit\" />\r\n </template>\r\n </Dialog>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n import { computed, defineComponent, ref } from 'vue'\r\n import { useI18n } from 'vue-i18n';\r\n\r\n export default defineComponent({\r\n props: {\r\n visible: Boolean\r\n },\r\n emits: ['update:visible', 'submited', 'resendVerificationCode'],\r\n setup(props, { emit }) {\r\n const { t } = useI18n();\r\n const token = ref(\"\");\r\n const countDownText = ref(\"\");\r\n const interval = ref(0);\r\n const resendButtonDisabled = ref(true);\r\n const resendButtonText = t(\"resetPasswordVerify.buttons.resendVerificationCode\");\r\n const resendButtonTextTimer = t(\"resetPasswordVerify.buttons.resendVerificationCodeIn\");\r\n const displayCountDownButton = ref(false);\r\n const isVisible = computed({\r\n get() {\r\n return props.visible;\r\n },\r\n set(val: boolean) {\r\n emit('update:visible', val);\r\n }\r\n })\r\n\r\n const submit = () => {\r\n emit('submited', token.value);\r\n token.value = \"\";\r\n }\r\n\r\n const resendVerificationCode = () => {\r\n emit('resendVerificationCode');\r\n }\r\n \r\n const startTimer = () => {\r\n displayCountDownButton.value = true;\r\n resendButtonDisabled.value = true;\r\n countDownText.value = resendButtonTextTimer + \" 02:00\";\r\n clearInterval(interval.value);\r\n let timer = (60 * 2) - 1, minutes, seconds;\r\n\r\n interval.value = setInterval(function () {\r\n minutes = parseInt((timer / 60).toString(), 10);\r\n seconds = parseInt((timer % 60).toString(), 10);\r\n\r\n minutes = minutes < 10 ? \"0\" + minutes : minutes;\r\n seconds = seconds < 10 ? \"0\" + seconds : seconds;\r\n countDownText.value = resendButtonTextTimer + \" \" + minutes + \":\" + seconds;\r\n\r\n if (--timer < 0) {\r\n countDownText.value = resendButtonText;\r\n clearInterval(interval.value);\r\n resendButtonDisabled.value = false;\r\n }\r\n }, 1000);\r\n }\r\n\r\n return {\r\n token,\r\n isVisible,\r\n submit,\r\n countDownText,\r\n startTimer,\r\n resendButtonDisabled,\r\n resendVerificationCode,\r\n t,\r\n displayCountDownButton\r\n }\r\n },\r\n })\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\r\n .dialog-body {\r\n margin: 0 1.5rem;\r\n }\r\n\r\n ::v-deep .p-dialog {\r\n max-width: 75vw;\r\n }\r\n</style>","\r\n import { computed, defineComponent, ref } from 'vue'\r\n import { useI18n } from 'vue-i18n';\r\n\r\n export default defineComponent({\r\n props: {\r\n visible: Boolean\r\n },\r\n emits: ['update:visible', 'submited', 'resendVerificationCode'],\r\n setup(props, { emit }) {\r\n const { t } = useI18n();\r\n const token = ref(\"\");\r\n const countDownText = ref(\"\");\r\n const interval = ref(0);\r\n const resendButtonDisabled = ref(true);\r\n const resendButtonText = t(\"resetPasswordVerify.buttons.resendVerificationCode\");\r\n const resendButtonTextTimer = t(\"resetPasswordVerify.buttons.resendVerificationCodeIn\");\r\n const displayCountDownButton = ref(false);\r\n const isVisible = computed({\r\n get() {\r\n return props.visible;\r\n },\r\n set(val: boolean) {\r\n emit('update:visible', val);\r\n }\r\n })\r\n\r\n const submit = () => {\r\n emit('submited', token.value);\r\n token.value = \"\";\r\n }\r\n\r\n const resendVerificationCode = () => {\r\n emit('resendVerificationCode');\r\n }\r\n \r\n const startTimer = () => {\r\n displayCountDownButton.value = true;\r\n resendButtonDisabled.value = true;\r\n countDownText.value = resendButtonTextTimer + \" 02:00\";\r\n clearInterval(interval.value);\r\n let timer = (60 * 2) - 1, minutes, seconds;\r\n\r\n interval.value = setInterval(function () {\r\n minutes = parseInt((timer / 60).toString(), 10);\r\n seconds = parseInt((timer % 60).toString(), 10);\r\n\r\n minutes = minutes < 10 ? \"0\" + minutes : minutes;\r\n seconds = seconds < 10 ? \"0\" + seconds : seconds;\r\n countDownText.value = resendButtonTextTimer + \" \" + minutes + \":\" + seconds;\r\n\r\n if (--timer < 0) {\r\n countDownText.value = resendButtonText;\r\n clearInterval(interval.value);\r\n resendButtonDisabled.value = false;\r\n }\r\n }, 1000);\r\n }\r\n\r\n return {\r\n token,\r\n isVisible,\r\n submit,\r\n countDownText,\r\n startTimer,\r\n resendButtonDisabled,\r\n resendVerificationCode,\r\n t,\r\n displayCountDownButton\r\n }\r\n },\r\n })\r\n","import { render } from \"./VerificationPrompt.vue?vue&type=template&id=65ff9016&scoped=true\"\nimport script from \"./VerificationPrompt.vue?vue&type=script&lang=ts\"\nexport * from \"./VerificationPrompt.vue?vue&type=script&lang=ts\"\n\nimport \"./VerificationPrompt.vue?vue&type=style&index=0&id=65ff9016&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-65ff9016\"\n\nexport default script","export default class ChangePasswordValidateDto {\r\n\tpublic originalPassword = '';\r\n\tpublic newPassword = '';\r\n\r\n\tpublic constructor(init?: Partial<ChangePasswordValidateDto>) {\r\n Object.assign(this, init);\r\n }\r\n}","\r\n import { computed, defineComponent, onMounted, reactive, ref } from 'vue'\r\n import AccountClient from '@/services/AccountClient';\r\n import ChangePasswordDto from '@/dtos/ChangePasswordDto';\r\n import SecondFactorClient from '@/services/SecondFactorClient';\r\n import { useToast } from \"primevue/usetoast\";\r\n import { useRouter } from 'vue-router';\r\n import { required, requiredIf } from '@vuelidate/validators';\r\n import useVuelidate from \"@vuelidate/core\";\r\n import UErrorContainer from \"@/components/common/UErrorContainer.vue\";\r\n import UErrorItem from \"@/components/common/UErrorItem.vue\";\r\n import { useStore } from '@/store';\r\n import UStrongPassword from '@/components/common/UStrongPassword.vue';\r\n import { useI18n } from 'vue-i18n';\r\n import { useHead } from '@vueuse/head';\r\n import AccountDto from '../dtos/AccountDto';\r\n import SecondFactorDto from '@/dtos/SecondFactorDto';\r\n import VerificationPrompt from '@/components/VerificationPrompt.vue';\r\n import ChangePasswordValidateDto from '@/dtos/ChangePasswordValidateDto';\r\n import { VueReCaptcha, useReCaptcha } from 'vue-recaptcha-v3';\r\n import WebSocketFunctions from '../help/WebSocketFunctions';\r\n import { WebSocketMessageTypes } from '@/types/WebSocketMessageTypes';\r\n \r\n export default defineComponent({\r\n components: { UErrorContainer, UErrorItem, UStrongPassword, VerificationPrompt },\r\n setup() {\r\n const toast = useToast();\r\n const router = useRouter();\r\n const store = useStore();\r\n const { t } = useI18n();\r\n const loading = ref(false), saving = ref(false);\r\n const loadingIcon = computed(() => loading.value || saving.value\r\n ? \"pi pi-spin pi-spinner\" : \"\");\r\n const minPasswordLength = ref(10);\r\n const userId = ref(store.state.user?.id ?? \"\");\r\n\r\n const accountClient = new AccountClient();\r\n const account = reactive(new AccountDto());\r\n let secFactor: SecondFactorDto;\r\n const secondFactorMissing = ref(false);\r\n let verificationCodeSent = false;\r\n const verifyPrompt = ref(null);\r\n const showVerifyPrompt = ref(false);\r\n const useSecondFactorVerification = ref(false);\r\n\r\n const reCaptcha = useReCaptcha();\r\n let recaptchaToken = \"\";\r\n const login = ref('');\r\n const displayModal = ref(false);\r\n\r\n const getRecaptchaToken = async () => {\r\n if (!store.getters.isRecaptchaEnabled) {\r\n return true;\r\n }\r\n recaptchaToken = \"\";\r\n // (optional) Wait until recaptcha has been loaded.\r\n if (reCaptcha) {\r\n await reCaptcha.recaptchaLoaded();\r\n recaptchaToken = await reCaptcha.executeRecaptcha('resetPassword');\r\n }\r\n\r\n if (recaptchaToken == null || recaptchaToken == undefined || recaptchaToken == \"\") {\r\n toast.add({\r\n severity: 'error',\r\n summary: t(\"toast.titles.error\"),\r\n detail: t(\"toast.messages.recaptchaError\")\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n const form = reactive({\r\n origPass: \"\",\r\n newPass: \"\",\r\n newPassVerify: \"\"\r\n });\r\n\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: \"noindex\",\r\n },\r\n ],\r\n });\r\n\r\n onMounted(async () => {\r\n try {\r\n loading.value = true;\r\n Object.assign(account, await accountClient.getMe());\r\n login.value = account.username ? account.username : account.email;\r\n if (account.type === \"Service\") {\r\n minPasswordLength.value = 25;\r\n } else {\r\n minPasswordLength.value = 10;\r\n }\r\n\r\n if (account.usePasswordConfirmation) {\r\n useSecondFactorVerification.value = false;\r\n } else {\r\n useSecondFactorVerification.value = true;\r\n secFactor = (await accountClient.getSecondFactors(userId.value))[0];\r\n if (secFactor == null) {\r\n secondFactorMissing.value = true;\r\n displayModal.value = true;\r\n }\r\n }\r\n } catch {\r\n // intercepted by axios\r\n }\r\n\r\n loading.value = false;\r\n });\r\n\r\n const passwordsMatch = () => form.newPass === form.newPassVerify; // TODO duplicated\r\n const rules = {\r\n origPass: { required },\r\n newPassVerify: { required, passwordsMatch }\r\n };\r\n\r\n const v$ = useVuelidate(rules, form);\r\n\r\n const authenticate = async () => {\r\n try {\r\n if (!verificationCodeSent) {\r\n await new SecondFactorClient().authenticate(secFactor.id, recaptchaToken)\r\n Object(verifyPrompt.value).startTimer();\r\n verificationCodeSent = true;\r\n }\r\n showVerifyPrompt.value = true;\r\n } catch {\r\n // intercepted by axios\r\n }\r\n };\r\n\r\n const resendVerificationCode = async () => {\r\n if (!await getRecaptchaToken()) {\r\n return;\r\n }\r\n verificationCodeSent = false;\r\n await authenticate();\r\n };\r\n\r\n const continueSaving = async (verificationData: string) => {\r\n saving.value = true;\r\n\r\n try {\r\n await accountClient.changePasswordVerify(\r\n userId.value,\r\n new ChangePasswordDto({\r\n originalPassword: form.origPass,\r\n newPassword: form.newPass,\r\n verificationToken: verificationData\r\n }));\r\n\r\n if (useSecondFactorVerification.value) {\r\n showVerifyPrompt.value = false;\r\n }\r\n\r\n toast.add({\r\n severity: 'success',\r\n detail: t(\"toast.messages.passwordChangeSuccess\"),\r\n life: 3000\r\n });\r\n\r\n router.push(\"user-profile\");\r\n\r\n } catch {\r\n // intercepted by axios\r\n }\r\n\r\n saving.value = false;\r\n\r\n };\r\n const changePassword = async (valid: boolean) => {\r\n\r\n v$.value.$touch();\r\n if (!valid) {\r\n return;\r\n }\r\n\r\n saving.value = true;\r\n try {\r\n if (useSecondFactorVerification.value) {\r\n try {\r\n await accountClient.validateMyNewPassword(new ChangePasswordValidateDto({\r\n originalPassword: form.origPass,\r\n newPassword: form.newPass\r\n }));\r\n\r\n if (!await getRecaptchaToken()) {\r\n return;\r\n }\r\n await authenticate();\r\n }\r\n catch {\r\n // intercepted by axios\r\n }\r\n } else {\r\n continueSaving(\"\");\r\n }\r\n\r\n } catch {\r\n // intercepted by axios\r\n }\r\n\r\n saving.value = false;\r\n };\r\n return {\r\n form,\r\n v$,\r\n loading,\r\n saving,\r\n loadingIcon,\r\n changePassword,\r\n t,\r\n secondFactorMissing,\r\n showVerifyPrompt,\r\n verifyPrompt,\r\n continueSaving,\r\n resendVerificationCode,\r\n minPasswordLength,\r\n login,\r\n displayModal\r\n };\r\n },\r\n })\r\n","import { render } from \"./ChangePassword.vue?vue&type=template&id=dd93da8a\"\nimport script from \"./ChangePassword.vue?vue&type=script&lang=ts\"\nexport * from \"./ChangePassword.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","<template>\r\n <form v-if=\"loading || resetTokenValid\" @submit.prevent=\"changePassword(!v$.$invalid)\">\r\n <div class=\"col-md-4 mx-auto\">\r\n <template v-if=\"loading\">\r\n <div class=\"h1 skeleton\">\r\n <skeleton height=\"100%\" />\r\n </div>\r\n </template>\r\n <template v-else>\r\n <h1>{{ t(\"resetPasswordVerify.pageTitle\", { username: username}) }}</h1>\r\n </template>\r\n </div>\r\n\r\n <div class=\"col-md-5 col-lg-4 mx-auto u-form\">\r\n <template v-if=\"loading\">\r\n <div class=\"skeleton skeleton-wrapper\" v-for=\"i in [...Array(3).keys()]\" :key=\"i\">\r\n <skeleton height=\"100%\" />\r\n </div>\r\n </template>\r\n <template v-else>\r\n <u-strong-password v-model=\"form.newPass\" :minPasswordLength=\"minPasswordLength\"\r\n :label=\"t('resetPasswordVerify.fields.newPassword')\"\r\n :disabled=\"saving || secondFactorMissing\" />\r\n\r\n <div class=\"p-float-label\">\r\n <InputText type=\"password\"\r\n id=\"reset-pass-verify\"\r\n :placeholder=\"t('resetPasswordVerify.fields.verifyNewPassword')\"\r\n class=\"p-inputtext-lg\"\r\n v-model=\"v$.newPassVerify.$model\"\r\n :disabled=\"saving || secondFactorMissing\"\r\n :class=\"{'p-invalid': v$.newPassVerify.$invalid && v$.newPassVerify.$dirty}\" />\r\n <label for=\"reset-pass-verify\">{{ t(\"resetPasswordVerify.fields.verifyNewPassword\") }}</label>\r\n </div>\r\n <u-error-container v-if=\"v$.newPassVerify.$invalid && v$.newPassVerify.$dirty\">\r\n <u-error-item v-if=\"v$.newPassVerify.passwordsMatch.$invalid \">\r\n {{ t(\"resetPasswordVerify.validations.passwordsMismatch\") }}\r\n </u-error-item>\r\n <u-error-item v-if=\"v$.newPassVerify.required.$invalid\">\r\n {{ t(\"resetPasswordVerify.validations.enterVerifyPassword\") }}\r\n </u-error-item>\r\n </u-error-container>\r\n\r\n <div class=\"d-grid gap-2\">\r\n <Button type=\"submit\"\r\n :label=\"t('resetPasswordVerify.buttons.submit')\"\r\n class=\"p-button-success\"\r\n :disabled=\"saving || secondFactorMissing\"\r\n :icon=\"savingIcon\"\r\n iconPos=\"right\" />\r\n </div>\r\n </template>\r\n </div>\r\n </form>\r\n <template v-else>\r\n <div class=\"col-md-5 col-lg-4 mx-auto\">\r\n <Message severity=\"error\" :closable=\"false\">\r\n {{ t(\"resetPasswordVerify.messages.resetLinkInvalid\") }}\r\n <a v-bind:href=\"resetPasswordUrl()\">{{resetPasswordUrl()}}</a>\r\n </Message>\r\n </div>\r\n </template>\r\n\r\n <verification-prompt v-model:visible=\"showVerifyPrompt\" @submited=\"continueSaving($event)\" @resendVerificationCode=\"resendVerificationCode()\" ref=\"verifyPrompt\" />\r\n <Dialog position=\"center\" :closable=\"false\" :showHeader=\"true\" :header=\"t('resetPasswordVerify.messages.resetPassword')\"\r\n\t\t\tv-model:visible=\"displayModal\" id=\"idDialog\" style=\"white-space: pre-line\" :modal=\"true\">\r\n\t\t{{t('resetPasswordVerify.messages.passwordChangeSuccess')}}\r\n\t\t<template #footer>\r\n\t\t\t<Button label=\"OK\" v-on:click=\"redirectToLogIn\" />\r\n\t\t</template>\r\n\t</Dialog>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n import FinishResetPasswordDto from '@/dtos/FinishResetPasswordDto';\r\n import ResetPasswordDto from '@/dtos/ResetPasswordDto';\r\n import { computed, defineComponent, onMounted, reactive, ref } from 'vue'\r\n import { useRoute } from 'vue-router'\r\n import PasswordResetClient from '../services/PasswordResetClient';\r\n import SecondFactorClient from '../services/SecondFactorClient';\r\n import { useToast } from \"primevue/usetoast\";\r\n import AccountClient from '@/services/AccountClient';\r\n import UErrorContainer from \"@/components/common/UErrorContainer.vue\";\r\n import UErrorItem from \"@/components/common/UErrorItem.vue\";\r\n import { required, requiredIf } from '@vuelidate/validators';\r\n import useVuelidate from \"@vuelidate/core\";\r\n import UStrongPassword from '@/components/common/UStrongPassword.vue';\r\n import { useI18n } from 'vue-i18n';\r\n import config from '../config';\r\n import router from '../router';\r\n import { useHead } from '@vueuse/head';\r\n import ResetPasswordValidateDto from '@/dtos/ResetPasswordValidateDto';\r\n import SecondFactorDto from '@/dtos/SecondFactorDto';\r\n import VerificationPrompt from '@/components/VerificationPrompt.vue';\r\n import { VueReCaptcha, useReCaptcha } from 'vue-recaptcha-v3';\r\n import { useStore } from '@/store';\r\n import LoginService from '../services/LoginService';\r\n\r\n export default defineComponent({\r\n components: { UErrorContainer, UErrorItem, UStrongPassword, VerificationPrompt },\r\n setup() {\r\n const route = useRoute();\r\n const toast = useToast();\r\n const { t } = useI18n();\r\n const store = useStore();\r\n\r\n const resetClient = new PasswordResetClient();\r\n const secondFactorClient = new SecondFactorClient();\r\n let secFactor: SecondFactorDto;\r\n let userId = \"\", resetToken = \"\";\r\n let useSecondFactorVerification = false;\r\n const minPasswordLength = ref(10);\r\n const secondFactorMissing = ref(false);\r\n const showVerifyPrompt = ref(false);\r\n const resetTokenValid = reactive(ref(false)), username = reactive(ref(\"\")),\r\n loading = ref(false), saving = ref(false);\r\n\r\n const savingIcon = computed(() => saving.value ? \"pi pi-spin pi-spinner\" : \"\");\r\n const verifyPrompt = ref(null);\r\n let verificationCodeSent = false;\r\n const reCaptcha = useReCaptcha();\r\n\r\n let recaptchaToken = \"\";\r\n const displayModal = ref(false);\r\n const loginService = new LoginService();\r\n const baseUrl = `${config.authRedirectUri}`;\r\n\r\n function getFullPath(path: string): string {\r\n if (baseUrl.endsWith('/') && path.startsWith('/')) {\r\n path = path.substring(1);\r\n }\r\n return baseUrl + path;\r\n }\r\n const redirectToLogIn = () => {\r\n const tilesPath = router.resolve({ name: 'tiles' }).fullPath;\r\n loginService.login(getFullPath(tilesPath));\r\n };\r\n const resetPasswordUrl = () => {\r\n const resetPassworPath = router.resolve({ name: 'ResetPassword' }).fullPath;\r\n return getFullPath(resetPassworPath);\r\n }\r\n const getRecaptchaToken = async () => {\r\n if (!store.getters.isRecaptchaEnabled) {\r\n return true;\r\n }\r\n recaptchaToken = \"\";\r\n // (optional) Wait until recaptcha has been loaded.\r\n if (reCaptcha) {\r\n await reCaptcha.recaptchaLoaded();\r\n recaptchaToken = await reCaptcha.executeRecaptcha('resetPassword');\r\n }\r\n\r\n if (recaptchaToken == null || recaptchaToken == undefined || recaptchaToken == \"\") {\r\n toast.add({\r\n severity: 'error',\r\n summary: t(\"toast.titles.error\"),\r\n detail: t(\"toast.messages.recaptchaError\")\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: \"noindex\",\r\n },\r\n ],\r\n });\r\n\r\n onMounted(async () => {\r\n userId = route.query[\"uid\"]?.toString() ?? \"\";\r\n resetToken = route.query[\"token\"]?.toString() ?? \"\";\r\n\r\n try {\r\n loading.value = true;\r\n const res = await resetClient.verify(new ResetPasswordDto({\r\n userId: userId,\r\n resetToken: resetToken\r\n }));\r\n\r\n if (res.minPasswordLength) {\r\n minPasswordLength.value = res.minPasswordLength;\r\n }\r\n\r\n resetTokenValid.value = res.tokenValid;\r\n username.value = res.username;\r\n useSecondFactorVerification = res.useSecondFactorVerification;\r\n if (res.tokenValid && useSecondFactorVerification) {\r\n try {\r\n secFactor = (await new AccountClient().getSecondFactors(userId))[0];\r\n if (secFactor == null) {\r\n secondFactorMissing.value = true;\r\n toast.add({\r\n severity: 'error',\r\n summary: t(\"toast.titles.error\"),\r\n detail: t(\"toast.messages.secondFactorMissing\")\r\n });\r\n }\r\n } catch {\r\n // intercepted by axios\r\n }\r\n }\r\n } catch {\r\n // intercepted by axios\r\n }\r\n\r\n loading.value = false;\r\n });\r\n\r\n const form = reactive({\r\n newPass: \"\",\r\n newPassVerify: \"\",\r\n });\r\n\r\n const passwordsMatch = () => form.newPass === form.newPassVerify; // TODO duplicated\r\n const rules =\r\n {\r\n newPassVerify: { required, passwordsMatch },\r\n };\r\n\r\n const v$ = useVuelidate(rules, form);\r\n\r\n const authenticate = async () => {\r\n try {\r\n if (!verificationCodeSent) {\r\n await secondFactorClient.authenticate(secFactor.id, recaptchaToken);\r\n Object(verifyPrompt.value).startTimer();\r\n verificationCodeSent = true;\r\n }\r\n showVerifyPrompt.value = true;\r\n } catch {\r\n // intercepted by axios\r\n }\r\n };\r\n\r\n const resendVerificationCode = async () => {\r\n if (!await getRecaptchaToken()) {\r\n return;\r\n }\r\n\r\n verificationCodeSent = false;\r\n await authenticate();\r\n };\r\n\r\n const continueSaving = async (verificationData: string) => {\r\n saving.value = true;\r\n try {\r\n if (useSecondFactorVerification) {\r\n if (!await getRecaptchaToken()) {\r\n return;\r\n }\r\n }\r\n\r\n const res = await resetClient.finish(new FinishResetPasswordDto({\r\n userId: userId,\r\n resetToken: resetToken,\r\n twoFactorToken: verificationData,\r\n newPassword: form.newPass,\r\n recaptchaToken: recaptchaToken\r\n }));\r\n\r\n if (!res.tokenValid) {\r\n\r\n toast.add({\r\n severity: 'error',\r\n summary: t(\"toast.titles.error\"),\r\n detail: t(\"toast.messages.invalidVerificationCode\"),\r\n life: 3000\r\n })\r\n } else {\r\n if (useSecondFactorVerification) {\r\n showVerifyPrompt.value = false;\r\n verificationCodeSent = false;\r\n }\r\n displayModal.value = true;\r\n }\r\n } catch {\r\n // intercepted by axios\r\n }\r\n saving.value = false;\r\n\r\n };\r\n\r\n const changePassword = async (valid: boolean) => {\r\n v$.value.$touch();\r\n if (!valid) {\r\n return;\r\n }\r\n\r\n if (!await getRecaptchaToken()) {\r\n return;\r\n }\r\n\r\n if (useSecondFactorVerification) {\r\n try {\r\n await resetClient.validate(new ResetPasswordValidateDto({\r\n userId: userId,\r\n resetToken: resetToken,\r\n newPassword: form.newPass\r\n }));\r\n\r\n await authenticate();\r\n }\r\n catch {\r\n // intercepted by axios\r\n }\r\n } else {\r\n continueSaving(\"\");\r\n }\r\n };\r\n\r\n return {\r\n form,\r\n v$,\r\n userId,\r\n resetToken,\r\n username,\r\n resetTokenValid,\r\n loading,\r\n saving,\r\n savingIcon,\r\n changePassword,\r\n t,\r\n showVerifyPrompt,\r\n verifyPrompt,\r\n continueSaving,\r\n secondFactorMissing,\r\n resendVerificationCode,\r\n minPasswordLength,\r\n store,\r\n displayModal,\r\n redirectToLogIn,\r\n resetPasswordUrl\r\n };\r\n },\r\n })\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n @import '@/css-framework/mixins';\r\n\r\n .skeleton-wrapper {\r\n margin-bottom: 1rem;\r\n }\r\n\r\n .skeleton {\r\n height: 3.5rem;\r\n }\r\n</style>","export default class FinishResetPasswordDto {\r\n\tpublic userId = '';\r\n\tpublic resetToken = '';\r\n\tpublic twoFactorToken = '';\r\n\tpublic newPassword = '';\r\n\tpublic recaptchaToken = '';\r\n\r\n\tpublic constructor(init?: Partial<FinishResetPasswordDto>) {\r\n Object.assign(this, init);\r\n }\r\n}","export default class ResetPasswordDto {\r\n\tpublic userId = '';\r\n\tpublic resetToken = '';\r\n\r\n\tpublic constructor(init?: Partial<ResetPasswordDto>) {\r\n Object.assign(this, init);\r\n }\r\n}","import axios from 'axios';\r\nimport FinishResetPasswordDto from '../dtos/FinishResetPasswordDto';\r\nimport PasswordResetResponseDto from '../dtos/PasswordResetResponseDto';\r\nimport ResetPasswordDto from '../dtos/ResetPasswordDto';\r\nimport VerifyTokenResponseDto from '../dtos/VerifyTokenResponseDto';\r\nimport PasswordResetClientMock from './mocks/PasswordResetClientMock';\r\nimport ResetPasswordValidateDto from '../dtos/ResetPasswordValidateDto';\r\n\r\nclass PasswordReset {\t\r\n\tprivate readonly RESOURCE_PASSWORD_RESET = 'password-reset';\r\n\t\r\n\tpublic init(username: string): Promise<void> {\r\n\t\treturn axios.post(`${this.RESOURCE_PASSWORD_RESET}/init/${username}`);\r\n\t}\r\n\r\n\tpublic async verify(data: ResetPasswordDto): Promise<PasswordResetResponseDto> {\r\n\t\treturn (await axios.post(`${this.RESOURCE_PASSWORD_RESET}/verify`, data, { supressErrorMessage: true })).data;\r\n\t}\r\n\r\n\tpublic async finish(data: FinishResetPasswordDto): Promise<VerifyTokenResponseDto> {\r\n\t\treturn (await axios.post(`${this.RESOURCE_PASSWORD_RESET}/finish`, data)).data;\r\n\t}\r\n\r\n\tpublic async validate(data: ResetPasswordValidateDto): Promise<void> {\r\n\t\treturn (await axios.post(`${this.RESOURCE_PASSWORD_RESET}/validate`, data)).data;\r\n\t}\r\n}\r\n\r\n//export default process.env.NODE_ENV === 'production' ? PasswordReset : PasswordResetClientMock\r\nexport default PasswordReset ","export default class ResetPasswordValidateDto {\r\n\tpublic userId = '';\r\n\tpublic resetToken = '';\r\n\tpublic newPassword = '';\r\n\r\n\tpublic constructor(init?: Partial<ResetPasswordValidateDto>) {\r\n Object.assign(this, init);\r\n }\r\n}","\r\n import FinishResetPasswordDto from '@/dtos/FinishResetPasswordDto';\r\n import ResetPasswordDto from '@/dtos/ResetPasswordDto';\r\n import { computed, defineComponent, onMounted, reactive, ref } from 'vue'\r\n import { useRoute } from 'vue-router'\r\n import PasswordResetClient from '../services/PasswordResetClient';\r\n import SecondFactorClient from '../services/SecondFactorClient';\r\n import { useToast } from \"primevue/usetoast\";\r\n import AccountClient from '@/services/AccountClient';\r\n import UErrorContainer from \"@/components/common/UErrorContainer.vue\";\r\n import UErrorItem from \"@/components/common/UErrorItem.vue\";\r\n import { required, requiredIf } from '@vuelidate/validators';\r\n import useVuelidate from \"@vuelidate/core\";\r\n import UStrongPassword from '@/components/common/UStrongPassword.vue';\r\n import { useI18n } from 'vue-i18n';\r\n import config from '../config';\r\n import router from '../router';\r\n import { useHead } from '@vueuse/head';\r\n import ResetPasswordValidateDto from '@/dtos/ResetPasswordValidateDto';\r\n import SecondFactorDto from '@/dtos/SecondFactorDto';\r\n import VerificationPrompt from '@/components/VerificationPrompt.vue';\r\n import { VueReCaptcha, useReCaptcha } from 'vue-recaptcha-v3';\r\n import { useStore } from '@/store';\r\n import LoginService from '../services/LoginService';\r\n\r\n export default defineComponent({\r\n components: { UErrorContainer, UErrorItem, UStrongPassword, VerificationPrompt },\r\n setup() {\r\n const route = useRoute();\r\n const toast = useToast();\r\n const { t } = useI18n();\r\n const store = useStore();\r\n\r\n const resetClient = new PasswordResetClient();\r\n const secondFactorClient = new SecondFactorClient();\r\n let secFactor: SecondFactorDto;\r\n let userId = \"\", resetToken = \"\";\r\n let useSecondFactorVerification = false;\r\n const minPasswordLength = ref(10);\r\n const secondFactorMissing = ref(false);\r\n const showVerifyPrompt = ref(false);\r\n const resetTokenValid = reactive(ref(false)), username = reactive(ref(\"\")),\r\n loading = ref(false), saving = ref(false);\r\n\r\n const savingIcon = computed(() => saving.value ? \"pi pi-spin pi-spinner\" : \"\");\r\n const verifyPrompt = ref(null);\r\n let verificationCodeSent = false;\r\n const reCaptcha = useReCaptcha();\r\n\r\n let recaptchaToken = \"\";\r\n const displayModal = ref(false);\r\n const loginService = new LoginService();\r\n const baseUrl = `${config.authRedirectUri}`;\r\n\r\n function getFullPath(path: string): string {\r\n if (baseUrl.endsWith('/') && path.startsWith('/')) {\r\n path = path.substring(1);\r\n }\r\n return baseUrl + path;\r\n }\r\n const redirectToLogIn = () => {\r\n const tilesPath = router.resolve({ name: 'tiles' }).fullPath;\r\n loginService.login(getFullPath(tilesPath));\r\n };\r\n const resetPasswordUrl = () => {\r\n const resetPassworPath = router.resolve({ name: 'ResetPassword' }).fullPath;\r\n return getFullPath(resetPassworPath);\r\n }\r\n const getRecaptchaToken = async () => {\r\n if (!store.getters.isRecaptchaEnabled) {\r\n return true;\r\n }\r\n recaptchaToken = \"\";\r\n // (optional) Wait until recaptcha has been loaded.\r\n if (reCaptcha) {\r\n await reCaptcha.recaptchaLoaded();\r\n recaptchaToken = await reCaptcha.executeRecaptcha('resetPassword');\r\n }\r\n\r\n if (recaptchaToken == null || recaptchaToken == undefined || recaptchaToken == \"\") {\r\n toast.add({\r\n severity: 'error',\r\n summary: t(\"toast.titles.error\"),\r\n detail: t(\"toast.messages.recaptchaError\")\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: \"noindex\",\r\n },\r\n ],\r\n });\r\n\r\n onMounted(async () => {\r\n userId = route.query[\"uid\"]?.toString() ?? \"\";\r\n resetToken = route.query[\"token\"]?.toString() ?? \"\";\r\n\r\n try {\r\n loading.value = true;\r\n const res = await resetClient.verify(new ResetPasswordDto({\r\n userId: userId,\r\n resetToken: resetToken\r\n }));\r\n\r\n if (res.minPasswordLength) {\r\n minPasswordLength.value = res.minPasswordLength;\r\n }\r\n\r\n resetTokenValid.value = res.tokenValid;\r\n username.value = res.username;\r\n useSecondFactorVerification = res.useSecondFactorVerification;\r\n if (res.tokenValid && useSecondFactorVerification) {\r\n try {\r\n secFactor = (await new AccountClient().getSecondFactors(userId))[0];\r\n if (secFactor == null) {\r\n secondFactorMissing.value = true;\r\n toast.add({\r\n severity: 'error',\r\n summary: t(\"toast.titles.error\"),\r\n detail: t(\"toast.messages.secondFactorMissing\")\r\n });\r\n }\r\n } catch {\r\n // intercepted by axios\r\n }\r\n }\r\n } catch {\r\n // intercepted by axios\r\n }\r\n\r\n loading.value = false;\r\n });\r\n\r\n const form = reactive({\r\n newPass: \"\",\r\n newPassVerify: \"\",\r\n });\r\n\r\n const passwordsMatch = () => form.newPass === form.newPassVerify; // TODO duplicated\r\n const rules =\r\n {\r\n newPassVerify: { required, passwordsMatch },\r\n };\r\n\r\n const v$ = useVuelidate(rules, form);\r\n\r\n const authenticate = async () => {\r\n try {\r\n if (!verificationCodeSent) {\r\n await secondFactorClient.authenticate(secFactor.id, recaptchaToken);\r\n Object(verifyPrompt.value).startTimer();\r\n verificationCodeSent = true;\r\n }\r\n showVerifyPrompt.value = true;\r\n } catch {\r\n // intercepted by axios\r\n }\r\n };\r\n\r\n const resendVerificationCode = async () => {\r\n if (!await getRecaptchaToken()) {\r\n return;\r\n }\r\n\r\n verificationCodeSent = false;\r\n await authenticate();\r\n };\r\n\r\n const continueSaving = async (verificationData: string) => {\r\n saving.value = true;\r\n try {\r\n if (useSecondFactorVerification) {\r\n if (!await getRecaptchaToken()) {\r\n return;\r\n }\r\n }\r\n\r\n const res = await resetClient.finish(new FinishResetPasswordDto({\r\n userId: userId,\r\n resetToken: resetToken,\r\n twoFactorToken: verificationData,\r\n newPassword: form.newPass,\r\n recaptchaToken: recaptchaToken\r\n }));\r\n\r\n if (!res.tokenValid) {\r\n\r\n toast.add({\r\n severity: 'error',\r\n summary: t(\"toast.titles.error\"),\r\n detail: t(\"toast.messages.invalidVerificationCode\"),\r\n life: 3000\r\n })\r\n } else {\r\n if (useSecondFactorVerification) {\r\n showVerifyPrompt.value = false;\r\n verificationCodeSent = false;\r\n }\r\n displayModal.value = true;\r\n }\r\n } catch {\r\n // intercepted by axios\r\n }\r\n saving.value = false;\r\n\r\n };\r\n\r\n const changePassword = async (valid: boolean) => {\r\n v$.value.$touch();\r\n if (!valid) {\r\n return;\r\n }\r\n\r\n if (!await getRecaptchaToken()) {\r\n return;\r\n }\r\n\r\n if (useSecondFactorVerification) {\r\n try {\r\n await resetClient.validate(new ResetPasswordValidateDto({\r\n userId: userId,\r\n resetToken: resetToken,\r\n newPassword: form.newPass\r\n }));\r\n\r\n await authenticate();\r\n }\r\n catch {\r\n // intercepted by axios\r\n }\r\n } else {\r\n continueSaving(\"\");\r\n }\r\n };\r\n\r\n return {\r\n form,\r\n v$,\r\n userId,\r\n resetToken,\r\n username,\r\n resetTokenValid,\r\n loading,\r\n saving,\r\n savingIcon,\r\n changePassword,\r\n t,\r\n showVerifyPrompt,\r\n verifyPrompt,\r\n continueSaving,\r\n secondFactorMissing,\r\n resendVerificationCode,\r\n minPasswordLength,\r\n store,\r\n displayModal,\r\n redirectToLogIn,\r\n resetPasswordUrl\r\n };\r\n },\r\n })\r\n","import { render } from \"./ResetPasswordVerify.vue?vue&type=template&id=c02cda70&scoped=true\"\nimport script from \"./ResetPasswordVerify.vue?vue&type=script&lang=ts\"\nexport * from \"./ResetPasswordVerify.vue?vue&type=script&lang=ts\"\n\nimport \"./ResetPasswordVerify.vue?vue&type=style&index=0&id=c02cda70&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-c02cda70\"\n\nexport default script","<template>\r\n <div class=\"user-profile\">\r\n <template v-if=\"loading\">\r\n <div class=\"h1 skeleton\">\r\n <div class=\"skeleton-header-wrapper\">\r\n <div class=\"skeleton-header\">\r\n <skeleton height=\"100%\" />\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n <template v-else>\r\n <h1>{{ fullName }}</h1>\r\n </template>\r\n <div class=\"row gx-md-4\">\r\n <div class=\"col-md-5 col-lg-4 mx-auto u-form\">\r\n <template v-if=\"loading\">\r\n <div class=\"skeleton skeleton-wrapper\" v-for=\"i in [...Array(5).keys()]\" :key=\"i\">\r\n <skeleton height=\"100%\" />\r\n </div>\r\n </template>\r\n <template v-else>\r\n <form @submit.prevent=\"saveChanges(!v$.$invalid && !emailInvalid())\">\r\n <u-floating-label v-if=\"!isSSO\">\r\n <InputText id=\"pers-set-login\"\r\n class=\"p-inputtext-lg\"\r\n v-model=\"login\"\r\n disabled\r\n readonly />\r\n <label for=\"pers-set-login\">{{ t(\"userProfile.fields.loginName\") }}</label>\r\n </u-floating-label>\r\n\r\n <u-floating-label>\r\n <InputText id=\"pers-set-firstname\"\r\n class=\"p-inputtext-lg\"\r\n v-model=\"account.firstName\"\r\n disabled\r\n readonly />\r\n <label for=\"pers-set-firstname\">{{ t(\"userProfile.fields.firstName\") }}</label>\r\n </u-floating-label>\r\n\r\n <u-floating-label>\r\n <InputText id=\"pers-set-lastname\"\r\n class=\"p-inputtext-lg\"\r\n v-model=\"account.lastName\"\r\n disabled\r\n readonly />\r\n <label for=\"pers-set-lastname\">{{ t(\"userProfile.fields.lastName\") }}</label>\r\n </u-floating-label>\r\n\r\n <u-floating-label>\r\n <InputText id=\"pers-set-birthdate\"\r\n class=\"p-inputtext-lg\"\r\n v-model=\"birthDateFormated\"\r\n disabled\r\n readonly />\r\n <label for=\"pers-set-birthdate\">{{ t(\"userProfile.fields.birthDate\") }}</label>\r\n </u-floating-label>\r\n\r\n <u-floating-label>\r\n <InputText id=\"pers-set-email\"\r\n class=\"p-inputtext-lg\"\r\n v-model=\"v$.email.$model\"\r\n :disabled=\"saving || isSSO || IsUserFromInternalDistribution\"\r\n :class=\"{'p-invalid': ((v$.email.$invalid || emailInvalid()) && v$.email.$dirty)}\" />\r\n <label for=\"pers-set-email\">{{ t(\"userProfile.fields.email\") }}</label>\r\n </u-floating-label>\r\n <u-error-container v-if=\"(v$.email.$invalid || emailInvalid() || emailChanged()) && v$.email.$dirty\">\r\n <u-error-item v-if=\"v$.email.required.$invalid\">\r\n {{ t(\"userProfile.validations.enterEmail\") }}\r\n </u-error-item>\r\n <u-error-item v-if=\"emailInvalid()\">\r\n {{ t(\"userProfile.validations.invalidEmail\") }}\r\n </u-error-item>\r\n <u-error-item v-if=\"emailChanged()\">\r\n {{ t(\"userProfile.validations.emailChanged\") }}\r\n </u-error-item>\r\n </u-error-container>\r\n\r\n <u-floating-label v-if=\"hasHCLRight\">\r\n <InputText id=\"pers-set-secondary-email\"\r\n class=\"p-inputtext-lg\"\r\n v-model=\"v$.secondaryEmail.$model\"/>\r\n <label for=\"pers-set-secondary-email\">{{ t(\"userProfile.fields.secondaryEmail\") }}</label>\r\n </u-floating-label>\r\n\r\n <u-floating-label>\r\n <InputText id=\"pers-set-phone\"\r\n class=\"p-inputtext-lg\"\r\n v-model=\"v$.phoneNumber.$model\"\r\n :disabled=\"saving || !account.phoneNumberIsEditable || isSSO\"\r\n :class=\"{'p-invalid': v$.phoneNumber.$invalid && v$.phoneNumber.$dirty}\" />\r\n <label for=\"pers-set-phone\">{{ t(\"userProfile.fields.phone\") }}</label>\r\n </u-floating-label>\r\n <u-error-container v-if=\"v$.phoneNumber.$invalid && v$.phoneNumber.$dirty\">\r\n\r\n <u-error-item v-if=\"v$.phoneNumber.phoneNumberValid.$invalid\">\r\n {{ t(\"userProfile.validations.invalidPhoneNumber\") }}\r\n </u-error-item>\r\n </u-error-container>\r\n\r\n <u-floating-label>\r\n <InputText id=\"pers-set-broker-name\"\r\n class=\"p-inputtext-lg\"\r\n v-model=\"broker.name\"\r\n disabled\r\n readonly />\r\n <label for=\"pers-set-broker-name\">{{ t(\"userProfile.fields.brokerName\") }}</label>\r\n </u-floating-label>\r\n\r\n <u-floating-label>\r\n <InputText id=\"pers-set-broker-crn\"\r\n class=\"p-inputtext-lg\"\r\n v-model=\"broker.crn\"\r\n disabled\r\n readonly />\r\n <label for=\"pers-set-broker-crn\">{{ t(\"userProfile.fields.brokerCrn\") }}</label>\r\n </u-floating-label>\r\n\r\n <Button :label=\"t('userProfile.buttons.submit')\"\r\n class=\"p-button-success\"\r\n type=\"submit\"\r\n :disabled=\"saving || (!v$.email.$dirty && !v$.phoneNumber.$dirty && !v$.secondaryEmail.$dirty)\"\r\n :icon=\"savingIcon\"\r\n iconPos=\"right\"\r\n v-if=\"!isSSO\" />\r\n </form>\r\n\r\n <Button :label=\"t('userProfile.buttons.changePassword')\"\r\n class=\"p-button-success\"\r\n @click=\"$router.push('change-password')\"\r\n :disabled=\"saving\"\r\n v-if=\"!isSSO\" />\r\n </template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <verification-prompt v-model:visible=\"showVerifyPrompt\" @submited=\"continueSaving($event)\" @resendVerificationCode=\"resendVerificationCode()\" ref=\"verifyPrompt\" />\r\n <password-verification-prompt v-model:visible=\"showPasswordVerifyPrompt\" @submited=\"continueSaving($event)\" />\r\n <Dialog position=\"center\" :closable=\"true\" :showHeader=\"true\" :header=\"t('tiles.messages.warning')\"\r\n v-model:visible=\"displayModal\" id=\"idDialog\">\r\n {{ modalMessage }}\r\n <template #footer>\r\n <Button label=\"OK\" v-on:click=\"displayModal = false;\" />\r\n </template>\r\n </Dialog>\r\n <Dialog position=\"center\" :closable=\"true\" :showHeader=\"true\" :header=\"t('tiles.messages.warning')\"\r\n v-model:visible=\"displaySecondaryModal\" id=\"idSecondaryDialog\">\r\n {{ secondaryModalMessage }}\r\n <template #footer>\r\n <Button label=\"OK\" v-on:click=\"displaySecondaryModal = false;\" />\r\n </template>\r\n </Dialog>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n import { computed, defineComponent, onMounted, reactive, ref } from 'vue';\r\n import BrokerClient from '../services/BrokerClient';\r\n import AccountClient from '../services/AccountClient';\r\n import AccountDto from '../dtos/AccountDto';\r\n import UFloatingLabel from '@/components/common/UFloatingLabel.vue'\r\n import BrokerDto from '@/dtos/BrokerDto';\r\n import diff, { PatchObject } from 'json-patch-gen';\r\n import { useToast } from 'primevue/usetoast';\r\n import useVuelidate from '@vuelidate/core';\r\n import { required, email, requiredIf } from '@vuelidate/validators';\r\n import UErrorContainer from \"@/components/common/UErrorContainer.vue\";\r\n import UErrorItem from \"@/components/common/UErrorItem.vue\";\r\n import VerificationPrompt from '@/components/VerificationPrompt.vue';\r\n import PasswordVerificationPrompt from '@/components/PasswordVerificationPrompt.vue';\r\n import TilesClient from '../services/TilesClient';\r\n import SecondFactorClient from '@/services/SecondFactorClient';\r\n import { useStore } from '@/store';\r\n import { useI18n } from 'vue-i18n';\r\n import * as EmailValidator from 'email-validator';\r\n import { useHead } from '@vueuse/head';\r\n import VerifyEmailUniquenessDto from '@/dtos/VerifyEmailUniquenessDto';\r\n import SecondFactorDto from '@/dtos/SecondFactorDto';\r\n import parseMobile from 'libphonenumber-js/mobile';\r\n import { VueReCaptcha, useReCaptcha } from 'vue-recaptcha-v3';\r\n import General from '../help/GeneralFunction';\r\n import WebSocketFunctions from '../help/WebSocketFunctions';\r\n import { WebSocketMessageTypes } from '@/types/WebSocketMessageTypes';\r\nimport TileCmsDto from '@/dtos/TileCmsDto';\r\nimport { MutationTypes } from '@/store/MutationTypes';\r\n\r\n export default defineComponent({\r\n components: { UFloatingLabel, UErrorContainer, UErrorItem, VerificationPrompt, PasswordVerificationPrompt },\r\n setup() {\r\n const toast = useToast();\r\n const store = useStore();\r\n const { t } = useI18n();\r\n const general = new General();\r\n const userId = ref(store.state.user?.id ?? \"\");\r\n\r\n const loading = ref(false), saving = ref(false);\r\n const savingIcon = computed(() => saving.value ? \"pi pi-spin pi-spinner\" : \"\");\r\n const displayModal = ref(false);\r\n const displaySecondaryModal = ref(false);\r\n const accountClient = new AccountClient();\r\n const broker = reactive(new BrokerDto());\r\n const modalMessage = ref(\"\");\r\n const secondaryModalMessage = ref(t('tiles.messages.secondaryEmailEditation'));\r\n const isSSO = store.state.user?.type == \"SSO\";\r\n //SAVEBUTTON - disable save button v pripade ze nebola vykonana ziadna zmena v profile\r\n //const origAccount = reactive(new AccountDto());\r\n let origAccount = new AccountDto();\r\n const account = reactive(new AccountDto());\r\n const tiles = reactive(Array<TileCmsDto>());\r\n\r\n function mobileValidate(phone: string): boolean {\r\n const mobileNumber = parseMobile(phone);\r\n\r\n if (mobileNumber) {\r\n return mobileNumber.getType() === 'MOBILE';\r\n }\r\n return false;\r\n }\r\n\r\n const secondaryEmailValid = (): boolean =>{\r\n return account.secondaryEmail == '' || account.secondaryEmail == null || account.secondaryEmail == undefined ? true : EmailValidator.validate(account.secondaryEmail);\r\n }\r\n\r\n const phoneNumberValid = () => account.phoneNumberIsEditable ?\r\n (new RegExp('^(\\\\+|(00))((420)|(421)|(36)|(48))[0-9]{9}$|^(\\\\+|(00))(((43)|(49))[0-9]{9,11})$')).test(account.phoneNumber) && mobileValidate(account.phoneNumber) :\r\n true;\r\n const rules = {\r\n email: { required },\r\n phoneNumber: { phoneNumberValid },\r\n secondaryEmail: { secondaryEmailValid }\r\n };\r\n let secFactor: SecondFactorDto;\r\n const v$ = useVuelidate(rules, account);\r\n const login = ref('');\r\n let verificationCodeSent = false;\r\n const verifyPrompt = ref(null);\r\n\r\n const reCaptcha = useReCaptcha();\r\n let recaptchaToken = \"\";\r\n\r\n const getRecaptchaToken = async () => {\r\n if (!store.getters.isRecaptchaEnabled) {\r\n return true;\r\n }\r\n recaptchaToken = \"\";\r\n // (optional) Wait until recaptcha has been loaded.\r\n if (reCaptcha) {\r\n await reCaptcha.recaptchaLoaded();\r\n recaptchaToken = await reCaptcha.executeRecaptcha('resetPassword');\r\n }\r\n\r\n if (recaptchaToken == null || recaptchaToken == undefined || recaptchaToken == \"\") {\r\n toast.add({\r\n severity: 'error',\r\n summary: t(\"toast.titles.error\"),\r\n detail: t(\"toast.messages.recaptchaError\")\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n const emailInvalid = (): boolean => {\r\n return account.email == '' ? false : !EmailValidator.validate(account.email);\r\n }\r\n\r\n const emailValidStyle = (): string => {\r\n return EmailValidator.validate(account.email) ? '' : 'p-invalid';\r\n }\r\n\r\n const emailChanged = (): boolean => {\r\n return (account.username == null || account.username == undefined || account.username.length < 1) &&\r\n !emailInvalid() && account.email.toLowerCase() != general.cutEmail(origAccount.email).toLowerCase();\r\n }\r\n\r\n async function loadMe(): Promise<void> {\r\n Object.assign(account, await accountClient.getMe());\r\n login.value = account.username ? account.username : account.email;\r\n origAccount = new AccountDto(account);\r\n account.email = general.cutEmail(account.email);\r\n store.commit(MutationTypes.setUser, account);\r\n }\r\n\r\n const isSecondaryEmailEditationOk = (): boolean =>{\r\n if (tiles.some(x => x.applicationName == 'HCL'))\r\n {\r\n if (account.email == account.secondaryEmail || account.secondaryEmail?.endsWith('uniqa.cz') || account.secondaryEmail?.endsWith('uniqa.sk')){\r\n return false;\r\n }\r\n else{\r\n return true;\r\n }\r\n }\r\n else\r\n {\r\n return true; // vracime Ok jestli uzivatel nema HCL pravo, tzn. nekontrolujeme editace sekundarniho emailu\r\n }\r\n }\r\n\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: \"noindex\",\r\n },\r\n ],\r\n });\r\n\r\n onMounted(async () => {\r\n loading.value = true;\r\n try {\r\n await loadMe();\r\n Object.assign(tiles, await new TilesClient().getAll());\r\n Object.assign(broker, await new BrokerClient().getById(account.brokerId));\r\n //SAVEBUTTON - disable save button v pripade ze nebola vykonana ziadna zmena v profile\r\n //Object.assign(origAccount , new AccountDto(account));\r\n } catch {\r\n // intercepted by axios\r\n }\r\n\r\n loading.value = false;\r\n });\r\n\r\n const fullName = computed(() => `${account.firstName} ${account.lastName}`);\r\n const birthDateFormated = computed(() => !account.birthDate\r\n ? undefined\r\n : new Intl.DateTimeFormat('cs-CZ').format(account.birthDate));\r\n\r\n const showVerifyPrompt = ref(false);\r\n const showPasswordVerifyPrompt = ref(false);\r\n let patch = [] as PatchObject[];\r\n\r\n const authenticate = async () => {\r\n try {\r\n if (!verificationCodeSent) {\r\n await new SecondFactorClient().authenticate(secFactor.id, recaptchaToken, true);\r\n Object(verifyPrompt.value).startTimer();\r\n verificationCodeSent = true;\r\n }\r\n showVerifyPrompt.value = true;\r\n } catch {\r\n // intercepted by axios\r\n }\r\n };\r\n\r\n const resendVerificationCode = async () => {\r\n if (!await getRecaptchaToken()) {\r\n return;\r\n }\r\n verificationCodeSent = false;\r\n await authenticate();\r\n };\r\n\r\n const saveChanges = async (valid: boolean) => {\r\n if (!isSecondaryEmailEditationOk()){\r\n displaySecondaryModal.value = true;\r\n return;\r\n }\r\n const updatedAccount = new AccountDto(account);\r\n if (general.cutEmail(origAccount.email) == updatedAccount.email) {\r\n updatedAccount.email = origAccount.email;\r\n }\r\n if (updatedAccount.secondaryEmail === \"\"){\r\n updatedAccount.secondaryEmail = undefined;\r\n }\r\n patch = diff(origAccount, updatedAccount);\r\n\r\n if (valid && patch.length > 0) {\r\n\r\n saving.value = true;\r\n try {\r\n if (!account.technicalAccount && origAccount.email != updatedAccount.email) {\r\n const verifyEmailUniquenessDto = new VerifyEmailUniquenessDto();\r\n verifyEmailUniquenessDto.email = updatedAccount.email;\r\n await accountClient.verifyMyNewEmailUniqueness(verifyEmailUniquenessDto);\r\n }\r\n if (account.usePasswordConfirmation) {\r\n showPasswordVerifyPrompt.value = true;\r\n } else {\r\n secFactor = (await accountClient.getSecondFactors(userId.value))[0];\r\n if (secFactor) {\r\n if (!await getRecaptchaToken()) {\r\n return;\r\n }\r\n await authenticate();\r\n } else {\r\n modalMessage.value = t(\"userProfile.messages.missing2faError\", { loginname: login.value})\r\n displayModal.value = true;\r\n }\r\n }\r\n // TODO getting second factor is duplicated with changepassword component -> move to service\r\n\r\n } catch {\r\n // intercepted by axios\r\n }\r\n saving.value = false;\r\n }\r\n }\r\n\r\n const continueSaving = async (verificationData: string) => {\r\n saving.value = true;\r\n try {\r\n const oldEmail = origAccount.email;\r\n await accountClient.patch(userId.value, patch, verificationData);\r\n\r\n if (account.usePasswordConfirmation) {\r\n showPasswordVerifyPrompt.value = false;\r\n } else {\r\n showVerifyPrompt.value = false;\r\n verificationCodeSent = false;\r\n }\r\n\r\n try {\r\n await loadMe();\r\n if (!account.username && oldEmail != origAccount.email) {\r\n modalMessage.value = t(\"userProfile.messages.newLoginName\", { loginname: login.value});\r\n displayModal.value = true;\r\n }\r\n } catch {\r\n // intercepted by axios\r\n }\r\n //SAVEBUTTON - disable save button v pripade ze nebola vykonana ziadna zmena v profile\r\n //Object.assign(origAccount , new AccountDto(account));\r\n\r\n v$.value.$reset();\r\n\r\n toast.add({\r\n severity: 'success',\r\n summary: 'Uloženo',\r\n detail: 'Změny byly uloženy',\r\n life: 3000\r\n });\r\n } catch {\r\n // intercepted by axios\r\n }\r\n\r\n saving.value = false;\r\n }\r\n\r\n return {\r\n showVerifyPrompt,\r\n loading,\r\n saving,\r\n savingIcon,\r\n v$,\r\n account,\r\n broker,\r\n fullName,\r\n birthDateFormated,\r\n saveChanges,\r\n continueSaving,\r\n t,\r\n showPasswordVerifyPrompt,\r\n login,\r\n emailInvalid,\r\n emailValidStyle,\r\n emailChanged,\r\n displayModal,\r\n resendVerificationCode,\r\n verifyPrompt,\r\n modalMessage,\r\n isSSO,\r\n tiles,\r\n displaySecondaryModal,\r\n secondaryModalMessage,\r\n isSecondaryEmailEditationOk\r\n }\r\n },\r\n\r\n computed:{\r\n hasHCLRight(): boolean{\r\n return this.tiles.some(x => x.applicationName == 'HCL');\r\n },\r\n\r\n IsUserFromInternalDistribution(): boolean{\r\n return this.broker.brokerNumber == 6000 || this.broker.brokerNumber == 3000\r\n || this.broker.brokerNumber == 292 || this.broker.brokerNumber == 99999; \r\n }\r\n }\r\n\r\n /*computed: {\r\n /*disableSaveButton(): boolean\r\n {\r\n //SAVEBUTTON - disable save button v pripade ze nebola vykonana ziadna zmena v profile\r\n let patch = [] as PatchObject[];\r\n patch = diff(this.origAccount, this.account);\r\n return patch.length == 0 || this.v$.$invalid || this.emailValidStyle != '';\r\n }*/\r\n //},\r\n });\r\n</script>\r\n\r\n<!-- Add \"scoped\" attribute to limit CSS to this component only -->\r\n<style scoped lang=\"scss\">\r\n @import '@/css-framework/mixins';\r\n\r\n .user-profile {\r\n & > div {\r\n padding: 0 1.5rem;\r\n\r\n @include media-breakpoint-down(md) {\r\n padding: 0 0.75rem;\r\n }\r\n }\r\n\r\n button {\r\n margin-bottom: 0.75rem;\r\n }\r\n\r\n .skeleton-wrapper {\r\n margin-bottom: 1rem;\r\n }\r\n\r\n .skeleton {\r\n height: 3.5rem;\r\n }\r\n\r\n .skeleton-header-wrapper {\r\n height: 100%;\r\n display: flex;\r\n justify-content: center;\r\n\r\n .skeleton-header {\r\n width: 40%;\r\n\r\n @include media-breakpoint-down(md) {\r\n width: 100%;\r\n }\r\n }\r\n }\r\n }\r\n</style>","import axios from 'axios';\r\nimport BrokerDto from '../dtos/BrokerDto';\r\nimport BrokerClientMock from './mocks/BrokerClientMock';\r\nimport BrokerServiceMock from './mocks/BrokerClientMock';\r\n\r\nclass BrokerClient {\r\n\tprotected name = 'Brokers';\r\n\r\n\tpublic async getById(id: string): Promise<BrokerDto> {\r\n\t\treturn (await axios.get(`${this.name}/${id}`)).data;\r\n\t}\r\n}\r\n\r\n//export default process.env.NODE_ENV === 'production' ? BrokerClient : BrokerClientMock\r\nexport default BrokerClient\r\n","<template>\r\n <span class=\"p-float-label\">\r\n <slot />\r\n </span>\r\n</template>","import { render } from \"./UFloatingLabel.vue?vue&type=template&id=f8da6cae\"\nconst script = {}\nscript.render = render\n\nexport default script","export default class BrokerDto {\r\n\tpublic id = '';\r\n\tpublic name = '';\r\n\tpublic crn = 0;\r\n\tpublic description = '';\r\n\tpublic brokerNumber = 0;\r\n\r\n\tpublic constructor(init?: Partial<BrokerDto>) {\r\n Object.assign(this, init);\r\n }\r\n}","<template>\r\n <Dialog v-model:visible=\"isVisible\" modal>\r\n <template #header>\r\n <h3>{{ t(\"userProfile.messages.enterVerificationPassword\") }}</h3>\r\n </template>\r\n\r\n <div class=\"dialog-body\">\r\n <InputText v-model=\"token\" :type=\"typeInput\" autofocus />\r\n <i v-show=\"!showPassword\" class=\"pi pi-eye\" v-on:click=\"showPassword =!showPassword\"></i><i v-show=\"showPassword\" class=\"pi pi-eye-slash\" v-on:click=\"showPassword =!showPassword\"></i>\r\n </div>\r\n \r\n <template #footer>\r\n <Button :label=\"t('userProfile.buttons.verify')\" \r\n class=\"p-button-small\" \r\n icon=\"pi pi-check\" \r\n :disabled=\"!token\"\r\n @click=\"submit\" />\r\n </template>\r\n </Dialog>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { computed, defineComponent, ref } from 'vue'\r\nimport { useI18n } from 'vue-i18n';\r\nexport default defineComponent({\r\n props: {\r\n visible: Boolean\r\n },\r\n emits: [ 'update:visible', 'submited' ],\r\n computed: {\r\n typeInput(): string {\r\n return this.showPassword ? 'text' : 'password';\r\n }\r\n },\r\n setup(props, { emit }) {\r\n const { t } = useI18n();\r\n const token = ref(\"\");\r\n const isVisible = computed({\r\n get() {\r\n return props.visible;\r\n },\r\n set(val: boolean) {\r\n emit('update:visible', val);\r\n }\r\n })\r\n\r\n const submit = () => {\r\n emit('submited', token.value);\r\n token.value = \"\";\r\n }\r\n\r\n return {\r\n token,\r\n isVisible,\r\n submit,\r\n t\r\n }\r\n },\r\n data() {\r\n return {\r\n showPassword: false\r\n }\r\n }\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\r\n.dialog-body {\r\n margin: 0 1.5rem;\r\n display: flex;\r\n}\r\n\r\n.p-inputtext{\r\nmargin-right: 10px;\r\n}\r\n\r\n.pi {\r\n align-self: center;\r\n}\r\n::v-deep .p-dialog {\r\n max-width: 75vw;\r\n}\r\n\r\n</style>","\r\nimport { computed, defineComponent, ref } from 'vue'\r\nimport { useI18n } from 'vue-i18n';\r\nexport default defineComponent({\r\n props: {\r\n visible: Boolean\r\n },\r\n emits: [ 'update:visible', 'submited' ],\r\n computed: {\r\n typeInput(): string {\r\n return this.showPassword ? 'text' : 'password';\r\n }\r\n },\r\n setup(props, { emit }) {\r\n const { t } = useI18n();\r\n const token = ref(\"\");\r\n const isVisible = computed({\r\n get() {\r\n return props.visible;\r\n },\r\n set(val: boolean) {\r\n emit('update:visible', val);\r\n }\r\n })\r\n\r\n const submit = () => {\r\n emit('submited', token.value);\r\n token.value = \"\";\r\n }\r\n\r\n return {\r\n token,\r\n isVisible,\r\n submit,\r\n t\r\n }\r\n },\r\n data() {\r\n return {\r\n showPassword: false\r\n }\r\n }\r\n})\r\n","import { render } from \"./PasswordVerificationPrompt.vue?vue&type=template&id=a47840d8&scoped=true\"\nimport script from \"./PasswordVerificationPrompt.vue?vue&type=script&lang=ts\"\nexport * from \"./PasswordVerificationPrompt.vue?vue&type=script&lang=ts\"\n\nimport \"./PasswordVerificationPrompt.vue?vue&type=style&index=0&id=a47840d8&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-a47840d8\"\n\nexport default script","import axios from 'axios';\r\nimport TileCmsDto from '../dtos/TileCmsDto';\r\nimport TilesClientMock from './mocks/TilesClientMock';\r\nimport TilesSequenceDto from '@/dtos/TilesSequenceDto';\r\n\r\nclass TilesClient {\r\n\tprotected name = 'Tiles';\r\n\tpublic async getAll(): Promise<TileCmsDto[]> {\r\n\t\treturn (await axios.get(`${this.name}`)).data;\r\n\t}\r\n\r\n\tpublic async SaveTilesSequence(sequenceDataDto: TilesSequenceDto): Promise<void>{\r\n\t\treturn (await axios.post(`${this.name}/saveSequence`, sequenceDataDto)).data;\r\n\t}\r\n}\r\n\r\n//export default process.env.NODE_ENV === 'production' ? TilesClient : TilesClientMock\r\nexport default TilesClient\r\n","export default class VerifyEmailUniquenessDto {\r\n\tpublic email = '';\r\n}","export default class GeneralFunction {\r\n\r\n public cutEmail(text: string): string {\r\n let result = text;\r\n if (result.indexOf(\"#\") > 0) {\r\n if (!this.checkEmailOrderingSuffix(text)) {\r\n text = text.replace(\"@\", \"\");\r\n }\r\n result = text.substring(0, text.indexOf(\"#\"));\r\n if (this.checkEmailSuffix(text)) {\r\n return result;\r\n }\r\n }\r\n return text;\r\n }\r\n\r\n public checkEmailOrderingSuffix(text: string): boolean {\r\n if (text.indexOf(\"#\") > -1) {\r\n const suffix = text.substring(text.indexOf(\"#\"), text.length);\r\n if (suffix.indexOf(\"@\") > -1) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n public checkEmailSuffix(text: string): boolean {\r\n const suffix = text.substring(text.indexOf(\"#\")).replace(\"#\", \"\");\r\n if (/^[A-Za-z0-9\\-._]+$/.test(suffix)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n\r\n","\r\n import { computed, defineComponent, onMounted, reactive, ref } from 'vue';\r\n import BrokerClient from '../services/BrokerClient';\r\n import AccountClient from '../services/AccountClient';\r\n import AccountDto from '../dtos/AccountDto';\r\n import UFloatingLabel from '@/components/common/UFloatingLabel.vue'\r\n import BrokerDto from '@/dtos/BrokerDto';\r\n import diff, { PatchObject } from 'json-patch-gen';\r\n import { useToast } from 'primevue/usetoast';\r\n import useVuelidate from '@vuelidate/core';\r\n import { required, email, requiredIf } from '@vuelidate/validators';\r\n import UErrorContainer from \"@/components/common/UErrorContainer.vue\";\r\n import UErrorItem from \"@/components/common/UErrorItem.vue\";\r\n import VerificationPrompt from '@/components/VerificationPrompt.vue';\r\n import PasswordVerificationPrompt from '@/components/PasswordVerificationPrompt.vue';\r\n import TilesClient from '../services/TilesClient';\r\n import SecondFactorClient from '@/services/SecondFactorClient';\r\n import { useStore } from '@/store';\r\n import { useI18n } from 'vue-i18n';\r\n import * as EmailValidator from 'email-validator';\r\n import { useHead } from '@vueuse/head';\r\n import VerifyEmailUniquenessDto from '@/dtos/VerifyEmailUniquenessDto';\r\n import SecondFactorDto from '@/dtos/SecondFactorDto';\r\n import parseMobile from 'libphonenumber-js/mobile';\r\n import { VueReCaptcha, useReCaptcha } from 'vue-recaptcha-v3';\r\n import General from '../help/GeneralFunction';\r\n import WebSocketFunctions from '../help/WebSocketFunctions';\r\n import { WebSocketMessageTypes } from '@/types/WebSocketMessageTypes';\r\nimport TileCmsDto from '@/dtos/TileCmsDto';\r\nimport { MutationTypes } from '@/store/MutationTypes';\r\n\r\n export default defineComponent({\r\n components: { UFloatingLabel, UErrorContainer, UErrorItem, VerificationPrompt, PasswordVerificationPrompt },\r\n setup() {\r\n const toast = useToast();\r\n const store = useStore();\r\n const { t } = useI18n();\r\n const general = new General();\r\n const userId = ref(store.state.user?.id ?? \"\");\r\n\r\n const loading = ref(false), saving = ref(false);\r\n const savingIcon = computed(() => saving.value ? \"pi pi-spin pi-spinner\" : \"\");\r\n const displayModal = ref(false);\r\n const displaySecondaryModal = ref(false);\r\n const accountClient = new AccountClient();\r\n const broker = reactive(new BrokerDto());\r\n const modalMessage = ref(\"\");\r\n const secondaryModalMessage = ref(t('tiles.messages.secondaryEmailEditation'));\r\n const isSSO = store.state.user?.type == \"SSO\";\r\n //SAVEBUTTON - disable save button v pripade ze nebola vykonana ziadna zmena v profile\r\n //const origAccount = reactive(new AccountDto());\r\n let origAccount = new AccountDto();\r\n const account = reactive(new AccountDto());\r\n const tiles = reactive(Array<TileCmsDto>());\r\n\r\n function mobileValidate(phone: string): boolean {\r\n const mobileNumber = parseMobile(phone);\r\n\r\n if (mobileNumber) {\r\n return mobileNumber.getType() === 'MOBILE';\r\n }\r\n return false;\r\n }\r\n\r\n const secondaryEmailValid = (): boolean =>{\r\n return account.secondaryEmail == '' || account.secondaryEmail == null || account.secondaryEmail == undefined ? true : EmailValidator.validate(account.secondaryEmail);\r\n }\r\n\r\n const phoneNumberValid = () => account.phoneNumberIsEditable ?\r\n (new RegExp('^(\\\\+|(00))((420)|(421)|(36)|(48))[0-9]{9}$|^(\\\\+|(00))(((43)|(49))[0-9]{9,11})$')).test(account.phoneNumber) && mobileValidate(account.phoneNumber) :\r\n true;\r\n const rules = {\r\n email: { required },\r\n phoneNumber: { phoneNumberValid },\r\n secondaryEmail: { secondaryEmailValid }\r\n };\r\n let secFactor: SecondFactorDto;\r\n const v$ = useVuelidate(rules, account);\r\n const login = ref('');\r\n let verificationCodeSent = false;\r\n const verifyPrompt = ref(null);\r\n\r\n const reCaptcha = useReCaptcha();\r\n let recaptchaToken = \"\";\r\n\r\n const getRecaptchaToken = async () => {\r\n if (!store.getters.isRecaptchaEnabled) {\r\n return true;\r\n }\r\n recaptchaToken = \"\";\r\n // (optional) Wait until recaptcha has been loaded.\r\n if (reCaptcha) {\r\n await reCaptcha.recaptchaLoaded();\r\n recaptchaToken = await reCaptcha.executeRecaptcha('resetPassword');\r\n }\r\n\r\n if (recaptchaToken == null || recaptchaToken == undefined || recaptchaToken == \"\") {\r\n toast.add({\r\n severity: 'error',\r\n summary: t(\"toast.titles.error\"),\r\n detail: t(\"toast.messages.recaptchaError\")\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n const emailInvalid = (): boolean => {\r\n return account.email == '' ? false : !EmailValidator.validate(account.email);\r\n }\r\n\r\n const emailValidStyle = (): string => {\r\n return EmailValidator.validate(account.email) ? '' : 'p-invalid';\r\n }\r\n\r\n const emailChanged = (): boolean => {\r\n return (account.username == null || account.username == undefined || account.username.length < 1) &&\r\n !emailInvalid() && account.email.toLowerCase() != general.cutEmail(origAccount.email).toLowerCase();\r\n }\r\n\r\n async function loadMe(): Promise<void> {\r\n Object.assign(account, await accountClient.getMe());\r\n login.value = account.username ? account.username : account.email;\r\n origAccount = new AccountDto(account);\r\n account.email = general.cutEmail(account.email);\r\n store.commit(MutationTypes.setUser, account);\r\n }\r\n\r\n const isSecondaryEmailEditationOk = (): boolean =>{\r\n if (tiles.some(x => x.applicationName == 'HCL'))\r\n {\r\n if (account.email == account.secondaryEmail || account.secondaryEmail?.endsWith('uniqa.cz') || account.secondaryEmail?.endsWith('uniqa.sk')){\r\n return false;\r\n }\r\n else{\r\n return true;\r\n }\r\n }\r\n else\r\n {\r\n return true; // vracime Ok jestli uzivatel nema HCL pravo, tzn. nekontrolujeme editace sekundarniho emailu\r\n }\r\n }\r\n\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: \"noindex\",\r\n },\r\n ],\r\n });\r\n\r\n onMounted(async () => {\r\n loading.value = true;\r\n try {\r\n await loadMe();\r\n Object.assign(tiles, await new TilesClient().getAll());\r\n Object.assign(broker, await new BrokerClient().getById(account.brokerId));\r\n //SAVEBUTTON - disable save button v pripade ze nebola vykonana ziadna zmena v profile\r\n //Object.assign(origAccount , new AccountDto(account));\r\n } catch {\r\n // intercepted by axios\r\n }\r\n\r\n loading.value = false;\r\n });\r\n\r\n const fullName = computed(() => `${account.firstName} ${account.lastName}`);\r\n const birthDateFormated = computed(() => !account.birthDate\r\n ? undefined\r\n : new Intl.DateTimeFormat('cs-CZ').format(account.birthDate));\r\n\r\n const showVerifyPrompt = ref(false);\r\n const showPasswordVerifyPrompt = ref(false);\r\n let patch = [] as PatchObject[];\r\n\r\n const authenticate = async () => {\r\n try {\r\n if (!verificationCodeSent) {\r\n await new SecondFactorClient().authenticate(secFactor.id, recaptchaToken, true);\r\n Object(verifyPrompt.value).startTimer();\r\n verificationCodeSent = true;\r\n }\r\n showVerifyPrompt.value = true;\r\n } catch {\r\n // intercepted by axios\r\n }\r\n };\r\n\r\n const resendVerificationCode = async () => {\r\n if (!await getRecaptchaToken()) {\r\n return;\r\n }\r\n verificationCodeSent = false;\r\n await authenticate();\r\n };\r\n\r\n const saveChanges = async (valid: boolean) => {\r\n if (!isSecondaryEmailEditationOk()){\r\n displaySecondaryModal.value = true;\r\n return;\r\n }\r\n const updatedAccount = new AccountDto(account);\r\n if (general.cutEmail(origAccount.email) == updatedAccount.email) {\r\n updatedAccount.email = origAccount.email;\r\n }\r\n if (updatedAccount.secondaryEmail === \"\"){\r\n updatedAccount.secondaryEmail = undefined;\r\n }\r\n patch = diff(origAccount, updatedAccount);\r\n\r\n if (valid && patch.length > 0) {\r\n\r\n saving.value = true;\r\n try {\r\n if (!account.technicalAccount && origAccount.email != updatedAccount.email) {\r\n const verifyEmailUniquenessDto = new VerifyEmailUniquenessDto();\r\n verifyEmailUniquenessDto.email = updatedAccount.email;\r\n await accountClient.verifyMyNewEmailUniqueness(verifyEmailUniquenessDto);\r\n }\r\n if (account.usePasswordConfirmation) {\r\n showPasswordVerifyPrompt.value = true;\r\n } else {\r\n secFactor = (await accountClient.getSecondFactors(userId.value))[0];\r\n if (secFactor) {\r\n if (!await getRecaptchaToken()) {\r\n return;\r\n }\r\n await authenticate();\r\n } else {\r\n modalMessage.value = t(\"userProfile.messages.missing2faError\", { loginname: login.value})\r\n displayModal.value = true;\r\n }\r\n }\r\n // TODO getting second factor is duplicated with changepassword component -> move to service\r\n\r\n } catch {\r\n // intercepted by axios\r\n }\r\n saving.value = false;\r\n }\r\n }\r\n\r\n const continueSaving = async (verificationData: string) => {\r\n saving.value = true;\r\n try {\r\n const oldEmail = origAccount.email;\r\n await accountClient.patch(userId.value, patch, verificationData);\r\n\r\n if (account.usePasswordConfirmation) {\r\n showPasswordVerifyPrompt.value = false;\r\n } else {\r\n showVerifyPrompt.value = false;\r\n verificationCodeSent = false;\r\n }\r\n\r\n try {\r\n await loadMe();\r\n if (!account.username && oldEmail != origAccount.email) {\r\n modalMessage.value = t(\"userProfile.messages.newLoginName\", { loginname: login.value});\r\n displayModal.value = true;\r\n }\r\n } catch {\r\n // intercepted by axios\r\n }\r\n //SAVEBUTTON - disable save button v pripade ze nebola vykonana ziadna zmena v profile\r\n //Object.assign(origAccount , new AccountDto(account));\r\n\r\n v$.value.$reset();\r\n\r\n toast.add({\r\n severity: 'success',\r\n summary: 'Uloženo',\r\n detail: 'Změny byly uloženy',\r\n life: 3000\r\n });\r\n } catch {\r\n // intercepted by axios\r\n }\r\n\r\n saving.value = false;\r\n }\r\n\r\n return {\r\n showVerifyPrompt,\r\n loading,\r\n saving,\r\n savingIcon,\r\n v$,\r\n account,\r\n broker,\r\n fullName,\r\n birthDateFormated,\r\n saveChanges,\r\n continueSaving,\r\n t,\r\n showPasswordVerifyPrompt,\r\n login,\r\n emailInvalid,\r\n emailValidStyle,\r\n emailChanged,\r\n displayModal,\r\n resendVerificationCode,\r\n verifyPrompt,\r\n modalMessage,\r\n isSSO,\r\n tiles,\r\n displaySecondaryModal,\r\n secondaryModalMessage,\r\n isSecondaryEmailEditationOk\r\n }\r\n },\r\n\r\n computed:{\r\n hasHCLRight(): boolean{\r\n return this.tiles.some(x => x.applicationName == 'HCL');\r\n },\r\n\r\n IsUserFromInternalDistribution(): boolean{\r\n return this.broker.brokerNumber == 6000 || this.broker.brokerNumber == 3000\r\n || this.broker.brokerNumber == 292 || this.broker.brokerNumber == 99999; \r\n }\r\n }\r\n\r\n /*computed: {\r\n /*disableSaveButton(): boolean\r\n {\r\n //SAVEBUTTON - disable save button v pripade ze nebola vykonana ziadna zmena v profile\r\n let patch = [] as PatchObject[];\r\n patch = diff(this.origAccount, this.account);\r\n return patch.length == 0 || this.v$.$invalid || this.emailValidStyle != '';\r\n }*/\r\n //},\r\n });\r\n","import { render } from \"./UserProfile.vue?vue&type=template&id=21b7ecf7&scoped=true\"\nimport script from \"./UserProfile.vue?vue&type=script&lang=ts\"\nexport * from \"./UserProfile.vue?vue&type=script&lang=ts\"\n\nimport \"./UserProfile.vue?vue&type=style&index=0&id=21b7ecf7&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-21b7ecf7\"\n\nexport default script","<template>\r\n\t<h1>{{ t(\"tiles.pageTitle\") }}</h1>\r\n <h2 class=\"special-sorting-caption\" v-if=\"sortModeEnabled\" style=\"text-align: center;\">{{ t(\"tiles.pageSortSubTitle\") }}</h2> \r\n <div v-if=\"loading\" class=\"col square\">\r\n <div v-for=\"i in [...Array(5).keys()]\" :key=\"i\">\r\n <skeleton height=\"100%\" />\r\n </div>\r\n\t</div>\r\n <div v-else>\r\n <draggable v-if=\"sortModeEnabled\" tag=\"div\" :list=\"tiles\" class=\"tiles-container\" @end=\"increaseRerenderKey\">\r\n <template #item=\"{element}\">\r\n <div :key=\"element.applicationName\">\r\n <u-tile class=\"special-sorting-mod\" :block-link=\"true\" :tileData=\"element\" :key=\"reRenderKey\"/>\r\n </div>\r\n </template>\r\n\t </draggable>\r\n <div v-else :list=\"tiles\" class=\"tiles-container\">\r\n <div v-for=\"tile in tiles\" v-bind:key=\"tile.applicationName\">\r\n <u-tile :block-link=\"false\" :tileData=\"tile\"/>\r\n </div>\r\n\t </div>\r\n </div>\r\n <div class=\"special-sorting-button-container\">\r\n <Button class=\"p-button-sort-red flex-col\" v-if=\"sortModeEnabled\" :label=\"t('tiles.buttons.save')\" @click=\"saveSequenceToDB()\"/>\r\n <Button class=\"p-button-sort-blue flex-col\" v-if=\"sortModeEnabled\" :label=\"t('tiles.buttons.back')\" @click=\"returnInitialArrayState()\"/>\r\n </div>\r\n\t\r\n\t<Dialog position=\"center\" :closable=\"true\" :showHeader=\"true\" :header=\"t('tiles.messages.warning')\" :style=\"{width: '50vw'}\"\r\n\t\t\tv-model:visible=\"displayModal\" id=\"idDialog\">\r\n\t\t{{checkPhoneMessage}}\r\n\t\t<template #footer>\r\n\t\t\t<Button :label=\"dialogUserProfileButtonLabel()\" @click=\"$router.push('user-profile')\" v-on:click=\"displayModal = false;\" />\r\n\t\t\t<Button v-if=\"showPhoneNumberIsCorrectButton()\" :label=\"t('tiles.buttons.phoneNumberIsCorrect')\" v-on:click=\"confirmPhoneNumber()\" />\r\n\t\t</template>\r\n\t</Dialog>\r\n\r\n <Dialog :closable=\"false\" v-model:visible=\"hasHCLRightAndEmptySecondaryEmail\" modal :header=\"t('tiles.messages.warning')\" :style=\"{ width: '30vw' }\">\r\n <span class=\"h5 text-dark\">{{t('tiles.messages.fillSecondaryEmail')}}</span>\r\n <template #footer>\r\n <Button type=\"button\" :label=\"t('tiles.buttons.set')\" @click=\"$router.push('user-profile')\"></Button>\r\n <Button :hidden=\"continueDialogButtonIsHidden\" type=\"button\" :label=\"t('tiles.buttons.continue')\" severity=\"secondary\" @click=\"secondaryEmailDialogVisible = false\"></Button>\r\n </template>\r\n </Dialog>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n\r\nimport { defineComponent, onMounted, reactive, ref, h } from 'vue';\r\nimport TilesClient from '../services/TilesClient';\r\nimport UTile from '@/components/common/UTile.vue';\r\nimport { useI18n } from 'vue-i18n';\r\nimport store, { useStore } from '@/store';\r\nimport { MutationTypes } from '../store/MutationTypes';\r\nimport moment from 'moment';\r\nimport ExtraPropertyClient from '@/services/ExtraPropertyClient';\r\nimport ExtraPropertyDto from '../dtos/ExtraPropertyDto';\r\nimport { useHead } from '@vueuse/head';\r\nimport { useDialog } from \"primevue/usedialog\";\r\nimport PasswordExpirationDialog from '@/components/PasswordExpirationDialog.vue';\r\nimport Button from 'primevue/button';\r\nimport { useRouter } from 'vue-router';\r\nimport WebSocketFunctions from '../help/WebSocketFunctions';\r\nimport { WebSocketMessageTypes } from '@/types/WebSocketMessageTypes';\r\nimport TileCmsDto from '@/dtos/TileCmsDto';\r\nimport TilesSequenceDto from '@/dtos/TilesSequenceDto';\r\nimport draggable from 'vuedraggable';\r\nimport EventBus from '@/help/EventBus';\r\n\r\nexport default defineComponent({\r\n name: 'Tile',\r\n components: { UTile, draggable },\r\n setup() {\r\n const tilesClient = new TilesClient();\r\n const store = useStore();\r\n const tiles = reactive(Array<TileCmsDto>());\r\n const initialTiles = reactive(Array<TileCmsDto>());\r\n const dialog = useDialog();\r\n const router = useRouter();\r\n\r\n const loading = ref(false);\r\n const displayModal = ref(false);\r\n const checkPhoneMessage = ref('');\r\n const { t } = useI18n();\r\n const extraPropertyClient = new ExtraPropertyClient();\r\n const phoneNumberValidated = \"PhoneNumberValidated\";\r\n const extraName = \"triton\";\r\n const user = store.state.user;\r\n const secondaryEmailDialogVisible = ref(true);\r\n const reRenderKey = ref(0);\r\n const sortModeEnabled = ref(false);\r\n\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: 'index',\r\n },\r\n ],\r\n });\r\n\r\n function getNumberOfDaysToSecondFactor(secondFactorActivationDate: Date): number {\r\n const diff = Math.abs(secondFactorActivationDate.getTime() - new Date().getTime());\r\n const diffDays = Math.ceil(diff / (1000 * 3600 * 24));\r\n return diffDays;\r\n }\r\n\r\n onMounted(async () => {\r\n loading.value = true;\r\n try {\r\n Object.assign(tiles, await tilesClient.getAll());\r\n Object.assign(initialTiles, tiles);\r\n } catch {\r\n // intercepted by axios\r\n }\r\n\r\n EventBus.on('sortModeEnabled', async () =>\r\n {\r\n sortModeEnabled.value = true;\r\n });\r\n\r\n if (user && user.secondFactorActivationDate) {\r\n const numberOfDaysToSecondFactor = user.secondFactorActivationDate == undefined ? 0 : getNumberOfDaysToSecondFactor(user.secondFactorActivationDate)\r\n const phoneNumberIsEditableUntil = user.secondFactorActivationDate;\r\n phoneNumberIsEditableUntil.setDate(phoneNumberIsEditableUntil.getDate() - 1);\r\n\r\n if (user.phoneNumberIsEditable && store.state.showCheckPhoneDialog) {\r\n try {\r\n const respone = await extraPropertyClient.getMe(phoneNumberValidated, extraName, true);\r\n if (respone.length == 0) {\r\n checkPhoneMessage.value =\r\n t(\"tiles.messages.daysToSecondFactor\", { daysCount: numberOfDaysToSecondFactor }) + \" \" +\r\n ((user.phoneNumber == undefined || user.phoneNumber == \"\") ?\r\n t(\"tiles.messages.enterPhone\", { date: moment(phoneNumberIsEditableUntil).format('D.M.YYYY') }) :\r\n t(\"tiles.messages.checkPhone\", { phoneNumber: user.phoneNumber, date: moment(phoneNumberIsEditableUntil).format('D.M.YYYY') }));\r\n displayModal.value = true;\r\n }\r\n store.commit(MutationTypes.setShowCheckPhoneDialog, false);\r\n } catch {\r\n // intercepted by axios\r\n }\r\n }\r\n }\r\n\r\n if (user && user.showPasswordExpirationWarning && store.state.showPasswordExpirationDialog) {\r\n const dialogRef = dialog.open(PasswordExpirationDialog, {\r\n props: {\r\n header: t(\"tiles.messages.errorPasswordExpirationTitle\"),\r\n modal: true,\r\n dismissableMask: false,\r\n closable: false\r\n },\r\n templates: {\r\n footer: () => {\r\n return [\r\n h(Button, {\r\n label: t(\"tiles.buttons.changePassword\"),\r\n onClick: () => {\r\n router.push('change-password');\r\n dialogRef.close();\r\n }, autofocus: true\r\n }),\r\n h(Button, {\r\n label: 'OK',\r\n onClick: () => {\r\n dialogRef.close();\r\n }, autofocus: false\r\n })\r\n ]\r\n }\r\n }\r\n });\r\n store.commit(MutationTypes.showPasswordExpirationDialog, false);\r\n }\r\n \r\n loading.value = false;\r\n });\r\n\r\n const confirmPhoneNumber = async () => {\r\n //const user = store.state.user;\r\n displayModal.value = false;\r\n if (user) {\r\n try {\r\n const extraPropertyDto = new ExtraPropertyDto();\r\n extraPropertyDto.userId = String(user.id);\r\n extraPropertyDto.name = phoneNumberValidated;\r\n extraPropertyDto.extraName = extraName;\r\n extraPropertyDto.content = moment(new Date()).format('DD.MM.YYYY HH:mm:ss');\r\n\r\n await extraPropertyClient.create(extraPropertyDto);\r\n } catch {\r\n // intercepted by axios\r\n }\r\n }\r\n };\r\n\r\n const showPhoneNumberIsCorrectButton = () => {\r\n return user && user.phoneNumber != undefined && user.phoneNumber != \"\";\r\n };\r\n\r\n const dialogUserProfileButtonLabel = () => {\r\n if (showPhoneNumberIsCorrectButton()) {\r\n return t('tiles.buttons.changePhoneNumber')\r\n }\r\n return t('tiles.buttons.enterPhoneNumber')\r\n };\r\n\r\n return { tiles, \r\n initialTiles,\r\n loading, \r\n t, \r\n displayModal, \r\n checkPhoneMessage, \r\n confirmPhoneNumber, \r\n dialogUserProfileButtonLabel, \r\n showPhoneNumberIsCorrectButton, \r\n secondaryEmailDialogVisible, \r\n user,\r\n reRenderKey,\r\n tilesClient,\r\n sortModeEnabled };\r\n },\r\n\r\n computed:{\r\n hasHCLRightAndEmptySecondaryEmail(): boolean{\r\n return this.tiles.some(x => x.applicationName == 'HCL') && (this.user?.secondaryEmail === null || this.user?.secondaryEmail === undefined) && this.secondaryEmailDialogVisible;\r\n },\r\n\r\n continueDialogButtonIsHidden(): boolean{\r\n return new Date() > new Date(store.state.app.secondaryEmailDialogDate);\r\n }\r\n },\r\n\r\n methods:{\r\n async saveSequenceToDB(){\r\n this.increaseRerenderKey();\r\n const tilesSequenceData = JSON.stringify(this.tiles.map(x => x.applicationName));\r\n const tilesSubsequenceDto = new TilesSequenceDto();\r\n tilesSubsequenceDto.data = tilesSequenceData;\r\n await this.tilesClient.SaveTilesSequence(tilesSubsequenceDto);\r\n\r\n this.sortModeEnabled = false;\r\n },\r\n\r\n returnInitialArrayState(){\r\n Object.assign(this.tiles, this.initialTiles);\r\n this.increaseRerenderKey();\r\n this.sortModeEnabled = false;\r\n },\r\n\r\n increaseRerenderKey(){\r\n this.reRenderKey += 1;\r\n }\r\n }\r\n});\r\n\r\n</script>","<template>\r\n <a class=\"tile-box\" :style=\"tileStyle\" href=\"#\" @click=\"!$props.blockLink && pushUri()\" v-tooltip.top=\"getTooltipByBrowserLanguage($props.tileData)\">\r\n <img class=\"tile-image\" :style=\"tileImageStyle\" :src=\"tileImage\" />\r\n <span class=\"tile-text\">{{ tileName }}</span>\r\n </a>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nimport TileCmsDto from '@/dtos/TileCmsDto';\r\nimport AuditClient from '@/services/AuditClient';\r\nimport CreateAuditDto from '@/dtos/CreateAuditDto';\r\nimport { useStore } from '@/store';\r\n\r\n export default defineComponent({\r\n props: {\r\n tileData: TileCmsDto,\r\n blockLink: Boolean\r\n },\r\n \r\n setup(props) {\r\n const auditClient = new AuditClient();\r\n const store = useStore();\r\n const tileUri = props.tileData?.url;\r\n const tileStyle = {\r\n \"--background-color\": props.tileData?.color ?? \"\",\r\n \"--background-color-hover\": props.tileData?.colorHover ?? \"\",\r\n \"--color\": props.tileData?.color ? \"white\" : \"\",\r\n \"--color-hover\": props.tileData?.color || props.tileData?.colorHover ? \"\" : \"#005ca9\",\r\n \"--icon-filter\": props.tileData?.color ? \"invert(100%)\" : \"\",\r\n \"--icon-filter-hover\": props.tileData?.colorHover ? \"\" : \"var(--icon-filter)\"\r\n }\r\n \r\n const tileImageStyle = {\r\n \"width\": props.tileData?.width ?? \"\",\r\n \"height\": props.tileData?.height ?? \"\"\r\n };\r\n\r\n const makeSvgObject = (image: string | undefined) => {\r\n if (image) {\r\n return URL.createObjectURL(new Blob([image], {type: 'image/svg+xml'}))\r\n }\r\n\r\n return image;\r\n }\r\n\r\n function isEmpty(text: string): boolean {\r\n return (!text || 0 === text.length);\r\n }\r\n\r\n function getNameByBrowserLanguage(data: TileCmsDto | undefined): string {\r\n if (data) {\r\n switch (navigator.language) {\r\n case \"cs\":\r\n default:\r\n return data.name;\r\n case \"sk\":\r\n return !isEmpty(data.nameSk) ? data.nameSk : data.name;\r\n case \"en\":\r\n return !isEmpty(data.nameEn) ? data.nameEn : data.name;\r\n }\r\n }\r\n else {\r\n return \"\";\r\n }\r\n } \r\n\r\n function pushUri(){\r\n try{\r\n const createAuditDto = new CreateAuditDto();\r\n createAuditDto.auditType = \"UnihubAppOpened\";\r\n createAuditDto.callerApplicationId = \"UNIHUB\";\r\n createAuditDto.description = \"Opened app \" + props.tileData?.applicationName+ \".\";\r\n if(store.getters.isImpersonification){\r\n createAuditDto.description += \" (Impersonated)\";\r\n } \r\n \r\n if(store.state.user){\r\n createAuditDto.userAccountId = store.state.user.id;\r\n }\r\n auditClient.createAudit(createAuditDto);\r\n }\r\n catch{\r\n //\r\n }\r\n if(tileUri){\r\n window.open(tileUri, props.tileData?.openInSameWindow ? \"_self\" : \"_blank\")?.focus();\r\n }\r\n }\r\n\r\n function getTooltipByBrowserLanguage(data: TileCmsDto | undefined): string {\r\n if (data) {\r\n switch (navigator.language) {\r\n case \"cs\":\r\n default:\r\n return data.tooltipCZ;\r\n case \"sk\":\r\n return data.tooltipSK\r\n case \"en\":\r\n return data.tooltipEN;\r\n }\r\n }\r\n else {\r\n return \"\";\r\n }\r\n }\r\n\r\n return {\r\n tileStyle,\r\n tileImageStyle,\r\n tileName: getNameByBrowserLanguage(props.tileData),\r\n tileImage: makeSvgObject(props.tileData?.image),\r\n pushUri,\r\n getTooltipByBrowserLanguage\r\n };\r\n },\r\n})\r\n</script>\r\n","export default class TileCmsDto {\r\n\tpublic applicationName = '';\r\n\tpublic name = '';\r\n\tpublic nameSk = '';\r\n\tpublic nameEn = '';\r\n\tpublic description = '';\r\n\tpublic url = '';\r\n\tpublic color = '';\r\n\tpublic colorHover = '';\r\n\tpublic width = '';\r\n\tpublic height = '';\r\n\tpublic tooltipCZ = '';\r\n\tpublic tooltipSK = '';\r\n\tpublic tooltipEN = '';\r\n\tpublic image = '';\r\n\tpublic imageHover = '';\r\n\tpublic openInSameWindow = false;\r\n\r\n\tpublic constructor(init?: Partial<TileCmsDto>) {\r\n Object.assign(this, init);\r\n }\r\n}\r\n\r\n","import axios from 'axios';\r\nimport CreateAuditDto from '../dtos/CreateAuditDto';\r\n\r\nclass AuditClient {\r\n\tprivate readonly RESOURCE_AUDIT = 'Audit';\r\n\r\n\tpublic async createAudit(data: CreateAuditDto): Promise<boolean> {\r\n\t\treturn await (await axios.post(`${this.RESOURCE_AUDIT}`, data, { supressErrorMessage: true })).data;\r\n\t}\r\n}\r\n\r\nexport default AuditClient","export default class CreateAuditDto {\r\n\tpublic userAccountId = '';\r\n\tpublic auditType = '';\r\n\tpublic description = '';\r\n\tpublic callerApplicationId = '';\r\n}","\r\nimport { defineComponent } from 'vue'\r\nimport TileCmsDto from '@/dtos/TileCmsDto';\r\nimport AuditClient from '@/services/AuditClient';\r\nimport CreateAuditDto from '@/dtos/CreateAuditDto';\r\nimport { useStore } from '@/store';\r\n\r\n export default defineComponent({\r\n props: {\r\n tileData: TileCmsDto,\r\n blockLink: Boolean\r\n },\r\n \r\n setup(props) {\r\n const auditClient = new AuditClient();\r\n const store = useStore();\r\n const tileUri = props.tileData?.url;\r\n const tileStyle = {\r\n \"--background-color\": props.tileData?.color ?? \"\",\r\n \"--background-color-hover\": props.tileData?.colorHover ?? \"\",\r\n \"--color\": props.tileData?.color ? \"white\" : \"\",\r\n \"--color-hover\": props.tileData?.color || props.tileData?.colorHover ? \"\" : \"#005ca9\",\r\n \"--icon-filter\": props.tileData?.color ? \"invert(100%)\" : \"\",\r\n \"--icon-filter-hover\": props.tileData?.colorHover ? \"\" : \"var(--icon-filter)\"\r\n }\r\n \r\n const tileImageStyle = {\r\n \"width\": props.tileData?.width ?? \"\",\r\n \"height\": props.tileData?.height ?? \"\"\r\n };\r\n\r\n const makeSvgObject = (image: string | undefined) => {\r\n if (image) {\r\n return URL.createObjectURL(new Blob([image], {type: 'image/svg+xml'}))\r\n }\r\n\r\n return image;\r\n }\r\n\r\n function isEmpty(text: string): boolean {\r\n return (!text || 0 === text.length);\r\n }\r\n\r\n function getNameByBrowserLanguage(data: TileCmsDto | undefined): string {\r\n if (data) {\r\n switch (navigator.language) {\r\n case \"cs\":\r\n default:\r\n return data.name;\r\n case \"sk\":\r\n return !isEmpty(data.nameSk) ? data.nameSk : data.name;\r\n case \"en\":\r\n return !isEmpty(data.nameEn) ? data.nameEn : data.name;\r\n }\r\n }\r\n else {\r\n return \"\";\r\n }\r\n } \r\n\r\n function pushUri(){\r\n try{\r\n const createAuditDto = new CreateAuditDto();\r\n createAuditDto.auditType = \"UnihubAppOpened\";\r\n createAuditDto.callerApplicationId = \"UNIHUB\";\r\n createAuditDto.description = \"Opened app \" + props.tileData?.applicationName+ \".\";\r\n if(store.getters.isImpersonification){\r\n createAuditDto.description += \" (Impersonated)\";\r\n } \r\n \r\n if(store.state.user){\r\n createAuditDto.userAccountId = store.state.user.id;\r\n }\r\n auditClient.createAudit(createAuditDto);\r\n }\r\n catch{\r\n //\r\n }\r\n if(tileUri){\r\n window.open(tileUri, props.tileData?.openInSameWindow ? \"_self\" : \"_blank\")?.focus();\r\n }\r\n }\r\n\r\n function getTooltipByBrowserLanguage(data: TileCmsDto | undefined): string {\r\n if (data) {\r\n switch (navigator.language) {\r\n case \"cs\":\r\n default:\r\n return data.tooltipCZ;\r\n case \"sk\":\r\n return data.tooltipSK\r\n case \"en\":\r\n return data.tooltipEN;\r\n }\r\n }\r\n else {\r\n return \"\";\r\n }\r\n }\r\n\r\n return {\r\n tileStyle,\r\n tileImageStyle,\r\n tileName: getNameByBrowserLanguage(props.tileData),\r\n tileImage: makeSvgObject(props.tileData?.image),\r\n pushUri,\r\n getTooltipByBrowserLanguage\r\n };\r\n },\r\n})\r\n","import { render } from \"./UTile.vue?vue&type=template&id=65716092\"\nimport script from \"./UTile.vue?vue&type=script&lang=ts\"\nexport * from \"./UTile.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","import axios from 'axios';\r\nimport ExtraPropertyClientMock from './mocks/ExtraPropertyClientMock';\r\nimport ExtraPropertyDto from '../dtos/ExtraPropertyDto';\r\n\r\nclass ExtraPropertyClient {\r\n\tprotected name = 'Properties';\r\n\r\n\tpublic async create(data: ExtraPropertyDto): Promise<string> {\r\n\t\treturn await axios.post(this.name, data);\r\n\t}\r\n\r\n\tpublic async getMe(name: string, extraname: string, exactMatch: boolean): Promise<ExtraPropertyDto[]> {\r\n\t\treturn (await axios.get(`${this.name}/me?name=${name}&extraname=${extraname}&exactMatch=${exactMatch}`)).data;\r\n\t}\r\n}\r\n\r\n\t//export default process.env.NODE_ENV === 'production' ? ExtraPropertyClient : ExtraPropertyClientMock\r\n\texport default ExtraPropertyClient\r\n\r\n","export default class ExtraPropertyDto {\r\n\tpublic id = '';\r\n\tpublic name = '';\r\n\tpublic extraName = '';\r\n\tpublic content = '';\r\n\tpublic description = '';\r\n\tpublic userId = '';\r\n}","<template>\r\n {{t(\"tiles.messages.errorPasswordExpirationMessage\", {date: passwordExpirationDate})}}\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n\r\n import { defineComponent, ref } from 'vue'\r\n import { useI18n } from 'vue-i18n';\r\n import { useStore } from '@/store';\r\n\r\n\r\n export default defineComponent({\r\n setup() {\r\n const { t } = useI18n();\r\n const store = useStore();\r\n const user = store.state.user;\r\n const passwordExpirationDate = ref('');\r\n if (user && user.passwordExpirationDate) {\r\n passwordExpirationDate.value = new Date(user.passwordExpirationDate).toLocaleDateString();\r\n }\r\n return {\r\n t,\r\n passwordExpirationDate\r\n };\r\n }\r\n })\r\n\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n ::v-deep .p-dialog {\r\n max-width: 75vw;\r\n }\r\n</style>","\r\n\r\n import { defineComponent, ref } from 'vue'\r\n import { useI18n } from 'vue-i18n';\r\n import { useStore } from '@/store';\r\n\r\n\r\n export default defineComponent({\r\n setup() {\r\n const { t } = useI18n();\r\n const store = useStore();\r\n const user = store.state.user;\r\n const passwordExpirationDate = ref('');\r\n if (user && user.passwordExpirationDate) {\r\n passwordExpirationDate.value = new Date(user.passwordExpirationDate).toLocaleDateString();\r\n }\r\n return {\r\n t,\r\n passwordExpirationDate\r\n };\r\n }\r\n })\r\n\r\n","import { render } from \"./PasswordExpirationDialog.vue?vue&type=template&id=426776a2&scoped=true\"\nimport script from \"./PasswordExpirationDialog.vue?vue&type=script&lang=ts\"\nexport * from \"./PasswordExpirationDialog.vue?vue&type=script&lang=ts\"\n\nimport \"./PasswordExpirationDialog.vue?vue&type=style&index=0&id=426776a2&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-426776a2\"\n\nexport default script","export default class TilesSequenceDto {\r\n\tpublic data = '';\r\n}\t","class EventBus {\r\n events: {[key: string]: any};\r\n \r\n constructor() {\r\n this.events = {};\r\n }\r\n \r\n on(eventName: string, fn?: any) {\r\n this.events[eventName] = this.events[eventName] || [];\r\n this.events[eventName].push(fn);\r\n }\r\n \r\n off(eventName: string, fn?: any) {\r\n if (this.events[eventName]) {\r\n for (let i = 0; i < this.events[eventName].length; i++) {\r\n if (this.events[eventName][i] === fn) {\r\n this.events[eventName].splice(i, 1);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n \r\n emit(eventName: string, data?: any) {\r\n if (this.events[eventName]) {\r\n this.events[eventName].forEach(function (fn: any) {\r\n fn(data);\r\n })\r\n }\r\n }\r\n }\r\n \r\n export default new EventBus();","\r\n\r\nimport { defineComponent, onMounted, reactive, ref, h } from 'vue';\r\nimport TilesClient from '../services/TilesClient';\r\nimport UTile from '@/components/common/UTile.vue';\r\nimport { useI18n } from 'vue-i18n';\r\nimport store, { useStore } from '@/store';\r\nimport { MutationTypes } from '../store/MutationTypes';\r\nimport moment from 'moment';\r\nimport ExtraPropertyClient from '@/services/ExtraPropertyClient';\r\nimport ExtraPropertyDto from '../dtos/ExtraPropertyDto';\r\nimport { useHead } from '@vueuse/head';\r\nimport { useDialog } from \"primevue/usedialog\";\r\nimport PasswordExpirationDialog from '@/components/PasswordExpirationDialog.vue';\r\nimport Button from 'primevue/button';\r\nimport { useRouter } from 'vue-router';\r\nimport WebSocketFunctions from '../help/WebSocketFunctions';\r\nimport { WebSocketMessageTypes } from '@/types/WebSocketMessageTypes';\r\nimport TileCmsDto from '@/dtos/TileCmsDto';\r\nimport TilesSequenceDto from '@/dtos/TilesSequenceDto';\r\nimport draggable from 'vuedraggable';\r\nimport EventBus from '@/help/EventBus';\r\n\r\nexport default defineComponent({\r\n name: 'Tile',\r\n components: { UTile, draggable },\r\n setup() {\r\n const tilesClient = new TilesClient();\r\n const store = useStore();\r\n const tiles = reactive(Array<TileCmsDto>());\r\n const initialTiles = reactive(Array<TileCmsDto>());\r\n const dialog = useDialog();\r\n const router = useRouter();\r\n\r\n const loading = ref(false);\r\n const displayModal = ref(false);\r\n const checkPhoneMessage = ref('');\r\n const { t } = useI18n();\r\n const extraPropertyClient = new ExtraPropertyClient();\r\n const phoneNumberValidated = \"PhoneNumberValidated\";\r\n const extraName = \"triton\";\r\n const user = store.state.user;\r\n const secondaryEmailDialogVisible = ref(true);\r\n const reRenderKey = ref(0);\r\n const sortModeEnabled = ref(false);\r\n\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: 'index',\r\n },\r\n ],\r\n });\r\n\r\n function getNumberOfDaysToSecondFactor(secondFactorActivationDate: Date): number {\r\n const diff = Math.abs(secondFactorActivationDate.getTime() - new Date().getTime());\r\n const diffDays = Math.ceil(diff / (1000 * 3600 * 24));\r\n return diffDays;\r\n }\r\n\r\n onMounted(async () => {\r\n loading.value = true;\r\n try {\r\n Object.assign(tiles, await tilesClient.getAll());\r\n Object.assign(initialTiles, tiles);\r\n } catch {\r\n // intercepted by axios\r\n }\r\n\r\n EventBus.on('sortModeEnabled', async () =>\r\n {\r\n sortModeEnabled.value = true;\r\n });\r\n\r\n if (user && user.secondFactorActivationDate) {\r\n const numberOfDaysToSecondFactor = user.secondFactorActivationDate == undefined ? 0 : getNumberOfDaysToSecondFactor(user.secondFactorActivationDate)\r\n const phoneNumberIsEditableUntil = user.secondFactorActivationDate;\r\n phoneNumberIsEditableUntil.setDate(phoneNumberIsEditableUntil.getDate() - 1);\r\n\r\n if (user.phoneNumberIsEditable && store.state.showCheckPhoneDialog) {\r\n try {\r\n const respone = await extraPropertyClient.getMe(phoneNumberValidated, extraName, true);\r\n if (respone.length == 0) {\r\n checkPhoneMessage.value =\r\n t(\"tiles.messages.daysToSecondFactor\", { daysCount: numberOfDaysToSecondFactor }) + \" \" +\r\n ((user.phoneNumber == undefined || user.phoneNumber == \"\") ?\r\n t(\"tiles.messages.enterPhone\", { date: moment(phoneNumberIsEditableUntil).format('D.M.YYYY') }) :\r\n t(\"tiles.messages.checkPhone\", { phoneNumber: user.phoneNumber, date: moment(phoneNumberIsEditableUntil).format('D.M.YYYY') }));\r\n displayModal.value = true;\r\n }\r\n store.commit(MutationTypes.setShowCheckPhoneDialog, false);\r\n } catch {\r\n // intercepted by axios\r\n }\r\n }\r\n }\r\n\r\n if (user && user.showPasswordExpirationWarning && store.state.showPasswordExpirationDialog) {\r\n const dialogRef = dialog.open(PasswordExpirationDialog, {\r\n props: {\r\n header: t(\"tiles.messages.errorPasswordExpirationTitle\"),\r\n modal: true,\r\n dismissableMask: false,\r\n closable: false\r\n },\r\n templates: {\r\n footer: () => {\r\n return [\r\n h(Button, {\r\n label: t(\"tiles.buttons.changePassword\"),\r\n onClick: () => {\r\n router.push('change-password');\r\n dialogRef.close();\r\n }, autofocus: true\r\n }),\r\n h(Button, {\r\n label: 'OK',\r\n onClick: () => {\r\n dialogRef.close();\r\n }, autofocus: false\r\n })\r\n ]\r\n }\r\n }\r\n });\r\n store.commit(MutationTypes.showPasswordExpirationDialog, false);\r\n }\r\n \r\n loading.value = false;\r\n });\r\n\r\n const confirmPhoneNumber = async () => {\r\n //const user = store.state.user;\r\n displayModal.value = false;\r\n if (user) {\r\n try {\r\n const extraPropertyDto = new ExtraPropertyDto();\r\n extraPropertyDto.userId = String(user.id);\r\n extraPropertyDto.name = phoneNumberValidated;\r\n extraPropertyDto.extraName = extraName;\r\n extraPropertyDto.content = moment(new Date()).format('DD.MM.YYYY HH:mm:ss');\r\n\r\n await extraPropertyClient.create(extraPropertyDto);\r\n } catch {\r\n // intercepted by axios\r\n }\r\n }\r\n };\r\n\r\n const showPhoneNumberIsCorrectButton = () => {\r\n return user && user.phoneNumber != undefined && user.phoneNumber != \"\";\r\n };\r\n\r\n const dialogUserProfileButtonLabel = () => {\r\n if (showPhoneNumberIsCorrectButton()) {\r\n return t('tiles.buttons.changePhoneNumber')\r\n }\r\n return t('tiles.buttons.enterPhoneNumber')\r\n };\r\n\r\n return { tiles, \r\n initialTiles,\r\n loading, \r\n t, \r\n displayModal, \r\n checkPhoneMessage, \r\n confirmPhoneNumber, \r\n dialogUserProfileButtonLabel, \r\n showPhoneNumberIsCorrectButton, \r\n secondaryEmailDialogVisible, \r\n user,\r\n reRenderKey,\r\n tilesClient,\r\n sortModeEnabled };\r\n },\r\n\r\n computed:{\r\n hasHCLRightAndEmptySecondaryEmail(): boolean{\r\n return this.tiles.some(x => x.applicationName == 'HCL') && (this.user?.secondaryEmail === null || this.user?.secondaryEmail === undefined) && this.secondaryEmailDialogVisible;\r\n },\r\n\r\n continueDialogButtonIsHidden(): boolean{\r\n return new Date() > new Date(store.state.app.secondaryEmailDialogDate);\r\n }\r\n },\r\n\r\n methods:{\r\n async saveSequenceToDB(){\r\n this.increaseRerenderKey();\r\n const tilesSequenceData = JSON.stringify(this.tiles.map(x => x.applicationName));\r\n const tilesSubsequenceDto = new TilesSequenceDto();\r\n tilesSubsequenceDto.data = tilesSequenceData;\r\n await this.tilesClient.SaveTilesSequence(tilesSubsequenceDto);\r\n\r\n this.sortModeEnabled = false;\r\n },\r\n\r\n returnInitialArrayState(){\r\n Object.assign(this.tiles, this.initialTiles);\r\n this.increaseRerenderKey();\r\n this.sortModeEnabled = false;\r\n },\r\n\r\n increaseRerenderKey(){\r\n this.reRenderKey += 1;\r\n }\r\n }\r\n});\r\n\r\n","import { render } from \"./Tiles.vue?vue&type=template&id=32b0ef35\"\nimport script from \"./Tiles.vue?vue&type=script&lang=ts\"\nexport * from \"./Tiles.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","<template>\r\n\t<h1>{{ t(\"damageReport.pageTitle\") }}</h1>\r\n\t<div class=\"d-grid col-lg-4 mx-auto\">\r\n <div v-for=\"button in buttons\" :key=\"button.id\">\r\n \t<form method=\"post\" target=\"_blank\" :action=\"reportUri\">\r\n\t\t\t\t<input type=\"hidden\" name=\"form\" :value=\"button.form\" />\r\n\t\t\t\t<input type=\"hidden\" name=\"operatorId\" :value=\"user.personalNumber\" />\r\n\t\t\t\t<input type=\"hidden\" name=\"operatorEmail\" :value=\"user.email\" />\r\n\t\t\t\t<input type=\"hidden\" name=\"operatorFirstName\" :value=\"user.firstName\" />\r\n\t\t\t\t<input type=\"hidden\" name=\"operatorLastName\" :value=\"user.lastName\" />\r\n\r\n\t\t\t\t<Button :label=\"button.label\" class=\"p-button-success\" type=\"submit\" />\r\n\t\t\t</form>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n\r\n\timport config from '@/config';\r\n\timport { useStore } from '@/store';\r\n\timport { computed, defineComponent, onMounted } from 'vue';\r\n\timport { useI18n } from 'vue-i18n';\r\n\timport { useHead } from '@vueuse/head';\r\n\timport General from '../help/GeneralFunction';\r\n import WebSocketFunctions from '../help/WebSocketFunctions';\r\n import { WebSocketMessageTypes } from '@/types/WebSocketMessageTypes';\r\n\r\n\texport default defineComponent({\r\n\t\tsetup() {\r\n\t\t\tconst store = useStore();\r\n const { t } = useI18n();\r\n\t\t\tconst general = new General();\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: \"noindex\",\r\n },\r\n ],\r\n });\r\n\t\t\t\r\n function cutEmail(text: string | undefined): string | undefined {\r\n if (text) {\r\n let result = text;\r\n if (result.indexOf(\"#\") > 0) {\r\n if (!general.checkEmailOrderingSuffix(text)) {\r\n text = text.replace(\"@\", \"\");\r\n }\r\n result = text.substring(0, text.indexOf(\"#\"));\r\n if (general.checkEmailSuffix(text)) {\r\n return result;\r\n }\r\n }\r\n return text;\r\n }\r\n return text;\r\n\t\t\t}\r\n\r\n const user = computed(() => {\r\n\t\t\t\tconst base64Url = (store.state.token?.accessToken.toString() ?? '').split('.')[1];\r\n \t\t\tconst base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\r\n \t\t\tconst jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {\r\n\t\t\t\t\treturn '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n\t\t\t\t}).join(''));\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tid: store.state.user?.id,\r\n\t\t\t\t\temail: cutEmail(store.state.user?.email),\r\n\t\t\t\t\tfirstName: store.state.user?.firstName,\r\n\t\t\t\t\tlastName: store.state.user?.lastName,\r\n\t\t\t\t\tpersonalNumber: JSON.parse(jsonPayload).acquisition_number\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tconst buttons = [\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 0,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.insured\"),\r\n\t\t\t\t\tform: \"MTPL_SKODCA\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 1,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.injured\"),\r\n\t\t\t\t\tform: \"MTPL_POSKODENY\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 2,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.carInsurance\"),\r\n\t\t\t\t\tform: \"CASCO\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 3,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.frontGlassInsurance\"),\r\n\t\t\t\t\tform: \"GLASS\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 4,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.propertyInsurance\"),\r\n\t\t\t\t\tform: \"PROPERTY\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 5,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.damageResponsibilityInsurance\"),\r\n\t\t\t\t\tform: \"LIABILITY\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 6,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.travelInsurance\"),\r\n\t\t\t\t\tform: \"TRAVEL\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 7,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.lifeInsurance\"),\r\n\t\t\t\t\tform: \"LIFE\"\r\n\t\t\t\t},\r\n\t\t\t]\r\n\r\n\t\t\treturn {\r\n\t\t\t\tuser,\r\n\t\t\t\tbuttons,\r\n\t\t\t\treportUri: config.damageReportUrl,\r\n\t\t\t\tt\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\r\nbutton {\r\n\tmargin-bottom: .75rem;\r\n}\r\n\r\n</style>\r\n","\r\n\r\n\timport config from '@/config';\r\n\timport { useStore } from '@/store';\r\n\timport { computed, defineComponent, onMounted } from 'vue';\r\n\timport { useI18n } from 'vue-i18n';\r\n\timport { useHead } from '@vueuse/head';\r\n\timport General from '../help/GeneralFunction';\r\n import WebSocketFunctions from '../help/WebSocketFunctions';\r\n import { WebSocketMessageTypes } from '@/types/WebSocketMessageTypes';\r\n\r\n\texport default defineComponent({\r\n\t\tsetup() {\r\n\t\t\tconst store = useStore();\r\n const { t } = useI18n();\r\n\t\t\tconst general = new General();\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: \"noindex\",\r\n },\r\n ],\r\n });\r\n\t\t\t\r\n function cutEmail(text: string | undefined): string | undefined {\r\n if (text) {\r\n let result = text;\r\n if (result.indexOf(\"#\") > 0) {\r\n if (!general.checkEmailOrderingSuffix(text)) {\r\n text = text.replace(\"@\", \"\");\r\n }\r\n result = text.substring(0, text.indexOf(\"#\"));\r\n if (general.checkEmailSuffix(text)) {\r\n return result;\r\n }\r\n }\r\n return text;\r\n }\r\n return text;\r\n\t\t\t}\r\n\r\n const user = computed(() => {\r\n\t\t\t\tconst base64Url = (store.state.token?.accessToken.toString() ?? '').split('.')[1];\r\n \t\t\tconst base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\r\n \t\t\tconst jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {\r\n\t\t\t\t\treturn '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n\t\t\t\t}).join(''));\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tid: store.state.user?.id,\r\n\t\t\t\t\temail: cutEmail(store.state.user?.email),\r\n\t\t\t\t\tfirstName: store.state.user?.firstName,\r\n\t\t\t\t\tlastName: store.state.user?.lastName,\r\n\t\t\t\t\tpersonalNumber: JSON.parse(jsonPayload).acquisition_number\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tconst buttons = [\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 0,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.insured\"),\r\n\t\t\t\t\tform: \"MTPL_SKODCA\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 1,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.injured\"),\r\n\t\t\t\t\tform: \"MTPL_POSKODENY\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 2,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.carInsurance\"),\r\n\t\t\t\t\tform: \"CASCO\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 3,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.frontGlassInsurance\"),\r\n\t\t\t\t\tform: \"GLASS\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 4,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.propertyInsurance\"),\r\n\t\t\t\t\tform: \"PROPERTY\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 5,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.damageResponsibilityInsurance\"),\r\n\t\t\t\t\tform: \"LIABILITY\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 6,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.travelInsurance\"),\r\n\t\t\t\t\tform: \"TRAVEL\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 7,\r\n\t\t\t\t\tlabel: t(\"damageReport.buttons.lifeInsurance\"),\r\n\t\t\t\t\tform: \"LIFE\"\r\n\t\t\t\t},\r\n\t\t\t]\r\n\r\n\t\t\treturn {\r\n\t\t\t\tuser,\r\n\t\t\t\tbuttons,\r\n\t\t\t\treportUri: config.damageReportUrl,\r\n\t\t\t\tt\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n","import { render } from \"./DamageReport.vue?vue&type=template&id=1a6b7879&scoped=true\"\nimport script from \"./DamageReport.vue?vue&type=script&lang=ts\"\nexport * from \"./DamageReport.vue?vue&type=script&lang=ts\"\n\nimport \"./DamageReport.vue?vue&type=style&index=0&id=1a6b7879&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-1a6b7879\"\n\nexport default script","<template>\r\n\t<h1>{{ t(\"damageReportSK.pageTitle\") }}</h1>\r\n\t<div class=\"d-grid col-lg-4 mx-auto\">\r\n\t\t<div v-for=\"button in buttons\" :key=\"button.id\">\r\n\t\t\t<Button :label=\"button.label\" class=\"p-button-success\" type=\"button\" v-on:click=\"startDamage(button.url, user.email)\" />\r\n\t\t</div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n\r\n\timport config from '@/config';\r\n\timport { useStore } from '@/store';\r\n import { computed, defineComponent, onMounted } from 'vue';\r\n import { useI18n } from 'vue-i18n';\r\n\timport { useHead } from '@vueuse/head';\r\n\timport Agent360Dto from '../dtos/Agent360Dto';\r\n import C360Client from '../services/C360Client';\r\n import WebSocketFunctions from '../help/WebSocketFunctions';\r\n import { WebSocketMessageTypes } from '@/types/WebSocketMessageTypes';\r\n export default defineComponent({\r\n setup() {\r\n const { t } = useI18n();\r\n const store = useStore();\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: \"noindex\",\r\n },\r\n ],\r\n });\r\n\r\n const buttons = [\r\n {\r\n id: 0,\r\n label: t(\"damageReportSK.buttons.kasko\"),\r\n url: `${config.damageReportUrlBaseSK}/vozidla/havarijne-poistenie/?stredisko={stred}&email={email}`\r\n },\r\n {\r\n id: 1,\r\n label: t(\"damageReportSK.buttons.pzpDamaged\"),\r\n url: `${config.damageReportUrlBaseSK}/vozidla/povinne-zmluvne-poistenie/poskodeny/?stredisko={stred}&email={email}`\r\n },\r\n {\r\n id: 2,\r\n label: t(\"damageReportSK.buttons.pzpPest\"),\r\n url: `${config.damageReportUrlBaseSK}/vozidla/povinne-zmluvne-poistenie/poisteny/?stredisko={stred}&email={email}`\r\n },\r\n {\r\n id: 3,\r\n label: t(\"damageReportSK.buttons.property\"),\r\n url: `${config.damageReportUrlBaseSK}/majetok-zodpovednost/majetok/?stredisko={stred}&email={email}`\r\n },\r\n {\r\n id: 4,\r\n label: t(\"damageReportSK.buttons.responsibility\"),\r\n url: `${config.damageReportUrlBaseSK}/majetok-zodpovednost/zodpovednost/?stredisko={stred}&email={email}`\r\n },\r\n {\r\n id: 5,\r\n label: t(\"damageReportSK.buttons.traveling\"),\r\n url: `${config.damageReportUrlBaseSK}/cestovanie/cestovne-poistenie/?stredisko={stred}&email={email}`\r\n },\r\n {\r\n id: 6,\r\n label: t(\"damageReportSK.buttons.persons\"),\r\n url: `${config.damageReportUrlBaseSK}/osoby/zivot-zdravie-uraz/?stredisko={stred}&email={email}`\r\n },\r\n ]\r\n \r\n const user = computed(() => {\r\n return {\r\n email: store.state.user?.email\r\n }\r\n });\r\n\r\n return {\r\n buttons, t, user\r\n }\r\n },\r\n methods: {\r\n startDamage(url: string, email: string) {\r\n const urlReplace = url?.replace(\"{stred}\", this.c360Agent.ns).replace(\"{email}\", email);\r\n window.open(urlReplace, \"_blank\");\r\n },\r\n async load() {\r\n const defaultNS = \"N/A\";\r\n const c360Client = new C360Client();\r\n try {\r\n Object.assign(this.c360Agent, await c360Client.getAgent());\r\n } catch (error) {\r\n // intercepted by axios\r\n }\r\n this.c360Agent.ns = this.c360Agent.ns ?? defaultNS;\r\n }\r\n\t\t},\r\n data() {\r\n const c360Agent = new Agent360Dto();\r\n return {\t\t\t\t\r\n c360Agent\r\n\t\t\t}\r\n\t\t},\r\n\t\tmounted() {\r\n\t\t\tthis.load();\r\n }\r\n\t});\r\n\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\r\nbutton {\r\n\tmargin-bottom: .75rem;\r\n}\r\n\r\n</style>\r\n","export default class Agent360Dto {\r\n\tpublic agentNumber = '';\r\n\tpublic countryCode = '';\r\n\tpublic agentType = '';\r\n\tpublic regNum = '';\r\n\tpublic branchName = '';\r\n\tpublic companyRepresentative = '';\r\n\tpublic distributionChannel = '';\r\n\tpublic ns = '';\r\n\tpublic firstName = '';\r\n\tpublic lastName = '';\r\n\tpublic birthNumber = '';\r\n\tpublic companyName = '';\r\n\tpublic companyID = '';\r\n\tpublic email = '';\r\n\tpublic phone = '';\r\n\r\n\tpublic constructor(init?: Partial<Agent360Dto>) {\r\n\t\tObject.assign(this, init);\r\n\t}\r\n}","import axios from 'axios';\r\nimport Agent360Dto from '../dtos/Agent360Dto';\r\n\r\nclass C360Client {\r\n\tprivate readonly RESOURCE_C360 = 'C360';\r\n\t\r\n\tpublic async getAgent(): Promise<Agent360Dto[]> {\r\n\t\treturn (await axios.get(`${this.RESOURCE_C360}`)).data;\r\n\t}\r\n}\r\n\r\nexport default C360Client","\r\n\r\n\timport config from '@/config';\r\n\timport { useStore } from '@/store';\r\n import { computed, defineComponent, onMounted } from 'vue';\r\n import { useI18n } from 'vue-i18n';\r\n\timport { useHead } from '@vueuse/head';\r\n\timport Agent360Dto from '../dtos/Agent360Dto';\r\n import C360Client from '../services/C360Client';\r\n import WebSocketFunctions from '../help/WebSocketFunctions';\r\n import { WebSocketMessageTypes } from '@/types/WebSocketMessageTypes';\r\n export default defineComponent({\r\n setup() {\r\n const { t } = useI18n();\r\n const store = useStore();\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: \"noindex\",\r\n },\r\n ],\r\n });\r\n\r\n const buttons = [\r\n {\r\n id: 0,\r\n label: t(\"damageReportSK.buttons.kasko\"),\r\n url: `${config.damageReportUrlBaseSK}/vozidla/havarijne-poistenie/?stredisko={stred}&email={email}`\r\n },\r\n {\r\n id: 1,\r\n label: t(\"damageReportSK.buttons.pzpDamaged\"),\r\n url: `${config.damageReportUrlBaseSK}/vozidla/povinne-zmluvne-poistenie/poskodeny/?stredisko={stred}&email={email}`\r\n },\r\n {\r\n id: 2,\r\n label: t(\"damageReportSK.buttons.pzpPest\"),\r\n url: `${config.damageReportUrlBaseSK}/vozidla/povinne-zmluvne-poistenie/poisteny/?stredisko={stred}&email={email}`\r\n },\r\n {\r\n id: 3,\r\n label: t(\"damageReportSK.buttons.property\"),\r\n url: `${config.damageReportUrlBaseSK}/majetok-zodpovednost/majetok/?stredisko={stred}&email={email}`\r\n },\r\n {\r\n id: 4,\r\n label: t(\"damageReportSK.buttons.responsibility\"),\r\n url: `${config.damageReportUrlBaseSK}/majetok-zodpovednost/zodpovednost/?stredisko={stred}&email={email}`\r\n },\r\n {\r\n id: 5,\r\n label: t(\"damageReportSK.buttons.traveling\"),\r\n url: `${config.damageReportUrlBaseSK}/cestovanie/cestovne-poistenie/?stredisko={stred}&email={email}`\r\n },\r\n {\r\n id: 6,\r\n label: t(\"damageReportSK.buttons.persons\"),\r\n url: `${config.damageReportUrlBaseSK}/osoby/zivot-zdravie-uraz/?stredisko={stred}&email={email}`\r\n },\r\n ]\r\n \r\n const user = computed(() => {\r\n return {\r\n email: store.state.user?.email\r\n }\r\n });\r\n\r\n return {\r\n buttons, t, user\r\n }\r\n },\r\n methods: {\r\n startDamage(url: string, email: string) {\r\n const urlReplace = url?.replace(\"{stred}\", this.c360Agent.ns).replace(\"{email}\", email);\r\n window.open(urlReplace, \"_blank\");\r\n },\r\n async load() {\r\n const defaultNS = \"N/A\";\r\n const c360Client = new C360Client();\r\n try {\r\n Object.assign(this.c360Agent, await c360Client.getAgent());\r\n } catch (error) {\r\n // intercepted by axios\r\n }\r\n this.c360Agent.ns = this.c360Agent.ns ?? defaultNS;\r\n }\r\n\t\t},\r\n data() {\r\n const c360Agent = new Agent360Dto();\r\n return {\t\t\t\t\r\n c360Agent\r\n\t\t\t}\r\n\t\t},\r\n\t\tmounted() {\r\n\t\t\tthis.load();\r\n }\r\n\t});\r\n\r\n","import { render } from \"./DamageReportSK.vue?vue&type=template&id=1261b791&scoped=true\"\nimport script from \"./DamageReportSK.vue?vue&type=script&lang=ts\"\nexport * from \"./DamageReportSK.vue?vue&type=script&lang=ts\"\n\nimport \"./DamageReportSK.vue?vue&type=style&index=0&id=1261b791&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-1261b791\"\n\nexport default script","<template>\r\n\t<template v-if=\"emailSent\">\r\n\t\t<h1>{{ t(\"resetPassword.pageTitles.emailSent\")}}</h1>\r\n\t\t<div class=\"col-md-5 col-lg-4 mx-auto u-text-content\">\r\n\t\t\t<p>\r\n\t\t\t\t{{ t( \"resetPassword.messages.emailSent1\") }}\r\n\t\t\t\t{{form.username}}\r\n\t\t\t\t{{ t( \"resetPassword.messages.emailSent2\") }}\r\n\t\t\t</p>\r\n\t\t</div>\r\n\t</template>\r\n\t<template v-else>\r\n\t\t<div class=\"row\">\r\n\t\t\t<div class=\"col-md-6 mx-auto\">\r\n\t\t\t\t<h1>{{passwordExpiredMessage}}</h1>\r\n\t\t\t\t<h1>{{ t(\"resetPassword.pageTitles.enterUsername\")}}</h1>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\r\n\t\t<div class=\"row\">\r\n\t\t\t<div class=\"col-md-5 col-lg-4 mx-auto u-form\">\r\n\t\t\t\t<div class=\"p-float-label\">\r\n\t\t\t\t\t<InputText v-model.trim=\"form.username\"\r\n\t\t\t\t\t\t\t class=\"p-inputtext-lg\"\r\n\t\t\t\t\t\t\t id=\"pass-reset-email\"\r\n\t\t\t\t\t\t\t :placeholder=\"t('resetPassword.fields.userName')\"\r\n\t\t\t\t\t\t\t :disabled=\"loading\" \r\n\t\t\t\t\t\t\t @keyup.enter=\"startPasswordReset\"\r\n\t\t\t\t\t\t\t />\r\n\t\t\t\t\t\t\t \r\n\t\t\t\t\t<label for=\"pass-reset-email\">{{ t(\"resetPassword.fields.userName\")}}</label>\r\n\t\t\t\t\t<br />\r\n\t\t\t\t</div>\r\n\t\r\n\t\t\t\t<div class=\"d-grid gap-2\">\r\n\t\t\t\t\t<Button :label=\"t('resetPassword.buttons.submit')\" \r\n\t\t\t\t\t\t\tclass=\"p-button-success\" \r\n\t\t\t\t\t\t\t:disabled=\"loading || !form.username\"\r\n\t\t\t\t\t\t\t:icon=\"loadingIcon\" \r\n\t\t\t\t\t\t\ticonPos=\"right\"\r\n\t\t\t\t\t\t\t@click=\"startPasswordReset\" />\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</template>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n\r\nimport { computed, defineComponent, reactive, ref } from 'vue';\t\r\nimport PasswordResetClient from '../services/PasswordResetClient';\r\nimport { useI18n } from 'vue-i18n';\r\nimport router from '../router';\r\nimport { useHead } from '@vueuse/head';\r\n\r\nexport default defineComponent({ \r\n\tsetup() {\r\n\t\tconst { t } = useI18n();\r\n\t\tconst client = new PasswordResetClient();\r\n\r\n\t\tconst loading = ref(false), emailSent = ref(false);\r\n\t\tconst loadingIcon = computed(() => loading.value ? \"pi pi-spin pi-spinner\" : \"\");\r\n\t\tconst form = reactive({\r\n\t\t\tusername: \"\"\r\n\t\t});\r\n\t\tconst passwordExpiredMessage = ref('');\r\n\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: \"noindex\",\r\n },\r\n ],\r\n });\r\n\r\n\t\tconst startPasswordReset = async () => {\r\n\t\t\tif (loading.value || !form.username) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tloading.value = true;\r\n\t\t\ttry {\r\n\t\t\t\tconst username = encodeURIComponent(form.username);\r\n\t\t\t\tconst res = await client.init(username);\r\n\t\t\t\temailSent.value = true;\r\n\t\t\t} catch {\r\n\t\t\t\t// intercepted by axios\r\n\t\t\t}\r\n\r\n\t\t\tloading.value = false;\r\n\t\t};\r\n\r\n\t\tif(router.currentRoute.value.query.expired !== undefined)\r\n\t\t{\r\n\t\t\tpasswordExpiredMessage.value = t(\"resetPassword.pageTitles.passwordExpired\");\t\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tform,\r\n\t\t\temailSent,\r\n\t\t\tloading,\r\n\t\t\tloadingIcon,\r\n\t\t\tt,\r\n\t\t\tstartPasswordReset,\r\n\t\t\tpasswordExpiredMessage\r\n\t\t}\t\t\t\r\n\t}\r\n});\r\n\r\n</script>","\r\n\r\nimport { computed, defineComponent, reactive, ref } from 'vue';\t\r\nimport PasswordResetClient from '../services/PasswordResetClient';\r\nimport { useI18n } from 'vue-i18n';\r\nimport router from '../router';\r\nimport { useHead } from '@vueuse/head';\r\n\r\nexport default defineComponent({ \r\n\tsetup() {\r\n\t\tconst { t } = useI18n();\r\n\t\tconst client = new PasswordResetClient();\r\n\r\n\t\tconst loading = ref(false), emailSent = ref(false);\r\n\t\tconst loadingIcon = computed(() => loading.value ? \"pi pi-spin pi-spinner\" : \"\");\r\n\t\tconst form = reactive({\r\n\t\t\tusername: \"\"\r\n\t\t});\r\n\t\tconst passwordExpiredMessage = ref('');\r\n\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: \"noindex\",\r\n },\r\n ],\r\n });\r\n\r\n\t\tconst startPasswordReset = async () => {\r\n\t\t\tif (loading.value || !form.username) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tloading.value = true;\r\n\t\t\ttry {\r\n\t\t\t\tconst username = encodeURIComponent(form.username);\r\n\t\t\t\tconst res = await client.init(username);\r\n\t\t\t\temailSent.value = true;\r\n\t\t\t} catch {\r\n\t\t\t\t// intercepted by axios\r\n\t\t\t}\r\n\r\n\t\t\tloading.value = false;\r\n\t\t};\r\n\r\n\t\tif(router.currentRoute.value.query.expired !== undefined)\r\n\t\t{\r\n\t\t\tpasswordExpiredMessage.value = t(\"resetPassword.pageTitles.passwordExpired\");\t\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tform,\r\n\t\t\temailSent,\r\n\t\t\tloading,\r\n\t\t\tloadingIcon,\r\n\t\t\tt,\r\n\t\t\tstartPasswordReset,\r\n\t\t\tpasswordExpiredMessage\r\n\t\t}\t\t\t\r\n\t}\r\n});\r\n\r\n","import { render } from \"./ResetPassword.vue?vue&type=template&id=44cfac3c\"\nimport script from \"./ResetPassword.vue?vue&type=script&lang=ts\"\nexport * from \"./ResetPassword.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","<template>\r\n\t<h1>{{ t(\"logOut.titles.logOut\")}}</h1>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n\r\nimport { defineComponent } from 'vue';\t\r\nimport { useI18n } from 'vue-i18n';\r\nimport { useHead } from '@vueuse/head';\r\n\r\nexport default defineComponent({ \r\n\tsetup() {\r\n\t\tconst { t } = useI18n();\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: \"noindex\",\r\n },\r\n ],\r\n });\r\n\r\n\t\treturn {\t\r\n\t\t\tt\r\n\t\t}\t\t\t\r\n\t}\r\n});\r\n\r\n</script>","\r\n\r\nimport { defineComponent } from 'vue';\t\r\nimport { useI18n } from 'vue-i18n';\r\nimport { useHead } from '@vueuse/head';\r\n\r\nexport default defineComponent({ \r\n\tsetup() {\r\n\t\tconst { t } = useI18n();\r\n useHead({\r\n meta: [\r\n {\r\n name: `robots`,\r\n content: \"noindex\",\r\n },\r\n ],\r\n });\r\n\r\n\t\treturn {\t\r\n\t\t\tt\r\n\t\t}\t\t\t\r\n\t}\r\n});\r\n\r\n","import { render } from \"./LogOut.vue?vue&type=template&id=2d195441\"\nimport script from \"./LogOut.vue?vue&type=script&lang=ts\"\nexport * from \"./LogOut.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","export enum WebSocketMessageTypes {\r\n\thello = \"hello\",\r\n\tping = \"ping\",\r\n\ttimeout = \"timeout\",\r\n\tlogout = \"logout\",\r\n\tbye = \"bye\",\r\n\tpretimeout = \"pretimeout\"\r\n}","import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';\r\nimport ChangePassword from '@/views/ChangePassword.vue';\r\nimport ResetPasswordVerify from '@/views/ResetPasswordVerify.vue';\r\nimport UserProfile from '@/views/UserProfile.vue';\r\nimport Tiles from '@/views/Tiles.vue';\r\nimport DamageReport from '@/views/DamageReport.vue';\r\nimport DamageReportSK from '@/views/DamageReportSK.vue';\r\nimport ResetPassword from '@/views/ResetPassword.vue';\r\nimport LogOut from '@/views/LogOut.vue';\r\n\r\nconst routes: Array<RouteRecordRaw> = [\r\n\t{\r\n\t\tpath: '/',\r\n\t\tredirect: '/tiles',\r\n\t},\r\n\t{\r\n\t\tpath: '/tiles',\r\n\t\tname: 'tiles',\r\n\t\tcomponent: Tiles,\r\n\t\tmeta: { background: \"tiles\" }\r\n\t},\r\n\t{\r\n\t\tpath: '/user-profile',\r\n\t\tname: 'user-profile',\r\n\t\tcomponent: UserProfile,\r\n\t\tmeta: { background: \"user-profile\" }\r\n\t},\r\n\t{\r\n\t\tpath: '/damage-report',\r\n\t\tname: 'damage-report',\r\n\t\tcomponent: DamageReport,\r\n\t\tmeta: { background: \"damage-report\" }\r\n\t},\r\n\t{\r\n\t\tpath: '/damage-report-sk',\r\n\t\tname: 'damage-report-sk',\r\n\t\tcomponent: DamageReportSK,\r\n\t\tmeta: { background: \"damage-report\" }\r\n\t},\r\n\t{\r\n\t\tpath: '/change-password',\r\n\t\tname: 'change-password',\r\n\t\tcomponent: ChangePassword,\t\r\n\t\tmeta: { background: \"change-password\" }\r\n\t},\r\n\t{\r\n\t\tpath: '/resetPassword',\r\n\t\tname: 'ResetPassword',\r\n\t\tcomponent: ResetPassword,\r\n\t\tmeta: { background: \"reset-password\" }\r\n\t},\r\n\t{\r\n\t\tpath: '/reset-password-verify',\r\n\t\tname: 'reset-password-verify',\r\n\t\tcomponent: ResetPasswordVerify,\r\n\t\tmeta: { background: \"reset-password\" }\r\n\t},\r\n\t{\r\n\t\tpath: '/logOut',\r\n\t\tname: 'LogOut',\r\n\t\tcomponent: LogOut,\r\n\t\tmeta: { background: \"log-out\" }\r\n\t}\r\n]\r\n\r\nconst router = createRouter({\r\n\thistory: createWebHistory(),\r\n\troutes\r\n});\r\n\r\nexport default router","export default class WebSocketDto {\t\r\n\tpublic id = '';\r\n\tpublic send = Date.now();\r\n\tpublic method = '';\r\n\tpublic user = '';\r\n\tpublic application = '';\r\n\tpublic ssoSessionId = '';\r\n\tpublic token = '';\r\n}","import { WebSocketMessageTypes } from \"@/types/WebSocketMessageTypes\";\r\n\r\nexport default class Message {\r\n public id: string;\r\n public messageType: WebSocketMessageTypes;\r\n\r\n constructor(id: string, messageType: WebSocketMessageTypes) {\r\n this.id = id\r\n this.messageType = messageType\r\n }\r\n}","export default class WebSocketAckDto {\t\r\n\tpublic id = '';\r\n\tpublic send = Date.now();\r\n\tpublic replyTo = '';\r\n\tpublic ack = '';\r\n}","import AccountDto from '@/dtos/AccountDto';\r\nimport AuthToken from '@/model/AuthToken';\r\nimport store from '../store/index'\r\nimport WebSocketDto from '@/dtos/WebSocketDto';\r\nimport main from \"../main\";\r\nimport { WebSocketMessageTypes } from '@/types/WebSocketMessageTypes';\r\nimport config from '../config';\r\nimport { AppConfig, getCurrentInstance } from 'vue';\r\nimport { ActionTypes } from '@/store/ActionTypes';\r\nimport { MutationTypes } from '../store/MutationTypes';\r\nimport Message from '@/model/Message';\r\nimport WebSocketAckDto from '@/dtos/WebSocketDtoAck';\r\n\r\nexport default class WebSocketFunctions {\r\n\r\n public static async sendMessage(messageType: WebSocketMessageTypes): Promise<string> {\r\n let messageId = '';\r\n if (store.state.user && \r\n messageType && \r\n store.state.token && \r\n store.state.socket.isConnected && \r\n store.state.sessionState && \r\n store.state.principalUsername) {\r\n await store.dispatch(ActionTypes.tryRefreshToken, store.state.token);\r\n const webSocketDto = new WebSocketDto();\r\n webSocketDto.id = crypto.randomUUID();\r\n webSocketDto.application = \"unihub\";\r\n webSocketDto.method = messageType;\r\n webSocketDto.ssoSessionId = store.state.sessionState;\r\n webSocketDto.user = store.state.principalUsername;\r\n webSocketDto.token = store.state.token.accessToken;\r\n messageId = webSocketDto.id;\r\n const json = JSON.stringify(webSocketDto);\r\n if(store.state.app.logToConsoleEnabled){\r\n console.log('SOCKET: SEND');\r\n console.log(json);\r\n }\r\n main.config.globalProperties.$socket.send(json);\r\n store.commit(MutationTypes.saveMessage, new Message(messageId, messageType));\r\n try{\r\n if(messageType == WebSocketMessageTypes.bye){\r\n main.config.globalProperties.$disconnect();\r\n }\r\n }\r\n catch{\r\n //log out z Unihubu\r\n }\r\n \r\n }\r\n return messageId;\r\n }\r\n\r\n public static sendAckMessage(messageId: string){\r\n const webSocketAckDto = new WebSocketAckDto();\r\n webSocketAckDto.id = crypto.randomUUID();\r\n webSocketAckDto.ack = \"true\";\r\n webSocketAckDto.replyTo = messageId;\r\n const json = JSON.stringify(webSocketAckDto);\r\n main.config.globalProperties.$socket.send(json);\r\n }\r\n}\r\n","import config from \"@/config\";\r\nimport store from \"@/store\";\r\nimport { MutationTypes } from \"@/store/MutationTypes\";\r\nimport AuthTokenService from \"./AuthTokenService\";\r\nimport router from '../router';\r\nimport WebSocketFunctions from '../help/WebSocketFunctions';\r\nimport { WebSocketMessageTypes } from '@/types/WebSocketMessageTypes';\r\n\r\nexport default class LoginService {\r\n private readonly redirectUri = encodeURIComponent(config.authRedirectUri);\r\n\r\n private tokenService: AuthTokenService;\r\n\r\n constructor() {\r\n this.tokenService = new AuthTokenService();\r\n }\r\n \r\n public login(returnUri: string): void {\r\n location.href = this.getAuthUrl(\"auth\", \"hyperion\", returnUri);\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n const returnUri = this.getReturnUrl();\r\n await WebSocketFunctions.sendMessage(WebSocketMessageTypes.logout);\r\n await WebSocketFunctions.sendMessage(WebSocketMessageTypes.bye);\r\n store.commit(MutationTypes.loginOut);\r\n location.href = this.getAuthUrl(\"logout\", \"hyperion\", returnUri);\r\n }\r\n\r\n private getAuthUrl(authType: string, clientId?: string, returnUri?: string): string {\r\n const redirectUri = returnUri ?? this.redirectUri;\r\n const params = [\r\n `redirect_uri=${redirectUri}`,\r\n \"response_type=code\",\r\n \"scope=openid\"\r\n ];\r\n\r\n if (clientId) {\r\n params.push(`client_id=${clientId}`);\r\n }\r\n\r\n const url = config.authUrl.endsWith(\"/\") ? config.authUrl.slice(0, -1) : config.authUrl;\r\n return `${url}/${authType}?${params.join(\"&\")}`;\r\n }\r\n\r\n private getReturnUrl(): string | undefined {\r\n const isSSO = store.state.user?.type == 'SSO';\r\n if(isSSO){\r\n const baseUrl = `${config.authRedirectUri}`;\r\n let logOutPath = router.resolve({ name: 'LogOut' }).fullPath;\r\n\r\n if (baseUrl.endsWith('/') && logOutPath.startsWith('/')) {\r\n logOutPath = logOutPath.substring(1);\r\n }\r\n return baseUrl + logOutPath\r\n }else{\r\n return undefined\r\n }\r\n }\r\n}","export default class InitAppDto {\r\n\tpublic recaptchaSiteKey = '';\r\n\tpublic recaptchaEnabled = false;\r\n\tpublic haNodeIdentifier = '';\r\n\tpublic logToConsoleEnabled = false;\r\n\tpublic idleLimitInSeconds = 3600;\r\n\tpublic wsPingTimeoutInSeconds = 30;\r\n\tpublic wsPretimeoutTimeoutInSeconds = 300;\r\n\tpublic wsEnabled = true;\r\n\tpublic secondaryEmailDialogDate = '2024-04-30';\r\n\tpublic wsUrl = \"\";\r\n}","import axios from 'axios';\r\n\r\nclass RecaptchaClient {\r\n\tprotected name = 'Recaptcha';\r\n\tpublic async getRecaptchaStatusForCurrentNetwork(): Promise<boolean> {\r\n\t\treturn (await axios.get(`${this.name}`)).data;\r\n\t}\r\n}\r\n\r\nexport default RecaptchaClient\r\n","import AccountDto from '@/dtos/AccountDto';\r\nimport AuthToken from '@/model/AuthToken';\r\nimport AccountClient from '@/services/AccountClient';\r\nimport AuthTokenService from '@/services/AuthTokenService';\r\nimport { InjectionKey } from 'vue';\r\nimport {\r\n ActionContext, ActionTree, CommitOptions, createStore, DispatchOptions, GetterTree, MutationTree,\r\n Store as VuexStore, useStore as baseUseStore\r\n} from 'vuex';\r\nimport { ActionTypes } from './ActionTypes';\r\nimport { MutationTypes } from './MutationTypes';\r\nimport LoginService from '@/services/LoginService';\r\nimport InitAppDto from '@/dtos/InitAppDto';\r\nimport RecaptchaClient from '@/services/RecaptchaClient';\r\nimport main from \"../main\";\r\nimport WebSocketFunctions from '@/help/WebSocketFunctions';\r\nimport { WebSocketMessageTypes } from '@/types/WebSocketMessageTypes';\r\nimport Message from '@/model/Message';\r\n\r\nconst tokenService = new AuthTokenService();\r\nconst accountClient = new AccountClient();\r\nconst loginService = new LoginService();\r\nconst recaptchaClient = new RecaptchaClient();\r\n\r\nexport interface State {\r\n\tuser?: AccountDto;\r\n\ttoken?: AuthToken;\r\n\tshowCheckPhoneDialog: boolean;\r\n\tshowPasswordExpirationDialog: boolean;\r\n\tapp: InitAppDto;\r\n\trecaptchaEnabled: boolean;\r\n\timpersonification: boolean;\r\n\tsso: boolean;\r\n socket: {\r\n // Connection Status\r\n isConnected: boolean;\r\n // Message content\r\n message: string;\r\n // Reconnect error\r\n reconnectError: boolean;\r\n };\r\n sessionState: string | undefined;\r\n principalUsername: string | undefined;\r\n userSource: string | undefined;\r\n authSrc: string | undefined;\r\n lastActivity: Date | undefined;\r\n lastWSPing: Date | undefined;\r\n messages: Message[];\r\n fromOrig: string | undefined;\r\n}\r\n\r\nexport type Mutations<S = State> = {\r\n\t[MutationTypes.setUser](state: S, user: AccountDto): void;\r\n\t[MutationTypes.removeUser](state: S): void;\r\n\t[MutationTypes.setToken](state: S, token: AuthToken): void;\r\n\t[MutationTypes.setShowCheckPhoneDialog](state: S, showCheckPhoneDialog: boolean): void;\r\n\t[MutationTypes.showPasswordExpirationDialog](state: S, showPasswordExpirationDialog: boolean): void;\r\n\t[MutationTypes.initApp](state: S, initApp: InitAppDto): void;\r\n\t[MutationTypes.setRecaptcha](state: S, recaptchaEnabled: boolean): void;\r\n\t[MutationTypes.setImpersonification](state: S, impersonification: boolean): void;\r\n\t[MutationTypes.loginOut](state: S): void;\r\n [MutationTypes.setSSO](state: S, sso: boolean): void;\r\n [MutationTypes.saveMessage](state: S, message: Message): void;\r\n}\r\n\r\nexport type Getters = {\r\n isUserLoggedIn(state: State): boolean;\r\n isRecaptchaEnabled(state: State): boolean;\r\n isImpersonification(state: State): boolean;\r\n pingActivity(state: State): boolean;\r\n}\r\n\r\ntype AugmentedActionContext = {\r\n commit<K extends keyof Mutations>(\r\n key: K,\r\n payload: Parameters<Mutations[K]>[1]\r\n ): ReturnType<Mutations[K]>;\r\n} & Omit<ActionContext<State, State>, 'commit'>\r\n\r\ntype GetTokenAction = {\r\n code: string;\r\n returnUri: string;\r\n}\r\n\r\nexport interface Actions {\r\n [ActionTypes.getToken](\r\n { commit }: AugmentedActionContext,\r\n payload: GetTokenAction\r\n ): Promise<void>;\r\n\r\n [ActionTypes.getUser](\r\n { commit }: AugmentedActionContext,\r\n ): Promise<void>;\r\n\r\n [ActionTypes.tryRefreshToken](\r\n { commit }: AugmentedActionContext,\r\n token: AuthToken\r\n ): Promise<void>;\r\n\r\n [ActionTypes.getRecaptchaStatus](\r\n { commit }: AugmentedActionContext,\r\n enabled: boolean\r\n ): Promise<void>;\r\n}\r\n\r\nexport type Store = Omit<\r\n VuexStore<State>,\r\n 'getters' | 'commit' | 'dispatch'>\r\n & {\r\n commit<K extends keyof Mutations, P extends Parameters<Mutations[K]>[1]>(\r\n key: K,\r\n payload?: P,\r\n options?: CommitOptions\r\n ): ReturnType<Mutations[K]>;\r\n } & {\r\n getters: {\r\n [K in keyof Getters]: ReturnType<Getters[K]>\r\n };\r\n } & {\r\n dispatch<K extends keyof Actions>(\r\n key: K,\r\n payload?: Parameters<Actions[K]>[1],\r\n options?: DispatchOptions\r\n ): ReturnType<Actions[K]>;\r\n }\r\n\r\nexport const key: InjectionKey<Store> = Symbol();\r\n\r\nexport function useStore() {\r\n return baseUseStore(key) as Store;\r\n}\r\n\r\nexport default createStore<State>({\r\n\tstate: {\r\n\t\tuser: undefined,\r\n\t\ttoken: undefined,\r\n\t\tshowCheckPhoneDialog: true,\r\n\t\tshowPasswordExpirationDialog: true,\r\n\t\tapp: new InitAppDto(),\r\n\t\trecaptchaEnabled: false,\r\n\t\timpersonification: false,\r\n sso: false,\r\n socket: {\r\n // Connection Status\r\n isConnected: false,\r\n // Message content\r\n message: \"\",\r\n // Reconnect error\r\n reconnectError: false\r\n },\r\n sessionState: undefined,\r\n principalUsername: undefined,\r\n userSource: undefined,\r\n authSrc: undefined,\r\n lastActivity: undefined,\r\n lastWSPing: undefined,\r\n messages: new Array<Message>(),\r\n fromOrig: undefined\r\n\t},\r\n\r\n\tgetters: {\r\n\t\tisUserLoggedIn: (state) => {\r\n\t\t\treturn state.user != undefined;\r\n\t\t},\r\n\t\tisRecaptchaEnabled: (state) => {\r\n\t\t\treturn state.app.recaptchaEnabled;\r\n\t\t},\r\n\t\tisImpersonification: (state) => {\r\n\t\t\treturn state.impersonification;\r\n },\r\n pingActivity: (state) => {\r\n return state.lastActivity && (state.lastWSPing == undefined || (state.lastWSPing && state.lastActivity > state.lastWSPing));\r\n }\r\n\t} as GetterTree<State, State> & Getters,\r\n\r\n\tmutations: {\r\n\t\t[MutationTypes.setUser](state, user) {\r\n\t\t\tstate.user = user;\r\n\t\t},\r\n\r\n\t\t[MutationTypes.removeUser](state) {\r\n\t\t\tstate.user = undefined;\r\n\t\t},\r\n\r\n\t\t[MutationTypes.setToken](state, token) {\r\n state.token = token;\r\n const tokenAccess = token.accessToken;\r\n const base64Url = tokenAccess.split('.')[1];\r\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\r\n const jsonPayload = decodeURIComponent(atob(base64).split('').map(function (c) {\r\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n }).join(''));\r\n const obj = JSON.parse(jsonPayload);\r\n state.sessionState = obj.session_state;\r\n state.principalUsername = obj.principal_username;\r\n state.userSource = obj.user_source;\r\n state.authSrc = obj.auth_src;\r\n state.fromOrig = obj.fromOrig;\r\n\t\t},\r\n\r\n\t\t[MutationTypes.setShowCheckPhoneDialog](state, showCheckPhoneDialog) {\r\n\t\t\tstate.showCheckPhoneDialog = showCheckPhoneDialog;\r\n\t\t},\r\n\t\t[MutationTypes.showPasswordExpirationDialog](state, showPasswordExpirationDialog) {\r\n\t\t\tstate.showPasswordExpirationDialog = showPasswordExpirationDialog;\r\n\t\t},\r\n\t\t[MutationTypes.initApp](state, initApp) {\r\n\t\t\tstate.app = initApp;\r\n\t\t},\t\r\n\t\t[MutationTypes.setRecaptcha](state, recaptchaEnabled) {\r\n\t\t\tstate.recaptchaEnabled = recaptchaEnabled;\r\n\t\t},\r\n\t\t[MutationTypes.setImpersonification](state, impersonification) {\r\n\t\t\tstate.impersonification = impersonification;\r\n\t\t},\r\n\t\t[MutationTypes.loginOut](state) {\r\n\t\t\tstate.user = undefined;\r\n\t\t\tstate.token = undefined;\r\n\t\t\tstate.showCheckPhoneDialog = true;\r\n\t\t\tstate.showPasswordExpirationDialog = true;\r\n\t\t\tstate.app = new InitAppDto();\r\n\t\t\tstate.recaptchaEnabled = true;\r\n\t\t\tstate.impersonification = false;\r\n state.sso = false;\r\n state.sessionState = undefined;\r\n state.principalUsername = undefined;\r\n state.userSource = undefined;\r\n state.authSrc = undefined;\r\n state.fromOrig = undefined;\r\n state.socket = {\r\n isConnected: false,\r\n message: \"\",\r\n reconnectError: false\r\n }\r\n\t\t},\r\n\t\t[MutationTypes.setSSO](state, sso) {\r\n\t\t\tstate.sso = sso;\r\n },\r\n [MutationTypes.SOCKET_ONOPEN](state, event) {\r\n if (state.app.logToConsoleEnabled) {\r\n console.log('SOCKET: ONOPEN');\r\n console.log(event);\r\n }\r\n main.config.globalProperties.$socket = event.currentTarget;\r\n state.socket.isConnected = true;\r\n },\r\n [MutationTypes.SOCKET_ONCLOSE](state, event) {\r\n state.socket.isConnected = false;\r\n },\r\n [MutationTypes.SOCKET_ONERROR](state, event) {\r\n if (state.app.logToConsoleEnabled) {\r\n console.log('SOCKET: ONERROR');\r\n console.error(state, event)\r\n }\r\n },\r\n // default handler called for all methods\r\n [MutationTypes.SOCKET_ONMESSAGE](state, message) {\r\n if (state.app.logToConsoleEnabled) {\r\n console.log('SOCKET: ONMESSAGE');\r\n console.log(message);\r\n }\r\n state.socket.message = message.data\r\n },\r\n // mutations for reconnect methods\r\n [MutationTypes.SOCKET_RECONNECT](state, count) {\r\n console.info(state, count);\r\n },\r\n [MutationTypes.SOCKET_RECONNECT_ERROR](state) {\r\n state.socket.reconnectError = true;\r\n },\r\n [MutationTypes.saveMessage](state, message) {\r\n if (state.messages.length >= 10) {\r\n state.messages.shift();\r\n }\r\n state.messages.push(message);\r\n }\r\n\t} as MutationTree<State> & Mutations,\r\n\r\n actions: {\r\n async [ActionTypes.getToken]({ commit }, { code, returnUri }) {\r\n const token = await tokenService.getToken(code, returnUri);\r\n commit(MutationTypes.setToken, token);\r\n },\r\n async [ActionTypes.getUser]({ commit }) {\r\n const user = await accountClient.getMe();\r\n commit(MutationTypes.setUser, user);\r\n },\r\n async [ActionTypes.tryRefreshToken]({ commit }, token) {\r\n // note: currently not in use, leaving here in case token refresh becomes \r\n // desirable again - please call inside axios request interceptor\r\n if (token.validTo < new Date()) {\r\n await tokenService.refreshToken(token.refreshToken).then(refreshed => {\r\n commit(MutationTypes.setToken, refreshed);\r\n }).catch(() => {\r\n loginService.logout();\r\n });\r\n }\r\n },\r\n async [ActionTypes.getRecaptchaStatus]({ commit }) {\r\n const recaptchaEnabled = await recaptchaClient.getRecaptchaStatusForCurrentNetwork();\r\n commit(MutationTypes.setRecaptcha, recaptchaEnabled);\r\n }\r\n } as ActionTree<State, State> & Actions\r\n}) as Store\r\n","\r\nimport { computed, defineComponent, ref } from 'vue'\r\nimport { useStore } from '@/store';\r\n\r\nexport default defineComponent({\r\n setup() {\r\n const store = useStore();\r\n const isImpersonification = computed(() => store.getters.isImpersonification);\r\n const time = ref('');\r\n const interval = setInterval(() => {\r\n time.value = Intl.DateTimeFormat(navigator.language,\r\n {\r\n year: 'numeric',\r\n month: 'numeric',\r\n day: 'numeric',\r\n hour: 'numeric',\r\n minute: 'numeric',\r\n second: 'numeric'\r\n }).format()\r\n }, 1000)\r\n return { isImpersonification, time };\r\n }\r\n})\r\n","import { render } from \"./UAppHeader.vue?vue&type=template&id=971ad3a4\"\nimport script from \"./UAppHeader.vue?vue&type=script&lang=ts\"\nexport * from \"./UAppHeader.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","<template>\r\n <button type=\"button\" class=\"u-icon-button\" v-tooltip.top=\"tooltip\">\r\n <suspense>\r\n <u-icon :showTimer=\"showTimer\" :image=\"image\" ref=\"timer\"/> \r\n </suspense>\r\n </button>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, ref } from 'vue'\r\nimport UIcon from '@/components/common/UIcon.vue'\r\nimport { useI18n } from 'vue-i18n';\r\n\r\nexport default defineComponent({\r\n components: { UIcon },\r\n props: {\r\n image: String,\r\n showTimer: Boolean, \r\n tooltip: String\r\n },\r\n setup(props){\r\n const { t } = useI18n();\r\n \r\n const timer = ref(null);\r\n function resetCounter (){\r\n if(props.showTimer){\r\n Object(timer.value).resetCounter();\r\n }\r\n }\r\n return {resetCounter, timer}\r\n }\r\n})\r\n</script>\r\n","<template>\r\n <span class=\"u-icon\">\r\n <img :class=\"imgClass\" :src=\"imgPath\" />\r\n <u-idle-timer v-if=\"showTimer\" ref=\"timer\"/>\r\n </span>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, ref } from 'vue'\r\n import UIdleTimer from '@/components/common/UIdleTimer.vue';\r\n\r\nexport default defineComponent({\r\n props: {\r\n image: String,\r\n showTimer: Boolean\r\n },\r\n components:{UIdleTimer},\r\n async setup(props) {\r\n const imgPath = await import(`@/assets/${props.image}.svg`);\r\n const imgClass = props.showTimer ? \"img-timer\" : \"\";\r\n const timer = ref(null);\r\n function resetCounter (){\r\n if(props.showTimer){\r\n Object(timer.value).resetCounter();\r\n }\r\n }\r\n return { imgPath: imgPath.default, imgClass, resetCounter, timer };\r\n },\r\n})\r\n</script>","<template>\r\n <div class=\"timer\" :style=\"style\">{{display}}</div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport store from '@/store';\r\nimport { defineComponent, ref, computed, onBeforeUnmount } from 'vue'\r\nimport LoginService from '@/services/LoginService';\r\nimport WebSocketFunctions from '@/help/WebSocketFunctions';\r\nimport { WebSocketMessageTypes } from '@/types/WebSocketMessageTypes';\r\n\r\n export default defineComponent({\r\n props: {\r\n idleLimit: Number\r\n },\r\n setup(props) {\r\n const display = ref(\"\");\r\n const defaultCounter = 3600; // seconds\r\n const counter = ref(defaultCounter);\r\n let timer: number;\r\n timer = 0; // TODO ts lint error prefer-const when not assigned here\r\n const style = computed(() => !store.getters.isImpersonification && counter.value <= 300 ? \"filter: invert(100%); color: red; font-weight: bold;\" : \"\");\r\n const loginService = new LoginService();\r\n\r\n const decreaseTime = async () => {\r\n counter.value--;\r\n if (counter.value <= 0) {\r\n clearInterval(timer);\r\n loginService.logout();\r\n }\r\n\r\n if(counter.value == store.state.app.wsPretimeoutTimeoutInSeconds){\r\n WebSocketFunctions.sendMessage(WebSocketMessageTypes.pretimeout);\r\n }\r\n const minute = (counter.value / 60) | 0;\r\n const second = counter.value % 60 | 0;\r\n\r\n const minutes = `${minute < 10 ? \"0\" + minute : minute}`;\r\n const seconds = `${second < 10 ? \"0\" + second : second}`;\r\n\r\n display.value = `${minutes}:${seconds}`;\r\n };\r\n\r\n const resetCounter = () => {\r\n counter.value = store.state.app.idleLimitInSeconds ?? defaultCounter;\r\n };\r\n\r\n const recordActivity = () => {\r\n store.state.lastActivity = new Date();\r\n resetCounter();\r\n };\r\n\r\n const events = [\r\n 'mousedown', 'mousemove', 'keydown',\r\n 'scroll', 'touchstart'\r\n ];\r\n events.forEach(ev => window.addEventListener(ev, recordActivity, true));\r\n\r\n resetCounter();\r\n timer = setInterval(decreaseTime, 1000);\r\n\r\n onBeforeUnmount(async () => {\r\n clearInterval(timer);\r\n for (let i = events.length - 1; i >= 0; i -= 1) {\r\n window.removeEventListener(events[i], recordActivity);\r\n }\r\n })\r\n\r\n return { counter, display, resetCounter, style }\r\n },\r\n })\r\n</script>","\r\nimport store from '@/store';\r\nimport { defineComponent, ref, computed, onBeforeUnmount } from 'vue'\r\nimport LoginService from '@/services/LoginService';\r\nimport WebSocketFunctions from '@/help/WebSocketFunctions';\r\nimport { WebSocketMessageTypes } from '@/types/WebSocketMessageTypes';\r\n\r\n export default defineComponent({\r\n props: {\r\n idleLimit: Number\r\n },\r\n setup(props) {\r\n const display = ref(\"\");\r\n const defaultCounter = 3600; // seconds\r\n const counter = ref(defaultCounter);\r\n let timer: number;\r\n timer = 0; // TODO ts lint error prefer-const when not assigned here\r\n const style = computed(() => !store.getters.isImpersonification && counter.value <= 300 ? \"filter: invert(100%); color: red; font-weight: bold;\" : \"\");\r\n const loginService = new LoginService();\r\n\r\n const decreaseTime = async () => {\r\n counter.value--;\r\n if (counter.value <= 0) {\r\n clearInterval(timer);\r\n loginService.logout();\r\n }\r\n\r\n if(counter.value == store.state.app.wsPretimeoutTimeoutInSeconds){\r\n WebSocketFunctions.sendMessage(WebSocketMessageTypes.pretimeout);\r\n }\r\n const minute = (counter.value / 60) | 0;\r\n const second = counter.value % 60 | 0;\r\n\r\n const minutes = `${minute < 10 ? \"0\" + minute : minute}`;\r\n const seconds = `${second < 10 ? \"0\" + second : second}`;\r\n\r\n display.value = `${minutes}:${seconds}`;\r\n };\r\n\r\n const resetCounter = () => {\r\n counter.value = store.state.app.idleLimitInSeconds ?? defaultCounter;\r\n };\r\n\r\n const recordActivity = () => {\r\n store.state.lastActivity = new Date();\r\n resetCounter();\r\n };\r\n\r\n const events = [\r\n 'mousedown', 'mousemove', 'keydown',\r\n 'scroll', 'touchstart'\r\n ];\r\n events.forEach(ev => window.addEventListener(ev, recordActivity, true));\r\n\r\n resetCounter();\r\n timer = setInterval(decreaseTime, 1000);\r\n\r\n onBeforeUnmount(async () => {\r\n clearInterval(timer);\r\n for (let i = events.length - 1; i >= 0; i -= 1) {\r\n window.removeEventListener(events[i], recordActivity);\r\n }\r\n })\r\n\r\n return { counter, display, resetCounter, style }\r\n },\r\n })\r\n","import { render } from \"./UIdleTimer.vue?vue&type=template&id=31615115\"\nimport script from \"./UIdleTimer.vue?vue&type=script&lang=ts\"\nexport * from \"./UIdleTimer.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","\r\nimport { defineComponent, ref } from 'vue'\r\n import UIdleTimer from '@/components/common/UIdleTimer.vue';\r\n\r\nexport default defineComponent({\r\n props: {\r\n image: String,\r\n showTimer: Boolean\r\n },\r\n components:{UIdleTimer},\r\n async setup(props) {\r\n const imgPath = await import(`@/assets/${props.image}.svg`);\r\n const imgClass = props.showTimer ? \"img-timer\" : \"\";\r\n const timer = ref(null);\r\n function resetCounter (){\r\n if(props.showTimer){\r\n Object(timer.value).resetCounter();\r\n }\r\n }\r\n return { imgPath: imgPath.default, imgClass, resetCounter, timer };\r\n },\r\n})\r\n","import { render } from \"./UIcon.vue?vue&type=template&id=137df9d5\"\nimport script from \"./UIcon.vue?vue&type=script&lang=ts\"\nexport * from \"./UIcon.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","\r\nimport { defineComponent, ref } from 'vue'\r\nimport UIcon from '@/components/common/UIcon.vue'\r\nimport { useI18n } from 'vue-i18n';\r\n\r\nexport default defineComponent({\r\n components: { UIcon },\r\n props: {\r\n image: String,\r\n showTimer: Boolean, \r\n tooltip: String\r\n },\r\n setup(props){\r\n const { t } = useI18n();\r\n \r\n const timer = ref(null);\r\n function resetCounter (){\r\n if(props.showTimer){\r\n Object(timer.value).resetCounter();\r\n }\r\n }\r\n return {resetCounter, timer}\r\n }\r\n})\r\n","import { render } from \"./UIconButton.vue?vue&type=template&id=06cd47fc\"\nimport script from \"./UIconButton.vue?vue&type=script&lang=ts\"\nexport * from \"./UIconButton.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","\r\nimport { computed, defineComponent, ref } from 'vue'\r\nimport UAppHeader from '@/components/common/UAppHeader.vue'\r\nimport UIconButton from '@/components/common/UIconButton.vue'\r\nimport { useStore } from '@/store';\r\nimport LoginService from '@/services/LoginService';\r\nimport { useI18n } from 'vue-i18n';\r\nimport { useRoute } from 'vue-router';\r\nimport EventBus from '@/help/EventBus';\r\n\r\nexport default defineComponent({\r\n components: {UAppHeader, UIconButton},\r\n setup() {\r\n const timer = ref(null);\r\n const store = useStore();\r\n const { t } = useI18n();\r\n const loginService = new LoginService();\r\n const route = useRoute();\r\n const showLogoutDialog = ref(false);\r\n\r\n const firstName = computed(() => store.state.user?.firstName);\r\n const lastName = computed(() => store.state.user?.lastName);\r\n const isLoggedIn = computed(() => store.getters.isUserLoggedIn);\r\n const isImpersonification = computed(() => store.getters.isImpersonification);\r\n const logout = () => {\r\n loginService.logout();\r\n };\r\n const to = computed(() => {\r\n return route.name == \"LogOut\" ? '/LogOut' : '/';\r\n });\r\n\r\n const menu = ref();\r\n const menuItems = ref([\r\n {\r\n items: [\r\n {\r\n label: 'Přeskládat dlaždice',\r\n command: () =>{\r\n EventBus.emit('sortModeEnabled');\r\n }\r\n }\r\n ]\r\n }\r\n ]);\r\n\r\n const toggleMenu = (event: any) => {\r\n menu.value.toggle(event);\r\n };\r\n\r\n function resetTimer(){\r\n Object(timer.value).resetCounter();\r\n }\r\n\r\n function isMobile(){\r\n return screen.width <= 450;\r\n }\r\n\r\n function showLogoutDialogClick(){\r\n showLogoutDialog.value = true;\r\n }\r\n\r\n return {\r\n firstName,\r\n lastName,\r\n isLoggedIn,\r\n logout,\r\n isImpersonification,\r\n t,\r\n to,\r\n timer,\r\n resetTimer,\r\n menuItems,\r\n menu,\r\n toggleMenu,\r\n isMobile,\r\n showLogoutDialog,\r\n showLogoutDialogClick\r\n };\r\n }\r\n})\r\n","import { render } from \"./AppHeader.vue?vue&type=template&id=143b386b&scoped=true\"\nimport script from \"./AppHeader.vue?vue&type=script&lang=ts\"\nexport * from \"./AppHeader.vue?vue&type=script&lang=ts\"\n\nimport \"./AppHeader.vue?vue&type=style&index=0&id=143b386b&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-143b386b\"\n\nexport default script","<template>\r\n <footer>\r\n <div class=\"container\">\r\n © UNIQA {{ new Date().getFullYear() }} | UNIHUB | \r\n <a href=\"#\">{{ t(\"appFooter.personalInfoProtection\") }} | {{store.state.app.haNodeIdentifier}}</a> |\r\n {{ appVersion }}\r\n </div>\r\n </footer>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nimport { useI18n } from 'vue-i18n';\r\nimport store from '../store';\r\nimport { version } from '../../package.json';\r\n\r\nexport default defineComponent({\r\n setup() {\r\n const { t } = useI18n();\r\n return { t, store, appVersion:version };\r\n },\r\n})\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@media (max-width: 700px) {\r\n .container{\r\n font-size: 12px; \r\n padding: 0 2px;\r\n }\r\n }\r\n</style>","\r\nimport { defineComponent } from 'vue'\r\nimport { useI18n } from 'vue-i18n';\r\nimport store from '../store';\r\nimport { version } from '../../package.json';\r\n\r\nexport default defineComponent({\r\n setup() {\r\n const { t } = useI18n();\r\n return { t, store, appVersion:version };\r\n },\r\n})\r\n","import { render } from \"./AppFooter.vue?vue&type=template&id=4b4349d5&scoped=true\"\nimport script from \"./AppFooter.vue?vue&type=script&lang=ts\"\nexport * from \"./AppFooter.vue?vue&type=script&lang=ts\"\n\nimport \"./AppFooter.vue?vue&type=style&index=0&id=4b4349d5&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-4b4349d5\"\n\nexport default script","<template>\r\n <div class=\"u-app-layout\" :class=\"`bg-${backgroundName}`\">\r\n <slot name=\"header\" />\r\n\r\n <div class=\"layout\">\r\n <div class=\"container\"><slot /></div>\r\n </div>\r\n\r\n <slot name=\"footer\" />\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, ref, watch } from 'vue'\r\nimport { useRoute } from 'vue-router'\r\n\r\nexport default defineComponent({\r\n setup() {\r\n const route = useRoute();\r\n const backgroundName = ref(route.meta.background);\r\n\r\n watch(route, (curr, _) => { backgroundName.value = curr.meta.background ?? \"none\" });\r\n\r\n return { backgroundName };\r\n }\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import '@/css-framework/mixins';\r\n\r\n@mixin bg-image($name) {\r\n // TODO css-loader probably needed to handle @/assets path\r\n background-image: url('../../assets/#{$name}_750.png');\r\n\r\n @include media-breakpoint-up(md) {\r\n background-image: url(\"../../assets/#{$name}_1024.png\");\r\n }\r\n\r\n @include media-breakpoint-up(lg) {\r\n background-image: url(\"../../assets/#{$name}_1920.png\");\r\n }\r\n}\r\n\r\n.bg-user-profile {\r\n @include bg-image('background_user_profile');\r\n}\r\n\r\n.bg-tiles {\r\n @include bg-image('background_tiles');\r\n}\r\n\r\n.bg-change-password {\r\n @include bg-image('background_password_change');\r\n}\r\n\r\n.bg-reset-password {\r\n @include bg-image('background_forgotten_password');\r\n}\r\n\r\n.bg-log-out {\r\n @include bg-image('background_logout');\r\n}\r\n</style>","\r\nimport { defineComponent, ref, watch } from 'vue'\r\nimport { useRoute } from 'vue-router'\r\n\r\nexport default defineComponent({\r\n setup() {\r\n const route = useRoute();\r\n const backgroundName = ref(route.meta.background);\r\n\r\n watch(route, (curr, _) => { backgroundName.value = curr.meta.background ?? \"none\" });\r\n\r\n return { backgroundName };\r\n }\r\n})\r\n","import { render } from \"./UAppLayout.vue?vue&type=template&id=857987da&scoped=true\"\nimport script from \"./UAppLayout.vue?vue&type=script&lang=ts\"\nexport * from \"./UAppLayout.vue?vue&type=script&lang=ts\"\n\nimport \"./UAppLayout.vue?vue&type=style&index=0&id=857987da&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-857987da\"\n\nexport default script","\r\n import { defineComponent, onMounted, ref, computed, watch } from 'vue';\r\n import AppHeader from '@/components/AppHeader.vue';\r\n import AppFooter from '@/components/AppFooter.vue';\r\n import UAppLayout from '@/components/common/UAppLayout.vue';\r\n import { VueReCaptcha, useReCaptcha } from 'vue-recaptcha-v3';\r\n import { useStore } from '@/store';\r\n import { WebSocketMessageTypes } from './types/WebSocketMessageTypes';\r\n import LoginService from './services/LoginService';\r\n import WebSocketFunctions from './help/WebSocketFunctions';\r\n import config from './config';\r\n import { useI18n } from 'vue-i18n';\r\n\r\n export default defineComponent({\r\n components: { UAppLayout, AppHeader, AppFooter },\r\n\r\n setup() {\r\n const { t } = useI18n();\r\n const pretimeoutDialogIsVissible = ref(false);\r\n const bgName = ref(\"\");\r\n const header = ref(null);\r\n const store = useStore();\r\n const loginService = new LoginService();\r\n let helloMessageId = '';\r\n const interval = ref(0);\r\n onMounted(async () => {\r\n document.title = 'Unihub' + config.envName;\r\n if (store.getters.isRecaptchaEnabled) {\r\n const reCaptcha = useReCaptcha();\r\n if (reCaptcha) {\r\n await reCaptcha.recaptchaLoaded();\r\n reCaptcha?.instance.value?.hideBadge();\r\n }\r\n }\r\n });\r\n\r\n async function startPingTimer(): Promise<void> {\r\n clearInterval(interval.value);\r\n let timer = store.state.app.wsPingTimeoutInSeconds ?? 30;\r\n interval.value = setInterval(async function () {\r\n if (--timer < 0) {\r\n timer = store.state.app.wsPingTimeoutInSeconds ?? 30;\r\n if (store.getters.pingActivity) {\r\n await WebSocketFunctions.sendMessage(WebSocketMessageTypes.ping);\r\n pretimeoutDialogIsVissible.value = false;\r\n }\r\n }\r\n }, 1000);\r\n }\r\n\r\n watch(() => store.state.socket.message, function () {\r\n try {\r\n const message = JSON.parse(store.state.socket.message.toString());\r\n\r\n if (helloMessageId && helloMessageId == message.replyTo) {\r\n if (message.ack == true) {\r\n startPingTimer();\r\n }\r\n }else if ( store.state.messages.findIndex(m=>m.id == message.replyTo) > -1){\r\n const storedMessage = store.state.messages.find(m => m.id = message.replyTo);\r\n if(storedMessage && storedMessage.messageType == WebSocketMessageTypes.ping){\r\n store.state.lastWSPing = new Date();\r\n }\r\n }\r\n else if (message && message.user && message.ssoSessionId && message.method && message.application) {\r\n if (store.state.principalUsername == message.user &&\r\n store.state.sessionState == message.ssoSessionId && store.state.messages.findIndex(m=>m.id == message.id) == -1) {\r\n if (message.method == WebSocketMessageTypes.logout) {\r\n WebSocketFunctions.sendAckMessage(message.id);\r\n loginService.logout();\r\n } else if (message.method == WebSocketMessageTypes.ping) {\r\n Object(header.value).resetTimer();\r\n startPingTimer();\r\n store.state.lastWSPing = new Date();\r\n WebSocketFunctions.sendAckMessage(message.id);\r\n } else if (message.method == WebSocketMessageTypes.pretimeout) {\r\n pretimeoutDialogIsVissible.value = true;\r\n WebSocketFunctions.sendAckMessage(message.id);\r\n }\r\n }\r\n }\r\n } catch (exc) {\r\n if (store.state.app.logToConsoleEnabled) {\r\n console.log('APP: ONMESSAGE');\r\n console.error(exc)\r\n }\r\n }\r\n });\r\n\r\n watch(async () => store.state.socket.isConnected, async function () {\r\n try {\r\n if (store.state.socket.isConnected) {\r\n helloMessageId = await WebSocketFunctions.sendMessage(WebSocketMessageTypes.hello);\r\n }\r\n } catch (exc) {\r\n if (store.state.app.logToConsoleEnabled) {\r\n console.log('APP: Hello');\r\n console.error(exc)\r\n }\r\n }\r\n });\r\n \r\n const stayLoggedIn = async () => {\r\n pretimeoutDialogIsVissible.value = false;\r\n await WebSocketFunctions.sendMessage(WebSocketMessageTypes.ping);\r\n };\r\n\r\n return {\r\n bgName,\r\n header,\r\n pretimeoutDialogIsVissible,\r\n t,\r\n stayLoggedIn\r\n }\r\n }\r\n });\r\n","import { render } from \"./App.vue?vue&type=template&id=03c1d329\"\nimport script from \"./App.vue?vue&type=script&lang=ts\"\nexport * from \"./App.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","<template>\r\n {{t(\"tiles.messages.errorNoUnihubPermission\")}}\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n\r\n import { defineComponent, inject } from 'vue'\r\n import { useI18n } from 'vue-i18n';\r\n\r\n export default defineComponent({\r\n setup() {\r\n const { t } = useI18n();\r\n return {\r\n t\r\n };\r\n }\r\n })\r\n\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n ::v-deep .p-dialog {\r\n max-width: 75vw;\r\n }\r\n</style>","\r\n\r\n import { defineComponent, inject } from 'vue'\r\n import { useI18n } from 'vue-i18n';\r\n\r\n export default defineComponent({\r\n setup() {\r\n const { t } = useI18n();\r\n return {\r\n t\r\n };\r\n }\r\n })\r\n\r\n","import { render } from \"./LogOutDialog.vue?vue&type=template&id=a2f61328&scoped=true\"\nimport script from \"./LogOutDialog.vue?vue&type=script&lang=ts\"\nexport * from \"./LogOutDialog.vue?vue&type=script&lang=ts\"\n\nimport \"./LogOutDialog.vue?vue&type=style&index=0&id=a2f61328&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-a2f61328\"\n\nexport default script","<template>\r\n\t<label>{{label}} </label>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n\timport { defineComponent } from 'vue';\r\n\r\n\texport default defineComponent({\r\n\t\tname: 'BaseLabel',\r\n\t\tprops: {\r\n\t\t\tlabel: String\r\n\t\t}\r\n\t}\r\n\t);\r\n\r\n\r\n</script>\r\n\r\n<!-- Add \"scoped\" attribute to limit CSS to this component only -->\r\n<style scoped lang=\"scss\">\r\n\t\r\n\r\n\t\r\n\r\n</style>\r\n","\r\n\timport { defineComponent } from 'vue';\r\n\r\n\texport default defineComponent({\r\n\t\tname: 'BaseLabel',\r\n\t\tprops: {\r\n\t\t\tlabel: String\r\n\t\t}\r\n\t}\r\n\t);\r\n\r\n\r\n","import { render } from \"./BaseLabel.vue?vue&type=template&id=7b29f1a6\"\nimport script from \"./BaseLabel.vue?vue&type=script&lang=ts\"\nexport * from \"./BaseLabel.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","import Vue, { ComponentInternalInstance, getCurrentInstance, createApp, h } from 'vue'\r\nimport App from './App.vue'\r\nimport PrimeVue from 'primevue/config';\r\nimport router from './router'\r\nimport store, { key } from './store'\r\nimport { ActionTypes } from './store/ActionTypes';\r\nimport { MutationTypes } from './store/MutationTypes';\r\nimport axios, { AxiosError } from 'axios';\r\nimport ToastService from 'primevue/toastservice';\r\nimport LoginService from './services/LoginService';\r\nimport { i18n } from \"@/i18n\";\r\nimport { createHead } from '@vueuse/head';\r\nimport 'primevue/resources/themes/bootstrap4-light-blue/theme.css';\r\nimport 'primevue/resources/primevue.min.css';\r\nimport 'primeicons/primeicons.css';\r\nimport LogOutDialog from './components/LogOutDialog.vue';\r\nimport AuthToken from '@/model/AuthToken';\r\nimport VueNativeSock from \"vue-native-websocket-vue3\";\r\n//import 'primeflex/primeflex.css';\r\n\r\nimport './css-framework/index.scss';\r\n\r\nimport Button from 'primevue/button';\r\nimport InputText from 'primevue/inputtext';\r\nimport TabView from 'primevue/tabview';\r\nimport TabPanel from 'primevue/tabpanel';\r\nimport BaseLabel from '@/components/BaseLabel.vue';\r\nimport Dropdown from 'primevue/dropdown';\r\nimport Dialog from 'primevue/dialog';\r\nimport Password from 'primevue/password';\r\nimport Column from 'primevue/column';\r\nimport DataTable from 'primevue/datatable';\r\nimport Checkbox from 'primevue/checkbox';\r\nimport ColumnGroup from 'primevue/columngroup';\r\nimport Toast from 'primevue/toast';\r\nimport Tooltip from 'primevue/tooltip';\r\nimport Message from 'primevue/message';\r\nimport Skeleton from 'primevue/skeleton';\r\nimport DialogService from 'primevue/dialogservice';\r\nimport DynamicDialog from 'primevue/dynamicdialog';\r\nimport Menu from 'primevue/menu';\r\n\r\nimport config from './config'; // TODO load config from file using store\r\nimport { VueReCaptcha } from 'vue-recaptcha-v3';\r\n\r\n// TODO better fix\r\n/* eslint prefer-const: \"off\" */\r\nlet appMounted: Vue.ComponentPublicInstance;\r\nconst loginService = new LoginService();\r\nconst pathToConfig = window.origin + '/config/config.json';\r\nconst SOCKET_ONOPEN = MutationTypes.SOCKET_ONOPEN;\r\nconst SOCKET_ONCLOSE = MutationTypes.SOCKET_ONCLOSE;\r\nconst SOCKET_ONERROR = MutationTypes.SOCKET_ONERROR;\r\nconst SOCKET_ONMESSAGE = MutationTypes.SOCKET_ONMESSAGE;\r\nconst SOCKET_RECONNECT = MutationTypes.SOCKET_RECONNECT;\r\nconst SOCKET_RECONNECT_ERROR = MutationTypes.SOCKET_RECONNECT_ERROR\r\nconst mutations = {\r\n SOCKET_ONOPEN,\r\n SOCKET_ONCLOSE,\r\n SOCKET_ONERROR,\r\n SOCKET_ONMESSAGE,\r\n SOCKET_RECONNECT,\r\n SOCKET_RECONNECT_ERROR\r\n};\r\n\r\nconst app = createApp(App)\r\nexport default app;\r\n\r\naxios.get(pathToConfig).then(async response => {\r\n store.commit(MutationTypes.initApp, response.data);\r\n if (store.state.app.recaptchaEnabled) await store.dispatch(ActionTypes.getRecaptchaStatus);\r\n\tapp\r\n\t.component('ColumnGroup', ColumnGroup)\r\n .component('Checkbox', Checkbox)\r\n .component('Password', Password)\r\n .component('Dialog', Dialog)\r\n .component('Dropdown', Dropdown)\r\n .component('BaseLabel', BaseLabel)\r\n .component('TabPanel', TabPanel)\r\n .component('TabView', TabView)\r\n .component('Button', Button)\r\n .component('InputText', InputText)\r\n .component('Column', Column)\r\n .component('DataTable', DataTable)\r\n .component('Toast', Toast)\r\n .component('Message', Message)\r\n .component('Skeleton', Skeleton)\r\n .component('DynamicDialog', DynamicDialog)\r\n .component('Menu', Menu)\r\n // TODO bug in primevue should be fixed but is not https://github.com/primefaces/primevue/issues/943\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n .directive('tooltip', Tooltip)\r\n .use(PrimeVue)\r\n .use(DialogService)\r\n .use(store, key)\r\n .use(i18n)\r\n .use(router) \r\n .use(ToastService)\r\n .use(createHead());\r\n \r\n if(store.state.app.recaptchaSiteKey && store.state.app.recaptchaEnabled){\r\n app.use(VueReCaptcha, {\r\n siteKey: store.state.app.recaptchaSiteKey, loaderOptions: {\r\n //Due to limitations in certain countries it's required to use recaptcha.net instead of google.com.\r\n useRecaptchaNet: false\r\n }\r\n });\r\n }\r\n\r\n if(store.state.app.wsUrl && store.state.app.wsEnabled != false) {\r\n app.use(VueNativeSock, store.state.app.wsUrl, {\r\n format: \"\",\r\n connectManually: true,\r\n store: store,\r\n mutations: mutations,\r\n reconnection: true,\r\n reconnectionAttempts: 5,\r\n reconnectionDelay: 3000,\r\n });\r\n }\r\n\tappMounted = app.mount('#app');\r\n});\r\n\r\nfunction getErrorMessage(method: string | undefined): string {\r\n switch (method) {\r\n case \"get\":\r\n return i18n.global.t(\"toast.messages.errorLoadingData\");\r\n case \"post\":\r\n case \"put\":\r\n case \"patch\":\r\n return i18n.global.t(\"toast.messages.errorSavingData\");\r\n case \"delete\":\r\n return i18n.global.t(\"toast.messages.errorRemovingData\");\r\n default:\r\n return i18n.global.t(\"toast.messages.errorCallingApi\");\r\n }\r\n}\r\n\r\naxios.defaults.baseURL = config.apiUrl;\r\naxios.interceptors.request.use(async config => {\r\n if (!config.auth && config.url != 'keycloak/refreshToken' && store.state.token) {\r\n await store.dispatch(ActionTypes.tryRefreshToken, store.state.token);\r\n config.headers.Authorization = `Bearer ${store.state.token.accessToken}`;\r\n }\r\n\r\n return config;\r\n})\r\n\r\naxios.interceptors.response.use(response => response,\r\n (error: AxiosError) => {\r\n if (error.response?.status == 401 || (error.response?.status == 500 && error.request?.responseURL.indexOf('api/keycloak/token') >= 0)) {\r\n loginService.logout();\r\n } else {\r\n if (!error.config?.supressErrorMessage) {\r\n if (error.response && error.response.status == 409 && (error.response.data as any).errorCode == 'CommonPasswordsFailed') {\r\n appMounted.$toast.add({\r\n severity: 'error',\r\n summary: i18n.global.t(\"toast.titles.error\"),\r\n detail: i18n.global.t(\"toast.messages.verifyCommonPasswordsFailed\")\r\n });\r\n } else if (error.response && error.response.status == 409 && (error.response.data as any).errorCode == 'PasswordHistoryFailed') {\r\n appMounted.$toast.add({\r\n severity: 'error',\r\n summary: i18n.global.t(\"toast.titles.error\"),\r\n detail: i18n.global.t(\"toast.messages.verifyPasswordHistoryFailed\")\r\n });\r\n } else if (error.response && error.response.status == 403 && (error.response.data as any).errorCode == 'PasswordVerificationFailed') {\r\n appMounted.$toast.add({\r\n severity: 'error',\r\n summary: i18n.global.t(\"toast.titles.error\"),\r\n detail: i18n.global.t(\"toast.messages.invalidPassword\")\r\n });\r\n } else if (error.response && error.response.status == 403 && (error.response.data as any).errorCode == 'InvalidVerificationToken') {\r\n appMounted.$toast.add({\r\n severity: 'error',\r\n summary: i18n.global.t(\"toast.titles.error\"),\r\n detail: i18n.global.t(\"toast.messages.invalidVerificationCode\")\r\n });\r\n } else if (error.response && error.response.status == 409 && (error.response.data as any).errorCode == 'VerifyEmailUniquenessFailed') {\r\n appMounted.$toast.add({\r\n severity: 'error',\r\n summary: i18n.global.t(\"toast.titles.error\"),\r\n detail: i18n.global.t(\"toast.messages.emailAlreadyExists\")\r\n });\r\n /* } else if (error.response && error.response.status == 400 && error.response.data.errorCode == 'UserAccountIdNotSetInToken') {\r\n setTimeout(() => {\r\n alert(i18n.global.t(\"tiles.messages.errorNoUnihubPermission\"));\r\n loginService.logout();\r\n }, 500);*/\r\n } else {\r\n const msg = error.config?.errorMessages?.get(error.response?.status ?? 0)\r\n || error.config?.errorMessage || getErrorMessage(error.config?.method);\r\n\r\n appMounted.$toast.add({\r\n severity: 'error',\r\n summary: i18n.global.t(\"toast.titles.error\"),\r\n detail: msg\r\n });\r\n }\r\n }\r\n\r\n return Promise.reject(error);\r\n }\r\n });\r\n\r\naxios.interceptors.response.use(res => {\r\n const isoDateFormat =\r\n /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d*)?)((-(\\d{2}):(\\d{2})|Z)?)$/;\r\n\r\n const handleDates = (body: any) => { // TODO argument type?\r\n if (!body || typeof body !== \"object\") {\r\n return body;\r\n }\r\n\r\n for (const key of Object.keys(body)) {\r\n const value = body[key];\r\n if (value && typeof value === \"string\" && isoDateFormat.test(value)) {\r\n body[key] = new Date(value);\r\n } else if (typeof value === \"object\") {\r\n handleDates(value);\r\n }\r\n }\r\n };\r\n\r\n handleDates(res.data);\r\n\r\n return res;\r\n});\r\n\r\nrouter.beforeEach(async (to, _, next) => {\r\n\tswitch(to.name) {\r\n\t\tcase \"ResetPassword\":\r\n\t\tcase \"reset-password-verify\":\r\n\t\tcase \"LogOut\":\r\n\t\t\tnext();\r\n\t\t\tbreak;\r\n\r\n default:\r\n if (store.getters.isUserLoggedIn) {\r\n next();\r\n } else if (store.state.token) {\r\n\r\n await store.dispatch(ActionTypes.getUser);\r\n\r\n next();\r\n } else {\r\n let authRedirectUri = config.authRedirectUri;\r\n let path = to.path;\r\n if (authRedirectUri.endsWith('/') && path.startsWith('/')) {\r\n path = path.substring(1);\r\n }\r\n \r\n while(path.startsWith('//')){\r\n path = path.slice(1);\r\n }\r\n \r\n const returnUri = `${authRedirectUri}${path}`\r\n const code = to.query[\"code\"]?.toString();\r\n if (code) {\r\n await store.dispatch(ActionTypes.getToken, { code, returnUri });\r\n if (store.state.token) {\r\n if (store.state.userSource == undefined) {\r\n const dialogRef = appMounted.$dialog.open(LogOutDialog, {\r\n props: {\r\n header: i18n.global.t(\"toast.titles.error\"),\r\n modal: true,\r\n dismissableMask: false,\r\n closable: false\r\n },\r\n templates: {\r\n footer: () => {\r\n return [\r\n h(Button, {\r\n label: i18n.global.t(\"tiles.buttons.logout\"),\r\n onClick: () => {\r\n loginService.logout();\r\n dialogRef.close();\r\n }, autofocus: true\r\n })\r\n ]\r\n }\r\n }\r\n });\r\n return;\r\n } else if (store.state.authSrc == 'impersonification') {\r\n store.commit(MutationTypes.setImpersonification, true);\r\n }\r\n\r\n if (store.state.fromOrig) {\r\n store.commit(MutationTypes.setSSO, true);\r\n }\r\n }\r\n await store.dispatch(ActionTypes.getUser);\r\n\t\t\t\t\tif(store.state.app.wsUrl && store.state.app.wsEnabled != false && store.state.token && (store.state.token as any) instanceof AuthToken && !store.state.socket.isConnected){\r\n\t\t\t\t\t\tawait appMounted.$.appContext.config.globalProperties.$connect(store.state.app.wsUrl + \"?token=\" + (store.state.token as any).accessToken);\r\n\t\t\t\t\t}\r\n next(to.path);\r\n } else {\r\n loginService.login(returnUri);\r\n }\r\n }\r\n }\r\n});\r\n\r\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./PasswordVerificationPrompt.vue?vue&type=style&index=0&id=a47840d8&lang=scss&scoped=true\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./PasswordExpirationDialog.vue?vue&type=style&index=0&id=426776a2&lang=scss&scoped=true\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./VerificationPrompt.vue?vue&type=style&index=0&id=65ff9016&lang=scss&scoped=true\""],"sourceRoot":""}