{"version":3,"file":"js/app.14ca98b3.js","mappings":"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","sources":["webpack://precog-frontend/./src/utils/arrayExtensions.ts","webpack://precog-frontend/./src/utils/stringExtensions.ts","webpack://precog-frontend/./src/App.vue","webpack://precog-frontend/./src/App.vue?33c6","webpack://precog-frontend/./src/quasar-user-options.js","webpack://precog-frontend/./src/store/utils/axiosSessionRefreshAdapter.ts","webpack://precog-frontend/./src/router/guards.ts","webpack://precog-frontend/./src/main.ts","webpack://precog-frontend/./src/router/paramTransformer.ts","webpack://precog-frontend/./src/router/index.ts","webpack://precog-frontend/./src/router/routes/error.ts","webpack://precog-frontend/./src/router/routes/home.ts","webpack://precog-frontend/./src/router/routes/login.ts","webpack://precog-frontend/./src/router/routes/transactions.ts","webpack://precog-frontend/./src/router/routes/users.ts","webpack://precog-frontend/./src/settings.ts","webpack://precog-frontend/./src/store/contracts/loginStore.ts","webpack://precog-frontend/./src/store/contracts/transactions.ts","webpack://precog-frontend/./src/store/contracts/transcribe.ts","webpack://precog-frontend/./src/store/contracts/translate.ts","webpack://precog-frontend/./src/store/contracts/upload.ts","webpack://precog-frontend/./src/store/contracts/users/divisionsGrid.ts","webpack://precog-frontend/./src/store/contracts/users/forgotPassword.ts","webpack://precog-frontend/./src/store/contracts/users/register.ts","webpack://precog-frontend/./src/store/imageAnalysis.ts","webpack://precog-frontend/./src/store/contracts/leftDrawer.ts","webpack://precog-frontend/./src/store/leftDrawer.ts","webpack://precog-frontend/./src/utils/nullable.ts","webpack://precog-frontend/./src/store/login.ts","webpack://precog-frontend/./src/store/mapping/transactionsMapping.ts","webpack://precog-frontend/./src/store/time.ts","webpack://precog-frontend/./src/store/transactions.ts","webpack://precog-frontend/./src/store/transcribe.ts","webpack://precog-frontend/./src/store/translate.ts","webpack://precog-frontend/./src/store/upload.ts","webpack://precog-frontend/./src/store/users/divisionsGrid.ts","webpack://precog-frontend/./src/store/users/forgotPassword.ts","webpack://precog-frontend/./src/store/users/register.ts","webpack://precog-frontend/./src/store/utils/apiResponseHandling.ts","webpack://precog-frontend/./src/store/utils/axiosUtils.ts","webpack://precog-frontend/./src/store/validation.ts","webpack://precog-frontend/./src/utils/dateUtils.ts","webpack://precog-frontend/./src/utils/fileListExtensions.ts","webpack://precog-frontend/./src/utils/impl.ts","webpack://precog-frontend/./src/utils/stringUtils.ts","webpack://precog-frontend/./src/utils/systemUtils.ts","webpack://precog-frontend/./src/validation/common/rules.ts","webpack://precog-frontend/./src/validation/forgotPasswordValidationModel.ts","webpack://precog-frontend/./src/validation/index.ts","webpack://precog-frontend/./src/validation/userRegisterValidationModel.ts","webpack://precog-frontend/./node_modules/moment/locale/ sync ^\\.\\/.*$","webpack://precog-frontend/webpack/bootstrap","webpack://precog-frontend/webpack/runtime/chunk loaded","webpack://precog-frontend/webpack/runtime/compat get default export","webpack://precog-frontend/webpack/runtime/define property getters","webpack://precog-frontend/webpack/runtime/ensure chunk","webpack://precog-frontend/webpack/runtime/get javascript chunk filename","webpack://precog-frontend/webpack/runtime/get mini-css chunk filename","webpack://precog-frontend/webpack/runtime/global","webpack://precog-frontend/webpack/runtime/hasOwnProperty shorthand","webpack://precog-frontend/webpack/runtime/load script","webpack://precog-frontend/webpack/runtime/make namespace object","webpack://precog-frontend/webpack/runtime/node module decorator","webpack://precog-frontend/webpack/runtime/publicPath","webpack://precog-frontend/webpack/runtime/css loading","webpack://precog-frontend/webpack/runtime/jsonp chunk loading","webpack://precog-frontend/webpack/startup"],"sourcesContent":["import flatMap from 'array.prototype.flatmap';\r\n\r\nflatMap.shim();\r\n\r\nArray.prototype.distinct = function () {\r\n return this.distinctBy((i) => i);\r\n};\r\n\r\nArray.prototype.distinctBy = function (getter: (value: any) => any) {\r\n const values: Set = new Set();\r\n return this.filter((v) => {\r\n const value = getter(v);\r\n if (!values.has(value)) {\r\n values.add(value);\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n });\r\n};\r\n\r\nArray.prototype.none = function (predicate: (item: any) => boolean): boolean {\r\n return !this.some(predicate);\r\n};\r\n\r\nArray.prototype.sortBy = function (\r\n getter: (item: any) => any,\r\n sortFn?: (value1: any, value2: any) => number\r\n) {\r\n const result = [...this];\r\n result.sort((item1, item2) => {\r\n const value1 = getter(item1);\r\n const value2 = getter(item2);\r\n if (sortFn) {\r\n return sortFn(value1, value2);\r\n } else {\r\n // Here, we actually want just double-equals since we are sorting.\r\n // tslint:disable-next-line: triple-equals\r\n // eslint-disable-next-line eqeqeq\r\n return value1 == value2\r\n ? 0\r\n : value1 > value2 ? 1 : -1;\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nArray.prototype.filterNulls = function () {\r\n return this.filter((v) => v !== undefined && v !== null);\r\n};\r\n\r\nArray.prototype.orDefault = function (arr: any[]) {\r\n if (this.length === 0) {\r\n return arr;\r\n } else {\r\n return this;\r\n }\r\n};\r\n","import { isNullOrWhitespace } from './stringUtils';\r\n\r\nString.prototype.capitalize = function () {\r\n if (this.length <= 0) {\r\n return '';\r\n }\r\n return this.charAt(0).toUpperCase() + this.slice(1);\r\n};\r\n\r\nString.prototype.replaceAllInstances = function (searchStr: string | RegExp, replaceWith: string): string {\r\n const parts = this.split(searchStr);\r\n return parts.join(replaceWith);\r\n};\r\n\r\nString.prototype.localeIncludes = function (searchStr: string, options?: Intl.CollatorOptions): boolean {\r\n if (isNullOrWhitespace(searchStr) || isNullOrWhitespace(this?.toString())) {\r\n return false;\r\n }\r\n const thisStr = this;\r\n const opts = options ?? {};\r\n // More performant than using string.localeCompare, since we are potentially doing multiple comparisons.\r\n const collator = new Intl.Collator('en', opts);\r\n return thisStr.split('').filter((_c, idx) =>\r\n collator.compare(thisStr.slice(idx, idx + searchStr.length), searchStr) === 0).length > 0;\r\n};\r\n","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./App.vue?vue&type=template&id=4f157412\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=4f157412&lang=scss\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\nimport './styles/quasar.scss';\r\nimport iconSet from 'quasar/icon-set/mdi-v4.js';\r\nimport '@quasar/extras/mdi-v4/mdi-v4.css';\r\nimport Notify from 'quasar/src/plugins/Notify.js';import Loading from 'quasar/src/plugins/Loading.js';import Dialog from 'quasar/src/plugins/Dialog.js';;\r\n\r\n// To be used on app.use(Quasar, { ... })\r\nexport default {\r\n config: {},\r\n plugins: {\r\n Notify,\r\n Loading,\r\n Dialog\r\n },\r\n iconSet: iconSet\r\n};\r\n","import Axios, {\r\n AxiosInstance,\r\n AxiosAdapter,\r\n AxiosResponse,\r\n AxiosHeaders,\r\n InternalAxiosRequestConfig\r\n} from 'axios';\r\nimport { store as loginStore } from '@/store/login';\r\nimport router from '@/router';\r\nimport { LoginRoutes } from '@/router/routes/login';\r\nimport { getLogoutListeners } from '@/store/contracts/loginStore';\r\nimport { delay } from '@/utils/systemUtils';\r\n\r\nexport interface IAxiosSessionRefreshOptions {\r\n axios?: AxiosInstance;\r\n}\r\n\r\nconst handleResponse = (r: AxiosResponse) => {\r\n if (r.status === 200) {\r\n return true;\r\n } else {\r\n if (r.status === 401 || r.status === 403) {\r\n const listeners = getLogoutListeners();\r\n Object.values(listeners).forEach(l => l());\r\n loginStore.setUserInfo(null);\r\n router.push({ name: LoginRoutes.login });\r\n }\r\n return false;\r\n }\r\n};\r\n\r\nconst isRefreshing = () => {\r\n const valueStr = localStorage.getItem('is-refreshing');\r\n return valueStr !== null;\r\n};\r\n\r\nconst setIsRefreshing = () => {\r\n localStorage.setItem('is-refreshing', 'true');\r\n};\r\n\r\nconst clearIsRefreshing = () => {\r\n localStorage.removeItem('is-refreshing');\r\n};\r\n\r\nconst waitNotRefreshing = async () => {\r\n if (isRefreshing()) {\r\n console.log('Looks like another browser tab is refreshing the session. Waiting for that.');\r\n const timeout = 2500;\r\n const waitTime = 10;\r\n let waited = 0;\r\n do {\r\n await delay(waitTime);\r\n waited += waitTime;\r\n } while (isRefreshing() && waited < timeout);\r\n if (isRefreshing()) {\r\n console.log('Still refreshing? Someone must have closed a browser tab or something.');\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nlet refreshingPromise: Promise | null = null;\r\n\r\nasync function refreshSession (adapter: AxiosAdapter): Promise {\r\n if (refreshingPromise !== null) {\r\n return refreshingPromise;\r\n }\r\n const otherTabRefreshed = await waitNotRefreshing();\r\n if (otherTabRefreshed) {\r\n return true;\r\n }\r\n setIsRefreshing();\r\n console.log('Refreshing session...');\r\n refreshingPromise = Axios.request({\r\n url: '/api/v1/users/refresh',\r\n withCredentials: true,\r\n method: 'post',\r\n headers: new AxiosHeaders({\r\n Accept: 'application/json, text/plain, */*'\r\n }),\r\n adapter: adapter\r\n }).then(r => {\r\n return handleResponse(r);\r\n }).catch(e => {\r\n return handleResponse(e.response);\r\n });\r\n\r\n const result = await refreshingPromise;\r\n clearIsRefreshing();\r\n refreshingPromise = null;\r\n\r\n return result;\r\n}\r\n\r\nexport function registerSessionRefreshAdapter (options?: IAxiosSessionRefreshOptions): void {\r\n const opts = options ?? {};\r\n const axios: AxiosInstance = opts.axios ?? Axios;\r\n\r\n if (!axios.defaults.adapter) {\r\n throw new Error(`\r\n No adapter on axios. For axiosSessionRefreshAdapter to work,\r\n The axios instance needs a default adapter to submit requests to.\r\n By default, the axios.defaults.adapter should not be null.\r\n See: https://github.com/axios/axios/pull/437\r\n `);\r\n }\r\n\r\n const defaultAdapter: AxiosAdapter = axios.defaults.adapter as AxiosAdapter;\r\n\r\n axios.defaults.adapter = async (config: InternalAxiosRequestConfig) => {\r\n try {\r\n const interimConfig = config;\r\n interimConfig.adapter = defaultAdapter;\r\n return await Axios.request(interimConfig);\r\n } catch (e) {\r\n if (e.response && e.response.status === 401) {\r\n const refreshed = await refreshSession(defaultAdapter);\r\n if (refreshed) {\r\n const interimConfig = config;\r\n interimConfig.adapter = defaultAdapter;\r\n return await Axios.request(interimConfig);\r\n }\r\n }\r\n throw e;\r\n }\r\n };\r\n}\r\n\r\nexport async function doRefreshSession (axios?: AxiosInstance): Promise {\r\n const instance: AxiosInstance = axios ?? Axios;\r\n\r\n if (!instance.defaults.adapter) {\r\n throw new Error(`\r\n No adapter on axios. For axiosSessionRefreshAdapter to work,\r\n The axios instance needs a default adapter to submit requests to.\r\n By default, the axios.defaults.adapter should not be null.\r\n See: https://github.com/axios/axios/pull/437\r\n `);\r\n }\r\n\r\n const defaultAdapter: AxiosAdapter = instance.defaults.adapter as AxiosAdapter;\r\n await refreshSession(defaultAdapter);\r\n}\r\n","import { RouteLocationNormalized, Router } from 'vue-router';\r\nimport { store as loginStore } from '@/store/login';\r\nimport { LoginRequirement, UserRole } from '@/store/contracts/loginStore';\r\nimport { LoginRoutes } from '@/router/routes/login';\r\nimport { HomeRoutes } from './routes/home';\r\nimport { UsersRoutes } from '@/router/routes/users';\r\nimport { TransactionRoutes } from './routes/transactions';\r\n\r\nexport function registerGuards (router: Router): void {\r\n router.beforeEach((to, from, next) => {\r\n const toAuthorizedRoles: UserRole[] | undefined = to.meta.authorizedRoles as any;\r\n if (!toAuthorizedRoles || toAuthorizedRoles.some(loginStore.hasRole)) {\r\n return hasLoginRequirements(to) ? next() : next(HomeRoutes.transcribe);\r\n }\r\n return next({ name: LoginRoutes.login });\r\n });\r\n}\r\n\r\nfunction hasLoginRequirements (to: RouteLocationNormalized): boolean {\r\n if (to.name && to.name !== HomeRoutes.transcribe) {\r\n const validLoginRequirements = !loginStore.state.info || loginStore.state.info.loginRequirements === LoginRequirement.None;\r\n const isSessionRoute = contains(HomeRoutes, to.name) || contains(UsersRoutes, to.name || contains(TransactionRoutes, to.name));\r\n return validLoginRequirements || !isSessionRoute;\r\n }\r\n return true;\r\n}\r\n\r\nfunction contains (routeEnum, toName): boolean {\r\n return Object.values(routeEnum).includes(toName as typeof routeEnum);\r\n}\r\n","import { createApp } from 'vue';\r\nimport '@/utils/arrayExtensions';\r\nimport '@/utils/stringExtensions';\r\nimport '@/utils/fileListExtensions';\r\nimport App from '@/App.vue';\r\nimport router from '@/router';\r\nimport Quasar from 'quasar/src/vue-plugin.js';;\r\nimport quasarUserOptions from '@/quasar-user-options.js';\r\n\r\nimport { provideStore as provideLeftDrawerStore } from '@/store/leftDrawer';\r\nimport { provideStore as provideTranscribeStore } from '@/store/transcribe';\r\nimport { provideStore as provideTranslateStore } from '@/store/translate';\r\nimport { provideStore as provideImageAnalysisStore } from '@/store/imageAnalysis';\r\nimport { provideStore as provideTimeStore } from '@/store/time';\r\nimport { provideStore as provideUploadStore } from '@/store/upload';\r\nimport { provideStore as provideRegisterStore } from '@/store/users/register';\r\nimport { provideStore as provideLoginStore } from '@/store/login';\r\nimport { provideStore as provideValidationStore } from '@/store/validation';\r\nimport { provideStore as provideForgotPasswordStore } from '@/store/users/forgotPassword';\r\nimport { provideStore as provideTransactionsStore } from '@/store/transactions';\r\nimport { provideStore as provideDivisionsGridStore } from '@/store/users/divisionsGrid';\r\n\r\nimport { doRefreshSession, registerSessionRefreshAdapter } from '@/store/utils/axiosSessionRefreshAdapter';\r\nimport { registerGuards } from '@/router/guards';\r\nimport { loadConfiguration } from '@/settings';\r\n\r\nregisterGuards(router);\r\n\r\nconst app = createApp(App);\r\n\r\napp.use(Quasar, quasarUserOptions);\r\napp.use(router);\r\n\r\nloadConfiguration().then(() => {\r\n provideTimeStore(app);\r\n provideLeftDrawerStore(app);\r\n provideTranscribeStore(app);\r\n provideTranslateStore(app);\r\n provideImageAnalysisStore(app);\r\n provideUploadStore(app);\r\n provideRegisterStore(app);\r\n provideForgotPasswordStore(app);\r\n provideLoginStore(app);\r\n provideValidationStore(app);\r\n provideTransactionsStore(app);\r\n provideDivisionsGridStore(app);\r\n\r\n doRefreshSession();\r\n registerSessionRefreshAdapter();\r\n\r\n app.mount('#app');\r\n});\r\n","import { RouteLocationNormalized } from 'vue-router';\r\nimport { IIndexable } from '@/utils/indexable';\r\n\r\nexport type ParamTransform = (paramValue: string | undefined | null) => T | undefined | null;\r\n\r\nexport type ParamTransformations = IIndexable>;\r\n\r\nfunction doTransformations (\r\n transforms: ParamTransformations,\r\n query: boolean\r\n): ((route: RouteLocationNormalized) => IIndexable) {\r\n return (route: RouteLocationNormalized) => {\r\n const props: IIndexable = { ...(query ? route.query : route.params) };\r\n Object.keys(transforms).forEach((param) => {\r\n const transform = transforms[param];\r\n props[param] = transform(props[param]);\r\n });\r\n return props;\r\n };\r\n}\r\n\r\nexport function transformRouteParams (transforms: ParamTransformations): ((route: RouteLocationNormalized) => IIndexable) {\r\n return doTransformations(transforms, false);\r\n}\r\n\r\nexport function transformRouteQuery (transforms: ParamTransformations): ((route: RouteLocationNormalized) => IIndexable) {\r\n return doTransformations(transforms, true);\r\n}\r\n\r\n/* Common parameter transformation functions */\r\n\r\nexport const toNumber: ParamTransform = (paramValue: string | undefined | null) => {\r\n if (paramValue !== undefined && paramValue != null) {\r\n const result = Number(paramValue);\r\n return isNaN(result) ? undefined : result;\r\n } else {\r\n return paramValue;\r\n }\r\n};\r\n\r\nexport const passThrough: ParamTransform = (paramValue: string | undefined | null) => {\r\n if (paramValue !== undefined && paramValue != null) {\r\n return String(paramValue);\r\n } else {\r\n return paramValue;\r\n }\r\n};\r\n\r\nexport const toBoolean: ParamTransform = (paramValue: string | undefined | null) => {\r\n if (paramValue !== undefined && paramValue != null) {\r\n return paramValue.trim().toLowerCase() === 'false' ? false : Boolean(paramValue);\r\n } else {\r\n return paramValue;\r\n }\r\n};\r\n","import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router';\r\nimport { HomeRoutes } from '@/router/routes/home';\r\nimport { LoginRoutes } from '@/router/routes/login';\r\nimport { ErrorRoutes } from '@/router/routes/error';\r\nimport { UsersRoutes } from '@/router/routes/users';\r\nimport { UserRole } from '@/store/contracts/loginStore';\r\nimport { passThrough, transformRouteParams } from '@/router/paramTransformer';\r\nimport { TransactionRoutes } from './routes/transactions';\r\n\r\nconst routes: Array = [\r\n {\r\n path: '/home',\r\n component: () => import(/* webpackChunkName: \"home\" */ '@/views/Home.vue'),\r\n children: [\r\n {\r\n path: '',\r\n name: HomeRoutes.index,\r\n redirect: { name: HomeRoutes.transcribe }\r\n },\r\n {\r\n path: '/translate',\r\n name: HomeRoutes.translate,\r\n // route level code-splitting\r\n // this generates a separate chunk (about.[hash].js) for this route\r\n // which is lazy-loaded when the route is visited.\r\n component: () => import(/* webpackChunkName: \"home\" */ '@/views/home/Translate.vue'),\r\n meta: {\r\n authorizedRoles: [UserRole.User, UserRole.Admin]\r\n }\r\n },\r\n {\r\n path: '/transcribe',\r\n name: HomeRoutes.transcribe,\r\n // route level code-splitting\r\n // this generates a separate chunk (about.[hash].js) for this route\r\n // which is lazy-loaded when the route is visited.\r\n component: () => import(/* webpackChunkName: \"home\" */ '@/views/home/Transcribe.vue'),\r\n meta: {\r\n authorizedRoles: [UserRole.User, UserRole.Admin]\r\n }\r\n },\r\n {\r\n path: '/analyze',\r\n name: HomeRoutes.analyze,\r\n // route level code-splitting\r\n // this generates a separate chunk (about.[hash].js) for this route\r\n // which is lazy-loaded when the route is visited.\r\n component: () => import(/* webpackChunkName: \"home\" */ '@/views/home/ImageAnalysis.vue'),\r\n meta: {\r\n authorizedRoles: [UserRole.Vision]\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n path: '/users',\r\n component: () => import(/* webpackChunkName: \"users\" */ '@/views/Admin.vue'),\r\n children: [\r\n {\r\n path: '',\r\n name: UsersRoutes.index,\r\n redirect: { name: UsersRoutes.home }\r\n },\r\n {\r\n path: '/list',\r\n name: UsersRoutes.home,\r\n // route level code-splitting\r\n // this generates a separate chunk (about.[hash].js) for this route\r\n // which is lazy-loaded when the route is visited.\r\n component: () => import(/* webpackChunkName: \"users\" */ '@/views/users/UserHome.vue'),\r\n meta: {\r\n authorizedRoles: [UserRole.Admin]\r\n }\r\n },\r\n {\r\n path: '/view/:userId',\r\n name: UsersRoutes.view,\r\n component: () => import(/* webpackChunkName: \"users\" */ '@/views/users/UserView.vue'),\r\n meta: {\r\n authorizedRoles: [UserRole.Admin]\r\n },\r\n props: (route) => {\r\n return {\r\n ...transformRouteParams({\r\n userId: passThrough\r\n })(route)\r\n };\r\n }\r\n },\r\n {\r\n path: '/create',\r\n name: UsersRoutes.create,\r\n component: () => import(/* webpackChunkName: \"users\" */ '@/views/users/UserCreate.vue'),\r\n meta: {\r\n authorizedRoles: [UserRole.Admin]\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n path: '/transactions',\r\n component: () => import(/* webpackChunkName: 'transactions' */ '@/views/Admin.vue'),\r\n children: [\r\n {\r\n path: '',\r\n name: TransactionRoutes.index,\r\n redirect: { name: TransactionRoutes.home }\r\n },\r\n {\r\n path: '/grid',\r\n name: TransactionRoutes.home,\r\n // route level code-splitting\r\n // this generates a separate chunk (about.[hash].js) for this route\r\n // which is lazy-loaded when the route is visited.\r\n component: () => import(/* webpackChunkName: \"transactions\" */ '@/views/transactions/TransactionsHome.vue'),\r\n meta: {\r\n authorizedRoles: [UserRole.Admin]\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n path: '/login',\r\n name: LoginRoutes.login,\r\n component: () => import(/* webpackChunkName: 'login' */ '@/views/Login.vue')\r\n },\r\n {\r\n path: '/error',\r\n name: ErrorRoutes.error,\r\n component: () => import(/* webpackChunkName: 'error' */ '@/views/error/Error.vue')\r\n },\r\n {\r\n path: '/not-found',\r\n name: ErrorRoutes.notFound,\r\n component: () => import(/* webpackChunkName: 'not-found' */ '@/views/error/NotFound.vue')\r\n },\r\n {\r\n path: '/',\r\n redirect: { name: HomeRoutes.index }\r\n },\r\n {\r\n path: '/:pathMatch(.*)*',\r\n redirect: { name: ErrorRoutes.notFound }\r\n }\r\n];\r\n\r\nconst router = createRouter({\r\n history: createWebHashHistory(),\r\n routes\r\n});\r\n\r\nexport default router;\r\n","export enum ErrorRoutes {\r\n notFound = 'notFound',\r\n error = 'error'\r\n}\r\n","export enum HomeRoutes {\r\n index = 'home-index',\r\n translate = 'translate',\r\n transcribe = 'transcribe',\r\n analyze = 'analyze'\r\n}\r\n","export enum LoginRoutes {\r\n login = 'login'\r\n}\r\n","export enum TransactionRoutes {\r\n index = 'transaction-index',\r\n home = 'transaction-home'\r\n}\r\n","export enum UsersRoutes {\r\n index = 'users-index',\r\n home = 'users-home',\r\n view = 'users-view',\r\n create = 'users-create'\r\n}\r\n","import Axios from 'axios';\r\nimport { impl } from '@/utils/impl';\r\n\r\nexport interface ISettings {\r\n appVersion: string;\r\n allowVision: boolean;\r\n allowSelfRegister: boolean;\r\n defaultTransactionDaysAgo: number;\r\n transactionsGridBuffer: number;\r\n customTranscriptionFileExtensions: string | null;\r\n maxConcurrentUploads: number;\r\n}\r\n\r\ninterface ISettingsModel {\r\n allowVision: boolean;\r\n allowSelfRegister: boolean;\r\n defaultTransactionDaysAgo: number;\r\n transactionsGridBuffer: number;\r\n customTranscriptionFileExtensions: string | null;\r\n maxConcurrentUploads: number;\r\n}\r\n\r\nexport async function loadConfiguration (): Promise {\r\n const requestUrl = '/api/v1/config/client';\r\n const configuration = await Axios.get(requestUrl);\r\n Settings = impl({\r\n appVersion: Settings.appVersion,\r\n allowVision: configuration.data.allowVision,\r\n allowSelfRegister: configuration.data.allowSelfRegister,\r\n defaultTransactionDaysAgo: configuration.data.defaultTransactionDaysAgo,\r\n transactionsGridBuffer: configuration.data.transactionsGridBuffer,\r\n customTranscriptionFileExtensions: configuration.data.customTranscriptionFileExtensions,\r\n maxConcurrentUploads: configuration.data.maxConcurrentUploads\r\n });\r\n}\r\n\r\nexport let Settings: ISettings = {\r\n appVersion: process.env.VUE_APP_VERSION,\r\n allowVision: process.env.VUE_APP_ALLOW_VISION === 'Y',\r\n allowSelfRegister: process.env.VUE_APP_ALLOW_SELF_REGISTER === 'Y',\r\n defaultTransactionDaysAgo: Number.parseInt(process.env.VUE_APP_DEFAULT_TRANSACTION_DAYS),\r\n transactionsGridBuffer: Number.parseInt(process.env.VUE_APP_TRANSACTION_GRID_BUFFER),\r\n customTranscriptionFileExtensions: null,\r\n maxConcurrentUploads: Number.parseInt(process.env.VUE_APP_MAX_CONCURRENT_UPLOADS)\r\n};\r\n","import { DeepReadonly, reactive, readonly } from 'vue';\r\nimport { IStatusHandler } from '@/store/utils/apiResponseHandling';\r\nimport { IIndexable } from '@/utils/indexable';\r\n\r\nexport enum UserRole {\r\n User = 'User',\r\n Admin = 'Admin',\r\n Vision = 'Vision'\r\n}\r\n\r\nexport enum LoginRequirement {\r\n None = 0,\r\n UserInformation = 1 << 0,\r\n PasswordReset = 1 << 1\r\n}\r\n\r\nexport interface IUserInfo {\r\n id: string;\r\n loginRequirements: LoginRequirement;\r\n email: string;\r\n firstName: string;\r\n lastName: string;\r\n roles: UserRole[];\r\n officeId: number;\r\n}\r\n\r\nexport interface ILoginState {\r\n info: IUserInfo | null;\r\n}\r\n\r\nexport interface IPasswordLoginModel {\r\n email: string;\r\n password: string;\r\n}\r\n\r\nexport type TSignOut = (handler?: Partial>) => Promise;\r\nexport type TSignIn = (model: IPasswordLoginModel, handler?: Partial>) => Promise;\r\nexport type TSetUserInfo = (info: IUserInfo | null) => void;\r\nexport type TLoginRequirementsComplete = () => void;\r\nexport type THasRole = (role: UserRole) => boolean;\r\nexport type TIsLoggedIn = () => boolean;\r\n\r\nexport interface ILoginStore {\r\n state: DeepReadonly;\r\n signOut: TSignOut;\r\n signIn: TSignIn;\r\n setUserInfo: TSetUserInfo;\r\n loginRequirementsComplete: TLoginRequirementsComplete;\r\n hasRole: THasRole;\r\n isLoggedIn: TIsLoggedIn;\r\n readonly userRoles: UserRole[];\r\n}\r\n\r\nexport type TLogoutListener = () => Promise;\r\nexport type TLoginListener = () => Promise;\r\n\r\nconst logoutListeners: IIndexable = reactive({});\r\nconst loginListeners: IIndexable = reactive({});\r\n\r\nexport function getLogoutListeners (): DeepReadonly> {\r\n return readonly(logoutListeners);\r\n}\r\n\r\nexport function setLogoutListener (key: string, listener: TLogoutListener): void {\r\n logoutListeners[key] = listener;\r\n}\r\n\r\nexport function removeLogoutListener (key: string): void {\r\n delete logoutListeners[key];\r\n}\r\n\r\nexport function getLoginListeners (): DeepReadonly> {\r\n return readonly(loginListeners);\r\n}\r\n\r\nexport function setLoginListener (key: string, listener: TLoginListener): void {\r\n loginListeners[key] = listener;\r\n}\r\n\r\nexport function removeLoginListener (key: string): void {\r\n delete loginListeners[key];\r\n}\r\n\r\nexport function setLoginLogoutListener (key: string, loginListener: TLoginListener, logoutListener: TLogoutListener): void {\r\n setLoginListener(key, loginListener);\r\n setLogoutListener(key, logoutListener);\r\n}\r\n\r\nexport function hasFlag (flags?: LoginRequirement, flag?: LoginRequirement): boolean {\r\n if (!flags || !flag) {\r\n return false;\r\n }\r\n return (flags & flag) === flag;\r\n}\r\n","import { DeepReadonly } from 'vue';\r\nimport { GridColumnProps } from '@progress/kendo-vue-grid';\r\nimport { SortDescriptor } from '@progress/kendo-data-query';\r\nimport { CancelTokenSource } from 'axios';\r\nimport { IIndexable } from '@/utils/indexable';\r\n\r\nexport enum TransactionLogRequestType {\r\n Transcription,\r\n DocumentTranslation,\r\n TextTranslation,\r\n TranscriptionTranslation,\r\n TranscriptionPhraseTranslation,\r\n}\r\n\r\nexport enum TransactionLogHelpfulnessRatingType {\r\n No,\r\n Maybe,\r\n Yes\r\n}\r\n\r\nexport enum GridSortDirection {\r\n Ascending,\r\n Descending\r\n}\r\n\r\nexport interface ITransactionContext {\r\n transactionLogId: number;\r\n referenceId: string;\r\n helpfulnessRating?: TransactionLogHelpfulnessRatingType;\r\n}\r\n\r\nexport interface IFilterChip {\r\n text: string;\r\n columnName: string;\r\n value: string;\r\n isExclude: boolean;\r\n}\r\n\r\nexport interface ITransactionHistoryReviewRequestModel {\r\n transactionLogId: number;\r\n helpfulnessRating: TransactionLogHelpfulnessRatingType;\r\n}\r\n\r\nexport interface IGridSortModel {\r\n columnName: string;\r\n sortDirection: GridSortDirection;\r\n}\r\n\r\nexport interface IGridFilterModel {\r\n columnName: string;\r\n isExclude: boolean;\r\n filterValues: (string | null)[];\r\n}\r\n\r\nexport interface ITransactionHistoryRecord {\r\n referenceId: string;\r\n requestDttm: Date;\r\n source: string;\r\n requestType: string;\r\n sourceLanguage: string;\r\n destinationLanguage: string;\r\n requestingUserFullName: string;\r\n requestingUserOffice: string;\r\n requestingUserDivision: string;\r\n resultDescription: string;\r\n helpfulnessRating: string;\r\n}\r\n\r\nexport interface ITransactionHistoryGridRequestModel {\r\n offset: number;\r\n limit: number | null;\r\n minRequestDttm: Date | null;\r\n maxRequestDttm: Date | null;\r\n isDttmFilterExclude: boolean;\r\n sorts: IGridSortModel[];\r\n filters: IGridFilterModel[];\r\n}\r\n\r\nexport interface ITransactionHistoryGridResponseModel {\r\n totalRecords: number;\r\n yesReviewCount: number;\r\n maybeReviewCount: number;\r\n noReviewCount: number;\r\n records: ITransactionHistoryRecord[];\r\n}\r\n\r\nexport interface IUsageTotalsModel {\r\n totalTransactions: number;\r\n divisionCount: number;\r\n officeCount: number;\r\n userCount: number;\r\n}\r\n\r\nexport interface IHelpfulnessRatingUsageModel {\r\n yesReviewCount: number;\r\n maybeReviewCount: number;\r\n noReviewCount: number;\r\n unreviewedCount: number;\r\n}\r\n\r\nexport interface IGenericUsageListingModel {\r\n name: string;\r\n frequency: number;\r\n}\r\n\r\nexport interface IGenericUsageModel {\r\n usageCount: number;\r\n averageUsage: number;\r\n topListings: IGenericUsageListingModel[];\r\n}\r\n\r\nexport interface IRequestTypeUsageModel {\r\n totalCount: number;\r\n successCount: number;\r\n erroredCount: number;\r\n}\r\n\r\nexport interface IRequestTypesUsageModel {\r\n transcriptionUsage: IRequestTypeUsageModel;\r\n totalTranslationUsage: IRequestTypeUsageModel;\r\n documentTranslationUsage: IRequestTypeUsageModel;\r\n documentTextExtractionUsage: IRequestTypeUsageModel;\r\n textTranslationUsage: IRequestTypeUsageModel;\r\n transcriptionTranslationUsage: IRequestTypeUsageModel;\r\n}\r\n\r\nexport interface ITransactionHistoryUsageRequestModel {\r\n minRequestDttm: Date | null;\r\n maxRequestDttm: Date | null;\r\n isDttmFilterExclude: boolean;\r\n filters: IGridFilterModel[];\r\n}\r\n\r\nexport interface ITransactionHistoryUsageResponseModel {\r\n minRecordDttm: Date;\r\n maxRecordDttm: Date;\r\n usageTotals: IUsageTotalsModel;\r\n helpfulnessRatingUsage: IHelpfulnessRatingUsageModel;\r\n sourceLanguageUsage: IGenericUsageModel;\r\n requestTypesUsage: IRequestTypesUsageModel;\r\n divisionUsage: IGenericUsageModel;\r\n officeUsage: IGenericUsageModel;\r\n userUsage: IGenericUsageModel;\r\n}\r\n\r\nexport interface IGridColumnValuesRequestModel {\r\n columnName: string;\r\n}\r\n\r\nexport interface IGridColumnValuesResponseModel {\r\n values: string[];\r\n}\r\n\r\nexport interface ITransactionHistoryExportRequestModel {\r\n minRequestDttm: Date | null;\r\n maxRequestDttm: Date | null;\r\n isDttmFilterExclude: boolean;\r\n sorts: IGridSortModel[];\r\n filters: IGridFilterModel[];\r\n columnNames: string[];\r\n clientTimeZoneFriendly: string;\r\n clientTimeZoneOffset: number;\r\n}\r\n\r\nexport interface ITransactionHistoryExportResponseModel {\r\n success: boolean;\r\n exportLocation: string | null;\r\n errorMessage: string | null;\r\n}\r\n\r\nexport interface IGridData {\r\n gridItems: ITransactionHistoryRecord[];\r\n loadedOffset: number;\r\n maxLoadedIndex: number;\r\n}\r\n\r\nexport interface IGridQuickFilterValue {\r\n value: string;\r\n isSelected: boolean;\r\n}\r\n\r\nexport interface IGridDttmFilter {\r\n minDttm: Date | null;\r\n maxDttm: Date | null;\r\n isExclude: boolean;\r\n}\r\n\r\nexport interface IGridQuickFilter {\r\n columnName: string;\r\n values: IGridQuickFilterValue[];\r\n isExclude: boolean;\r\n}\r\n\r\nexport interface ITransactionsState {\r\n dttmFilter: IGridDttmFilter;\r\n gridLoadCancelToken: CancelTokenSource | null;\r\n gridData: IGridData;\r\n totalRecords: number;\r\n yesReviewCount: number;\r\n maybeReviewCount: number;\r\n noReviewCount: number;\r\n browserTimeZoneFriendly: string;\r\n browserTimeZoneOffset: number;\r\n gridSorts: SortDescriptor[];\r\n gridColumns: GridColumnProps[];\r\n gridQuickFilters: IIndexable;\r\n usageLoadCancelToken: CancelTokenSource | null;\r\n usage: ITransactionHistoryUsageResponseModel | null;\r\n}\r\n\r\nexport type TSetDttmFilter = (minDttm: Date | null, maxDttm: Date | null, isExclude: boolean) => void;\r\nexport type TSetGridLoadCancelToken = (gridLoadCancelToken: CancelTokenSource | null) => void;\r\nexport type TSetGridData = (gridItems: ITransactionHistoryRecord[], loadedOffset: number, maxLoadedIndex: number) => void;\r\nexport type TSetTotalRecords = (totalRecords: number) => void;\r\nexport type TSetYesReviewCount = (yesReviewCount: number) => void;\r\nexport type TSetMaybeReviewCount = (maybeReviewCount: number) => void;\r\nexport type TSetNoReviewCount = (noReviewCount: number) => void;\r\nexport type TSetBrowserTimeZoneFriendly = (browserTimeZoneFriendly: string) => void;\r\nexport type TSetBrowserTimeZoneOffset = (browserTimeZoneOffset: number) => void;\r\nexport type TSetGridSorts = (sorts: SortDescriptor[]) => void;\r\nexport type TSetGridColumns = (columns: GridColumnProps[]) => void;\r\nexport type TSetGridQuickFilters = (gridQuickFilters: IIndexable) => void;\r\nexport type TSetUsageLoadCancelToken = (usageLoadCancelToken: CancelTokenSource | null) => void;\r\nexport type TSetUsage = (usage: ITransactionHistoryUsageResponseModel | null) => void;\r\nexport type TLoadRecords = (offset: number, limit: number, fullRefresh: boolean) => Promise;\r\nexport type TGetGridRecords = (offset: number, limit: number, loadedOffset: number, gridItems: readonly ITransactionHistoryRecord[]) => ITransactionHistoryRecord[];\r\nexport type TExportRecords = () => Promise;\r\nexport type TReviewTransaction = (transactionLogId: number, helpfulnessRating: TransactionLogHelpfulnessRatingType) => Promise;\r\nexport type TLoadQuickFilter = (columnName: string) => Promise;\r\nexport type TGetQuickFilter = (columnName: string) => IGridQuickFilter;\r\nexport type TApplyQuickFilter = (columnName: string, quickFilter: IGridQuickFilter) => void;\r\nexport type TRemoveFilter = (columnName: string, value: string | null) => void;\r\nexport type TLoadUsage = () => Promise;\r\nexport type TCancelGridLoad = () => void;\r\nexport type TCancelUsageLoad = () => void;\r\nexport type TReset = () => void;\r\n\r\nexport interface ITransactionsStore {\r\n state: DeepReadonly;\r\n setDttmFilter: TSetDttmFilter;\r\n setGridLoadCancelToken: TSetGridLoadCancelToken;\r\n setGridData: TSetGridData;\r\n setTotalRecords: TSetTotalRecords;\r\n setYesReviewCount: TSetYesReviewCount;\r\n setMaybeReviewCount: TSetMaybeReviewCount;\r\n setNoReviewCount: TSetNoReviewCount;\r\n setBrowserTimeZoneFriendly: TSetBrowserTimeZoneFriendly;\r\n setBrowserTimeZoneOffset: TSetBrowserTimeZoneOffset;\r\n setGridSorts: TSetGridSorts;\r\n setGridColumns: TSetGridColumns;\r\n setGridQuickFilters: TSetGridQuickFilters;\r\n setUsageLoadCancelToken: TSetUsageLoadCancelToken;\r\n setUsage: TSetUsage;\r\n loadRecords: TLoadRecords;\r\n getGridRecords: TGetGridRecords;\r\n exportRecords: TExportRecords;\r\n reviewTransaction: TReviewTransaction;\r\n loadQuickFilter: TLoadQuickFilter;\r\n getQuickFilter: TGetQuickFilter;\r\n applyQuickFilter: TApplyQuickFilter;\r\n removeFilter: TRemoveFilter;\r\n loadUsage: TLoadUsage;\r\n cancelGridLoad: TCancelGridLoad;\r\n cancelUsageLoad: TCancelUsageLoad;\r\n reset: TReset;\r\n readonly filterChips: IFilterChip[];\r\n readonly isLoadingGrid: boolean;\r\n readonly isLoadingUsage: boolean;\r\n}\r\n","import { IUploadInformation, IUploadStore } from '@/store/contracts/upload';\r\nimport { IIndexable } from '@/utils/indexable';\r\nimport { DeepReadonly } from 'vue';\r\nimport { ITransactionContext, TransactionLogHelpfulnessRatingType, TransactionLogRequestType } from '@/store/contracts/transactions';\r\nimport { ITextTranslationResponse } from '@/store/contracts/translate';\r\n\r\nexport interface ISupportedLocale {\r\n localeCode: string;\r\n name: string;\r\n}\r\n\r\nexport interface ILocalesResponseModel {\r\n defaultLocaleCodes: string[];\r\n locales: ISupportedLocale[];\r\n}\r\n\r\nexport interface ITranscriptionRequestModel {\r\n transcriptionId: string;\r\n transactionLogId: number;\r\n}\r\n\r\nexport interface ITranscriptionsRequestModel {\r\n requests: ITranscriptionRequestModel[];\r\n}\r\n\r\nexport interface ITranscriptonPhrase {\r\n speaker?: number;\r\n offsetMillis: number;\r\n transcriptionText: string;\r\n confidence: number;\r\n translationResponse: ITextTranslationResponse | null;\r\n detectedLanguage?: string;\r\n}\r\n\r\nexport interface ITranscription {\r\n localeCode?: string;\r\n friendlyLocale?: string;\r\n durationMillis?: number;\r\n transcriptionText?: string;\r\n phrases?: ITranscriptonPhrase[];\r\n selectedTranslateLanguageCode: string | null;\r\n translatedLanguageCode: string | null;\r\n singleLocaleDetected: boolean;\r\n translationResponse: ITextTranslationResponse | null;\r\n}\r\n\r\nexport enum TranscriptionStatusType {\r\n NotStarted,\r\n Running,\r\n Succeeded,\r\n Failed\r\n}\r\n\r\nexport interface ITranscriptionStatus {\r\n transcriptionId: string;\r\n success: boolean;\r\n transcription?: ITranscription;\r\n status: TranscriptionStatusType;\r\n errorMessage?: string;\r\n}\r\n\r\nexport interface ITranscriptionStatusResponseModel {\r\n statuses: ITranscriptionStatus[];\r\n}\r\n\r\nexport interface ITranscriptionMetadata {\r\n success: boolean;\r\n id?: string;\r\n localeCode?: string;\r\n friendlyLocale?: string;\r\n uploadedFileUri?: string;\r\n originalFileVideo?: boolean;\r\n convertedFileUri?: string;\r\n transactionContext: ITransactionContext;\r\n fileName: string;\r\n errorMessage?: string;\r\n}\r\n\r\nexport interface ITranscriptionResponse {\r\n metadata: ITranscriptionMetadata;\r\n status?: ITranscriptionStatus;\r\n}\r\n\r\nexport interface ITranscribeState {\r\n responses: IIndexable;\r\n supportedLocales: ISupportedLocale[];\r\n selectedLocales: ISupportedLocale[];\r\n files?: FileList;\r\n activeUploads: IUploadInformation[];\r\n isPolling: boolean;\r\n autoTranslate: boolean;\r\n selectedAutoTranslateLanguageCode: string;\r\n}\r\n\r\nexport type TSetResponses = (responses: IIndexable) => void;\r\nexport type TSetLocales = (locales: ISupportedLocale[]) => void;\r\nexport type TSetSelectedLocales = (selectedLocales: readonly ISupportedLocale[]) => void;\r\nexport type TSetFiles = (selectedFiles?: FileList) => void;\r\nexport type TSetActiveUploads = (activeUploads: IUploadInformation[]) => void;\r\nexport type TSetIsPolling = (isPolling: boolean) => void;\r\nexport type TSetAutoTranslate = (autoTranslate: boolean) => void;\r\nexport type TSetSelectedAutoTranslateLanguageCode = (selectedAutoTranslateLanguageCode: string) => void;\r\nexport type TTransactionReviewed = (helpfulnessRating: TransactionLogHelpfulnessRatingType, responseName: string, transactionType: TransactionLogRequestType) => void;\r\nexport type TLoadLocales = () => Promise;\r\nexport type TTranslateResponse = (responseKey: string, languageCode: string | null) => Promise;\r\nexport type TUpdateResponseLanguageCode = (responseKey: string, selectedLanguageCode: string) => void;\r\nexport type TUploadFiles = (uploadStore: IUploadStore) => void;\r\nexport type TTranslateLanguageCode = (responseKey: string) => string | null;\r\nexport type TRemoveResponse = (responseKey: string) => void;\r\nexport type TReset = () => void;\r\n\r\nexport interface ITranscribeStore {\r\n state: DeepReadonly;\r\n setResponses: TSetResponses;\r\n setLocales: TSetLocales;\r\n setSelectedLocales: TSetSelectedLocales;\r\n setFiles: TSetFiles;\r\n setActiveUploads: TSetActiveUploads;\r\n setIsPolling: TSetIsPolling;\r\n setAutoTranslate: TSetAutoTranslate,\r\n setSelectedAutoTranslateLanguageCode: TSetSelectedAutoTranslateLanguageCode,\r\n transactionReviewed: TTransactionReviewed;\r\n loadLocales: TLoadLocales;\r\n translateResponse: TTranslateResponse;\r\n updateResponseLanguageCode: TUpdateResponseLanguageCode;\r\n uploadFiles: TUploadFiles;\r\n translateLanguageCode: TTranslateLanguageCode;\r\n removeResponse: TRemoveResponse;\r\n reset: TReset;\r\n readonly noSelectedLocales: boolean;\r\n readonly noSelectedAutoTranslateLanguage: boolean;\r\n readonly noFiles: boolean;\r\n}\r\n","import { IUploadInformation, IUploadStore } from '@/store/contracts/upload';\r\nimport { IIndexable } from '@/utils/indexable';\r\nimport { DeepReadonly } from 'vue';\r\nimport { ITransactionContext, TransactionLogRequestType, TransactionLogHelpfulnessRatingType } from '@/store/contracts/transactions';\r\n\r\nexport interface ISupportedLanguage {\r\n languageCode: string;\r\n name: string;\r\n}\r\n\r\nexport interface ILanguagesResponseModel {\r\n languages: ISupportedLanguage[];\r\n defaultLanguageCode: string;\r\n}\r\n\r\nexport interface ISupportedFileExtensions {\r\n fileExtensions: string[];\r\n}\r\n\r\nexport enum TranslationType {\r\n Text,\r\n Document,\r\n TextExtraction,\r\n}\r\n\r\nexport interface DocumentPageModel {\r\n pageNumber?: number;\r\n paragraphs: string[];\r\n}\r\n\r\nexport interface ITranslationResponse {\r\n fileName?: string;\r\n success: boolean;\r\n type: TranslationType;\r\n transactionContext?: ITransactionContext;\r\n sourceText?: string,\r\n translatedText?: string;\r\n pages?: DocumentPageModel[];\r\n translatedDocumentSasUrl?: string;\r\n sourceLanguage?: string;\r\n isImage?: boolean;\r\n destinationLanguage: string;\r\n errorMessage?: string;\r\n}\r\n\r\nexport interface ITextTranslateRequest {\r\n toLanguageCode: string;\r\n content: string;\r\n requestType: TransactionLogRequestType;\r\n transcriptionTransactionLogId: number | null;\r\n transcriptionFileName: string | null;\r\n}\r\n\r\nexport interface ITextTranslationResponse {\r\n success: boolean;\r\n translatedText?: string;\r\n sourceLanguage?: string;\r\n transactionContext: ITransactionContext;\r\n errorMessage?: string;\r\n}\r\n\r\nexport interface IDocumentStartDocumentTranslationResponse {\r\n success: boolean;\r\n id?: string;\r\n resultsUri?: string;\r\n errorMessage?: string;\r\n transactionContext: ITransactionContext;\r\n}\r\n\r\nexport interface IDocumentStartTextExtractTranslationResponse {\r\n success: boolean;\r\n id?: string;\r\n uploadedFileUri?: string;\r\n errorMessage?: string;\r\n transactionContext: ITransactionContext;\r\n fileName: string;\r\n isImage: boolean;\r\n}\r\n\r\nexport interface IDocumentTranslationRequestPropertiesModel {\r\n id: string;\r\n resultsUri: string;\r\n transactionLogId: number;\r\n}\r\n\r\nexport interface IDocumentTranslationStatusRequestModel {\r\n requests: IDocumentTranslationRequestPropertiesModel[];\r\n}\r\n\r\nexport interface IDocumentTextExtractionRequestPropertiesModel {\r\n id: string;\r\n transactionLogId: number;\r\n fileName: string;\r\n translateToLanguageCode: string;\r\n}\r\n\r\nexport interface IDocumentTextExtractionStatusRequestModel {\r\n requests: IDocumentTextExtractionRequestPropertiesModel[];\r\n}\r\n\r\nexport enum TranslationStatusType {\r\n Queued,\r\n Running,\r\n Success,\r\n Failed,\r\n}\r\n\r\nexport interface IDocumentTranslationStatus {\r\n id: string;\r\n statusType: TranslationStatusType;\r\n resultsSasUri?: string;\r\n errorMessage?: string;\r\n}\r\n\r\nexport interface IDocumentTranslationStatusResponseModel {\r\n statuses: IDocumentTranslationStatus[];\r\n}\r\n\r\nexport interface DocumentTextExtractResultModel {\r\n pages: DocumentPageModel[];\r\n friendlyLanguage?: string;\r\n singleLanguageDetected: boolean;\r\n}\r\n\r\nexport interface IDocumentTextExtractStatus {\r\n id: string;\r\n statusType: TranslationStatusType;\r\n result?: DocumentTextExtractResultModel;\r\n errorMessage?: string;\r\n}\r\n\r\nexport interface IDocumentTextExtractionStatusResponse {\r\n statuses: IDocumentTextExtractStatus[];\r\n}\r\n\r\nexport interface IDocumentTextExtractCapabilities {\r\n maxBytes: number;\r\n maxFileSizeDisplay: string;\r\n fileExtensions: string[];\r\n}\r\n\r\nexport interface ITranslateState {\r\n responses: IIndexable;\r\n supportedLanguages: ISupportedLanguage[];\r\n supportedDocumentExtensions: string[];\r\n documentTextExtractCapabilities: IDocumentTextExtractCapabilities;\r\n selectedLanguageCode: string;\r\n translationType: TranslationType;\r\n translateText: string;\r\n pages: DocumentPageModel[];\r\n files?: FileList;\r\n isTranslatingText: boolean;\r\n defaultLanguageCode: string;\r\n activeDocumentTranslationUploads: IUploadInformation[];\r\n isPollingDocumentTranslation: boolean;\r\n activeDocumentTextExtractionUploads: IUploadInformation[];\r\n isPollingDocumentTextExtraction: boolean;\r\n}\r\n\r\nexport type TSetResponses = (responses: IIndexable) => void;\r\nexport type TSetLanguages = (languages: ISupportedLanguage[]) => void;\r\nexport type TSetDefaultLanguageCode = (defaultLanguageCode: string) => void;\r\nexport type TSetDocumentExtensions = (documentExtensions: string[]) => void;\r\nexport type TSetTextExtractCapabilities = (textExtractCapabilities: IDocumentTextExtractCapabilities) => void;\r\nexport type TSetSelectedLanguage = (selectedLanguageCode: string) => void;\r\nexport type TSetTranslationType = (translationType: TranslationType) => void;\r\nexport type TSetTranslateText = (translateText: string) => void;\r\nexport type TSetFiles = (selectedFiles?: FileList) => void;\r\nexport type TSetIsTranslatingText = (isTranslatingText: boolean) => void;\r\nexport type TSetActiveDocumentTranslationUploads = (activeDocumentTranslationUploads: IUploadInformation[]) => void;\r\nexport type TSetIsPollingDocumentTranslation = (isPollingDocumentTranslation: boolean) => void;\r\nexport type TSetActiveDocumentTextExtractionUploads = (activeDocumentTextExtractionUploads: IUploadInformation[]) => void;\r\nexport type TSetIsPollingDocumentTextExtraction = (isPollingDocumentTextExtraction: boolean) => void;\r\nexport type TTransactionReviewed = (helpfulnessRating: TransactionLogHelpfulnessRatingType, responseName: string) => void;\r\nexport type TLoadLanguages = () => Promise;\r\nexport type TLoadDocumentExtensions = () => Promise;\r\nexport type TLoadTextExtractCapabilities = () => Promise;\r\nexport type TGetAcceptedMimes = () => string[];\r\nexport type TGetAcceptedExtensions = () => string[];\r\nexport type TTranslateTextAction = () => Promise;\r\nexport type TUploadFiles = (uploadStore: IUploadStore) => void;\r\nexport type TLanguageCodeDisplay = (languageCode: string | null) => string | null;\r\nexport type TRemoveResponse = (responseKey: string) => void;\r\nexport type TReset = () => void;\r\n\r\nexport interface ITranslateStore {\r\n state: DeepReadonly;\r\n setResponses: TSetResponses;\r\n setLanguages: TSetLanguages;\r\n setDefaultLanguageCode: TSetDefaultLanguageCode;\r\n setDocumentExtensions: TSetDocumentExtensions;\r\n setTextExtractCapabilities: TSetTextExtractCapabilities;\r\n setSelectedLanguage: TSetSelectedLanguage;\r\n setTranslationType: TSetTranslationType;\r\n setTranslateText: TSetTranslateText;\r\n setFiles: TSetFiles;\r\n setIsTranslatingText: TSetIsTranslatingText;\r\n setActiveDocumentTranslationUploads: TSetActiveDocumentTranslationUploads;\r\n setIsPollingDocumentTranslation: TSetIsPollingDocumentTranslation;\r\n setActiveDocumentTextExtractionUploads: TSetActiveDocumentTextExtractionUploads;\r\n setIsPollingDocumentTextExtraction: TSetIsPollingDocumentTextExtraction;\r\n transactionReviewed: TTransactionReviewed;\r\n loadLanguages: TLoadLanguages;\r\n loadDocumentExtensions: TLoadDocumentExtensions;\r\n loadTextExtractCapabilities: TLoadTextExtractCapabilities;\r\n getAcceptedMimes: TGetAcceptedMimes;\r\n getAcceptedExtensions: TGetAcceptedExtensions;\r\n translateTextAction: TTranslateTextAction;\r\n uploadFiles: TUploadFiles;\r\n languageCodeDisplay: TLanguageCodeDisplay;\r\n removeResponse: TRemoveResponse;\r\n reset: TReset;\r\n readonly noSelectedLanguage: boolean;\r\n readonly noTranslateText: boolean;\r\n readonly noFiles: boolean;\r\n}\r\n","import { IIndexable } from '@/utils/indexable';\r\nimport { DeepReadonly } from 'vue';\r\nimport { AxiosResponse, CancelTokenSource } from 'axios';\r\n\r\nexport enum UploadState {\r\n notStarted = 'notStarted',\r\n uploading = 'uploading',\r\n polling = 'polling',\r\n success = 'success',\r\n failed = 'failed'\r\n}\r\n\r\nexport interface IUploadInformation {\r\n id: number;\r\n fileName: string;\r\n xhr: AxiosResponse | null;\r\n cancelToken: CancelTokenSource;\r\n uploadState: UploadState;\r\n statusDisplay?: string;\r\n cancelled: boolean;\r\n}\r\n\r\nexport interface IUploadState {\r\n uploads: IIndexable;\r\n isOpen: boolean;\r\n notify: boolean;\r\n routedNamespace: string;\r\n uploadId: number;\r\n}\r\n\r\nexport type TSetStatusDisplay = (upload: IUploadInformation, statusDisplay?: string) => void;\r\nexport type TSetUploadState = (upload: IUploadInformation, uploadState: UploadState) => void;\r\nexport type TUploadCompleteCallback = (i: IUploadInformation[], setStatusDisplay: TSetStatusDisplay, setUploadState: TSetUploadState) => Promise;\r\nexport type TUploadUrlBuilder = (file: File, baseUrl: string) => string;\r\nexport type TUpload = (namespace: string, url: string, files: File[], uploadComplete: TUploadCompleteCallback, urlBuilder?: TUploadUrlBuilder) => void;\r\nexport type TAbortUpload = (namespace: string, upload: IUploadInformation) => void;\r\nexport type TSetUploads = (uploads: IIndexable) => void;\r\nexport type TSetIsOpen = (isOpen: boolean) => void;\r\nexport type TSetNotify = (notify: boolean) => void;\r\nexport type TSetRoutedNamespace = (routedNamespace: string) => void;\r\nexport type TCleanupSuccess = (namespace: string) => void;\r\nexport type TReset = () => void;\r\n\r\nexport interface IUploadStore {\r\n state: DeepReadonly;\r\n upload: TUpload;\r\n abortUpload: TAbortUpload;\r\n setUploads: TSetUploads;\r\n setIsOpen: TSetIsOpen;\r\n setNotify: TSetNotify;\r\n setRoutedNamespace: TSetRoutedNamespace;\r\n cleanupSuccess: TCleanupSuccess;\r\n reset: TReset;\r\n readonly noUploads: boolean;\r\n}\r\n","import { DeepReadonly } from 'vue';\r\n\r\nexport enum DivisionOfficeGridItemType {\r\n division = 'division',\r\n office = 'office'\r\n}\r\n\r\nexport interface IDivisionOfficeGridItem {\r\n type: DivisionOfficeGridItemType;\r\n divisionId: number;\r\n divisionName: string;\r\n officeName: string | null;\r\n officeId: number | null;\r\n}\r\n\r\nexport interface IDivisionsGridState {\r\n gridItems: IDivisionOfficeGridItem[];\r\n}\r\n\r\nexport interface IDivisionModel {\r\n id: number;\r\n name: string;\r\n}\r\n\r\nexport interface IAddDivisionModel {\r\n divisionName: string;\r\n officeNames: string[];\r\n}\r\n\r\nexport interface IOfficeModel {\r\n divisionId: number;\r\n officeId: number;\r\n name: string;\r\n}\r\n\r\nexport interface IAddOfficeModel {\r\n divisionId: number;\r\n name: string;\r\n}\r\n\r\nexport interface IApplyDivisionsRequestModel {\r\n addDivisions: IAddDivisionModel[];\r\n addOffices: IAddOfficeModel[];\r\n editDivisions: IDivisionModel[];\r\n editOffices: IOfficeModel[];\r\n removeDivisionIds: number[];\r\n removeOfficeIds: number[];\r\n}\r\n\r\nexport type TSetGridItems = (gridItems: IDivisionOfficeGridItem[]) => void;\r\nexport type TLoadGridItems = () => Promise;\r\nexport type TAddDivision = (divisionName: string) => Promise;\r\nexport type TAddOffice = (officeName: string, divisionId: number) => Promise;\r\nexport type TEditDivision = (divisionId: number, name: string) => Promise;\r\nexport type TEditOffice = (officeId: number, name: string, divisionId: number) => Promise;\r\nexport type TDeleteDivision = (divisionId: number) => Promise;\r\nexport type TDeleteOffice = (officeId: number) => Promise;\r\n\r\nexport interface IDivisionsGridStore {\r\n state: DeepReadonly;\r\n setGridItems: TSetGridItems;\r\n loadGridItems: TLoadGridItems;\r\n addDivision: TAddDivision;\r\n addOffice: TAddOffice;\r\n editDivision: TEditDivision;\r\n editOffice: TEditOffice;\r\n deleteDivision: TDeleteDivision;\r\n deleteOffice: TDeleteOffice;\r\n readonly divisions: IDivisionOfficeGridItem[];\r\n readonly offices: IDivisionOfficeGridItem[];\r\n}\r\n","import { DeepReadonly } from 'vue';\r\n\r\nexport enum ForgotPasswordDialogState {\r\n Inputting = 'Inputting',\r\n Loading = 'Loading',\r\n UserNotFound = 'UserNotFound',\r\n Error = 'Error',\r\n Success = 'Success'\r\n}\r\n\r\nexport enum ForgotPasswordStatusTypeModel {\r\n Success,\r\n UserNotFound,\r\n UnknownError\r\n}\r\n\r\nexport interface IForgotPasswordModel {\r\n email: string | null;\r\n}\r\n\r\nexport interface IForgotPasswordResponseModel {\r\n status: ForgotPasswordStatusTypeModel;\r\n}\r\n\r\nexport interface IForgotPasswordState {\r\n model: IForgotPasswordModel;\r\n dialogState: ForgotPasswordDialogState\r\n}\r\n\r\nexport type TSetModel = (model: IForgotPasswordModel) => void;\r\nexport type TSetEmail = (email: string | null) => void;\r\nexport type TSetDialogState = (dialogState: ForgotPasswordDialogState) => void;\r\nexport type TSubmit = () => Promise;\r\n\r\nexport interface IForgotPasswordStore {\r\n state: DeepReadonly;\r\n setModel: TSetModel;\r\n setEmail: TSetEmail;\r\n setDialogState: TSetDialogState;\r\n submit: TSubmit\r\n}\r\n","import { DeepReadonly } from 'vue';\r\n\r\nexport enum UserRegisterDialogState {\r\n Inputting = 'Inputting',\r\n Loading = 'Loading',\r\n InvalidEmail = 'InvalidEmail',\r\n DuplicateEmail = 'DuplicateEmail',\r\n Error = 'Error',\r\n Success = 'Success'\r\n}\r\n\r\nexport enum UserRegisterStatusTypeModel {\r\n Success,\r\n InvalidEmail,\r\n DuplicateEmail,\r\n UnknownError\r\n}\r\n\r\nexport interface IUserRegisterModel {\r\n email: string | null;\r\n firstName: string | null;\r\n lastName: string | null;\r\n}\r\n\r\nexport interface IUserRegisterResponseModel {\r\n status: UserRegisterStatusTypeModel;\r\n}\r\n\r\nexport interface IUserRegisterState {\r\n model: IUserRegisterModel;\r\n dialogState: UserRegisterDialogState\r\n}\r\n\r\nexport type TSetModel = (model: IUserRegisterModel) => void;\r\nexport type TSetEmail = (email: string | null) => void;\r\nexport type TSetFirstName = (firstName: string | null) => void;\r\nexport type TSetLastName = (lastName: string | null) => void;\r\nexport type TSetDialogState = (dialogState: UserRegisterDialogState) => void;\r\nexport type TSubmit = () => Promise;\r\n\r\nexport interface IUserRegisterStore {\r\n state: DeepReadonly;\r\n setModel: TSetModel;\r\n setEmail: TSetEmail;\r\n setFirstName: TSetFirstName;\r\n setLastName: TSetLastName;\r\n setDialogState: TSetDialogState;\r\n submit: TSubmit\r\n}\r\n","import { provide, inject, reactive, App, readonly } from 'vue';\r\nimport {\r\n IImageAnalyzeState,\r\n IImageAnalyzeStore,\r\n IImageResult,\r\n TSetResponses,\r\n TGetAcceptedExtensions,\r\n TGetAcceptedMimes,\r\n TSetFiles,\r\n TUploadFiles,\r\n TReset,\r\n TRemoveResponse\r\n} from '@/store/contracts/imageAnalysis';\r\nimport { IUploadInformation, IUploadStore, TSetStatusDisplay, TUploadCompleteCallback } from '@/store/contracts/upload';\r\nimport { impl } from '@/utils/impl';\r\nimport mime from 'mime-types';\r\nimport { setLoginLogoutListener } from '@/store/contracts/loginStore';\r\n\r\nconst ImageAnalyzeStoreKey = Symbol('ImageAnalyzeStore');\r\n\r\nconst createState = () => reactive(impl({\r\n responses: {},\r\n files: undefined\r\n}));\r\n\r\nfunction setResponses (state: IImageAnalyzeState): TSetResponses {\r\n return (responses) => {\r\n state.responses = responses;\r\n };\r\n}\r\n\r\nfunction setFiles (state: IImageAnalyzeState): TSetFiles {\r\n return (files) => {\r\n state.files = files;\r\n };\r\n}\r\n\r\nfunction uploadFiles (state: IImageAnalyzeState): TUploadFiles {\r\n return (uploadStore: IUploadStore) => {\r\n if (!state.files || state.files.length === 0) {\r\n return;\r\n }\r\n uploadStore.upload('Vision', '/api/v1/precog/analyze/image', Array.from(state.files), onUploadSuccess(state));\r\n };\r\n}\r\n\r\nfunction getFileKey (fileName: string, fileKeys: string[], iter?: number): string {\r\n const fileKey = iter === undefined ? fileName : `${fileName} (${iter})`;\r\n\r\n if (!fileKeys.includes(fileKey)) {\r\n return fileKey;\r\n }\r\n\r\n return getFileKey(fileName, fileKeys, iter === undefined ? 1 : iter + 1);\r\n}\r\n\r\nfunction onUploadSuccess (state: IImageAnalyzeState): TUploadCompleteCallback {\r\n return (info: IUploadInformation[], _: TSetStatusDisplay) => {\r\n info.forEach(i => {\r\n const fileKey = getFileKey(i.fileName, Object.keys(state.responses));\r\n const mappedResponse: IImageResult = i.xhr?.data;\r\n setResponses(state)({ ...state.responses, [fileKey]: mappedResponse });\r\n });\r\n return Promise.resolve();\r\n };\r\n}\r\n\r\nconst acceptedFileExtensions = [\r\n '.jpeg', '.jpg', '.png', '.gif', '.bmp'\r\n];\r\n\r\nconst acceptedFileTypes = acceptedFileExtensions.map((e) => mime.lookup(e)).filter((m) => m !== false).map((m) => m as string);\r\n\r\nconst getAcceptedMimes: TGetAcceptedMimes = () => acceptedFileTypes;\r\n\r\nconst getAcceptedExtensions: TGetAcceptedExtensions = () => acceptedFileExtensions;\r\n\r\nfunction removeResponse (state: IImageAnalyzeState): TRemoveResponse {\r\n return (responseKey: string) => {\r\n delete state.responses[`${responseKey}`];\r\n };\r\n}\r\n\r\nfunction reset (state: IImageAnalyzeState): TReset {\r\n return () => {\r\n setResponses(state)({});\r\n setFiles(state)(undefined);\r\n };\r\n}\r\n\r\nfunction createForState (state: IImageAnalyzeState): IImageAnalyzeStore {\r\n return {\r\n state: readonly(state),\r\n setResponses: setResponses(state),\r\n setFiles: setFiles(state),\r\n getAcceptedMimes,\r\n getAcceptedExtensions,\r\n uploadFiles: uploadFiles(state),\r\n removeResponse: removeResponse(state),\r\n reset: reset(state),\r\n get noFiles (): boolean {\r\n return !state || !state.files || state.files.length === 0;\r\n }\r\n };\r\n}\r\n\r\nexport function provideStore (app?: App): void {\r\n const state = createState();\r\n const onLoginlogout = async () => createForState(state).reset();\r\n setLoginLogoutListener(\r\n ImageAnalyzeStoreKey.toString(),\r\n onLoginlogout,\r\n onLoginlogout);\r\n if (app !== undefined) {\r\n app.provide(ImageAnalyzeStoreKey, state);\r\n } else {\r\n provide(ImageAnalyzeStoreKey, state);\r\n }\r\n}\r\n\r\nexport function useStore (): IImageAnalyzeStore {\r\n const state = inject(ImageAnalyzeStoreKey);\r\n if (state === undefined) {\r\n throw new Error('Using image analyze store before providing it!');\r\n }\r\n return createForState(state);\r\n}\r\n","import { IIndexable } from '@/utils/indexable';\r\nimport { reactive, readonly, DeepReadonly } from 'vue';\r\n\r\nexport interface ILeftDrawerState {\r\n open: boolean;\r\n}\r\n\r\nexport type TToggleLeftDrawer = () => void;\r\nexport type TSetLeftDrawerState = (value: boolean) => void;\r\n\r\nexport interface ILeftDrawerStore {\r\n state: DeepReadonly;\r\n toggleLeftDrawer: TToggleLeftDrawer;\r\n setLeftDrawerState: TSetLeftDrawerState;\r\n}\r\n\r\nexport type TLeftDrawerToggleListener = (isOpen: boolean) => Promise;\r\n\r\nconst leftDrawerToggleListeners: IIndexable = reactive({});\r\n\r\nexport function getLeftDrawerToggleListeners (): DeepReadonly> {\r\n return readonly(leftDrawerToggleListeners);\r\n}\r\n\r\nexport function setLeftDrawerToggleListener (key: string, listener: TLeftDrawerToggleListener): void {\r\n leftDrawerToggleListeners[key] = listener;\r\n}\r\n\r\nexport function removeLeftDrawerToggleListener (key: string): void {\r\n delete leftDrawerToggleListeners[key];\r\n}\r\n","import { provide, inject, reactive, App, readonly } from 'vue';\r\nimport {\r\n getLeftDrawerToggleListeners,\r\n ILeftDrawerState,\r\n ILeftDrawerStore,\r\n TSetLeftDrawerState,\r\n TToggleLeftDrawer\r\n} from '@/store/contracts/leftDrawer';\r\nimport { impl } from '@/utils/impl';\r\n\r\nconst LeftDrawerStoreKey = Symbol('LeftDrawerStore');\r\nlet provided = false;\r\n\r\nconst createState = () => reactive(impl({\r\n open: true\r\n}));\r\n\r\nfunction setLeftDrawerState (state: ILeftDrawerState): TSetLeftDrawerState {\r\n return (value) => {\r\n const toggled = value !== state.open;\r\n state.open = value;\r\n if (toggled) {\r\n const listeners = getLeftDrawerToggleListeners();\r\n Object.values(listeners).forEach(l => l(state.open));\r\n }\r\n };\r\n}\r\n\r\nfunction toggleLeftDrawer (state: ILeftDrawerState): TToggleLeftDrawer {\r\n return () => {\r\n setLeftDrawerState(state)(!state.open);\r\n };\r\n}\r\n\r\nexport function provideStore (app?: App): void {\r\n if (!provided) {\r\n provided = true;\r\n if (app !== undefined) {\r\n app.provide(LeftDrawerStoreKey, createState());\r\n } else {\r\n provide(LeftDrawerStoreKey, createState());\r\n }\r\n }\r\n}\r\n\r\nexport function useStore (): ILeftDrawerStore {\r\n const state = inject(LeftDrawerStoreKey);\r\n if (state === undefined) {\r\n throw new Error('Using LeftDrawerStore before providing it!');\r\n }\r\n\r\n return {\r\n state: readonly(state),\r\n setLeftDrawerState: setLeftDrawerState(state),\r\n toggleLeftDrawer: toggleLeftDrawer(state)\r\n };\r\n}\r\n","export function nullable (\r\n value: T | null | undefined,\r\n onNotNull: (val: T) => V)\r\n : V | null | undefined {\r\n if (value === null || value === undefined) {\r\n return value as (V | null | undefined);\r\n }\r\n return onNotNull(value);\r\n}\r\n\r\nexport function possiblyUndefined (\r\n value: T | undefined,\r\n onNotUndefined: (val: T) => V)\r\n : V | undefined {\r\n if (value === undefined) {\r\n return value as (V | undefined);\r\n }\r\n return onNotUndefined(value);\r\n}\r\n\r\nexport function possiblyNull (\r\n value: T | null,\r\n onNotNull: (val: T) => V)\r\n : V | null {\r\n if (value === null) {\r\n return value as (V | null);\r\n }\r\n return onNotNull(value);\r\n}\r\n","import {\r\n IUserInfo,\r\n ILoginState,\r\n ILoginStore,\r\n TSetUserInfo,\r\n TSignIn,\r\n IPasswordLoginModel,\r\n TSignOut,\r\n THasRole,\r\n UserRole,\r\n TIsLoggedIn,\r\n getLogoutListeners,\r\n getLoginListeners,\r\n TLoginRequirementsComplete,\r\n LoginRequirement\r\n} from '@/store/contracts/loginStore';\r\nimport { impl } from '@/utils/impl';\r\nimport { nullable } from '@/utils/nullable';\r\nimport { App, inject, provide, reactive, readonly } from 'vue';\r\nimport { sendRequest } from '@/store/utils/axiosUtils';\r\nimport {\r\n chainHandlers,\r\n handleErrorStatus,\r\n handleErrorStatusResult,\r\n IStatusHandler\r\n} from '@/store/utils/apiResponseHandling';\r\nimport { Settings } from '@/settings';\r\n\r\nconst LoginStoreKey = Symbol('LoginStore');\r\n\r\nconst getInfoFromLocalStorage = () => {\r\n const infoStr = localStorage.getItem('userInfo');\r\n return nullable(infoStr, (i) => JSON.parse(i) as IUserInfo) ?? null;\r\n};\r\n\r\nconst setInfoInLocalStorage = (info: IUserInfo | null) => {\r\n if (info === null) {\r\n localStorage.removeItem('userInfo');\r\n } else {\r\n localStorage.setItem('userInfo', JSON.stringify(info));\r\n }\r\n};\r\n\r\nconst createState = () => reactive(impl({\r\n info: getInfoFromLocalStorage()\r\n}));\r\n\r\nfunction setUserInfo (state: ILoginState): TSetUserInfo {\r\n return (info: IUserInfo | null) => {\r\n state.info = info;\r\n setInfoInLocalStorage(info);\r\n };\r\n}\r\n\r\nfunction loginRequirementsComplete (state: ILoginState): TLoginRequirementsComplete {\r\n return () => {\r\n if (!state.info) {\r\n return;\r\n }\r\n\r\n setUserInfo(state)(impl({\r\n id: state.info.id,\r\n loginRequirements: LoginRequirement.None,\r\n email: state.info.email,\r\n firstName: state.info.firstName,\r\n lastName: state.info.lastName,\r\n roles: state.info.roles,\r\n officeId: state.info.officeId\r\n }));\r\n };\r\n}\r\n\r\nfunction hasRole (state: ILoginState): THasRole {\r\n return (role: UserRole) => {\r\n return state.info !== null && state.info.roles.includes(role);\r\n };\r\n}\r\n\r\nfunction isLoggedIn (state: ILoginState): TIsLoggedIn {\r\n return () => {\r\n return state.info !== null && state.info.roles.length > 0;\r\n };\r\n}\r\n\r\nfunction signIn (state: ILoginState): TSignIn {\r\n return async (model: IPasswordLoginModel, handler?: Partial>) => {\r\n const result = await handleErrorStatusResult(await sendRequest(\r\n '/api/v1/users/login',\r\n 'post',\r\n model),\r\n chainHandlers({\r\n onSuccess: async (i) => {\r\n const listeners = getLoginListeners();\r\n Object.values(listeners).forEach(l => l());\r\n setUserInfo(state)(i);\r\n }\r\n }, handler));\r\n\r\n return !!result;\r\n };\r\n}\r\n\r\nconst signOut: TSignOut = async (handler?: Partial>) => {\r\n const isError = await handleErrorStatus(await sendRequest(\r\n '/api/v1/users/logout',\r\n 'post'\r\n ), chainHandlers({\r\n onSuccess: async () => {\r\n const listeners = getLogoutListeners();\r\n Object.values(listeners).forEach(l => l());\r\n }\r\n }, handler));\r\n return !isError;\r\n};\r\n\r\nconst storeState = createState();\r\n\r\nconst createForState = (state: ILoginState) => impl({\r\n state: readonly(state),\r\n setUserInfo: setUserInfo(state),\r\n loginRequirementsComplete: loginRequirementsComplete(state),\r\n hasRole: hasRole(state),\r\n signIn: signIn(state),\r\n signOut,\r\n isLoggedIn: isLoggedIn(state),\r\n get userRoles (): UserRole[] {\r\n return Settings.allowVision ? [UserRole.User, UserRole.Admin, UserRole.Vision] : [UserRole.User, UserRole.Admin];\r\n }\r\n});\r\n\r\n/**\r\n * Store implementation that can be accessed outside of a component.\r\n */\r\nexport const store: ILoginStore = createForState(storeState);\r\n\r\nexport function provideStore (app?: App): void {\r\n if (app !== undefined) {\r\n app.provide(LoginStoreKey, storeState);\r\n } else {\r\n provide(LoginStoreKey, storeState);\r\n }\r\n}\r\n\r\nexport function useStore (): ILoginStore {\r\n const state = inject(LoginStoreKey);\r\n if (state === undefined) {\r\n throw new Error('Using LoginStore before providing it!');\r\n }\r\n return createForState(state);\r\n}\r\n","import { SortDescriptor } from '@progress/kendo-data-query';\r\nimport { GridSortDirection, IFilterChip, IGridColumnValuesResponseModel, IGridFilterModel, IGridDttmFilter, IGridQuickFilter, IGridQuickFilterValue, IGridSortModel } from '@/store/contracts/transactions';\r\nimport { impl } from '@/utils/impl';\r\nimport { GridColumnProps } from '@progress/kendo-vue-grid';\r\nimport { twoDigitDates } from '@/utils/dateUtils';\r\nimport { upperFirstLetter } from '@/utils/stringUtils';\r\n\r\nexport function mapSorts (sorts: SortDescriptor[]): IGridSortModel[] {\r\n return sorts.map(s => impl({\r\n columnName: s.field.charAt(0).toUpperCase() + s.field.slice(1),\r\n sortDirection: s.dir === 'asc' ? GridSortDirection.Ascending : GridSortDirection.Descending\r\n }));\r\n}\r\n\r\nexport function mapQuickFilters (gridQuickFilters: IGridQuickFilter[]): IGridFilterModel[] {\r\n return gridQuickFilters.filter(f => f.values.some(v => v.isSelected)).map(f => {\r\n return {\r\n columnName: upperFirstLetter(f.columnName)!,\r\n isExclude: f.isExclude,\r\n filterValues: f.values.filter(v => v.isSelected).map(v => v.value)\r\n };\r\n });\r\n}\r\n\r\nexport function mapColumns (columns: GridColumnProps[]): string[] {\r\n return columns.filter(c => c.field && !c.hidden).sortBy(c => c.orderIndex).map(c => upperFirstLetter(c.field)!);\r\n}\r\n\r\nexport function dateFilterDisplay (dttm: Date | null | undefined): string | null {\r\n return !dttm ? null : `${twoDigitDates(dttm.getMonth() + 1)}/${twoDigitDates(dttm.getDate())}/${dttm.getFullYear()}`;\r\n}\r\n\r\nexport function filterDisplayValue (columnName: string, isExclude: boolean, value: string): string {\r\n let display = value;\r\n if (columnName === 'helpfulnessRating') {\r\n display = `Helpful: ${value}`;\r\n } else if (columnName === 'requestingUserOffice' && value === 'N/A') {\r\n display = `Office: ${value}`;\r\n } else if (columnName === 'requestingUserDivision' && value === 'N/A') {\r\n display = `Division: ${value}`;\r\n }\r\n return isExclude ? `EXCLUDE ${display}` : display;\r\n}\r\n\r\nfunction filterChipSortOrder (columnName: string): number {\r\n switch (columnName) {\r\n case 'requestType':\r\n return 0;\r\n case 'requestingUserFullName':\r\n return 1;\r\n case 'requestingUserDivision':\r\n return 2;\r\n case 'requestingUserOffice':\r\n return 3;\r\n case 'helpfulnessRating':\r\n return 4;\r\n default:\r\n return 5;\r\n }\r\n}\r\n\r\nexport function dateFilterChipDisplayText (dttmFilter: IGridDttmFilter): string | null {\r\n if (!dttmFilter.minDttm && !dttmFilter.maxDttm) {\r\n return null;\r\n } else if (!dttmFilter.minDttm) {\r\n return `Before ${dateFilterDisplay(dttmFilter.maxDttm)}`;\r\n } else if (!dttmFilter.maxDttm) {\r\n return `After ${dateFilterDisplay(dttmFilter.minDttm)}`;\r\n } else {\r\n return `${dateFilterDisplay(dttmFilter.minDttm)}-${dateFilterDisplay(dttmFilter.maxDttm)}`;\r\n }\r\n}\r\n\r\nexport function mapFilterChips (dttmFilter: IGridDttmFilter, gridQuickFilters: IGridQuickFilter[]): IFilterChip[] {\r\n if (!dttmFilter.minDttm && !dttmFilter.maxDttm && gridQuickFilters.length === 0) {\r\n return [];\r\n }\r\n\r\n const chips: IFilterChip[] = [];\r\n\r\n // Always display date filter first if we have one.\r\n const dateFilterChipText = dateFilterChipDisplayText(dttmFilter);\r\n if (dateFilterChipText) {\r\n chips.push({\r\n text: dttmFilter.isExclude ? `EXCLUDE ${dateFilterChipText}` : dateFilterChipText,\r\n columnName: 'requestDttm',\r\n value: 'dateFilter',\r\n isExclude: dttmFilter.isExclude\r\n });\r\n }\r\n\r\n // Display quick filter chips in column order then filter value.\r\n gridQuickFilters.sortBy(f => filterChipSortOrder(f.columnName)).forEach(f => {\r\n f.values.sortBy(v => v.value).filter(v => v.isSelected).forEach(v => {\r\n chips.push({\r\n text: filterDisplayValue(f.columnName, f.isExclude, v.value),\r\n columnName: f.columnName,\r\n value: v.value,\r\n isExclude: f.isExclude\r\n });\r\n });\r\n });\r\n\r\n return chips;\r\n}\r\n\r\nexport function columnDisplayName (columnName: string, browserTimeZoneFriendly?: string): string {\r\n switch (columnName) {\r\n case 'referenceId':\r\n return 'Reference ID';\r\n case 'requestDttm':\r\n return !browserTimeZoneFriendly ? 'Date/Time' : `Date/Time (${browserTimeZoneFriendly})`;\r\n case 'source':\r\n return 'Source';\r\n case 'requestType':\r\n return 'Request Type';\r\n case 'sourceLanguage':\r\n return 'Source Language';\r\n case 'destinationLanguage':\r\n return 'Destination Language';\r\n case 'requestingUserFullName':\r\n return 'Submitted By';\r\n case 'requestingUserOffice':\r\n return 'Office';\r\n case 'requestingUserDivision':\r\n return 'Division';\r\n case 'resultDescription':\r\n return 'Transaction Result';\r\n case 'helpfulnessRating':\r\n return 'Was this helpful?';\r\n default:\r\n // Just return the column name back if no mapping\r\n return columnName;\r\n }\r\n}\r\n\r\nexport function mapQuickFilterResponse (columnName: string, responseModel: IGridColumnValuesResponseModel | null): IGridQuickFilter {\r\n const values: IGridQuickFilterValue[] = responseModel === null ? [] : responseModel.values.map(v => {\r\n return {\r\n value: v,\r\n isSelected: false\r\n };\r\n });\r\n\r\n return {\r\n columnName: columnName,\r\n values: values,\r\n isExclude: false\r\n };\r\n}\r\n","import { impl } from '@/utils/impl';\r\nimport { App, inject, provide, reactive, readonly } from 'vue';\r\nimport { ITimeState, ITimeStore } from '@/store/contracts/time';\r\n\r\nconst TimeStoreKey = Symbol('TimeStore');\r\n\r\nconst createState = () => {\r\n const state = reactive(impl({\r\n now: new Date()\r\n }));\r\n\r\n setInterval(() => {\r\n state.now = new Date();\r\n }, 1000);\r\n\r\n return state;\r\n};\r\n\r\nexport function provideStore (app?: App): void {\r\n if (app !== undefined) {\r\n app.provide(TimeStoreKey, createState());\r\n } else {\r\n provide(TimeStoreKey, createState());\r\n }\r\n}\r\n\r\nexport function useStore (): ITimeStore {\r\n const state = inject(TimeStoreKey);\r\n if (state === undefined) {\r\n throw new Error('Using TimeStore before providing it!');\r\n }\r\n return {\r\n state: readonly(state)\r\n };\r\n}\r\n","import {\r\n ITransactionHistoryReviewRequestModel,\r\n ITransactionHistoryGridRequestModel,\r\n ITransactionHistoryGridResponseModel,\r\n ITransactionHistoryExportRequestModel,\r\n ITransactionHistoryExportResponseModel,\r\n ITransactionsState,\r\n ITransactionsStore,\r\n TSetTotalRecords,\r\n TSetGridSorts,\r\n TSetGridColumns,\r\n TLoadRecords,\r\n TExportRecords,\r\n TReviewTransaction,\r\n TReset,\r\n TransactionLogHelpfulnessRatingType,\r\n TSetYesReviewCount,\r\n TSetNoReviewCount,\r\n TSetMaybeReviewCount,\r\n TSetBrowserTimeZoneFriendly,\r\n TSetGridData,\r\n TSetBrowserTimeZoneOffset,\r\n TGetGridRecords,\r\n IFilterChip,\r\n TSetDttmFilter,\r\n TSetGridLoadCancelToken,\r\n ITransactionHistoryRecord,\r\n TGetQuickFilter,\r\n TApplyQuickFilter,\r\n IGridQuickFilter,\r\n IGridColumnValuesRequestModel,\r\n IGridColumnValuesResponseModel,\r\n TLoadQuickFilter,\r\n TSetGridQuickFilters,\r\n TRemoveFilter,\r\n TSetUsage,\r\n TLoadUsage,\r\n ITransactionHistoryUsageRequestModel,\r\n TSetUsageLoadCancelToken,\r\n ITransactionHistoryUsageResponseModel,\r\n TCancelGridLoad,\r\n TCancelUsageLoad\r\n} from '@/store/contracts/transactions';\r\nimport { impl } from '@/utils/impl';\r\nimport { provide, inject, reactive, App, readonly } from 'vue';\r\nimport { handleErrorStatusResult, IStatusHandler, ResponseStatus } from '@/store/utils/apiResponseHandling';\r\nimport { sendRequest } from '@/store/utils/axiosUtils';\r\nimport { setLoginLogoutListener } from '@/store/contracts/loginStore';\r\nimport { mapSorts, mapColumns, mapFilterChips, mapQuickFilterResponse, mapQuickFilters, columnDisplayName } from '@/store/mapping/transactionsMapping';\r\nimport * as moment from 'moment';\r\nimport * as momentTimezone from 'moment-timezone';\r\nimport { Settings } from '@/settings';\r\nimport { GridColumnProps } from '@progress/kendo-vue-grid';\r\nimport { SortDescriptor } from '@progress/kendo-data-query';\r\nimport Axios from 'axios';\r\nimport { upperFirstLetter } from '@/utils/stringUtils';\r\n\r\nconst TransactionsStoreKey = Symbol('TransactionsStore');\r\n\r\nconst defaultTimezone = moment.tz(momentTimezone.tz.guess());\r\nconst defaultTimezoneFriendly = defaultTimezone.zoneAbbr();\r\nconst defaultSorts: SortDescriptor[] = [{\r\n field: 'requestDttm',\r\n dir: 'desc'\r\n}];\r\n\r\nconst minColumnWidth = 86;\r\nconst defaultColumns: GridColumnProps[] = [\r\n { field: 'referenceId', title: columnDisplayName('referenceId'), width: '150px', columnMenu: false, type: 'string', cell: 'cellTemplate', minResizableWidth: minColumnWidth },\r\n { field: 'requestDttm', title: columnDisplayName('requestDttm', defaultTimezoneFriendly), width: '200px', columnMenu: 'dateFilterTemplate', filter: 'date', type: 'date', sortable: true, cell: 'dateCellTemplate', minResizableWidth: minColumnWidth },\r\n { field: 'source', title: columnDisplayName('source'), width: '200px', columnMenu: false, type: 'string', cell: 'cellTemplate', minResizableWidth: minColumnWidth },\r\n { field: 'requestType', title: columnDisplayName('requestType'), width: '170px', columnMenu: 'distinctFilterTemplate', type: 'string', cell: 'cellTemplate', minResizableWidth: minColumnWidth },\r\n { field: 'sourceLanguage', title: columnDisplayName('sourceLanguage'), width: '230px', columnMenu: false, type: 'string', sortable: true, cell: 'cellTemplate', minResizableWidth: minColumnWidth },\r\n { field: 'destinationLanguage', title: columnDisplayName('destinationLanguage'), width: '230px', columnMenu: false, type: 'string', cell: 'cellTemplate', minResizableWidth: minColumnWidth },\r\n { field: 'requestingUserFullName', title: columnDisplayName('requestingUserFullName'), width: '170px', columnMenu: 'distinctFilterTemplate', type: 'string', cell: 'cellTemplate', minResizableWidth: minColumnWidth },\r\n { field: 'requestingUserDivision', title: columnDisplayName('requestingUserDivision'), width: '200px', columnMenu: 'distinctFilterTemplate', type: 'string', cell: 'cellTemplate', minResizableWidth: minColumnWidth },\r\n { field: 'requestingUserOffice', title: columnDisplayName('requestingUserOffice'), width: '200px', columnMenu: 'distinctFilterTemplate', type: 'string', cell: 'cellTemplate', minResizableWidth: minColumnWidth },\r\n { field: 'resultDescription', title: columnDisplayName('resultDescription'), width: '200px', columnMenu: false, type: 'string', cell: 'cellTemplate', minResizableWidth: minColumnWidth },\r\n { field: 'helpfulnessRating', title: columnDisplayName('helpfulnessRating'), width: '190px', columnMenu: 'distinctFilterTemplate', type: 'string', cell: 'cellTemplate', minResizableWidth: minColumnWidth }\r\n];\r\n\r\nconst createState = (): ITransactionsState => {\r\n const today = new Date();\r\n today.setHours(23, 59, 59, 99);\r\n const minDttm = new Date(new Date().setDate(today.getDate() - Settings.defaultTransactionDaysAgo));\r\n minDttm.setHours(0, 0, 0, 0);\r\n const utcOffset = defaultTimezone.utcOffset();\r\n\r\n return reactive(impl({\r\n dttmFilter: {\r\n minDttm: minDttm,\r\n maxDttm: today,\r\n isExclude: false\r\n },\r\n gridLoadCancelToken: null,\r\n gridData: {\r\n gridItems: [],\r\n loadedOffset: 0,\r\n maxLoadedIndex: 0\r\n },\r\n totalRecords: 0,\r\n yesReviewCount: 0,\r\n maybeReviewCount: 0,\r\n noReviewCount: 0,\r\n browserTimeZoneFriendly: defaultTimezoneFriendly,\r\n browserTimeZoneOffset: utcOffset,\r\n gridSorts: defaultSorts,\r\n gridColumns: defaultColumns,\r\n gridQuickFilters: {},\r\n usageLoadCancelToken: null,\r\n usage: null\r\n }));\r\n};\r\n\r\nfunction setDttmFilter (state: ITransactionsState): TSetDttmFilter {\r\n return (minDttm, maxDttm, isExclude) => {\r\n state.dttmFilter.minDttm = minDttm;\r\n state.dttmFilter.maxDttm = maxDttm;\r\n state.dttmFilter.isExclude = isExclude;\r\n };\r\n}\r\n\r\nfunction setGridLoadCancelToken (state: ITransactionsState): TSetGridLoadCancelToken {\r\n return (gridLoadCancelToken) => {\r\n state.gridLoadCancelToken = gridLoadCancelToken;\r\n };\r\n}\r\n\r\nfunction setGridData (state: ITransactionsState): TSetGridData {\r\n return (gridItems, loadedOffset, maxLoadedIndex) => {\r\n state.gridData.gridItems = gridItems;\r\n state.gridData.loadedOffset = loadedOffset;\r\n state.gridData.maxLoadedIndex = maxLoadedIndex;\r\n };\r\n}\r\n\r\nfunction setTotalRecords (state: ITransactionsState): TSetTotalRecords {\r\n return (totalRecords) => {\r\n state.totalRecords = totalRecords;\r\n };\r\n}\r\n\r\nfunction setYesReviewCount (state: ITransactionsState): TSetYesReviewCount {\r\n return (yesReviewCount) => {\r\n state.yesReviewCount = yesReviewCount;\r\n };\r\n}\r\n\r\nfunction setMaybeReviewCount (state: ITransactionsState): TSetMaybeReviewCount {\r\n return (maybeReviewCount) => {\r\n state.maybeReviewCount = maybeReviewCount;\r\n };\r\n}\r\n\r\nfunction setNoReviewCount (state: ITransactionsState): TSetNoReviewCount {\r\n return (noReviewCount) => {\r\n state.noReviewCount = noReviewCount;\r\n };\r\n}\r\n\r\nfunction setBrowserTimeZoneFriendly (state: ITransactionsState): TSetBrowserTimeZoneFriendly {\r\n return (browserTimeZoneFriendly) => {\r\n state.browserTimeZoneFriendly = browserTimeZoneFriendly;\r\n };\r\n}\r\n\r\nfunction setBrowserTimeZoneOffset (state: ITransactionsState): TSetBrowserTimeZoneOffset {\r\n return (browserTimeZoneOffset) => {\r\n state.browserTimeZoneOffset = browserTimeZoneOffset;\r\n };\r\n}\r\n\r\nfunction setGridSorts (state: ITransactionsState): TSetGridSorts {\r\n return (sorts) => {\r\n state.gridSorts = sorts;\r\n };\r\n}\r\n\r\nfunction setGridColumns (state: ITransactionsState): TSetGridColumns {\r\n return (columns) => {\r\n state.gridColumns = columns;\r\n };\r\n}\r\n\r\nfunction setGridQuickFilters (state: ITransactionsState): TSetGridQuickFilters {\r\n return (gridQuickFilters) => {\r\n state.gridQuickFilters = gridQuickFilters;\r\n };\r\n}\r\n\r\nfunction setUsageLoadCancelToken (state: ITransactionsState): TSetUsageLoadCancelToken {\r\n return (usageLoadCancelToken) => {\r\n state.usageLoadCancelToken = usageLoadCancelToken;\r\n };\r\n}\r\n\r\nfunction setUsage (state: ITransactionsState): TSetUsage {\r\n return (usage) => {\r\n state.usage = usage;\r\n };\r\n}\r\n\r\nfunction loadRecords (state: ITransactionsState): TLoadRecords {\r\n return async (offset: number, limit: number, fullRefresh: boolean) => {\r\n const needsMoreRecords = fullRefresh || (state.gridLoadCancelToken === null && (offset < state.gridData.loadedOffset || Math.min(offset + limit, state.totalRecords) > state.gridData.maxLoadedIndex));\r\n\r\n if (!needsMoreRecords) {\r\n return;\r\n }\r\n\r\n if (state.gridLoadCancelToken !== null) {\r\n state.gridLoadCancelToken.cancel();\r\n }\r\n\r\n const cancelTokenSource = Axios.CancelToken.source();\r\n const cancelToken = cancelTokenSource.token;\r\n setGridLoadCancelToken(state)(cancelTokenSource);\r\n\r\n // Load records with a buffer on each side for a mini browser cache here in the store.\r\n const loadOffset = Math.max(offset - (limit * ~~(Settings.transactionsGridBuffer / 2)), 0);\r\n const loadLimit = limit * Settings.transactionsGridBuffer;\r\n\r\n const request: ITransactionHistoryGridRequestModel = {\r\n offset: loadOffset,\r\n limit: loadLimit,\r\n minRequestDttm: state.dttmFilter.minDttm,\r\n maxRequestDttm: state.dttmFilter.maxDttm,\r\n isDttmFilterExclude: state.dttmFilter.isExclude,\r\n sorts: mapSorts(state.gridSorts),\r\n filters: mapQuickFilters(Object.keys(state.gridQuickFilters).map(columnName => state.gridQuickFilters[columnName]))\r\n };\r\n const handler = impl>>({\r\n onSuccess: async data => {\r\n setTotalRecords(state)(data.totalRecords);\r\n setYesReviewCount(state)(data.yesReviewCount);\r\n setMaybeReviewCount(state)(data.maybeReviewCount);\r\n setNoReviewCount(state)(data.noReviewCount);\r\n setGridData(state)(data.records, loadOffset, loadOffset + data.records.length);\r\n setGridLoadCancelToken(state)(null);\r\n },\r\n onCancel: async (_) => {\r\n // Cancel will happen when chaining reloads, nothing to do here.\r\n }\r\n });\r\n\r\n await handleErrorStatusResult(await sendRequest(\r\n '/api/v1/precog/transactionHistory/grid',\r\n 'post',\r\n request,\r\n cancelToken\r\n ), handler);\r\n };\r\n}\r\n\r\nfunction getGridRecords (): TGetGridRecords {\r\n return (offset: number, limit: number, loadedOffset: number, gridItems: readonly ITransactionHistoryRecord[]) => {\r\n const start = offset - loadedOffset;\r\n return gridItems.slice(start, start + limit);\r\n };\r\n}\r\n\r\nfunction exportRecords (state: ITransactionsState): TExportRecords {\r\n return async () => {\r\n const request: ITransactionHistoryExportRequestModel = {\r\n minRequestDttm: state.dttmFilter.minDttm,\r\n maxRequestDttm: state.dttmFilter.maxDttm,\r\n isDttmFilterExclude: state.dttmFilter.isExclude,\r\n sorts: mapSorts(state.gridSorts),\r\n filters: mapQuickFilters(Object.keys(state.gridQuickFilters).map(columnName => state.gridQuickFilters[columnName])),\r\n columnNames: mapColumns(state.gridColumns),\r\n clientTimeZoneFriendly: state.browserTimeZoneFriendly,\r\n clientTimeZoneOffset: state.browserTimeZoneOffset\r\n };\r\n let response: ITransactionHistoryExportResponseModel | null = null;\r\n const handler = impl>>({\r\n onSuccess: async data => {\r\n response = data;\r\n },\r\n onError: async _ => {\r\n response = {\r\n success: false,\r\n exportLocation: null,\r\n errorMessage: 'Error during export.'\r\n };\r\n }\r\n });\r\n await handleErrorStatusResult(await sendRequest(\r\n '/api/v1/precog/transactionHistory/export',\r\n 'post',\r\n request\r\n ), handler);\r\n\r\n return response;\r\n };\r\n}\r\n\r\nfunction reviewTransaction (): TReviewTransaction {\r\n return async (transactionLogId: number, helpfulnessRating: TransactionLogHelpfulnessRatingType) => {\r\n const request: ITransactionHistoryReviewRequestModel = {\r\n transactionLogId: transactionLogId,\r\n helpfulnessRating: helpfulnessRating\r\n };\r\n await handleErrorStatusResult(await sendRequest(\r\n '/api/v1/precog/transactionHistory/review',\r\n 'post',\r\n request\r\n ));\r\n };\r\n}\r\n\r\nfunction loadQuickFilter (state: ITransactionsState): TLoadQuickFilter {\r\n return async (columnName: string) => {\r\n const existingQuickFilter = state.gridQuickFilters[columnName];\r\n if (existingQuickFilter) {\r\n return;\r\n }\r\n\r\n const request: IGridColumnValuesRequestModel = {\r\n columnName: upperFirstLetter(columnName)!\r\n };\r\n\r\n let response: IGridColumnValuesResponseModel | null = null;\r\n const handler = impl>>({\r\n onSuccess: async data => {\r\n response = data;\r\n },\r\n onError: async _ => {\r\n response = null;\r\n }\r\n });\r\n await handleErrorStatusResult(await sendRequest(\r\n '/api/v1/precog/transactionHistory/columnValues',\r\n 'post',\r\n request\r\n ), handler);\r\n\r\n const quickFilter = mapQuickFilterResponse(columnName, response);\r\n setGridQuickFilters(state)({ ...state.gridQuickFilters, [columnName]: quickFilter });\r\n };\r\n}\r\n\r\nfunction getQuickFilter (state: ITransactionsState): TGetQuickFilter {\r\n return (columnName: string) => {\r\n return state.gridQuickFilters[columnName];\r\n };\r\n}\r\n\r\nfunction applyQuickFilter (state: ITransactionsState): TApplyQuickFilter {\r\n return (columnName: string, quickFilter: IGridQuickFilter) => {\r\n state.gridQuickFilters[columnName] = quickFilter;\r\n };\r\n}\r\n\r\nfunction removeFilter (state: ITransactionsState): TRemoveFilter {\r\n return (columnName: string, value: string | null) => {\r\n if (columnName === 'requestDttm') {\r\n setDttmFilter(state)(null, null, false);\r\n return;\r\n }\r\n\r\n const quickFilter = getQuickFilter(state)(columnName);\r\n if (!quickFilter) {\r\n return;\r\n }\r\n\r\n const filterValue = quickFilter.values.find(v => v.value === value);\r\n if (!filterValue) {\r\n return;\r\n }\r\n filterValue.isSelected = false;\r\n if (quickFilter.values.every(v => !v.isSelected)) {\r\n quickFilter.isExclude = false;\r\n }\r\n };\r\n}\r\n\r\nfunction loadUsage (state: ITransactionsState): TLoadUsage {\r\n return async () => {\r\n if (state.usageLoadCancelToken !== null) {\r\n state.usageLoadCancelToken.cancel();\r\n }\r\n\r\n const cancelTokenSource = Axios.CancelToken.source();\r\n const cancelToken = cancelTokenSource.token;\r\n setUsageLoadCancelToken(state)(cancelTokenSource);\r\n\r\n const request: ITransactionHistoryUsageRequestModel = {\r\n minRequestDttm: state.dttmFilter.minDttm,\r\n maxRequestDttm: state.dttmFilter.maxDttm,\r\n isDttmFilterExclude: state.dttmFilter.isExclude,\r\n filters: mapQuickFilters(Object.keys(state.gridQuickFilters).map(columnName => state.gridQuickFilters[columnName]))\r\n };\r\n\r\n const handler = impl>>({\r\n onSuccess: async data => {\r\n data.minRecordDttm = new Date(data.minRecordDttm);\r\n data.maxRecordDttm = new Date(data.maxRecordDttm);\r\n setUsage(state)(data);\r\n setUsageLoadCancelToken(state)(null);\r\n },\r\n onCancel: async (_) => {\r\n // Cancel will happen when chaining reloads, nothing to do here.\r\n }\r\n });\r\n\r\n await handleErrorStatusResult(await sendRequest(\r\n '/api/v1/precog/transactionHistory/usage',\r\n 'post',\r\n request,\r\n cancelToken\r\n ), handler);\r\n };\r\n}\r\n\r\nfunction cancelGridLoad (state: ITransactionsState): TCancelGridLoad {\r\n return () => {\r\n if (state.gridLoadCancelToken !== null) {\r\n state.gridLoadCancelToken.cancel();\r\n }\r\n };\r\n}\r\n\r\nfunction cancelUsageLoad (state: ITransactionsState): TCancelUsageLoad {\r\n return () => {\r\n if (state.usageLoadCancelToken !== null) {\r\n state.usageLoadCancelToken.cancel();\r\n }\r\n };\r\n}\r\n\r\nfunction reset (state: ITransactionsState): TReset {\r\n const today = new Date();\r\n today.setHours(23, 59, 59, 99);\r\n const minDttm = new Date(new Date().setDate(today.getDate() - Settings.defaultTransactionDaysAgo));\r\n minDttm.setHours(0, 0, 0, 0);\r\n\r\n return () => {\r\n if (state.gridLoadCancelToken !== null) {\r\n state.gridLoadCancelToken.cancel();\r\n }\r\n setDttmFilter(state)(minDttm, today, false);\r\n setGridLoadCancelToken(state)(null);\r\n setGridData(state)([], 0, 0);\r\n setTotalRecords(state)(0);\r\n setYesReviewCount(state)(0);\r\n setMaybeReviewCount(state)(0);\r\n setNoReviewCount(state)(0);\r\n setGridSorts(state)(defaultSorts);\r\n setGridColumns(state)(defaultColumns);\r\n setGridQuickFilters(state)({});\r\n setUsageLoadCancelToken(state)(null);\r\n setUsage(state)(null);\r\n };\r\n}\r\n\r\nfunction createForState (state: ITransactionsState): ITransactionsStore {\r\n return {\r\n state: readonly(state),\r\n setDttmFilter: setDttmFilter(state),\r\n setGridLoadCancelToken: setGridLoadCancelToken(state),\r\n setGridData: setGridData(state),\r\n setTotalRecords: setTotalRecords(state),\r\n setYesReviewCount: setYesReviewCount(state),\r\n setMaybeReviewCount: setMaybeReviewCount(state),\r\n setNoReviewCount: setNoReviewCount(state),\r\n setBrowserTimeZoneFriendly: setBrowserTimeZoneFriendly(state),\r\n setBrowserTimeZoneOffset: setBrowserTimeZoneOffset(state),\r\n setGridSorts: setGridSorts(state),\r\n setGridColumns: setGridColumns(state),\r\n setGridQuickFilters: setGridQuickFilters(state),\r\n setUsageLoadCancelToken: setUsageLoadCancelToken(state),\r\n setUsage: setUsage(state),\r\n loadRecords: loadRecords(state),\r\n getGridRecords: getGridRecords(),\r\n exportRecords: exportRecords(state),\r\n reviewTransaction: reviewTransaction(),\r\n loadQuickFilter: loadQuickFilter(state),\r\n getQuickFilter: getQuickFilter(state),\r\n applyQuickFilter: applyQuickFilter(state),\r\n removeFilter: removeFilter(state),\r\n loadUsage: loadUsage(state),\r\n cancelGridLoad: cancelGridLoad(state),\r\n cancelUsageLoad: cancelUsageLoad(state),\r\n reset: reset(state),\r\n get filterChips (): IFilterChip[] {\r\n return mapFilterChips(state.dttmFilter, Object.keys(state.gridQuickFilters).map(columnName => state.gridQuickFilters[columnName]));\r\n },\r\n get isLoadingGrid (): boolean {\r\n return state.gridLoadCancelToken !== null;\r\n },\r\n get isLoadingUsage (): boolean {\r\n return state.usageLoadCancelToken !== null;\r\n }\r\n };\r\n}\r\n\r\nexport function provideStore (app?: App): void {\r\n const state = createState();\r\n const onLoginlogout = async () => createForState(state).reset();\r\n setLoginLogoutListener(\r\n TransactionsStoreKey.toString(),\r\n onLoginlogout,\r\n onLoginlogout);\r\n if (app !== undefined) {\r\n app.provide(TransactionsStoreKey, state);\r\n } else {\r\n provide(TransactionsStoreKey, state);\r\n }\r\n}\r\n\r\nexport function useStore (): ITransactionsStore {\r\n const state = inject(TransactionsStoreKey);\r\n if (state === undefined) {\r\n throw new Error('Using TransactionsStore before providing it!');\r\n }\r\n return createForState(state);\r\n}\r\n","import { provide, inject, reactive, App, readonly } from 'vue';\r\nimport {\r\n ITranscribeState,\r\n ITranscribeStore,\r\n TSetResponses,\r\n ITranscriptionResponse,\r\n TSetLocales,\r\n TLoadLocales,\r\n TSetSelectedLocales,\r\n TTransactionReviewed,\r\n TTranslateResponse,\r\n TUpdateResponseLanguageCode,\r\n TSetFiles,\r\n TUploadFiles,\r\n TTranslateLanguageCode,\r\n TReset,\r\n TRemoveResponse,\r\n ITranscriptionMetadata,\r\n ITranscriptionRequestModel,\r\n ITranscriptionStatus,\r\n TranscriptionStatusType,\r\n ILocalesResponseModel,\r\n TSetActiveUploads,\r\n TSetIsPolling,\r\n ITranscriptionsRequestModel,\r\n TSetAutoTranslate,\r\n TSetSelectedAutoTranslateLanguageCode,\r\n ITranscriptionStatusResponseModel\r\n} from '@/store/contracts/transcribe';\r\nimport { IUploadInformation, IUploadStore, TSetStatusDisplay, TSetUploadState, TUploadCompleteCallback, TUploadUrlBuilder, UploadState } from '@/store/contracts/upload';\r\nimport { impl } from '@/utils/impl';\r\nimport { cleanFileName, isNullOrWhitespace } from '@/utils/stringUtils';\r\nimport { setLoginLogoutListener } from '@/store/contracts/loginStore';\r\nimport { ITextTranslateRequest, ITextTranslationResponse } from '@/store/contracts/translate';\r\nimport { TransactionLogRequestType, TransactionLogHelpfulnessRatingType } from '@/store/contracts/transactions';\r\nimport { handleErrorStatusResult, IStatusHandler } from '@/store/utils/apiResponseHandling';\r\nimport { sendRequest } from '@/store/utils/axiosUtils';\r\nimport { delay } from '@/utils/systemUtils';\r\n\r\nconst TranscribeStoreKey = Symbol('TranscribeStore');\r\n\r\nconst maxTranscribeLocales = 10;\r\n\r\nconst createState = () => reactive(impl({\r\n responses: {},\r\n supportedLocales: [],\r\n selectedLocales: [],\r\n files: undefined,\r\n activeUploads: [],\r\n isPolling: false,\r\n autoTranslate: true,\r\n selectedAutoTranslateLanguageCode: ''\r\n}));\r\n\r\nfunction setAutoTranslate (state: ITranscribeState): TSetAutoTranslate {\r\n return (autoTranslate) => {\r\n state.autoTranslate = autoTranslate;\r\n };\r\n}\r\n\r\nfunction setSelectedAutoTranslateLanguageCode (state: ITranscribeState): TSetSelectedAutoTranslateLanguageCode {\r\n return (selectedAutoTranslateLanguageCode) => {\r\n state.selectedAutoTranslateLanguageCode = selectedAutoTranslateLanguageCode;\r\n };\r\n}\r\n\r\nfunction setResponses (state: ITranscribeState): TSetResponses {\r\n return (responses) => {\r\n state.responses = responses;\r\n };\r\n}\r\n\r\nfunction setLocales (state: ITranscribeState): TSetLocales {\r\n return (locales) => {\r\n state.supportedLocales = locales;\r\n };\r\n}\r\n\r\nfunction setSelectedLocales (state: ITranscribeState): TSetSelectedLocales {\r\n return (selectedLocales) => {\r\n if (selectedLocales.length <= maxTranscribeLocales) {\r\n state.selectedLocales = selectedLocales.slice().sort();\r\n }\r\n };\r\n}\r\n\r\nfunction transactionReviewed (state: ITranscribeState): TTransactionReviewed {\r\n return (helpfulnessRating: TransactionLogHelpfulnessRatingType, responseName: string, transactionType: TransactionLogRequestType) => {\r\n switch (transactionType) {\r\n case TransactionLogRequestType.Transcription: {\r\n state.responses[responseName].metadata.transactionContext.helpfulnessRating = helpfulnessRating;\r\n break;\r\n }\r\n\r\n case TransactionLogRequestType.TranscriptionTranslation: {\r\n const translationResponse = state.responses[responseName].status?.transcription?.translationResponse;\r\n if (translationResponse) {\r\n translationResponse.transactionContext.helpfulnessRating = helpfulnessRating;\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n}\r\n\r\nfunction setFiles (state: ITranscribeState): TSetFiles {\r\n return (files) => {\r\n state.files = files;\r\n };\r\n}\r\n\r\nfunction setActiveUploads (state: ITranscribeState): TSetActiveUploads {\r\n return (uploads) => {\r\n state.activeUploads = uploads;\r\n };\r\n}\r\n\r\nfunction setIsPolling (state: ITranscribeState): TSetIsPolling {\r\n return (isPolling) => {\r\n state.isPolling = isPolling;\r\n };\r\n}\r\n\r\nfunction setFileUploadUri (state: ITranscribeState): TUploadUrlBuilder {\r\n return (file: File, baseUrl: string) => {\r\n let cleanBaseUrl = baseUrl;\r\n if (!baseUrl.endsWith('/') && !baseUrl.endsWith('\\\\')) {\r\n cleanBaseUrl += '/';\r\n }\r\n const fileName = cleanFileName(file.name);\r\n\r\n const localesQueryPrefix = '&locales=';\r\n const locales = state.selectedLocales.map(s => localesQueryPrefix.concat(s.localeCode));\r\n\r\n return `${cleanBaseUrl}?&fileName=${fileName}${locales.reduce((a, b) => a.concat(b))}`;\r\n };\r\n}\r\n\r\nfunction uploadFiles (state: ITranscribeState): TUploadFiles {\r\n return (uploadStore: IUploadStore) => {\r\n if (!state.files || state.files.length === 0) {\r\n return;\r\n }\r\n uploadStore.upload('Transcribe', '/api/v1/precog/transcribe/', Array.from(state.files), onUploadSuccess(state), setFileUploadUri(state));\r\n };\r\n}\r\n\r\nfunction getFileKey (fileName: string, fileKeys: string[], iter?: number): string {\r\n const fileKey = iter === undefined ? fileName : `${fileName} (${iter})`;\r\n\r\n if (!fileKeys.includes(fileKey)) {\r\n return fileKey;\r\n }\r\n\r\n return getFileKey(fileName, fileKeys, iter === undefined ? 1 : iter + 1);\r\n}\r\n\r\nfunction isStatusDone (status?: ITranscriptionStatus): boolean {\r\n if (!status) {\r\n return false;\r\n }\r\n return status.status !== TranscriptionStatusType.Running && status.status !== TranscriptionStatusType.NotStarted;\r\n}\r\n\r\nfunction statusDisplay (status: TranscriptionStatusType): string | undefined {\r\n switch (status) {\r\n case TranscriptionStatusType.Succeeded:\r\n case TranscriptionStatusType.Failed:\r\n return undefined;\r\n case TranscriptionStatusType.NotStarted:\r\n return 'Queued';\r\n case TranscriptionStatusType.Running:\r\n return 'Running';\r\n }\r\n}\r\n\r\nfunction uploadComplete (state: ITranscribeState, upload: IUploadInformation): void {\r\n setActiveUploads(state)(state.activeUploads.filter(info => info.id !== upload.id));\r\n}\r\n\r\nasync function pollActiveUploads (state: ITranscribeState, setStatusDisplay: TSetStatusDisplay, setUploadState: TSetUploadState): Promise {\r\n if (state.isPolling) {\r\n return;\r\n }\r\n\r\n setIsPolling(state)(true);\r\n\r\n while (state.activeUploads.length > 0) {\r\n await delay(5000);\r\n\r\n const activeUploads = [...state.activeUploads];\r\n const requests: ITranscriptionRequestModel[] = [];\r\n const metadatas: ITranscriptionMetadata[] = [];\r\n for (const upload of activeUploads) {\r\n const mappedMetadata: ITranscriptionMetadata = upload.xhr?.data;\r\n metadatas.push(mappedMetadata);\r\n requests.push({\r\n transcriptionId: mappedMetadata.id ?? '',\r\n transactionLogId: mappedMetadata.transactionContext.transactionLogId\r\n });\r\n }\r\n\r\n const request: ITranscriptionsRequestModel = {\r\n requests: requests\r\n };\r\n\r\n let responseModel: ITranscriptionStatusResponseModel;\r\n\r\n const handler = impl>>({\r\n onSuccess: async response => {\r\n responseModel = response;\r\n for (let i = 0; i < responseModel.statuses.length; i++) {\r\n const status = responseModel.statuses[i];\r\n const uploadInfo = activeUploads[i];\r\n if (uploadInfo.cancelled) {\r\n uploadComplete(state, uploadInfo);\r\n continue;\r\n }\r\n setStatusDisplay(uploadInfo, statusDisplay(status.status));\r\n if (status.success && status.status === TranscriptionStatusType.Succeeded && !!status.transcription) {\r\n status.transcription.selectedTranslateLanguageCode = null;\r\n status.transcription.translationResponse = null;\r\n\r\n if (status.transcription.phrases) {\r\n for (const phrase of status.transcription.phrases) {\r\n phrase.translationResponse = null;\r\n }\r\n }\r\n }\r\n const done = isStatusDone(status);\r\n if (done) {\r\n const fileKey = getFileKey(uploadInfo.fileName, Object.keys(state.responses));\r\n const transcriptionResponse: ITranscriptionResponse = {\r\n metadata: metadatas[i],\r\n status: status\r\n };\r\n setResponses(state)({ ...state.responses, [fileKey]: transcriptionResponse });\r\n\r\n // Extract language part from the locale code, i.e., get 'en' from 'en-US'\r\n const detectedLanguage = (transcriptionResponse.metadata.localeCode ?? transcriptionResponse.status?.transcription?.localeCode)?.split('-')[0];\r\n\r\n // Check if auto detect language code === transcription language code\r\n // Also, check if status.success === true, to ensure translation only if transcription was successful\r\n if (\r\n state.autoTranslate &&\r\n status.success &&\r\n detectedLanguage !== state.selectedAutoTranslateLanguageCode\r\n ) {\r\n await translateResponse(state)(fileKey, state.selectedAutoTranslateLanguageCode);\r\n }\r\n\r\n setUploadState(uploadInfo, status.success ? UploadState.success : UploadState.failed);\r\n uploadComplete(state, uploadInfo);\r\n }\r\n }\r\n },\r\n onError: async () => {\r\n for (let i = 0; i < activeUploads.length; i++) {\r\n const uploadInfo = activeUploads[i];\r\n if (uploadInfo.cancelled) {\r\n uploadComplete(state, uploadInfo);\r\n continue;\r\n }\r\n const failedFileKey = getFileKey(uploadInfo.fileName, Object.keys(state.responses));\r\n const failedTranscriptionResponse: ITranscriptionResponse = {\r\n metadata: metadatas[i],\r\n status: {\r\n transcriptionId: metadatas[i].id ?? '',\r\n success: false,\r\n status: TranscriptionStatusType.Failed,\r\n errorMessage: 'Error during transcription.'\r\n }\r\n };\r\n setResponses(state)({ ...state.responses, [failedFileKey]: failedTranscriptionResponse });\r\n setUploadState(uploadInfo, UploadState.failed);\r\n uploadComplete(state, uploadInfo);\r\n }\r\n },\r\n onCancel: async () => {\r\n // nothing to do here\r\n }\r\n });\r\n\r\n await handleErrorStatusResult(await sendRequest(\r\n 'api/v1/precog/transcription/status',\r\n 'post',\r\n request\r\n ), handler);\r\n }\r\n\r\n setIsPolling(state)(false);\r\n}\r\n\r\nfunction onUploadSuccess (state: ITranscribeState): TUploadCompleteCallback {\r\n return (info: IUploadInformation[], setStatusDisplay: TSetStatusDisplay, setUploadState: TSetUploadState) => {\r\n const successUploadInfos: IUploadInformation[] = [];\r\n for (const uploadInfo of info) {\r\n if (uploadInfo.cancelled) {\r\n continue;\r\n }\r\n\r\n const mappedMetadata: ITranscriptionMetadata = uploadInfo.xhr?.data;\r\n const existingResponse = Object.values(state.responses).find(r => r.metadata.id === mappedMetadata.id);\r\n if (!!existingResponse || !mappedMetadata.success) {\r\n const failedFileKey = getFileKey(uploadInfo.fileName, Object.keys(state.responses));\r\n const failedResponse: ITranscriptionResponse = {\r\n metadata: mappedMetadata,\r\n status: {\r\n transcriptionId: mappedMetadata.id ?? '',\r\n success: false,\r\n status: TranscriptionStatusType.Failed,\r\n errorMessage: 'Error during transcription.'\r\n }\r\n };\r\n setResponses(state)({ ...state.responses, [failedFileKey]: failedResponse });\r\n setUploadState(uploadInfo, UploadState.failed);\r\n continue;\r\n }\r\n successUploadInfos.push(uploadInfo);\r\n }\r\n\r\n if (successUploadInfos.length === 0) {\r\n return Promise.resolve();\r\n }\r\n setActiveUploads(state)([...state.activeUploads, ...successUploadInfos]);\r\n pollActiveUploads(state, setStatusDisplay, setUploadState);\r\n return Promise.resolve();\r\n };\r\n}\r\n\r\nfunction loadLocales (state: ITranscribeState): TLoadLocales {\r\n return async () => {\r\n if (state.supportedLocales.length > 0) {\r\n return;\r\n }\r\n const handler = impl>>({\r\n onSuccess: async response => {\r\n setLocales(state)(response.locales);\r\n setSelectedLocales(state)(response.locales.filter(l => response.defaultLocaleCodes.includes(l.localeCode)));\r\n }\r\n });\r\n await handleErrorStatusResult(await sendRequest(\r\n '/api/v1/precog/locales',\r\n 'get'\r\n ), handler);\r\n };\r\n}\r\n\r\nasync function translateText (text: string, languageCode: string, requestType: TransactionLogRequestType, transcriptionTransactionLogId: number, transcriptionFileName: string): Promise {\r\n const fullTranslationRequest: ITextTranslateRequest = {\r\n toLanguageCode: languageCode,\r\n content: text,\r\n requestType: requestType,\r\n transcriptionTransactionLogId: transcriptionTransactionLogId,\r\n transcriptionFileName: transcriptionFileName\r\n };\r\n\r\n let translationResponse: ITextTranslationResponse | null = null;\r\n const handler = impl>>({\r\n onSuccess: async response => {\r\n translationResponse = response;\r\n }\r\n });\r\n await handleErrorStatusResult(await sendRequest(\r\n 'api/v1/precog/translate/text',\r\n 'post',\r\n fullTranslationRequest\r\n ), handler);\r\n\r\n return translationResponse;\r\n}\r\n\r\nfunction translateResponse (state: ITranscribeState): TTranslateResponse {\r\n return async (responseKey: string, languageCode: string | null) => {\r\n const responses = state.responses;\r\n const myResponse = responses[responseKey];\r\n if (!myResponse.status?.transcription) {\r\n return;\r\n }\r\n const transactionLogId = myResponse.metadata.transactionContext.transactionLogId;\r\n const transcriptionFileName = myResponse.metadata.fileName;\r\n const removeTranslation = !languageCode;\r\n myResponse.status.transcription.selectedTranslateLanguageCode = languageCode;\r\n myResponse.status.transcription.translationResponse = removeTranslation ? null : await translateText(myResponse.status.transcription.transcriptionText ?? '', languageCode!, TransactionLogRequestType.TranscriptionTranslation, transactionLogId, transcriptionFileName);\r\n myResponse.status.transcription.translatedLanguageCode = removeTranslation ? null : myResponse.status.transcription.selectedTranslateLanguageCode;\r\n\r\n if (!myResponse.status.transcription.phrases) {\r\n return;\r\n }\r\n for (const phrase of myResponse.status.transcription.phrases) {\r\n phrase.translationResponse = removeTranslation ? null : await translateText(phrase.transcriptionText, languageCode!, TransactionLogRequestType.TranscriptionPhraseTranslation, transactionLogId, transcriptionFileName);\r\n }\r\n };\r\n}\r\n\r\nfunction updateResponseLanguageCode (state: ITranscribeState) : TUpdateResponseLanguageCode {\r\n return (responseKey: string, selectedLanguageCode: string) => {\r\n const responses = state.responses;\r\n const myResponse = responses[responseKey];\r\n if (!myResponse.status?.transcription) {\r\n return;\r\n }\r\n myResponse.status.transcription.selectedTranslateLanguageCode = selectedLanguageCode;\r\n };\r\n}\r\n\r\nfunction translateLanguageCode (state: ITranscribeState): TTranslateLanguageCode {\r\n return (responseKey: string) => {\r\n const response = state.responses[responseKey];\r\n if (!response?.status?.transcription) {\r\n return null;\r\n }\r\n const translateCode = response.status.transcription.translatedLanguageCode;\r\n\r\n return translateCode;\r\n };\r\n}\r\n\r\nfunction removeResponse (state: ITranscribeState): TRemoveResponse {\r\n return (responseKey: string) => {\r\n delete state.responses[`${responseKey}`];\r\n };\r\n}\r\n\r\nfunction reset (state: ITranscribeState): TReset {\r\n return () => {\r\n setResponses(state)({});\r\n setLocales(state)([]);\r\n setFiles(state)(undefined);\r\n setSelectedLocales(state)([]);\r\n setAutoTranslate(state)(true);\r\n setSelectedAutoTranslateLanguageCode(state)('');\r\n };\r\n}\r\n\r\nfunction createForState (state: ITranscribeState): ITranscribeStore {\r\n return {\r\n state: readonly(state),\r\n setResponses: setResponses(state),\r\n setLocales: setLocales(state),\r\n setSelectedLocales: setSelectedLocales(state),\r\n transactionReviewed: transactionReviewed(state),\r\n setFiles: setFiles(state),\r\n setActiveUploads: setActiveUploads(state),\r\n setIsPolling: setIsPolling(state),\r\n setAutoTranslate: setAutoTranslate(state),\r\n setSelectedAutoTranslateLanguageCode: setSelectedAutoTranslateLanguageCode(state),\r\n loadLocales: loadLocales(state),\r\n translateResponse: translateResponse(state),\r\n updateResponseLanguageCode: updateResponseLanguageCode(state),\r\n uploadFiles: uploadFiles(state),\r\n translateLanguageCode: translateLanguageCode(state),\r\n removeResponse: removeResponse(state),\r\n reset: reset(state),\r\n get noSelectedLocales (): boolean {\r\n return !state || state.selectedLocales.length === 0;\r\n },\r\n get noSelectedAutoTranslateLanguage (): boolean {\r\n return !state || isNullOrWhitespace(state.selectedAutoTranslateLanguageCode);\r\n },\r\n get noFiles (): boolean {\r\n return !state || !state.files || state.files.length === 0;\r\n }\r\n };\r\n}\r\n\r\nexport function provideStore (app?: App): void {\r\n const state = createState();\r\n const onLoginlogout = async () => createForState(state).reset();\r\n setLoginLogoutListener(\r\n TranscribeStoreKey.toString(),\r\n onLoginlogout,\r\n onLoginlogout);\r\n if (app !== undefined) {\r\n app.provide(TranscribeStoreKey, state);\r\n } else {\r\n provide(TranscribeStoreKey, state);\r\n }\r\n}\r\n\r\nexport function useStore (): ITranscribeStore {\r\n const state = inject(TranscribeStoreKey);\r\n if (state === undefined) {\r\n throw new Error('Using TranscribeStore before providing it!');\r\n }\r\n return createForState(state);\r\n}\r\n","import { provide, inject, reactive, App, readonly } from 'vue';\r\nimport {\r\n ITranslateState,\r\n ITranslateStore,\r\n TSetResponses,\r\n TSetLanguages,\r\n TLoadLanguages,\r\n TSetSelectedLanguage,\r\n TGetAcceptedExtensions,\r\n TGetAcceptedMimes,\r\n TSetTranslationType,\r\n TSetTranslateText,\r\n TTranslateTextAction,\r\n TSetFiles,\r\n TUploadFiles,\r\n TLanguageCodeDisplay,\r\n TReset,\r\n TRemoveResponse,\r\n ITranslationResponse,\r\n TLoadDocumentExtensions,\r\n TSetDocumentExtensions,\r\n ISupportedFileExtensions,\r\n ITextTranslationResponse,\r\n TranslationType,\r\n IDocumentStartDocumentTranslationResponse,\r\n IDocumentTranslationStatusRequestModel,\r\n TranslationStatusType,\r\n TSetIsTranslatingText,\r\n TTransactionReviewed,\r\n ILanguagesResponseModel,\r\n TSetDefaultLanguageCode,\r\n ITextTranslateRequest,\r\n IDocumentTextExtractionStatusRequestModel,\r\n TLoadTextExtractCapabilities,\r\n TSetTextExtractCapabilities,\r\n IDocumentStartTextExtractTranslationResponse,\r\n IDocumentTextExtractCapabilities,\r\n TSetActiveDocumentTranslationUploads,\r\n TSetIsPollingDocumentTranslation,\r\n TSetActiveDocumentTextExtractionUploads,\r\n TSetIsPollingDocumentTextExtraction,\r\n IDocumentTranslationRequestPropertiesModel,\r\n IDocumentTranslationStatusResponseModel,\r\n IDocumentTextExtractionRequestPropertiesModel,\r\n IDocumentTextExtractionStatusResponse\r\n} from '@/store/contracts/translate';\r\nimport { IUploadInformation, IUploadStore, TSetStatusDisplay, TSetUploadState, TUploadCompleteCallback, UploadState } from '@/store/contracts/upload';\r\nimport { impl } from '@/utils/impl';\r\nimport mime from 'mime-types';\r\nimport {\r\n handleErrorStatusResult,\r\n IStatusHandler\r\n} from '@/store/utils/apiResponseHandling';\r\nimport { sendRequest } from '@/store/utils/axiosUtils';\r\nimport { cleanFileName, isNullOrWhitespace } from '@/utils/stringUtils';\r\nimport { setLoginLogoutListener } from '@/store/contracts/loginStore';\r\nimport { TransactionLogRequestType, TransactionLogHelpfulnessRatingType } from '@/store/contracts/transactions';\r\nimport { delay } from '@/utils/systemUtils';\r\n\r\nconst TranslateStoreKey = Symbol('TranslateStore');\r\n\r\nconst createState = () => reactive(impl({\r\n responses: {},\r\n supportedLanguages: [],\r\n supportedDocumentExtensions: [],\r\n documentTextExtractCapabilities: { maxBytes: 0, maxFileSizeDisplay: '', fileExtensions: [] },\r\n selectedLanguageCode: '',\r\n translationType: TranslationType.Document,\r\n translateText: '',\r\n pages: [],\r\n files: undefined,\r\n isTranslatingText: false,\r\n defaultLanguageCode: '',\r\n activeDocumentTranslationUploads: [],\r\n isPollingDocumentTranslation: false,\r\n activeDocumentTextExtractionUploads: [],\r\n isPollingDocumentTextExtraction: false\r\n}));\r\n\r\nfunction setResponses (state: ITranslateState): TSetResponses {\r\n return (responses) => {\r\n state.responses = responses;\r\n };\r\n}\r\n\r\nfunction setLanguages (state: ITranslateState): TSetLanguages {\r\n return (languages) => {\r\n state.supportedLanguages = languages;\r\n };\r\n}\r\n\r\nfunction setDefaultLanguageCode (state: ITranslateState): TSetDefaultLanguageCode {\r\n return (defaultLanguageCode: string) => {\r\n state.defaultLanguageCode = defaultLanguageCode;\r\n };\r\n}\r\n\r\nfunction setDocumentExtensions (state: ITranslateState): TSetDocumentExtensions {\r\n return (extensions) => {\r\n state.supportedDocumentExtensions = extensions;\r\n };\r\n}\r\n\r\nfunction setTextExtractCapabilities (state: ITranslateState): TSetTextExtractCapabilities {\r\n return (textExtractCapabilities) => {\r\n state.documentTextExtractCapabilities = textExtractCapabilities;\r\n };\r\n}\r\n\r\nfunction setSelectedLanguage (state: ITranslateState): TSetSelectedLanguage {\r\n return (selectedLanguageCode) => {\r\n state.selectedLanguageCode = selectedLanguageCode;\r\n };\r\n}\r\n\r\nfunction setTranslationType (state: ITranslateState): TSetTranslationType {\r\n return (selectedTranslationType) => {\r\n state.translationType = selectedTranslationType;\r\n };\r\n}\r\n\r\nfunction setTranslateText (state: ITranslateState): TSetTranslateText {\r\n return (translateText) => {\r\n state.translateText = translateText;\r\n };\r\n}\r\n\r\nfunction setFiles (state: ITranslateState): TSetFiles {\r\n return (files) => {\r\n state.files = files;\r\n };\r\n}\r\n\r\nfunction setIsTranslatingText (state: ITranslateState): TSetIsTranslatingText {\r\n return (isTranslatingText) => {\r\n state.isTranslatingText = isTranslatingText;\r\n };\r\n}\r\n\r\nfunction setActiveDocumentTranslationUploads (state: ITranslateState): TSetActiveDocumentTranslationUploads {\r\n return (activeDocumentTranslationUploads) => {\r\n state.activeDocumentTranslationUploads = activeDocumentTranslationUploads;\r\n };\r\n}\r\n\r\nfunction setIsPollingDocumentTranslation (state: ITranslateState): TSetIsPollingDocumentTranslation {\r\n return (isPollingDocumentTranslation) => {\r\n state.isPollingDocumentTranslation = isPollingDocumentTranslation;\r\n };\r\n}\r\n\r\nfunction setActiveDocumentTextExtractionUploads (state: ITranslateState): TSetActiveDocumentTextExtractionUploads {\r\n return (activeDocumentTextExtractionUploads) => {\r\n state.activeDocumentTextExtractionUploads = activeDocumentTextExtractionUploads;\r\n };\r\n}\r\n\r\nfunction setIsPollingDocumentTextExtraction (state: ITranslateState): TSetIsPollingDocumentTextExtraction {\r\n return (isPollingDocumentTextExtraction) => {\r\n state.isPollingDocumentTextExtraction = isPollingDocumentTextExtraction;\r\n };\r\n}\r\n\r\nfunction transactionReviewed (state: ITranslateState): TTransactionReviewed {\r\n return (helpfulnessRating: TransactionLogHelpfulnessRatingType, responseName: string) => {\r\n const transactionContext = state.responses[responseName].transactionContext;\r\n if (transactionContext) {\r\n transactionContext.helpfulnessRating = helpfulnessRating;\r\n }\r\n };\r\n}\r\n\r\nfunction uploadFiles (state: ITranslateState): TUploadFiles {\r\n return (uploadStore: IUploadStore) => {\r\n if (!state.files || state.files.length === 0) {\r\n return;\r\n }\r\n setDefaultLanguageCode(state)(state.selectedLanguageCode);\r\n const filesArray = Array.from(state.files);\r\n filesArray.forEach(f => {\r\n const fileName = cleanFileName(f.name); // Just clean the string to prevent issues with the path.\r\n const fileTypeLower = f.type.toLowerCase();\r\n const isImage = fileTypeLower.includes('image') && !fileTypeLower.includes('tiff') && !fileTypeLower.includes('tif');\r\n switch (state.translationType) {\r\n case TranslationType.Document:\r\n uploadStore.upload('Translate', `/api/v1/precog/translate/document/start/${state.selectedLanguageCode}/${fileName}`, [f], onUploadDocumentTranslationSuccess(state));\r\n break;\r\n case TranslationType.TextExtraction:\r\n uploadStore.upload('Translate', `/api/v1/precog/extract/document/start/${isImage}/${fileName}`, [f], onUploadTextExtractFileSuccess(state));\r\n break;\r\n default:\r\n throw new Error(`Upload type ${f.type} on uploadFiles not found.`);\r\n }\r\n });\r\n };\r\n}\r\n\r\nfunction getFileKey (fileName: string, fileKeys: string[], iter?: number): string {\r\n const fileKey = iter === undefined ? fileName : `${fileName} (${iter})`;\r\n\r\n if (!fileKeys.includes(fileKey)) {\r\n return fileKey;\r\n }\r\n\r\n return getFileKey(fileName, fileKeys, iter === undefined ? 1 : iter + 1);\r\n}\r\n\r\nfunction statusDisplay (status: TranslationStatusType): string | undefined {\r\n switch (status) {\r\n case TranslationStatusType.Success:\r\n case TranslationStatusType.Failed:\r\n return undefined;\r\n case TranslationStatusType.Queued:\r\n return 'Queued';\r\n case TranslationStatusType.Running:\r\n return 'Running';\r\n }\r\n}\r\n\r\nfunction isStatusDone (status: TranslationStatusType): boolean {\r\n return status !== TranslationStatusType.Running && status !== TranslationStatusType.Queued;\r\n}\r\n\r\nfunction documentTranslationUploadComplete (state: ITranslateState, upload: IUploadInformation): void {\r\n setActiveDocumentTranslationUploads(state)(state.activeDocumentTranslationUploads.filter(info => info.id !== upload.id));\r\n}\r\n\r\nasync function pollActiveDocumentTranslationUploads (state: ITranslateState, setStatusDisplay: TSetStatusDisplay, setUploadState: TSetUploadState): Promise {\r\n if (state.isPollingDocumentTranslation) {\r\n return;\r\n }\r\n\r\n setIsPollingDocumentTranslation(state)(true);\r\n\r\n while (state.activeDocumentTranslationUploads.length > 0) {\r\n await delay(5000);\r\n\r\n const activeUploads = [...state.activeDocumentTranslationUploads];\r\n const requests: IDocumentTranslationRequestPropertiesModel[] = [];\r\n const startResponses: IDocumentStartDocumentTranslationResponse[] = [];\r\n for (const upload of activeUploads) {\r\n const startResponse: IDocumentStartDocumentTranslationResponse = upload.xhr?.data;\r\n startResponses.push(startResponse);\r\n requests.push({\r\n id: startResponse.id ?? '',\r\n resultsUri: startResponse.resultsUri ?? '',\r\n transactionLogId: startResponse.transactionContext.transactionLogId\r\n });\r\n }\r\n\r\n const languageDisplay = languageCodeDisplay(state)(state.selectedLanguageCode);\r\n const request: IDocumentTranslationStatusRequestModel = {\r\n requests: requests\r\n };\r\n\r\n let responseModel: IDocumentTranslationStatusResponseModel;\r\n\r\n const handler = impl>>({\r\n onSuccess: async response => {\r\n responseModel = response;\r\n for (let i = 0; i < responseModel.statuses.length; i++) {\r\n const status = responseModel.statuses[i];\r\n const uploadInfo = activeUploads[i];\r\n const startResponse = startResponses[i];\r\n if (uploadInfo.cancelled) {\r\n documentTranslationUploadComplete(state, uploadInfo);\r\n continue;\r\n }\r\n setStatusDisplay(uploadInfo, statusDisplay(status.statusType));\r\n const done = isStatusDone(status.statusType);\r\n if (done) {\r\n const fileKey = getFileKey(`${uploadInfo.fileName} - ${languageDisplay}`, Object.keys(state.responses));\r\n const translationResponse: ITranslationResponse = {\r\n fileName: uploadInfo.fileName,\r\n sourceText: uploadInfo.fileName,\r\n destinationLanguage: languageDisplay ?? '',\r\n success: status.statusType === TranslationStatusType.Success,\r\n type: TranslationType.Document,\r\n transactionContext: startResponse.transactionContext,\r\n translatedText: undefined,\r\n translatedDocumentSasUrl: status.resultsSasUri,\r\n errorMessage: status.errorMessage\r\n };\r\n setResponses(state)({ ...state.responses, [fileKey]: translationResponse });\r\n setUploadState(uploadInfo, translationResponse.success ? UploadState.success : UploadState.failed);\r\n documentTranslationUploadComplete(state, uploadInfo);\r\n }\r\n }\r\n },\r\n onError: async () => {\r\n for (let i = 0; i < activeUploads.length; i++) {\r\n const uploadInfo = activeUploads[i];\r\n const startResponse = startResponses[i];\r\n if (uploadInfo.cancelled) {\r\n documentTranslationUploadComplete(state, uploadInfo);\r\n continue;\r\n }\r\n const failedFileKey = getFileKey(`${uploadInfo.fileName} - ${languageDisplay}`, Object.keys(state.responses));\r\n const failedResponse: ITranslationResponse = {\r\n fileName: uploadInfo.fileName,\r\n destinationLanguage: languageDisplay ?? '',\r\n sourceText: uploadInfo.fileName,\r\n success: false,\r\n type: TranslationType.Document,\r\n transactionContext: startResponse.transactionContext,\r\n translatedText: undefined,\r\n translatedDocumentSasUrl: undefined,\r\n errorMessage: startResponse.errorMessage ?? 'Error during translation.'\r\n };\r\n setResponses(state)({ ...state.responses, [failedFileKey]: failedResponse });\r\n setUploadState(uploadInfo, UploadState.failed);\r\n documentTranslationUploadComplete(state, uploadInfo);\r\n }\r\n },\r\n onCancel: async () => {\r\n // nothing to do here\r\n }\r\n });\r\n\r\n await handleErrorStatusResult(await sendRequest(\r\n 'api/v1/precog/translate/document/status',\r\n 'post',\r\n request\r\n ), handler);\r\n }\r\n\r\n setIsPollingDocumentTranslation(state)(false);\r\n}\r\n\r\nfunction onUploadDocumentTranslationSuccess (state: ITranslateState): TUploadCompleteCallback {\r\n return (info: IUploadInformation[], setStatusDisplay: TSetStatusDisplay, setUploadState: TSetUploadState) => {\r\n const successUploadInfos: IUploadInformation[] = [];\r\n const languageDisplay = languageCodeDisplay(state)(state.selectedLanguageCode);\r\n for (const uploadInfo of info) {\r\n if (uploadInfo.cancelled) {\r\n continue;\r\n }\r\n const startResponse: IDocumentStartDocumentTranslationResponse = uploadInfo.xhr?.data;\r\n if (!startResponse.success) {\r\n const failedFileKey = getFileKey(`${uploadInfo.fileName} - ${languageDisplay}`, Object.keys(state.responses));\r\n const failedResponse: ITranslationResponse = {\r\n fileName: uploadInfo.fileName,\r\n destinationLanguage: languageDisplay ?? '',\r\n sourceText: uploadInfo.fileName,\r\n success: false,\r\n type: TranslationType.Document,\r\n transactionContext: startResponse.transactionContext,\r\n translatedText: undefined,\r\n translatedDocumentSasUrl: undefined,\r\n errorMessage: startResponse.errorMessage ?? 'Error during translation.'\r\n };\r\n setResponses(state)({ ...state.responses, [failedFileKey]: failedResponse });\r\n setUploadState(uploadInfo, UploadState.failed);\r\n continue;\r\n }\r\n successUploadInfos.push(uploadInfo);\r\n }\r\n\r\n if (successUploadInfos.length === 0) {\r\n return Promise.resolve();\r\n }\r\n setActiveDocumentTranslationUploads(state)([...state.activeDocumentTranslationUploads, ...successUploadInfos]);\r\n pollActiveDocumentTranslationUploads(state, setStatusDisplay, setUploadState);\r\n return Promise.resolve();\r\n };\r\n}\r\n\r\nfunction documentTextExtractionUploadComplete (state: ITranslateState, upload: IUploadInformation): void {\r\n setActiveDocumentTextExtractionUploads(state)(state.activeDocumentTextExtractionUploads.filter(info => info.id !== upload.id));\r\n}\r\n\r\nasync function pollActiveDocumentTextExtractionUploads (state: ITranslateState, setStatusDisplay: TSetStatusDisplay, setUploadState: TSetUploadState): Promise {\r\n if (state.isPollingDocumentTextExtraction) {\r\n return;\r\n }\r\n\r\n setIsPollingDocumentTextExtraction(state)(true);\r\n\r\n while (state.activeDocumentTextExtractionUploads.length > 0) {\r\n await delay(5000);\r\n\r\n const activeUploads = [...state.activeDocumentTextExtractionUploads];\r\n const requests: IDocumentTextExtractionRequestPropertiesModel[] = [];\r\n const startResponses: IDocumentStartTextExtractTranslationResponse[] = [];\r\n for (const upload of activeUploads) {\r\n const startResponse: IDocumentStartTextExtractTranslationResponse = upload.xhr?.data;\r\n startResponses.push(startResponse);\r\n requests.push({\r\n id: startResponse.id ?? '',\r\n transactionLogId: startResponse.transactionContext.transactionLogId,\r\n fileName: startResponse.fileName,\r\n translateToLanguageCode: state.selectedLanguageCode\r\n });\r\n }\r\n\r\n const languageDisplay = languageCodeDisplay(state)(state.selectedLanguageCode);\r\n const request: IDocumentTextExtractionStatusRequestModel = {\r\n requests: requests\r\n };\r\n\r\n let responseModel: IDocumentTextExtractionStatusResponse;\r\n\r\n const handler = impl>>({\r\n onSuccess: async response => {\r\n responseModel = response;\r\n for (let i = 0; i < responseModel.statuses.length; i++) {\r\n const status = responseModel.statuses[i];\r\n const uploadInfo = activeUploads[i];\r\n const startResponse = startResponses[i];\r\n if (uploadInfo.cancelled) {\r\n documentTextExtractionUploadComplete(state, uploadInfo);\r\n continue;\r\n }\r\n setStatusDisplay(uploadInfo, statusDisplay(status.statusType));\r\n const done = isStatusDone(status.statusType);\r\n if (done) {\r\n const fileKey = getFileKey(`${uploadInfo.fileName} - ${languageDisplay}`, Object.keys(state.responses));\r\n const translationResponse: ITranslationResponse = {\r\n fileName: uploadInfo.fileName,\r\n destinationLanguage: languageDisplay ?? '',\r\n sourceText: uploadInfo.fileName,\r\n success: status.statusType === TranslationStatusType.Success,\r\n type: TranslationType.TextExtraction,\r\n transactionContext: startResponse.transactionContext,\r\n translatedText: undefined,\r\n pages: status.result?.pages,\r\n translatedDocumentSasUrl: startResponse.uploadedFileUri,\r\n sourceLanguage: status.result?.friendlyLanguage,\r\n isImage: startResponse.isImage,\r\n errorMessage: status.errorMessage\r\n };\r\n setResponses(state)({ ...state.responses, [fileKey]: translationResponse });\r\n setUploadState(uploadInfo, translationResponse.success ? UploadState.success : UploadState.failed);\r\n documentTextExtractionUploadComplete(state, uploadInfo);\r\n }\r\n }\r\n },\r\n onError: async () => {\r\n for (let i = 0; i < activeUploads.length; i++) {\r\n const uploadInfo = activeUploads[i];\r\n const startResponse = startResponses[i];\r\n if (uploadInfo.cancelled) {\r\n documentTextExtractionUploadComplete(state, uploadInfo);\r\n continue;\r\n }\r\n const failedFileKey = getFileKey(`${uploadInfo.fileName} - ${languageDisplay}`, Object.keys(state.responses));\r\n const failedResponse: ITranslationResponse = {\r\n fileName: uploadInfo.fileName,\r\n destinationLanguage: languageDisplay ?? '',\r\n sourceText: uploadInfo.fileName,\r\n success: false,\r\n type: TranslationType.TextExtraction,\r\n transactionContext: startResponse.transactionContext,\r\n translatedText: undefined,\r\n translatedDocumentSasUrl: undefined,\r\n isImage: undefined,\r\n errorMessage: startResponse.errorMessage ?? 'Error during translation.'\r\n };\r\n setResponses(state)({ ...state.responses, [failedFileKey]: failedResponse });\r\n setUploadState(uploadInfo, UploadState.failed);\r\n documentTextExtractionUploadComplete(state, uploadInfo);\r\n }\r\n },\r\n onCancel: async () => {\r\n // nothing to do here\r\n }\r\n });\r\n\r\n await handleErrorStatusResult(await sendRequest(\r\n 'api/v1/precog/extract/document/status',\r\n 'post',\r\n request\r\n ), handler);\r\n }\r\n\r\n setIsPollingDocumentTextExtraction(state)(false);\r\n}\r\n\r\nfunction onUploadTextExtractFileSuccess (state: ITranslateState): TUploadCompleteCallback {\r\n return (info: IUploadInformation[], setStatusDisplay: TSetStatusDisplay, setUploadState: TSetUploadState) => {\r\n const successUploadInfos: IUploadInformation[] = [];\r\n const languageDisplay = languageCodeDisplay(state)(state.selectedLanguageCode);\r\n for (const uploadInfo of info) {\r\n if (uploadInfo.cancelled) {\r\n continue;\r\n }\r\n const startResponse: IDocumentStartTextExtractTranslationResponse = uploadInfo.xhr?.data;\r\n if (!startResponse.success) {\r\n const failedFileKey = getFileKey(`${uploadInfo.fileName} - ${languageDisplay}`, Object.keys(state.responses));\r\n const failedResponse: ITranslationResponse = {\r\n fileName: uploadInfo.fileName,\r\n destinationLanguage: languageDisplay ?? '',\r\n sourceText: uploadInfo.fileName,\r\n success: false,\r\n type: TranslationType.TextExtraction,\r\n transactionContext: startResponse.transactionContext,\r\n translatedText: undefined,\r\n translatedDocumentSasUrl: undefined,\r\n isImage: undefined,\r\n errorMessage: startResponse.errorMessage ?? 'Error during translation.'\r\n };\r\n setResponses(state)({ ...state.responses, [failedFileKey]: failedResponse });\r\n setUploadState(uploadInfo, UploadState.failed);\r\n continue;\r\n }\r\n successUploadInfos.push(uploadInfo);\r\n }\r\n\r\n if (successUploadInfos.length === 0) {\r\n return Promise.resolve();\r\n }\r\n setActiveDocumentTextExtractionUploads(state)([...state.activeDocumentTextExtractionUploads, ...successUploadInfos]);\r\n pollActiveDocumentTextExtractionUploads(state, setStatusDisplay, setUploadState);\r\n return Promise.resolve();\r\n };\r\n}\r\n\r\nfunction loadLanguages (state: ITranslateState): TLoadLanguages {\r\n return async () => {\r\n if (state.supportedLanguages.length > 0) {\r\n return;\r\n }\r\n const handler = impl>>({\r\n onSuccess: async response => {\r\n setLanguages(state)(response.languages);\r\n setSelectedLanguage(state)(response.defaultLanguageCode);\r\n setDefaultLanguageCode(state)(response.defaultLanguageCode);\r\n }\r\n });\r\n await handleErrorStatusResult(await sendRequest(\r\n '/api/v1/precog/languages',\r\n 'get'\r\n ), handler);\r\n };\r\n}\r\n\r\nfunction loadDocumentExtensions (state: ITranslateState): TLoadDocumentExtensions {\r\n return async () => {\r\n if (state.supportedDocumentExtensions.length > 0) {\r\n return;\r\n }\r\n const handler = impl>>({\r\n onSuccess: async response => {\r\n setDocumentExtensions(state)(response.fileExtensions);\r\n }\r\n });\r\n await handleErrorStatusResult(await sendRequest(\r\n '/api/v1/precog/translate/fileExtensions',\r\n 'get'\r\n ), handler);\r\n };\r\n}\r\n\r\nfunction loadTextExtractCapabilities (state: ITranslateState): TLoadTextExtractCapabilities {\r\n return async () => {\r\n if (state.documentTextExtractCapabilities.maxBytes > 0) {\r\n return;\r\n }\r\n const handler = impl>>({\r\n onSuccess: async response => {\r\n setTextExtractCapabilities(state)({ maxBytes: response.maxBytes, maxFileSizeDisplay: response.maxFileSizeDisplay, fileExtensions: response.fileExtensions });\r\n }\r\n });\r\n await handleErrorStatusResult(await sendRequest(\r\n '/api/v1/precog/extract/document/capabilities',\r\n 'get'\r\n ), handler);\r\n };\r\n}\r\n\r\nfunction translateTextAction (state: ITranslateState): TTranslateTextAction {\r\n return async () => {\r\n setIsTranslatingText(state)(true);\r\n setDefaultLanguageCode(state)(state.selectedLanguageCode);\r\n const languageDisplay = languageCodeDisplay(state)(state.selectedLanguageCode);\r\n const key = `${state.translateText.length < 100 ? state.translateText : state.translateText.substring(0, 100)} - ${languageDisplay}`;\r\n const fileKey = getFileKey(key, Object.keys(state.responses));\r\n const request: ITextTranslateRequest = {\r\n toLanguageCode: state.selectedLanguageCode,\r\n content: state.translateText,\r\n requestType: TransactionLogRequestType.TextTranslation,\r\n transcriptionTransactionLogId: null,\r\n transcriptionFileName: null\r\n };\r\n\r\n const handler = impl>>({\r\n onSuccess: async textResponse => {\r\n const translationResponse: ITranslationResponse = {\r\n transactionContext: textResponse.transactionContext,\r\n success: textResponse.success,\r\n type: TranslationType.Text,\r\n sourceText: state.translateText,\r\n translatedText: textResponse.translatedText,\r\n translatedDocumentSasUrl: undefined,\r\n destinationLanguage: languageDisplay ?? '',\r\n sourceLanguage: textResponse.sourceLanguage,\r\n errorMessage: textResponse.errorMessage\r\n };\r\n setResponses(state)({ ...state.responses, [fileKey]: translationResponse });\r\n setIsTranslatingText(state)(false);\r\n }\r\n });\r\n await handleErrorStatusResult(await sendRequest(\r\n '/api/v1/precog/translate/text',\r\n 'post',\r\n request\r\n ), handler);\r\n };\r\n}\r\n\r\nfunction getAcceptedDocumentMimes (state: ITranslateState): TGetAcceptedMimes {\r\n return () => {\r\n return state.supportedDocumentExtensions.map((e) => mime.lookup(e)).filter((m) => m !== false).map((m) => m as string);\r\n };\r\n}\r\n\r\nfunction getAcceptedDocumentExtensions (state: ITranslateState): TGetAcceptedExtensions {\r\n return () => {\r\n return state.supportedDocumentExtensions;\r\n };\r\n}\r\n\r\nfunction languageCodeDisplay (state: ITranslateState): TLanguageCodeDisplay {\r\n return (languageCode: string | null) => {\r\n if (languageCode === null) {\r\n return null;\r\n }\r\n\r\n return state.supportedLanguages\r\n .find((l) => l.languageCode === languageCode)?.name ?? null;\r\n };\r\n}\r\n\r\nfunction removeResponse (state: ITranslateState): TRemoveResponse {\r\n return (responseKey: string) => {\r\n delete state.responses[`${responseKey}`];\r\n };\r\n}\r\n\r\nfunction reset (state: ITranslateState): TReset {\r\n return () => {\r\n setResponses(state)({});\r\n setLanguages(state)([]);\r\n setDefaultLanguageCode(state)('');\r\n setDocumentExtensions(state)([]);\r\n setSelectedLanguage(state)('');\r\n setTranslationType(state)(TranslationType.Document);\r\n setTranslateText(state)('');\r\n setFiles(state)(undefined);\r\n setIsTranslatingText(state)(false);\r\n };\r\n}\r\n\r\nfunction createForState (state: ITranslateState): ITranslateStore {\r\n return {\r\n state: readonly(state),\r\n setResponses: setResponses(state),\r\n setLanguages: setLanguages(state),\r\n setDefaultLanguageCode: setDefaultLanguageCode(state),\r\n setDocumentExtensions: setDocumentExtensions(state),\r\n setTextExtractCapabilities: setTextExtractCapabilities(state),\r\n setSelectedLanguage: setSelectedLanguage(state),\r\n setTranslationType: setTranslationType(state),\r\n setTranslateText: setTranslateText(state),\r\n setFiles: setFiles(state),\r\n setIsTranslatingText: setIsTranslatingText(state),\r\n setActiveDocumentTranslationUploads: setActiveDocumentTranslationUploads(state),\r\n setIsPollingDocumentTranslation: setIsPollingDocumentTranslation(state),\r\n setActiveDocumentTextExtractionUploads: setActiveDocumentTextExtractionUploads(state),\r\n setIsPollingDocumentTextExtraction: setIsPollingDocumentTextExtraction(state),\r\n transactionReviewed: transactionReviewed(state),\r\n loadLanguages: loadLanguages(state),\r\n loadDocumentExtensions: loadDocumentExtensions(state),\r\n loadTextExtractCapabilities: loadTextExtractCapabilities(state),\r\n getAcceptedMimes: getAcceptedDocumentMimes(state),\r\n getAcceptedExtensions: getAcceptedDocumentExtensions(state),\r\n translateTextAction: translateTextAction(state),\r\n uploadFiles: uploadFiles(state),\r\n languageCodeDisplay: languageCodeDisplay(state),\r\n removeResponse: removeResponse(state),\r\n reset: reset(state),\r\n get noSelectedLanguage (): boolean {\r\n return !state || isNullOrWhitespace(state.selectedLanguageCode);\r\n },\r\n get noTranslateText (): boolean {\r\n return !state || isNullOrWhitespace(state.translateText);\r\n },\r\n get noFiles (): boolean {\r\n return !state || !state.files || state.files.length === 0;\r\n }\r\n };\r\n}\r\n\r\nexport function provideStore (app?: App): void {\r\n const state = createState();\r\n const onLoginlogout = async () => createForState(state).reset();\r\n setLoginLogoutListener(\r\n TranslateStoreKey.toString(),\r\n onLoginlogout,\r\n onLoginlogout);\r\n if (app !== undefined) {\r\n app.provide(TranslateStoreKey, state);\r\n } else {\r\n provide(TranslateStoreKey, state);\r\n }\r\n}\r\n\r\nexport function useStore (): ITranslateStore {\r\n const state = inject(TranslateStoreKey);\r\n if (state === undefined) {\r\n throw new Error('Using TranslateStore before providing it!');\r\n }\r\n return createForState(state);\r\n}\r\n","import { provide, inject, reactive, App, readonly } from 'vue';\r\nimport { IUploadState, IUploadStore, IUploadInformation, TUpload, TAbortUpload, TSetUploads, TCleanupSuccess, UploadState, TSetIsOpen, TSetRoutedNamespace, TReset, TSetStatusDisplay, TUploadCompleteCallback, TUploadUrlBuilder, TSetUploadState } from '@/store/contracts/upload';\r\nimport { impl } from '@/utils/impl';\r\nimport { isNullOrWhitespace } from '@/utils/stringUtils';\r\nimport Axios, { AxiosResponse } from 'axios';\r\nimport { setLoginLogoutListener } from '@/store/contracts/loginStore';\r\nimport { delay } from '@/utils/systemUtils';\r\nimport { Settings } from '@/settings';\r\n\r\nconst UploadStoreKey = Symbol('UploadStore');\r\n// const Batch = false; // Just hard coding this hear so can include logic to batch if that ever speeds up.\r\n\r\nconst createState = () => reactive(impl({\r\n uploads: {},\r\n isOpen: false,\r\n notify: false,\r\n routedNamespace: 'Transcribe',\r\n uploadId: 0\r\n}));\r\n\r\nfunction setUploads (state: IUploadState): TSetUploads {\r\n return (uploads) => {\r\n state.uploads = uploads;\r\n };\r\n}\r\n\r\nfunction setIsOpen (state: IUploadState): TSetIsOpen {\r\n return (isOpen) => {\r\n state.isOpen = isOpen;\r\n if (isOpen) {\r\n setNotify(state)(false);\r\n }\r\n };\r\n}\r\n\r\nfunction setNotify (state: IUploadState): TSetIsOpen {\r\n return (notify) => {\r\n state.notify = notify;\r\n };\r\n}\r\n\r\nfunction setRoutedNamespace (state: IUploadState): TSetRoutedNamespace {\r\n return (routedNamespace) => {\r\n state.routedNamespace = routedNamespace;\r\n };\r\n}\r\n\r\nfunction currentUploadingCount (state: IUploadState): number {\r\n let count = 0;\r\n Object.keys(state.uploads).forEach(namespace => {\r\n count += state.uploads[namespace].filter(u => u.uploadState === UploadState.uploading).length;\r\n });\r\n return count;\r\n}\r\n\r\nfunction upload (state: IUploadState): TUpload {\r\n return (namespace: string, url: string, files: File[], uploadComplete: TUploadCompleteCallback, urlBuilder?: TUploadUrlBuilder) => {\r\n // if (Batch) {\r\n // sendRequest(state, namespace, url, files, uploadComplete);\r\n // } else {\r\n // files.forEach(f => sendRequest(state, namespace, url, [f], uploadComplete));\r\n // }\r\n files.forEach(f => sendRequest(state, namespace, url, f, uploadComplete, urlBuilder));\r\n };\r\n}\r\n\r\nasync function sendRequest (state: IUploadState, namespace: string, url: string, file: File, uploadComplete: TUploadCompleteCallback, urlBuilder?: TUploadUrlBuilder) {\r\n let cleanUrl = url;\r\n if (urlBuilder) {\r\n cleanUrl = urlBuilder(file, url);\r\n }\r\n\r\n if (isNullOrWhitespace(cleanUrl)) {\r\n console.error('uploadStore: invalid or no URL specified!!');\r\n return;\r\n }\r\n\r\n const cancelTokenSource = Axios.CancelToken.source();\r\n const cancelToken = cancelTokenSource.token;\r\n\r\n const uploads = [] as IUploadInformation[];\r\n uploads.push({\r\n id: state.uploadId++,\r\n fileName: file.name,\r\n xhr: null,\r\n cancelToken: cancelTokenSource,\r\n uploadState: UploadState.notStarted,\r\n cancelled: false\r\n });\r\n\r\n const setUploadState = (): TSetUploadState => {\r\n return (upload: IUploadInformation, requestState: UploadState) => {\r\n const stateNamespace = state.uploads[namespace];\r\n const stateUpload = stateNamespace.find(su => su.id === upload.id);\r\n if (!stateUpload) {\r\n return;\r\n }\r\n stateUpload.uploadState = requestState;\r\n\r\n if (state.routedNamespace === namespace) {\r\n state.uploads[namespace] = stateNamespace.filter(u => u.id !== upload.id);\r\n setNotify(state)(false);\r\n return;\r\n }\r\n\r\n if (!state.isOpen) {\r\n setNotify(state)(true);\r\n }\r\n };\r\n };\r\n\r\n const setStatusDisplay = (): TSetStatusDisplay => {\r\n return (upload: IUploadInformation, statusDisplay?: string) => {\r\n const stateUpload = state.uploads[namespace].find(u => u.id === upload.id);\r\n if (!stateUpload) {\r\n return;\r\n }\r\n stateUpload.statusDisplay = statusDisplay;\r\n };\r\n };\r\n\r\n const setAxiosResponse = (response: AxiosResponse, success: boolean) => {\r\n uploads.forEach(u => {\r\n const stateUpload = state.uploads[namespace].find(su => su.id === u.id);\r\n if (!stateUpload) {\r\n return;\r\n }\r\n stateUpload.xhr = response;\r\n if (success) {\r\n stateUpload.uploadState = UploadState.polling;\r\n }\r\n });\r\n };\r\n\r\n if (!state.uploads[namespace]) {\r\n setUploads(state)({ ...state.uploads, [namespace]: [] });\r\n }\r\n\r\n state.uploads[namespace].push(...uploads);\r\n\r\n while (currentUploadingCount(state) > Settings.maxConcurrentUploads) {\r\n await delay(1000);\r\n }\r\n let uploadFound = false;\r\n for (const upload of state.uploads[namespace].filter(su => uploads.map(u => u.id).includes(su.id))) {\r\n if (upload.cancelled) {\r\n // If it was cancelled while we were waiting, don't send the request.\r\n continue;\r\n }\r\n uploadFound = true;\r\n upload.uploadState = UploadState.uploading;\r\n }\r\n\r\n if (!uploadFound) {\r\n return;\r\n }\r\n\r\n const blob = new Blob([file]);\r\n\r\n Axios.post(cleanUrl, blob, {\r\n withCredentials: true,\r\n cancelToken: cancelToken,\r\n headers: {\r\n 'Content-Type': blob.type\r\n }\r\n }).then(async (r) => {\r\n setAxiosResponse(r, true);\r\n await uploadComplete(uploads, setStatusDisplay(), setUploadState());\r\n }).catch((e) => {\r\n setAxiosResponse(e.response, false);\r\n uploads.forEach(u => {\r\n const stateUpload = state.uploads[namespace].find(su => su.id === u.id);\r\n if (!stateUpload) {\r\n return;\r\n }\r\n stateUpload.uploadState = UploadState.failed;\r\n });\r\n\r\n if (!state.isOpen) {\r\n setNotify(state)(true);\r\n }\r\n });\r\n\r\n setIsOpen(state)(true);\r\n}\r\n\r\nfunction abortUpload (state: IUploadState): TAbortUpload {\r\n return (namespace: string, upload: IUploadInformation) => {\r\n const myNamespace = state.uploads[namespace];\r\n const index = myNamespace.findIndex(u => u.id === upload.id);\r\n const namespaceUpload = myNamespace[index];\r\n namespaceUpload.cancelToken.cancel();\r\n namespaceUpload.cancelled = true;\r\n myNamespace.splice(index, 1);\r\n };\r\n}\r\n\r\nfunction cleanupSuccess (state: IUploadState): TCleanupSuccess {\r\n return (namespace) => {\r\n const myNamespace = state.uploads[namespace];\r\n if (!myNamespace) {\r\n return;\r\n }\r\n state.uploads[namespace] = myNamespace.filter(u => u.uploadState !== UploadState.success);\r\n };\r\n}\r\n\r\nfunction reset (state: IUploadState): TReset {\r\n return () => {\r\n setUploads(state)({});\r\n setIsOpen(state)(false);\r\n setNotify(state)(false);\r\n setRoutedNamespace(state)('Transcribe');\r\n };\r\n}\r\n\r\nfunction createForState (state: IUploadState): IUploadStore {\r\n return {\r\n state: readonly(state),\r\n upload: upload(state),\r\n abortUpload: abortUpload(state),\r\n setUploads: setUploads(state),\r\n setIsOpen: setIsOpen(state),\r\n setNotify: setNotify(state),\r\n setRoutedNamespace: setRoutedNamespace(state),\r\n cleanupSuccess: cleanupSuccess(state),\r\n reset: reset(state),\r\n get noUploads (): boolean {\r\n if (!state || !state.uploads) {\r\n return true;\r\n }\r\n return Object.keys(state.uploads).none(k => state.uploads[k].length > 0);\r\n }\r\n };\r\n}\r\n\r\nexport function provideStore (app?: App): void {\r\n const state = createState();\r\n const onLoginlogout = async () => createForState(state).reset();\r\n setLoginLogoutListener(\r\n UploadStoreKey.toString(),\r\n onLoginlogout,\r\n onLoginlogout);\r\n if (app !== undefined) {\r\n app.provide(UploadStoreKey, state);\r\n } else {\r\n provide(UploadStoreKey, state);\r\n }\r\n}\r\n\r\nexport function useStore (): IUploadStore {\r\n const state = inject(UploadStoreKey);\r\n if (state === undefined) {\r\n throw new Error('Using UploadStore before providing it!');\r\n }\r\n return createForState(state);\r\n}\r\n","import { impl } from '@/utils/impl';\r\nimport { reactive, readonly, provide, inject, App } from 'vue';\r\nimport {\r\n handleErrorStatusResult,\r\n IStatusHandler,\r\n ResponseStatus\r\n} from '@/store/utils/apiResponseHandling';\r\nimport { sendRequest } from '@/store/utils/axiosUtils';\r\nimport {\r\n DivisionOfficeGridItemType,\r\n IDivisionOfficeGridItem,\r\n IDivisionsGridState,\r\n IDivisionsGridStore,\r\n IAddDivisionModel,\r\n IDivisionModel,\r\n IAddOfficeModel,\r\n IOfficeModel,\r\n IApplyDivisionsRequestModel,\r\n TAddDivision,\r\n TAddOffice,\r\n TDeleteDivision,\r\n TDeleteOffice,\r\n TEditDivision,\r\n TEditOffice,\r\n TLoadGridItems,\r\n TSetGridItems\r\n} from '@/store/contracts/users/divisionsGrid';\r\nimport { IDivisionListing } from '@/store/contracts/users/divisionsSelect';\r\n\r\nconst DivisionsGridStoreKey = Symbol('DivisionsGridStore');\r\n\r\nconst createState = () => reactive(impl({\r\n gridItems: []\r\n}));\r\n\r\nfunction setGridItems (state: IDivisionsGridState): TSetGridItems {\r\n return (gridItems) => {\r\n state.gridItems = gridItems;\r\n };\r\n}\r\n\r\nfunction loadGridItems (state: IDivisionsGridState): TLoadGridItems {\r\n return async () => {\r\n const handler = impl>>({\r\n onSuccess: async (divisionListings) => {\r\n const gridItems: IDivisionOfficeGridItem[] = [];\r\n divisionListings.forEach(d => {\r\n // Get our division grid item in there.\r\n gridItems.push(impl({\r\n type: DivisionOfficeGridItemType.division,\r\n divisionId: d.division.id,\r\n divisionName: d.division.name,\r\n officeName: null,\r\n officeId: null\r\n }));\r\n\r\n // Get our office grid items in there.\r\n d.offices.forEach(o => gridItems.push(impl({\r\n type: DivisionOfficeGridItemType.office,\r\n divisionId: d.division.id,\r\n divisionName: d.division.name,\r\n officeName: o.name,\r\n officeId: o.officeId\r\n })));\r\n });\r\n\r\n setGridItems(state)(gridItems);\r\n }\r\n });\r\n\r\n await handleErrorStatusResult(await sendRequest(\r\n '/api/v1/users/divisions',\r\n 'get'\r\n ), handler);\r\n };\r\n}\r\n\r\nfunction addDivision (state: IDivisionsGridState): TAddDivision {\r\n return async (divisionName) => {\r\n const addDivision: IAddDivisionModel = {\r\n divisionName: divisionName,\r\n officeNames: []\r\n };\r\n const addDivisions: IAddDivisionModel[] = [addDivision];\r\n applyDivisions(state, { addDivisions: addDivisions });\r\n };\r\n}\r\n\r\nfunction addOffice (state: IDivisionsGridState): TAddOffice {\r\n return async (officeName, divisionId) => {\r\n const addOffice: IAddOfficeModel = {\r\n name: officeName,\r\n divisionId: divisionId\r\n };\r\n const addOffices: IAddOfficeModel[] = [addOffice];\r\n applyDivisions(state, { addOffices: addOffices });\r\n };\r\n}\r\n\r\nfunction editDivision (state: IDivisionsGridState): TEditDivision {\r\n return async (divisionId, name) => {\r\n const editDivision: IDivisionModel = {\r\n id: divisionId,\r\n name: name\r\n };\r\n const editDivisions: IDivisionModel[] = [editDivision];\r\n applyDivisions(state, { editDivisions: editDivisions });\r\n };\r\n}\r\n\r\nfunction editOffice (state: IDivisionsGridState): TEditOffice {\r\n return async (officeId, name, divisionId) => {\r\n const editOffice: IOfficeModel = {\r\n divisionId: divisionId,\r\n name: name,\r\n officeId: officeId\r\n };\r\n const editOffices: IOfficeModel[] = [editOffice];\r\n applyDivisions(state, { editOffices: editOffices });\r\n };\r\n}\r\n\r\nfunction deleteDivision (state: IDivisionsGridState): TDeleteDivision {\r\n return async (divisionId) => {\r\n const removeDivisionIds: number[] = [divisionId];\r\n applyDivisions(state, { removeDivisionIds: removeDivisionIds });\r\n };\r\n}\r\n\r\nfunction deleteOffice (state: IDivisionsGridState): TDeleteOffice {\r\n return async (officeId) => {\r\n const removeOfficeIds: number[] = [officeId];\r\n applyDivisions(state, { removeOfficeIds: removeOfficeIds });\r\n };\r\n}\r\n\r\nasync function applyDivisions (state: IDivisionsGridState, applyDivision: { editDivisions?: IDivisionModel[], editOffices?: IOfficeModel[], addDivisions?: IAddDivisionModel[], addOffices?: IAddOfficeModel[], removeDivisionIds?: number[], removeOfficeIds?: number[] }): Promise {\r\n const request: IApplyDivisionsRequestModel = {\r\n editDivisions: applyDivision.editDivisions ?? [],\r\n editOffices: applyDivision.editOffices ?? [],\r\n addDivisions: applyDivision.addDivisions ?? [],\r\n addOffices: applyDivision.addOffices ?? [],\r\n removeDivisionIds: applyDivision.removeDivisionIds ?? [],\r\n removeOfficeIds: applyDivision.removeOfficeIds ?? []\r\n };\r\n const handler = impl>>({\r\n onSuccess: async () => {\r\n await loadGridItems(state)();\r\n }\r\n });\r\n\r\n await handleErrorStatusResult(await sendRequest(\r\n '/api/v1/users/divisions/apply',\r\n 'post',\r\n request\r\n ), handler);\r\n}\r\n\r\nconst createForState = (state: IDivisionsGridState) => impl({\r\n state: readonly(state),\r\n setGridItems: setGridItems(state),\r\n loadGridItems: loadGridItems(state),\r\n addDivision: addDivision(state),\r\n addOffice: addOffice(state),\r\n editDivision: editDivision(state),\r\n editOffice: editOffice(state),\r\n deleteDivision: deleteDivision(state),\r\n deleteOffice: deleteOffice(state),\r\n get divisions (): IDivisionOfficeGridItem[] {\r\n return state.gridItems.filter(i => i.type === DivisionOfficeGridItemType.division);\r\n },\r\n get offices (): IDivisionOfficeGridItem[] {\r\n return state.gridItems.filter(i => i.type === DivisionOfficeGridItemType.office);\r\n }\r\n});\r\n\r\nexport function provideStore (app?: App): void {\r\n const state = createState();\r\n if (app !== undefined) {\r\n app.provide(DivisionsGridStoreKey, state);\r\n } else {\r\n provide(DivisionsGridStoreKey, state);\r\n }\r\n}\r\n\r\nexport function useStore (): IDivisionsGridStore {\r\n const state = inject(DivisionsGridStoreKey);\r\n if (state === undefined) {\r\n throw new Error('Using DivisionsGridStore before providing it!');\r\n }\r\n return createForState(state);\r\n}\r\n","import { impl } from '@/utils/impl';\r\nimport { App, inject, provide, reactive, readonly } from 'vue';\r\nimport {\r\n IForgotPasswordResponseModel,\r\n IForgotPasswordStore,\r\n IForgotPasswordState,\r\n TSubmit,\r\n TSetEmail,\r\n TSetModel,\r\n TSetDialogState,\r\n ForgotPasswordDialogState,\r\n ForgotPasswordStatusTypeModel\r\n} from '@/store/contracts/users/forgotPassword';\r\nimport validationModel, { ForgotPasswordModelFieldName } from '@/validation/forgotPasswordValidationModel';\r\nimport { store as validationStore } from '@/store/validation';\r\nimport { sendRequest } from '@/store/utils/axiosUtils';\r\nimport {\r\n handleErrorStatus,\r\n IStatusHandler\r\n} from '@/store/utils/apiResponseHandling';\r\nimport { IIndexable } from '@/utils/indexable';\r\n\r\nconst ForgotPasswordStoreKey = Symbol('ForgotPasswordStore');\r\n\r\nconst createState = () => {\r\n validationStore.clear(validationModel);\r\n return reactive(impl({\r\n model: {\r\n email: null\r\n },\r\n dialogState: ForgotPasswordDialogState.Inputting\r\n }));\r\n};\r\n\r\nfunction setEmail (state: IForgotPasswordState): TSetEmail {\r\n return (email) => {\r\n state.model.email = email;\r\n };\r\n}\r\n\r\nfunction setModel (state: IForgotPasswordState): TSetModel {\r\n return (model) => {\r\n state.model = model;\r\n };\r\n}\r\n\r\nfunction setDialogState (state: IForgotPasswordState): TSetDialogState {\r\n return (dialogState) => {\r\n state.dialogState = dialogState;\r\n };\r\n}\r\n\r\nconst forgotPasswordErrorPropToValidationProp: IIndexable = {\r\n Email: ForgotPasswordModelFieldName.Email\r\n};\r\n\r\nfunction submit (state: IForgotPasswordState): TSubmit {\r\n return async () => {\r\n setDialogState(state)(ForgotPasswordDialogState.Loading);\r\n\r\n const valid = await validationStore.doValidation({\r\n model: validationModel,\r\n value: state.model\r\n });\r\n\r\n if (!valid) {\r\n setDialogState(state)(ForgotPasswordDialogState.Inputting);\r\n return;\r\n }\r\n\r\n const handler = impl>>({\r\n onError: async (r) => {\r\n const status = r?.status ?? 500;\r\n if (status !== 500) {\r\n const data = r?.data ?? {};\r\n let unhandled = false;\r\n Object.keys(data).forEach((errKey) => {\r\n const vProp = forgotPasswordErrorPropToValidationProp[errKey];\r\n if (vProp) {\r\n validationStore.setModelFieldResult(validationModel.modelName, vProp, data[errKey].join('\\n'));\r\n } else {\r\n unhandled = true;\r\n }\r\n });\r\n if (!unhandled) {\r\n return;\r\n }\r\n }\r\n setDialogState(state)(ForgotPasswordDialogState.Error);\r\n },\r\n onSuccess: async (r) => {\r\n switch (r.status) {\r\n case ForgotPasswordStatusTypeModel.Success: {\r\n setDialogState(state)(ForgotPasswordDialogState.Success);\r\n break;\r\n }\r\n case ForgotPasswordStatusTypeModel.UserNotFound: {\r\n setDialogState(state)(ForgotPasswordDialogState.UserNotFound);\r\n break;\r\n }\r\n case ForgotPasswordStatusTypeModel.UnknownError: {\r\n setDialogState(state)(ForgotPasswordDialogState.Error);\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n await handleErrorStatus(await sendRequest(\r\n '/api/v1/users/forgotPassword',\r\n 'post',\r\n state.model\r\n ), handler);\r\n };\r\n}\r\n\r\nconst createForState = (state: IForgotPasswordState) => impl({\r\n state: readonly(state),\r\n setModel: setModel(state),\r\n setEmail: setEmail(state),\r\n setDialogState: setDialogState(state),\r\n submit: submit(state)\r\n});\r\n\r\nexport function provideStore (app?: App): void {\r\n const state = createState();\r\n if (app !== undefined) {\r\n app.provide(ForgotPasswordStoreKey, state);\r\n } else {\r\n provide(ForgotPasswordStoreKey, state);\r\n }\r\n}\r\n\r\nexport function useStore (): IForgotPasswordStore {\r\n const state = inject(ForgotPasswordStoreKey);\r\n if (state === undefined) {\r\n throw new Error('Using ForgotPasswordStore before providing it!');\r\n }\r\n return createForState(state);\r\n}\r\n","import { impl } from '@/utils/impl';\r\nimport { App, inject, provide, reactive, readonly } from 'vue';\r\nimport {\r\n IUserRegisterResponseModel,\r\n IUserRegisterStore,\r\n IUserRegisterState,\r\n TSubmit,\r\n TSetEmail,\r\n TSetFirstName,\r\n TSetLastName,\r\n TSetModel,\r\n TSetDialogState,\r\n UserRegisterDialogState,\r\n UserRegisterStatusTypeModel\r\n} from '@/store/contracts/users/register';\r\nimport validationModel, { UserRegisterModelFieldName } from '@/validation/userRegisterValidationModel';\r\nimport { store as validationStore } from '@/store/validation';\r\nimport { sendRequest } from '@/store/utils/axiosUtils';\r\nimport {\r\n handleErrorStatus,\r\n IStatusHandler\r\n} from '@/store/utils/apiResponseHandling';\r\nimport { IIndexable } from '@/utils/indexable';\r\n\r\nconst UserRegisterStoreKey = Symbol('UserRegisterStore');\r\n\r\nconst createState = () => {\r\n validationStore.clear(validationModel);\r\n return reactive(impl({\r\n model: {\r\n email: null,\r\n firstName: null,\r\n lastName: null\r\n },\r\n dialogState: UserRegisterDialogState.Inputting\r\n }));\r\n};\r\n\r\nfunction setEmail (state: IUserRegisterState): TSetEmail {\r\n return (email) => {\r\n state.model.email = email;\r\n };\r\n}\r\n\r\nfunction setModel (state: IUserRegisterState): TSetModel {\r\n return (model) => {\r\n state.model = model;\r\n };\r\n}\r\n\r\nfunction setFirstName (state: IUserRegisterState): TSetFirstName {\r\n return (firstName) => {\r\n state.model.firstName = firstName;\r\n };\r\n}\r\n\r\nfunction setLastName (state: IUserRegisterState): TSetLastName {\r\n return (lastName) => {\r\n state.model.lastName = lastName;\r\n };\r\n}\r\n\r\nfunction setDialogState (state: IUserRegisterState): TSetDialogState {\r\n return (dialogState) => {\r\n state.dialogState = dialogState;\r\n };\r\n}\r\n\r\nconst registerErrorPropToValidationProp: IIndexable = {\r\n LastName: UserRegisterModelFieldName.LastName,\r\n FirstName: UserRegisterModelFieldName.FirstName,\r\n Email: UserRegisterModelFieldName.Email\r\n};\r\n\r\nfunction submit (state: IUserRegisterState): TSubmit {\r\n return async () => {\r\n setDialogState(state)(UserRegisterDialogState.Loading);\r\n\r\n const valid = await validationStore.doValidation({\r\n model: validationModel,\r\n value: state.model\r\n });\r\n\r\n if (!valid) {\r\n setDialogState(state)(UserRegisterDialogState.Inputting);\r\n return;\r\n }\r\n\r\n const handler = impl>>({\r\n onError: async (r) => {\r\n const status = r?.status ?? 500;\r\n if (status !== 500) {\r\n const data = r?.data ?? {};\r\n let unhandled = false;\r\n Object.keys(data).forEach((errKey) => {\r\n const vProp = registerErrorPropToValidationProp[errKey];\r\n if (vProp) {\r\n validationStore.setModelFieldResult(validationModel.modelName, vProp, data[errKey].join('\\n'));\r\n } else {\r\n unhandled = true;\r\n }\r\n });\r\n if (!unhandled) {\r\n return;\r\n }\r\n }\r\n setDialogState(state)(UserRegisterDialogState.Error);\r\n },\r\n onSuccess: async (r) => {\r\n switch (r.status) {\r\n case UserRegisterStatusTypeModel.Success: {\r\n setDialogState(state)(UserRegisterDialogState.Success);\r\n break;\r\n }\r\n case UserRegisterStatusTypeModel.InvalidEmail: {\r\n setDialogState(state)(UserRegisterDialogState.InvalidEmail);\r\n break;\r\n }\r\n case UserRegisterStatusTypeModel.DuplicateEmail: {\r\n setDialogState(state)(UserRegisterDialogState.DuplicateEmail);\r\n break;\r\n }\r\n case UserRegisterStatusTypeModel.UnknownError: {\r\n setDialogState(state)(UserRegisterDialogState.Error);\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n await handleErrorStatus(await sendRequest(\r\n '/api/v1/users/register',\r\n 'post',\r\n state.model\r\n ), handler);\r\n };\r\n}\r\n\r\nconst createForState = (state: IUserRegisterState) => impl({\r\n state: readonly(state),\r\n setModel: setModel(state),\r\n setEmail: setEmail(state),\r\n setFirstName: setFirstName(state),\r\n setLastName: setLastName(state),\r\n setDialogState: setDialogState(state),\r\n submit: submit(state)\r\n});\r\n\r\nexport function provideStore (app?: App): void {\r\n const state = createState();\r\n if (app !== undefined) {\r\n app.provide(UserRegisterStoreKey, state);\r\n } else {\r\n provide(UserRegisterStoreKey, state);\r\n }\r\n}\r\n\r\nexport function useStore (): IUserRegisterStore {\r\n const state = inject(UserRegisterStoreKey);\r\n if (state === undefined) {\r\n throw new Error('Using UserRegisterStore before providing it!');\r\n }\r\n return createForState(state);\r\n}\r\n","import { AxiosResponse } from 'axios';\r\nimport router from '@/router';\r\nimport { ErrorRoutes } from '@/router/routes/error';\r\nimport { LoginRoutes } from '@/router/routes/login';\r\nimport { impl } from '@/utils/impl';\r\n\r\nexport enum ResponseStatus {\r\n Success = 'Success',\r\n NotFound = 'NotFound',\r\n Error = 'Error',\r\n NotAuthenticated = 'NotAuthenticated',\r\n Cancel = 'Cancel'\r\n}\r\n\r\nexport type IsError = ResponseStatus.NotFound | ResponseStatus.Error | ResponseStatus.NotAuthenticated | ResponseStatus.Cancel;\r\n\r\nexport type ApiResponse = [T | IsError, AxiosResponse | null];\r\n\r\nexport function isError ([result, _]: ApiResponse): boolean {\r\n return result === ResponseStatus.NotFound ||\r\n result === ResponseStatus.Error ||\r\n result === ResponseStatus.NotAuthenticated ||\r\n result === ResponseStatus.Cancel;\r\n}\r\n\r\nexport interface IStatusHandler {\r\n onNotFound: (response: AxiosResponse | null) => Promise;\r\n onError: (response: AxiosResponse | null) => Promise;\r\n onNotAuthenticated: (response: AxiosResponse | null) => Promise;\r\n onCancel: (response: AxiosResponse | null) => Promise;\r\n onSuccess: (value: R) => Promise;\r\n}\r\n\r\nexport const DefaultIStatusHandler: IStatusHandler = {\r\n onNotFound: async (_) => { router.push({ name: ErrorRoutes.notFound }); },\r\n onError: async (_) => { router.push({ name: ErrorRoutes.error }); },\r\n onNotAuthenticated: async (_) => { router.push({ name: LoginRoutes.login }); },\r\n onCancel: async (_) => { router.push({ name: ErrorRoutes.error }); },\r\n onSuccess: async (_) => { /* Do Nothing */ }\r\n};\r\n\r\nexport function chainHandlers (first?: Partial>, second?: Partial>): Partial> {\r\n const result = impl>>({});\r\n if (first?.onNotFound || second?.onNotFound) {\r\n result.onNotFound = async (response) => {\r\n if (first?.onNotFound) { await first.onNotFound(response); }\r\n if (second?.onNotFound) { await second.onNotFound(response); }\r\n };\r\n }\r\n if (first?.onNotAuthenticated || second?.onNotAuthenticated) {\r\n result.onNotAuthenticated = async (response) => {\r\n if (first?.onNotAuthenticated) { await first.onNotAuthenticated(response); }\r\n if (second?.onNotAuthenticated) { await second.onNotAuthenticated(response); }\r\n };\r\n }\r\n if (first?.onError || second?.onError) {\r\n result.onError = async (response) => {\r\n if (first?.onError) { await first.onError(response); }\r\n if (second?.onError) { await second.onError(response); }\r\n };\r\n }\r\n if (first?.onCancel || second?.onCancel) {\r\n result.onCancel = async (response) => {\r\n if (first?.onCancel) { await first.onCancel(response); }\r\n if (second?.onCancel) { await second.onCancel(response); }\r\n };\r\n }\r\n if (first?.onSuccess || second?.onSuccess) {\r\n result.onSuccess = async (response) => {\r\n if (first?.onSuccess) { await first.onSuccess(response); }\r\n if (second?.onSuccess) { await second.onSuccess(response); }\r\n };\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * handle the response status if it is an error\r\n * and route the user to the respective error page.\r\n * @param status the response status\r\n * @returns true if status was error. false otherwise.\r\n */\r\nexport async function handleErrorStatus (\r\n [result, response]: ApiResponse,\r\n customHandler?: Partial>\r\n): Promise {\r\n const handler: IStatusHandler = {\r\n onNotFound: customHandler?.onNotFound ??\r\n DefaultIStatusHandler.onNotFound,\r\n onError: customHandler?.onError ??\r\n DefaultIStatusHandler.onError,\r\n onNotAuthenticated: customHandler?.onNotAuthenticated ??\r\n DefaultIStatusHandler.onNotAuthenticated,\r\n onCancel: customHandler?.onCancel ??\r\n DefaultIStatusHandler.onCancel,\r\n onSuccess: customHandler?.onSuccess ??\r\n DefaultIStatusHandler.onSuccess\r\n };\r\n switch (result) {\r\n case ResponseStatus.NotFound:\r\n await handler.onNotFound(response);\r\n return true;\r\n case ResponseStatus.Error:\r\n await handler.onError(response);\r\n return true;\r\n case ResponseStatus.NotAuthenticated:\r\n await handler.onNotAuthenticated(response);\r\n return true;\r\n case ResponseStatus.Cancel:\r\n await handler.onCancel(response);\r\n return true;\r\n default:\r\n await handler.onSuccess(result);\r\n return false;\r\n }\r\n}\r\n\r\nexport async function mapResultStatus (\r\n [result, response]: ApiResponse,\r\n valueMapping: (result: D) => Promise\r\n): Promise> {\r\n switch (result) {\r\n case ResponseStatus.NotFound:\r\n case ResponseStatus.Error:\r\n case ResponseStatus.NotAuthenticated:\r\n case ResponseStatus.Cancel:\r\n return [result, response];\r\n }\r\n return [await valueMapping(result), response];\r\n}\r\n\r\nexport async function handleErrorStatusResult (\r\n apiResponse: ApiResponse,\r\n customHandler?: Partial>\r\n): Promise {\r\n const [result] = apiResponse;\r\n const isError = await handleErrorStatus(apiResponse, customHandler);\r\n if (isError) {\r\n return undefined;\r\n } else {\r\n return result as D;\r\n }\r\n}\r\n\r\nexport async function handleErrorStatusResults (\r\n statuses: Array>,\r\n customHandler?: Partial>\r\n): Promise> {\r\n return statuses.reduce(\r\n async (accumulator, current) => {\r\n const acc = await accumulator;\r\n const hasUndef = !!acc.find((v) => v === undefined);\r\n if (hasUndef) {\r\n return [...acc.map(() => undefined), undefined];\r\n } else {\r\n const nextResult = await handleErrorStatusResult(current, customHandler);\r\n return [...acc, nextResult];\r\n }\r\n },\r\n Promise.resolve([] as Array)\r\n );\r\n}\r\n\r\n/**\r\n * If the first status is error, return the error. Otherwise, execute and return the nextStatus.\r\n * @param status first status\r\n * @param nextStatus next status function\r\n * @return next status or error.\r\n */\r\nexport async function chainStatusResults (\r\n apiResponse: Promise>,\r\n nextStatus: (previousStatus: D) => Promise>\r\n): Promise> {\r\n const [result, response] = await apiResponse;\r\n switch (result) {\r\n case ResponseStatus.NotFound:\r\n case ResponseStatus.Error:\r\n case ResponseStatus.NotAuthenticated:\r\n case ResponseStatus.Cancel:\r\n return [result, response];\r\n }\r\n return await nextStatus(result);\r\n}\r\n","import Axios, { AxiosRequestConfig, CancelToken } from 'axios';\r\nimport { ApiResponse, ResponseStatus } from './apiResponseHandling';\r\n\r\nexport async function sendRequest (\r\n url: string,\r\n method: 'get' | 'post' | 'delete',\r\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\r\n data?: any,\r\n cancelToken?: CancelToken\r\n): Promise> {\r\n try {\r\n let config: AxiosRequestConfig;\r\n if (method === 'get') {\r\n config = {\r\n url,\r\n method,\r\n withCredentials: true,\r\n params: data,\r\n cancelToken: cancelToken\r\n };\r\n } else {\r\n config = {\r\n url,\r\n method,\r\n withCredentials: true,\r\n data,\r\n cancelToken\r\n };\r\n }\r\n\r\n const result = await Axios.request(config);\r\n return [result.data, result];\r\n } catch (e) {\r\n if (e.response && e.response.status === 401) {\r\n return [ResponseStatus.NotAuthenticated, e.response];\r\n } else if (e.response && e.response.status === 404) {\r\n return [ResponseStatus.NotFound, e.response];\r\n } else if (Axios.isCancel(e)) {\r\n return [ResponseStatus.Cancel, null];\r\n }\r\n return [ResponseStatus.Error, e.response ?? null];\r\n }\r\n}\r\n","import {\r\n IModelValue,\r\n IValidationState,\r\n IValidationStore,\r\n TFieldErrorMessage,\r\n TFieldIsError,\r\n TFieldResult,\r\n TModelResults,\r\n TIsValid,\r\n TSetResults,\r\n TSetModelFieldResult,\r\n TDoValidations,\r\n TDoValidation,\r\n TDoFieldsValidation,\r\n IModelFieldValue,\r\n TClear,\r\n TReset\r\n} from '@/store/contracts/validation';\r\nimport { impl } from '@/utils/impl';\r\nimport { IIndexable } from '@/utils/indexable';\r\nimport { ValidationModel } from '@/validation';\r\nimport { App, inject, provide, reactive, readonly } from 'vue';\r\nimport { setLoginLogoutListener } from '@/store/contracts/loginStore';\r\n\r\nconst ValidationStoreKey = Symbol('ValidationStore');\r\n\r\nconst createState = () => reactive(impl({\r\n results: {}\r\n}));\r\n\r\nfunction modelResults (state: IValidationState): TModelResults {\r\n return (modelName: string) => state.results[modelName] ?? {};\r\n}\r\n\r\nfunction fieldResult (state: IValidationState): TFieldResult {\r\n return (modelName: string, fieldKey: string) =>\r\n modelResults(state)(modelName)[fieldKey] ?? true;\r\n}\r\n\r\nfunction fieldIsError (state: IValidationState): TFieldIsError {\r\n return (modelName: string, fieldKey: string) =>\r\n fieldResult(state)(modelName, fieldKey) !== true;\r\n}\r\n\r\nfunction fieldErrorMessage (state: IValidationState): TFieldErrorMessage {\r\n return (modelName: string, fieldKey: string) => {\r\n const result = fieldResult(state)(modelName, fieldKey);\r\n return result === true ? '' : result;\r\n };\r\n}\r\n\r\nfunction isValid (state: IValidationState): TIsValid {\r\n return (model: ValidationModel, checkSubModels?: boolean) => {\r\n const checkSubModelsValue = checkSubModels ?? true;\r\n const startsWithCheck = `${model.modelName}:`;\r\n const subModels = Object.keys(state.results)\r\n .filter((k) => k.startsWith(startsWithCheck) && checkSubModelsValue);\r\n return [model.modelName, ...subModels].flatMap((modelName) => {\r\n return Object.keys(state.results[modelName] ?? {})\r\n .map((fieldKey) => fieldIsError(state)(modelName, fieldKey));\r\n }).none((isError) => isError);\r\n };\r\n}\r\n\r\nfunction setResults (state: IValidationState): TSetResults {\r\n return (results: IIndexable>) => {\r\n state.results = results;\r\n };\r\n}\r\n\r\nfunction setModelFieldResult (state: IValidationState): TSetModelFieldResult {\r\n return (modelName: string, fieldKey: string, value: string | true) => {\r\n if (state.results[modelName] === undefined) {\r\n state.results[modelName] = {};\r\n }\r\n state.results[modelName][fieldKey] = value;\r\n };\r\n}\r\n\r\nfunction areValid (state: IValidationState) : (models: Array>, checkSubModels?: boolean) => boolean {\r\n return (models: Array>, checkSubModels?: boolean) =>\r\n models.reduce(\r\n (acc: boolean, curr) => acc && isValid(state)(curr, checkSubModels),\r\n true);\r\n}\r\n\r\nasync function validateModel (\r\n dataGetter: () => IIndexable>,\r\n { model, value }: IModelValue)\r\n : Promise>> {\r\n const result = await model.validate(value);\r\n const data = dataGetter();\r\n return {\r\n ...data,\r\n [model.modelName]: {\r\n ...data[model.modelName],\r\n ...result\r\n }\r\n };\r\n}\r\n\r\nasync function validateModelField (\r\n dataGetter: () => IIndexable>,\r\n field: string,\r\n { model, value }: IModelValue)\r\n : Promise>> {\r\n const result = await model.validateField(field, value);\r\n const data = dataGetter();\r\n return {\r\n ...data,\r\n [model.modelName]: {\r\n ...(data[model.modelName] ?? {}),\r\n [field]: result\r\n }\r\n };\r\n}\r\n\r\nfunction doValidations (state: IValidationState): TDoValidations {\r\n return async (models: IModelValue[]) => {\r\n const newResults = await (models.reduce(\r\n async (acc, curr) => {\r\n const results = await acc;\r\n setResults(state)(results);\r\n return validateModel(() => state.results, curr);\r\n },\r\n Promise.resolve(state.results)));\r\n setResults(state)(newResults);\r\n return areValid(state)(\r\n models.map(({ model }: IModelValue) => model),\r\n true);\r\n };\r\n}\r\n\r\nfunction doValidation (state: IValidationState): TDoValidation {\r\n return (modelValue: IModelValue) => doValidations(state)([modelValue]);\r\n}\r\n\r\nfunction doFieldsValidation (state: IValidationState): TDoFieldsValidation {\r\n return async ({ model, fields, value }: IModelFieldValue) => {\r\n const newResults = await (fields.reduce(\r\n async (acc, curr) => {\r\n const results = await acc;\r\n setResults(state)(results);\r\n return validateModelField(\r\n () => state.results,\r\n curr,\r\n { model, value });\r\n },\r\n Promise.resolve(state.results)));\r\n setResults(state)(newResults);\r\n return isValid(state)(model, true);\r\n };\r\n}\r\n\r\nfunction clear (state: IValidationState): TClear {\r\n return (model: ValidationModel) => {\r\n const startsWithCheck = `${model.modelName}:`;\r\n const subModels = Object.keys(state.results).filter((k) => k.startsWith(startsWithCheck));\r\n const newResults = {\r\n ...state.results,\r\n [model.modelName]: {}\r\n };\r\n subModels.forEach((subModel) => { newResults[subModel] = {}; });\r\n setResults(state)(newResults);\r\n };\r\n}\r\n\r\nfunction reset (state: IValidationState): TReset {\r\n return () => {\r\n setResults(state)({});\r\n };\r\n}\r\n\r\nconst storeState = createState();\r\n\r\nconst createForState = (state: IValidationState) => impl({\r\n state: readonly(state),\r\n modelResults: modelResults(state),\r\n fieldResult: fieldResult(state),\r\n fieldIsError: fieldIsError(state),\r\n fieldErrorMessage: fieldErrorMessage(state),\r\n isValid: isValid(state),\r\n setResults: setResults(state),\r\n setModelFieldResult: setModelFieldResult(state),\r\n doValidation: doValidation(state),\r\n doValidations: doValidations(state),\r\n doFieldsValidation: doFieldsValidation(state),\r\n clear: clear(state),\r\n reset: reset(state)\r\n});\r\n\r\nexport const store: IValidationStore = createForState(storeState);\r\n\r\nexport function provideStore (app?: App): void {\r\n const onLoginlogout = async () => store.reset();\r\n setLoginLogoutListener(\r\n ValidationStoreKey.toString(),\r\n onLoginlogout,\r\n onLoginlogout);\r\n if (app !== undefined) {\r\n app.provide(ValidationStoreKey, storeState);\r\n } else {\r\n provide(ValidationStoreKey, storeState);\r\n }\r\n}\r\n\r\nexport function useStore (): IValidationStore {\r\n const state = inject(ValidationStoreKey);\r\n if (state === undefined) {\r\n throw new Error('Using ValidationStore before providing it!');\r\n }\r\n return createForState(state);\r\n}\r\n","export function twoDigitDates (value: number): string {\r\n return value < 10 ? `0${value}` : value.toString();\r\n}\r\n","FileList.prototype.toArray = function (): File[] {\r\n const files: File[] = [];\r\n for (let i = 0; i < this.length; i++) {\r\n const f = this.item(i);\r\n if (f != null) {\r\n files.push(f);\r\n }\r\n }\r\n return files;\r\n};\r\n","/**\r\n * Use function snytax for creating an implementation of an interface\r\n * Without the need for an explicit cast, which would remove compile-time type safety.\r\n *\r\n * @param i the interface implementation\r\n * @return the interface implementation\r\n */\r\nexport function impl (i: I): I {\r\n return i;\r\n}\r\n","export function isNullOrWhitespace (value: V | null | undefined): boolean {\r\n return value === null || value === undefined || `${value}`.trim() === '';\r\n}\r\n\r\nexport function cleanFileName (value: string | null | undefined): string | null | undefined {\r\n if (value === null || value === undefined || value.length <= 0) {\r\n return value;\r\n }\r\n const fileExtension = value.split('.').pop() ?? '';\r\n return encodeURIComponent(`${value.substring(0, value.length - fileExtension.length).replace(/\\W/g, '')}.${fileExtension}`);\r\n}\r\n\r\nexport function upperFirstLetter (value: string | null | undefined): string | null | undefined {\r\n if (!value) {\r\n return value;\r\n }\r\n\r\n return value.charAt(0).toUpperCase() + value.slice(1);\r\n}\r\n","export function delay (ms: number): Promise {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n","// import {FORMAT_DATE, FORMAT_TIME} from '@/utils/dateTime';\r\n// import moment from 'moment';\r\nimport { IFieldValidationContext } from '@/validation';\r\n\r\nexport type TValidationRule = (context: IFieldValidationContext) => Promise;\r\n\r\nexport const stringRequiredRule = getValueRequiredRule((value) => value !== null && value.trim().length > 0);\r\nexport const numberRequiredRule = getValueRequiredRule();\r\n\r\nexport function getValueRequiredRule (\r\n check?: (value: V | null) => boolean)\r\n : (errorMessage?: string) => TValidationRule {\r\n const checker = check ?? ((value) => value !== null);\r\n return (errorMessage?: string) => {\r\n const errorMsg = errorMessage ?? 'Please enter a value.';\r\n return async ({ value }: IFieldValidationContext) => checker(value) || errorMsg;\r\n };\r\n}\r\n\r\n// Tested this here: https://regexr.com/5scv9 so I know it's good.\r\nconst emailRegex = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\r\n\r\nexport function emailFormatRule (message?: string): TValidationRule {\r\n return async ({ value }: IFieldValidationContext) =>\r\n value === null || emailRegex.test(value.toLowerCase()) || (message ?? `${value} is not a valid email.`);\r\n}\r\n\r\nexport interface IPasswordValidationOptions {\r\n length?: number;\r\n containsNumber?: true;\r\n containsUpper?: true;\r\n containsLower?: true;\r\n containsSymbol?: true;\r\n}\r\n\r\nconst digitRegex = /[0-9]/;\r\nconst symbolRegex = /[^a-zA-Z\\d\\s:]/;\r\nconst upperRegex = /[A-Z]/;\r\nconst lowerRegex = /[a-z]/;\r\n\r\nexport function passwordRequirements (options: IPasswordValidationOptions, fieldName = 'Password'): TValidationRule {\r\n return async ({ value }: IFieldValidationContext) => {\r\n if (value === null) {\r\n // We don't check password required here. use stringRequiredRule for that.\r\n return true;\r\n }\r\n\r\n if (options.length !== undefined) {\r\n if (value.length < options.length) {\r\n return `${fieldName} must be at least ${options.length} characters.`;\r\n }\r\n }\r\n\r\n if (options.containsNumber) {\r\n if (!digitRegex.test(value)) {\r\n return `${fieldName} should contain at least one number.`;\r\n }\r\n }\r\n\r\n if (options.containsLower) {\r\n if (!lowerRegex.test(value)) {\r\n return `${fieldName} should contain at least lowercase letter.`;\r\n }\r\n }\r\n\r\n if (options.containsUpper) {\r\n if (!upperRegex.test(value)) {\r\n return `${fieldName} should contain at least uppercase letter.`;\r\n }\r\n }\r\n\r\n if (options.containsSymbol) {\r\n if (!symbolRegex.test(value)) {\r\n return `${fieldName} should contain at least one symbol (#,$,%,^,&, etc).`;\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n}\r\n\r\n/*\r\n For now, we don't have a need for validating dates.\r\n When we do, we can add moment as a dependency and\r\n uncomment the following code to get some common validator rules.\r\n*/\r\n\r\n// export const dateFormatRule = getDateFormatRule();\r\n// export const timeFormatRule = getTimeFormatRule();\r\n\r\n// export const dateRequiredRule: (errorMessage?: string)\r\n// => (context: IFieldValidationContext)\r\n// => Promise = (errorMessage?: string) => {\r\n// const errMsg = errorMessage ?? `Date ${FORMAT_DATE.toLowerCase()} is required.`;\r\n// return getValueRequiredRule(\r\n// (value) => value !== null && (value instanceof Date || value !== ''))(errMsg);\r\n// };\r\n\r\n// export function getDateFormatRule (\r\n// dateFormat?: string)\r\n// : (errorMessage?: string) => (context: IFieldValidationContext) => Promise {\r\n// const format = dateFormat ?? FORMAT_DATE;\r\n// return (errorMessage?: string) => {\r\n// const errorMsg = errorMessage ?? `Date invalid format ${format.toLowerCase()}.`;\r\n// return async ({ value }: IFieldValidationContext) => !value ||\r\n// value instanceof Date ||\r\n// (value.length === format.length && moment(value, format).isValid()) ||\r\n// errorMsg;\r\n// };\r\n// }\r\n\r\n// export function getTimeFormatRule (\r\n// timeFormat?: string)\r\n// : (errorMessage?: string) => (context: IFieldValidationContext) => Promise {\r\n// const format = timeFormat ?? FORMAT_TIME;\r\n// return (errorMessage?: string) => {\r\n// const errorMsg = errorMessage ?? `Time invalid format ${format.toLowerCase()}.`;\r\n// return async ({ value }: IFieldValidationContext) => !value ||\r\n// moment(`01/01/1979 ${value.toUpperCase()}`, `MM/DD/YYYY ${format}`).isValid() ||\r\n// errorMsg;\r\n// };\r\n// }\r\n","import { IForgotPasswordModel } from '@/store/contracts/users/forgotPassword';\r\nimport { ValidationModel } from '@/validation';\r\nimport {\r\n emailFormatRule,\r\n stringRequiredRule\r\n} from '@/validation/common/rules';\r\n\r\nexport enum ForgotPasswordModelFieldName {\r\n Email = 'email'\r\n}\r\n\r\nclass ForgotPasswordValidationModel extends ValidationModel {\r\n constructor () {\r\n super();\r\n\r\n this.setField(ForgotPasswordModelFieldName.Email, {\r\n getter: (model: IForgotPasswordModel | null) => model?.email ?? null,\r\n rules: [\r\n stringRequiredRule('Email is required'),\r\n emailFormatRule()\r\n ]\r\n });\r\n }\r\n\r\n public get modelName (): string {\r\n return 'UserRegister';\r\n }\r\n}\r\n\r\nexport default new ForgotPasswordValidationModel();\r\n","import { IIndexable } from '@/utils/indexable';\r\n\r\nexport interface IFieldValidationContext {\r\n modelName: string;\r\n model: T | null;\r\n value: V;\r\n}\r\n\r\nexport interface IValidationField {\r\n getter: (model: T | null) => V;\r\n rules: Array<(validationContext: IFieldValidationContext) => Promise>;\r\n}\r\n\r\nexport abstract class ValidationModel {\r\n public fields: IIndexable> = {};\r\n\r\n public abstract get modelName(): string;\r\n\r\n public setField (key: string, field: IValidationField): void {\r\n this.fields[key] = field;\r\n }\r\n\r\n public async validateField (key: string, model: T | null): Promise {\r\n const field = this.fields[key];\r\n if (field === undefined) {\r\n return true;\r\n }\r\n const value: V = field.getter(model);\r\n return (await Promise.all(\r\n field.rules\r\n .map((rule) => rule({\r\n modelName: this.modelName,\r\n model,\r\n value\r\n }))\r\n )).filter((result) => result !== true)[0] ?? true;\r\n }\r\n\r\n public async validate (model: T | null): Promise> {\r\n const results: IIndexable = {};\r\n await Promise.all(\r\n Object.keys(this.fields).map(async (key) => {\r\n results[key] = await this.validateField(key, model);\r\n })\r\n );\r\n return results;\r\n }\r\n\r\n public createForUUID (index: string): ValidationModel {\r\n const thisModel = this;\r\n // disabling max class per file since this is anonymous.\r\n // tslint:disable-next-line: max-classes-per-file\r\n return new (class ValueValidationModel extends ValidationModel {\r\n constructor () {\r\n super();\r\n this.fields = thisModel.fields;\r\n }\r\n\r\n public get modelName (): string {\r\n return `${thisModel.modelName}:[${index}]`;\r\n }\r\n })();\r\n }\r\n\r\n public createForIndex (index: number): ValidationModel {\r\n const thisModel = this;\r\n // disabling max class per file since this is anonymous.\r\n // tslint:disable-next-line: max-classes-per-file\r\n return new (class ValueValidationModel extends ValidationModel {\r\n constructor () {\r\n super();\r\n this.fields = thisModel.fields;\r\n }\r\n\r\n public get modelName (): string {\r\n return `${thisModel.modelName}:[${index}]`;\r\n }\r\n })();\r\n }\r\n\r\n public createForParent

(parentModel: ValidationModel

): ValidationModel {\r\n const thisModel = this;\r\n // disabling max class per file since this is anonymous.\r\n // tslint:disable-next-line: max-classes-per-file\r\n return new (class ValueValidationModel extends ValidationModel {\r\n constructor () {\r\n super();\r\n this.fields = thisModel.fields;\r\n }\r\n\r\n public get modelName (): string {\r\n return `${parentModel.modelName}:${thisModel.modelName}`;\r\n }\r\n })();\r\n }\r\n}\r\n\r\nexport function createValidationModel (name: string): ValidationModel {\r\n // disabling max class per file since this is anonymous.\r\n // tslint:disable-next-line:max-classes-per-file\r\n return new (class NamedValidationModel extends ValidationModel {\r\n public get modelName (): string {\r\n return name;\r\n }\r\n })();\r\n}\r\n","import { IUserRegisterModel } from '@/store/contracts/users/register';\r\nimport { ValidationModel } from '@/validation';\r\nimport {\r\n emailFormatRule,\r\n stringRequiredRule\r\n} from '@/validation/common/rules';\r\n\r\nexport enum UserRegisterModelFieldName {\r\n Email = 'email',\r\n FirstName = 'firstName',\r\n LastName = 'lastName'\r\n}\r\n\r\nclass UserRegisterValidationModel extends ValidationModel {\r\n constructor () {\r\n super();\r\n\r\n this.setField(UserRegisterModelFieldName.Email, {\r\n getter: (model: IUserRegisterModel | null) => model?.email ?? null,\r\n rules: [\r\n stringRequiredRule('Email is required'),\r\n emailFormatRule()\r\n ]\r\n });\r\n\r\n this.setField(UserRegisterModelFieldName.FirstName, {\r\n getter: (model: IUserRegisterModel | null) => model?.firstName ?? null,\r\n rules: [\r\n stringRequiredRule('First Name is required')\r\n ]\r\n });\r\n\r\n this.setField(UserRegisterModelFieldName.LastName, {\r\n getter: (model: IUserRegisterModel | null) => model?.lastName ?? null,\r\n rules: [\r\n stringRequiredRule('Last Name is required')\r\n ]\r\n });\r\n }\r\n\r\n public get modelName (): string {\r\n return 'UserRegister';\r\n }\r\n}\r\n\r\nexport default new UserRegisterValidationModel();\r\n","var map = {\n\t\"./af\": 49058,\n\t\"./af.js\": 49058,\n\t\"./ar\": 60798,\n\t\"./ar-dz\": 7757,\n\t\"./ar-dz.js\": 7757,\n\t\"./ar-kw\": 72509,\n\t\"./ar-kw.js\": 72509,\n\t\"./ar-ly\": 86892,\n\t\"./ar-ly.js\": 86892,\n\t\"./ar-ma\": 90365,\n\t\"./ar-ma.js\": 90365,\n\t\"./ar-ps\": 2114,\n\t\"./ar-ps.js\": 2114,\n\t\"./ar-sa\": 11687,\n\t\"./ar-sa.js\": 11687,\n\t\"./ar-tn\": 241,\n\t\"./ar-tn.js\": 241,\n\t\"./ar.js\": 60798,\n\t\"./az\": 18710,\n\t\"./az.js\": 18710,\n\t\"./be\": 34928,\n\t\"./be.js\": 34928,\n\t\"./bg\": 55354,\n\t\"./bg.js\": 55354,\n\t\"./bm\": 11704,\n\t\"./bm.js\": 11704,\n\t\"./bn\": 91345,\n\t\"./bn-bd\": 14188,\n\t\"./bn-bd.js\": 14188,\n\t\"./bn.js\": 91345,\n\t\"./bo\": 23458,\n\t\"./bo.js\": 23458,\n\t\"./br\": 4949,\n\t\"./br.js\": 4949,\n\t\"./bs\": 93110,\n\t\"./bs.js\": 93110,\n\t\"./ca\": 15861,\n\t\"./ca.js\": 15861,\n\t\"./cs\": 3203,\n\t\"./cs.js\": 3203,\n\t\"./cv\": 45840,\n\t\"./cv.js\": 45840,\n\t\"./cy\": 80365,\n\t\"./cy.js\": 80365,\n\t\"./da\": 10678,\n\t\"./da.js\": 10678,\n\t\"./de\": 26634,\n\t\"./de-at\": 7202,\n\t\"./de-at.js\": 7202,\n\t\"./de-ch\": 82068,\n\t\"./de-ch.js\": 82068,\n\t\"./de.js\": 26634,\n\t\"./dv\": 92999,\n\t\"./dv.js\": 92999,\n\t\"./el\": 31492,\n\t\"./el.js\": 31492,\n\t\"./en-au\": 51421,\n\t\"./en-au.js\": 51421,\n\t\"./en-ca\": 83079,\n\t\"./en-ca.js\": 83079,\n\t\"./en-gb\": 56238,\n\t\"./en-gb.js\": 56238,\n\t\"./en-ie\": 37605,\n\t\"./en-ie.js\": 37605,\n\t\"./en-il\": 22318,\n\t\"./en-il.js\": 22318,\n\t\"./en-in\": 58436,\n\t\"./en-in.js\": 58436,\n\t\"./en-nz\": 79079,\n\t\"./en-nz.js\": 79079,\n\t\"./en-sg\": 61237,\n\t\"./en-sg.js\": 61237,\n\t\"./eo\": 56077,\n\t\"./eo.js\": 56077,\n\t\"./es\": 69369,\n\t\"./es-do\": 80711,\n\t\"./es-do.js\": 80711,\n\t\"./es-mx\": 66715,\n\t\"./es-mx.js\": 66715,\n\t\"./es-us\": 75710,\n\t\"./es-us.js\": 75710,\n\t\"./es.js\": 69369,\n\t\"./et\": 33836,\n\t\"./et.js\": 33836,\n\t\"./eu\": 34099,\n\t\"./eu.js\": 34099,\n\t\"./fa\": 18824,\n\t\"./fa.js\": 18824,\n\t\"./fi\": 98432,\n\t\"./fi.js\": 98432,\n\t\"./fil\": 82694,\n\t\"./fil.js\": 82694,\n\t\"./fo\": 46518,\n\t\"./fo.js\": 46518,\n\t\"./fr\": 27857,\n\t\"./fr-ca\": 93574,\n\t\"./fr-ca.js\": 93574,\n\t\"./fr-ch\": 6733,\n\t\"./fr-ch.js\": 6733,\n\t\"./fr.js\": 27857,\n\t\"./fy\": 28912,\n\t\"./fy.js\": 28912,\n\t\"./ga\": 81105,\n\t\"./ga.js\": 81105,\n\t\"./gd\": 65902,\n\t\"./gd.js\": 65902,\n\t\"./gl\": 34118,\n\t\"./gl.js\": 34118,\n\t\"./gom-deva\": 89047,\n\t\"./gom-deva.js\": 89047,\n\t\"./gom-latn\": 38536,\n\t\"./gom-latn.js\": 38536,\n\t\"./gu\": 2813,\n\t\"./gu.js\": 2813,\n\t\"./he\": 29758,\n\t\"./he.js\": 29758,\n\t\"./hi\": 26410,\n\t\"./hi.js\": 26410,\n\t\"./hr\": 63919,\n\t\"./hr.js\": 63919,\n\t\"./hu\": 83534,\n\t\"./hu.js\": 83534,\n\t\"./hy-am\": 16489,\n\t\"./hy-am.js\": 16489,\n\t\"./id\": 11920,\n\t\"./id.js\": 11920,\n\t\"./is\": 98293,\n\t\"./is.js\": 98293,\n\t\"./it\": 81440,\n\t\"./it-ch\": 55002,\n\t\"./it-ch.js\": 55002,\n\t\"./it.js\": 81440,\n\t\"./ja\": 76500,\n\t\"./ja.js\": 76500,\n\t\"./jv\": 34577,\n\t\"./jv.js\": 34577,\n\t\"./ka\": 65389,\n\t\"./ka.js\": 65389,\n\t\"./kk\": 45699,\n\t\"./kk.js\": 45699,\n\t\"./km\": 80713,\n\t\"./km.js\": 80713,\n\t\"./kn\": 47760,\n\t\"./kn.js\": 47760,\n\t\"./ko\": 71911,\n\t\"./ko.js\": 71911,\n\t\"./ku\": 73697,\n\t\"./ku-kmr\": 70234,\n\t\"./ku-kmr.js\": 70234,\n\t\"./ku.js\": 73697,\n\t\"./ky\": 17781,\n\t\"./ky.js\": 17781,\n\t\"./lb\": 85835,\n\t\"./lb.js\": 85835,\n\t\"./lo\": 11344,\n\t\"./lo.js\": 11344,\n\t\"./lt\": 15041,\n\t\"./lt.js\": 15041,\n\t\"./lv\": 96223,\n\t\"./lv.js\": 96223,\n\t\"./me\": 27963,\n\t\"./me.js\": 27963,\n\t\"./mi\": 98391,\n\t\"./mi.js\": 98391,\n\t\"./mk\": 28953,\n\t\"./mk.js\": 28953,\n\t\"./ml\": 93420,\n\t\"./ml.js\": 93420,\n\t\"./mn\": 23510,\n\t\"./mn.js\": 23510,\n\t\"./mr\": 53858,\n\t\"./mr.js\": 53858,\n\t\"./ms\": 21745,\n\t\"./ms-my\": 62668,\n\t\"./ms-my.js\": 62668,\n\t\"./ms.js\": 21745,\n\t\"./mt\": 74724,\n\t\"./mt.js\": 74724,\n\t\"./my\": 5831,\n\t\"./my.js\": 5831,\n\t\"./nb\": 17753,\n\t\"./nb.js\": 17753,\n\t\"./ne\": 58924,\n\t\"./ne.js\": 58924,\n\t\"./nl\": 35995,\n\t\"./nl-be\": 78485,\n\t\"./nl-be.js\": 78485,\n\t\"./nl.js\": 35995,\n\t\"./nn\": 99901,\n\t\"./nn.js\": 99901,\n\t\"./oc-lnc\": 79005,\n\t\"./oc-lnc.js\": 79005,\n\t\"./pa-in\": 55512,\n\t\"./pa-in.js\": 55512,\n\t\"./pl\": 23901,\n\t\"./pl.js\": 23901,\n\t\"./pt\": 85925,\n\t\"./pt-br\": 4110,\n\t\"./pt-br.js\": 4110,\n\t\"./pt.js\": 85925,\n\t\"./ro\": 97394,\n\t\"./ro.js\": 97394,\n\t\"./ru\": 62384,\n\t\"./ru.js\": 62384,\n\t\"./sd\": 52410,\n\t\"./sd.js\": 52410,\n\t\"./se\": 7465,\n\t\"./se.js\": 7465,\n\t\"./si\": 92141,\n\t\"./si.js\": 92141,\n\t\"./sk\": 66827,\n\t\"./sk.js\": 66827,\n\t\"./sl\": 23394,\n\t\"./sl.js\": 23394,\n\t\"./sq\": 2005,\n\t\"./sq.js\": 2005,\n\t\"./sr\": 20428,\n\t\"./sr-cyrl\": 82659,\n\t\"./sr-cyrl.js\": 82659,\n\t\"./sr.js\": 20428,\n\t\"./ss\": 86515,\n\t\"./ss.js\": 86515,\n\t\"./sv\": 61856,\n\t\"./sv.js\": 61856,\n\t\"./sw\": 67927,\n\t\"./sw.js\": 67927,\n\t\"./ta\": 77126,\n\t\"./ta.js\": 77126,\n\t\"./te\": 44666,\n\t\"./te.js\": 44666,\n\t\"./tet\": 27228,\n\t\"./tet.js\": 27228,\n\t\"./tg\": 7344,\n\t\"./tg.js\": 7344,\n\t\"./th\": 58221,\n\t\"./th.js\": 58221,\n\t\"./tk\": 59812,\n\t\"./tk.js\": 59812,\n\t\"./tl-ph\": 57466,\n\t\"./tl-ph.js\": 57466,\n\t\"./tlh\": 67317,\n\t\"./tlh.js\": 67317,\n\t\"./tr\": 78771,\n\t\"./tr.js\": 78771,\n\t\"./tzl\": 60823,\n\t\"./tzl.js\": 60823,\n\t\"./tzm\": 54752,\n\t\"./tzm-latn\": 12928,\n\t\"./tzm-latn.js\": 12928,\n\t\"./tzm.js\": 54752,\n\t\"./ug-cn\": 9099,\n\t\"./ug-cn.js\": 9099,\n\t\"./uk\": 52193,\n\t\"./uk.js\": 52193,\n\t\"./ur\": 69978,\n\t\"./ur.js\": 69978,\n\t\"./uz\": 57314,\n\t\"./uz-latn\": 63586,\n\t\"./uz-latn.js\": 63586,\n\t\"./uz.js\": 57314,\n\t\"./vi\": 43184,\n\t\"./vi.js\": 43184,\n\t\"./x-pseudo\": 68708,\n\t\"./x-pseudo.js\": 68708,\n\t\"./yo\": 36129,\n\t\"./yo.js\": 36129,\n\t\"./zh-cn\": 90693,\n\t\"./zh-cn.js\": 90693,\n\t\"./zh-hk\": 45833,\n\t\"./zh-hk.js\": 45833,\n\t\"./zh-mo\": 74364,\n\t\"./zh-mo.js\": 74364,\n\t\"./zh-tw\": 70657,\n\t\"./zh-tw.js\": 70657\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 = 35358;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + ({\"552\":\"transactions\",\"757\":\"not-found\",\"779\":\"error\",\"809\":\"users\",\"962\":\"home\",\"966\":\"login\"}[chunkId] || chunkId) + \".\" + {\"77\":\"a578ba87\",\"330\":\"5b0ce7ac\",\"489\":\"57d597ed\",\"552\":\"c0848511\",\"645\":\"72473caf\",\"757\":\"87334a86\",\"779\":\"6b352ab2\",\"809\":\"d7c60a81\",\"962\":\"9b8497bb\",\"966\":\"8b0f3753\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + ({\"552\":\"transactions\",\"757\":\"not-found\",\"779\":\"error\",\"809\":\"users\",\"962\":\"home\",\"966\":\"login\"}[chunkId] || chunkId) + \".\" + {\"330\":\"f7d7c3e6\",\"489\":\"174bf625\",\"552\":\"f547adeb\",\"645\":\"cd368a54\",\"757\":\"a1a67c2d\",\"779\":\"abea7754\",\"809\":\"e30236b1\",\"962\":\"f325ab1c\",\"966\":\"32e1d8ac\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"precog-frontend:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"330\":1,\"489\":1,\"552\":1,\"645\":1,\"757\":1,\"779\":1,\"809\":1,\"962\":1,\"966\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\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\tif(645 != chunkId) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkprecog_frontend\"] = self[\"webpackChunkprecog_frontend\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(70061); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["flatMap","Array","prototype","distinct","this","distinctBy","i","getter","values","Set","filter","v","value","has","add","none","predicate","some","sortBy","sortFn","result","sort","item1","item2","value1","value2","filterNulls","undefined","orDefault","arr","length","String","capitalize","charAt","toUpperCase","slice","replaceAllInstances","searchStr","replaceWith","parts","split","join","localeIncludes","options","isNullOrWhitespace","toString","thisStr","opts","collator","Intl","Collator","_c","idx","compare","id","_createElementBlock","_hoisted_1","_createElementVNode","_createBlock","_component_router_view","key","_ctx","$route","fullPath","defineComponent","name","__exports__","render","config","plugins","Notify","Loading","Dialog","iconSet","handleResponse","r","status","listeners","getLogoutListeners","Object","forEach","l","loginStore","setUserInfo","router","push","LoginRoutes","login","isRefreshing","valueStr","localStorage","getItem","setIsRefreshing","setItem","clearIsRefreshing","removeItem","waitNotRefreshing","async","console","log","timeout","waitTime","waited","delay","refreshingPromise","refreshSession","adapter","otherTabRefreshed","Axios","request","url","withCredentials","method","headers","AxiosHeaders","Accept","then","catch","e","response","registerSessionRefreshAdapter","axios","defaults","Error","defaultAdapter","interimConfig","refreshed","doRefreshSession","instance","registerGuards","beforeEach","to","from","next","toAuthorizedRoles","meta","authorizedRoles","hasRole","hasLoginRequirements","HomeRoutes","transcribe","validLoginRequirements","state","info","loginRequirements","LoginRequirement","None","isSessionRoute","contains","UsersRoutes","TransactionRoutes","routeEnum","toName","includes","app","createApp","App","use","Quasar","quasarUserOptions","loadConfiguration","provideTimeStore","provideLeftDrawerStore","provideTranscribeStore","provideTranslateStore","provideImageAnalysisStore","provideUploadStore","provideRegisterStore","provideForgotPasswordStore","provideLoginStore","provideValidationStore","provideTransactionsStore","provideDivisionsGridStore","mount","doTransformations","transforms","query","route","props","params","keys","param","transform","transformRouteParams","passThrough","paramValue","routes","path","component","children","index","redirect","translate","UserRole","User","Admin","analyze","Vision","home","view","userId","create","ErrorRoutes","error","notFound","createRouter","history","createWebHashHistory","requestUrl","configuration","get","Settings","impl","appVersion","allowVision","data","allowSelfRegister","defaultTransactionDaysAgo","transactionsGridBuffer","customTranscriptionFileExtensions","maxConcurrentUploads","process","Number","parseInt","logoutListeners","reactive","loginListeners","readonly","setLogoutListener","listener","getLoginListeners","setLoginListener","setLoginLogoutListener","loginListener","logoutListener","hasFlag","flags","flag","TransactionLogRequestType","TransactionLogHelpfulnessRatingType","GridSortDirection","TranscriptionStatusType","TranslationType","TranslationStatusType","UploadState","DivisionOfficeGridItemType","ForgotPasswordDialogState","ForgotPasswordStatusTypeModel","UserRegisterDialogState","UserRegisterStatusTypeModel","ImageAnalyzeStoreKey","Symbol","createState","responses","files","setResponses","setFiles","uploadFiles","uploadStore","upload","onUploadSuccess","getFileKey","fileName","fileKeys","iter","fileKey","_","mappedResponse","xhr","Promise","resolve","acceptedFileExtensions","acceptedFileTypes","map","mime","m","getAcceptedMimes","getAcceptedExtensions","removeResponse","responseKey","reset","createForState","noFiles","provideStore","onLoginlogout","provide","useStore","inject","leftDrawerToggleListeners","getLeftDrawerToggleListeners","LeftDrawerStoreKey","provided","open","setLeftDrawerState","toggled","toggleLeftDrawer","nullable","onNotNull","LoginStoreKey","getInfoFromLocalStorage","infoStr","JSON","parse","setInfoInLocalStorage","stringify","loginRequirementsComplete","email","firstName","lastName","roles","officeId","role","isLoggedIn","signIn","model","handler","handleErrorStatusResult","sendRequest","chainHandlers","onSuccess","signOut","isError","handleErrorStatus","storeState","userRoles","store","mapSorts","sorts","s","columnName","field","sortDirection","dir","Ascending","Descending","mapQuickFilters","gridQuickFilters","f","isSelected","upperFirstLetter","isExclude","filterValues","mapColumns","columns","c","hidden","orderIndex","dateFilterDisplay","dttm","twoDigitDates","getMonth","getDate","getFullYear","filterDisplayValue","display","filterChipSortOrder","dateFilterChipDisplayText","dttmFilter","minDttm","maxDttm","mapFilterChips","chips","dateFilterChipText","text","columnDisplayName","browserTimeZoneFriendly","mapQuickFilterResponse","responseModel","TimeStoreKey","now","Date","setInterval","TransactionsStoreKey","defaultTimezone","moment","momentTimezone","guess","defaultTimezoneFriendly","zoneAbbr","defaultSorts","minColumnWidth","defaultColumns","title","width","columnMenu","type","cell","minResizableWidth","sortable","today","setHours","setDate","utcOffset","gridLoadCancelToken","gridData","gridItems","loadedOffset","maxLoadedIndex","totalRecords","yesReviewCount","maybeReviewCount","noReviewCount","browserTimeZoneOffset","gridSorts","gridColumns","usageLoadCancelToken","usage","setDttmFilter","setGridLoadCancelToken","setGridData","setTotalRecords","setYesReviewCount","setMaybeReviewCount","setNoReviewCount","setBrowserTimeZoneFriendly","setBrowserTimeZoneOffset","setGridSorts","setGridColumns","setGridQuickFilters","setUsageLoadCancelToken","setUsage","loadRecords","offset","limit","fullRefresh","needsMoreRecords","Math","min","cancel","cancelTokenSource","CancelToken","source","cancelToken","token","loadOffset","max","loadLimit","minRequestDttm","maxRequestDttm","isDttmFilterExclude","filters","records","onCancel","getGridRecords","start","exportRecords","columnNames","clientTimeZoneFriendly","clientTimeZoneOffset","onError","success","exportLocation","errorMessage","reviewTransaction","transactionLogId","helpfulnessRating","loadQuickFilter","existingQuickFilter","quickFilter","getQuickFilter","applyQuickFilter","removeFilter","filterValue","find","every","loadUsage","minRecordDttm","maxRecordDttm","cancelGridLoad","cancelUsageLoad","filterChips","isLoadingGrid","isLoadingUsage","TranscribeStoreKey","maxTranscribeLocales","supportedLocales","selectedLocales","activeUploads","isPolling","autoTranslate","selectedAutoTranslateLanguageCode","setAutoTranslate","setSelectedAutoTranslateLanguageCode","setLocales","locales","setSelectedLocales","transactionReviewed","responseName","transactionType","Transcription","metadata","transactionContext","TranscriptionTranslation","translationResponse","transcription","setActiveUploads","uploads","setIsPolling","setFileUploadUri","file","baseUrl","cleanBaseUrl","endsWith","cleanFileName","localesQueryPrefix","concat","localeCode","reduce","a","b","isStatusDone","Running","NotStarted","statusDisplay","Succeeded","Failed","uploadComplete","pollActiveUploads","setStatusDisplay","setUploadState","requests","metadatas","mappedMetadata","transcriptionId","statuses","uploadInfo","cancelled","selectedTranslateLanguageCode","phrases","phrase","done","transcriptionResponse","detectedLanguage","translateResponse","failed","failedFileKey","failedTranscriptionResponse","successUploadInfos","existingResponse","failedResponse","loadLocales","defaultLocaleCodes","translateText","languageCode","requestType","transcriptionTransactionLogId","transcriptionFileName","fullTranslationRequest","toLanguageCode","content","myResponse","removeTranslation","transcriptionText","translatedLanguageCode","TranscriptionPhraseTranslation","updateResponseLanguageCode","selectedLanguageCode","translateLanguageCode","translateCode","noSelectedLocales","noSelectedAutoTranslateLanguage","TranslateStoreKey","supportedLanguages","supportedDocumentExtensions","documentTextExtractCapabilities","maxBytes","maxFileSizeDisplay","fileExtensions","translationType","Document","pages","isTranslatingText","defaultLanguageCode","activeDocumentTranslationUploads","isPollingDocumentTranslation","activeDocumentTextExtractionUploads","isPollingDocumentTextExtraction","setLanguages","languages","setDefaultLanguageCode","setDocumentExtensions","extensions","setTextExtractCapabilities","textExtractCapabilities","setSelectedLanguage","setTranslationType","selectedTranslationType","setTranslateText","setIsTranslatingText","setActiveDocumentTranslationUploads","setIsPollingDocumentTranslation","setActiveDocumentTextExtractionUploads","setIsPollingDocumentTextExtraction","filesArray","fileTypeLower","toLowerCase","isImage","onUploadDocumentTranslationSuccess","TextExtraction","onUploadTextExtractFileSuccess","Success","Queued","documentTranslationUploadComplete","pollActiveDocumentTranslationUploads","startResponses","startResponse","resultsUri","languageDisplay","languageCodeDisplay","statusType","sourceText","destinationLanguage","translatedText","translatedDocumentSasUrl","resultsSasUri","documentTextExtractionUploadComplete","pollActiveDocumentTextExtractionUploads","translateToLanguageCode","uploadedFileUri","sourceLanguage","friendlyLanguage","loadLanguages","loadDocumentExtensions","loadTextExtractCapabilities","translateTextAction","substring","TextTranslation","textResponse","Text","getAcceptedDocumentMimes","getAcceptedDocumentExtensions","noSelectedLanguage","noTranslateText","UploadStoreKey","isOpen","notify","routedNamespace","uploadId","setUploads","setIsOpen","setNotify","setRoutedNamespace","currentUploadingCount","count","namespace","u","uploadState","uploading","urlBuilder","cleanUrl","notStarted","requestState","stateNamespace","stateUpload","su","setAxiosResponse","polling","uploadFound","blob","Blob","post","abortUpload","myNamespace","findIndex","namespaceUpload","splice","cleanupSuccess","noUploads","k","DivisionsGridStoreKey","setGridItems","loadGridItems","divisionListings","d","division","divisionId","divisionName","officeName","offices","o","office","addDivision","officeNames","addDivisions","applyDivisions","addOffice","addOffices","editDivision","editDivisions","editOffice","editOffices","deleteDivision","removeDivisionIds","deleteOffice","removeOfficeIds","applyDivision","divisions","ForgotPasswordStoreKey","validationStore","clear","validationModel","dialogState","Inputting","setEmail","setModel","setDialogState","forgotPasswordErrorPropToValidationProp","Email","ForgotPasswordModelFieldName","submit","valid","doValidation","unhandled","errKey","vProp","setModelFieldResult","modelName","UserNotFound","UnknownError","UserRegisterStoreKey","setFirstName","setLastName","registerErrorPropToValidationProp","LastName","UserRegisterModelFieldName","FirstName","InvalidEmail","DuplicateEmail","ResponseStatus","DefaultIStatusHandler","onNotFound","onNotAuthenticated","first","second","customHandler","NotFound","NotAuthenticated","Cancel","apiResponse","isCancel","ValidationStoreKey","results","modelResults","fieldResult","fieldKey","fieldIsError","fieldErrorMessage","isValid","checkSubModels","checkSubModelsValue","startsWithCheck","subModels","startsWith","setResults","areValid","models","acc","curr","validateModel","dataGetter","validate","validateModelField","validateField","doValidations","newResults","modelValue","doFieldsValidation","fields","subModel","FileList","toArray","item","trim","fileExtension","pop","encodeURIComponent","replace","ms","setTimeout","stringRequiredRule","getValueRequiredRule","check","checker","errorMsg","emailRegex","emailFormatRule","message","test","digitRegex","symbolRegex","upperRegex","lowerRegex","passwordRequirements","fieldName","containsNumber","containsLower","containsUpper","containsSymbol","ForgotPasswordValidationModel","ValidationModel","constructor","super","setField","rules","_defineProperty","all","rule","createForUUID","thisModel","createForIndex","createForParent","parentModel","UserRegisterValidationModel","webpackContext","req","webpackContextResolve","__webpack_require__","code","module","exports","__webpack_module_cache__","moduleId","cachedModule","loaded","__webpack_modules__","call","deferred","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","n","__esModule","definition","defineProperty","enumerable","chunkId","promises","miniCssF","g","globalThis","Function","window","obj","prop","hasOwnProperty","inProgress","dataWebpackPrefix","script","needAttach","scripts","document","getElementsByTagName","getAttribute","createElement","charset","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","bind","target","head","appendChild","toStringTag","nmd","paths","p","createStylesheet","fullhref","oldTag","reject","linkTag","rel","onLinkComplete","errorType","realHref","href","err","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","promise","loadingEnded","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","self","__webpack_exports__"],"sourceRoot":""}