{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/shared/constants/permissions/LinkType.js","webpack:///./src/models/error/missingConfigurationError.js","webpack:///./src/plugins/appinsights.js","webpack:///./src/helpers/language-helpers.js","webpack:///./src/shared/constants/permissions/PermissionModifier.js","webpack:///./src/services/features/clientGroupOverviewFeatureFactory.js","webpack:///./src/components/_base-input-select.vue?029e","webpack:///src/components/_base-input-select.vue","webpack:///./src/components/_base-input-select.vue?1cb0","webpack:///./src/components/_base-input-select.vue","webpack:///./src/models/error/nullParameterError.js","webpack:///./src/models/user/userIndentificationDTO.js","webpack:///./src/helpers/log-helper.js","webpack:///./src/plugins/vee-validate.js","webpack:///./src/router/layouts/public.vue?15a0","webpack:///./src/shared/constants/permissions/PermissionDelimiter.js","webpack:///./src/helpers/permissions-helpers.js","webpack:///./src/router/views/_loading.vue?e025","webpack:///./src/router/layouts/loading.vue?867f","webpack:///src/router/layouts/loading.vue","webpack:///./src/router/layouts/loading.vue?7aae","webpack:///./src/router/layouts/loading.vue","webpack:///src/router/views/_loading.vue","webpack:///./src/router/views/_loading.vue?b044","webpack:///./src/router/views/_loading.vue","webpack:///./src/components/_base-input-text.vue?6be8","webpack:///./src/router/layouts/public.vue?2d8e","webpack:///src/router/layouts/public.vue","webpack:///./src/router/layouts/public.vue?5925","webpack:///./src/router/layouts/public.vue","webpack:///./src/plugins/vuetify.js","webpack:///./src/shared/constants/permissions/OperationReturnType.js","webpack:///./src/components/_base-checkbox-list.vue?5366","webpack:///src/components/_base-checkbox-list.vue","webpack:///./src/components/_base-checkbox-list.vue?e727","webpack:///./src/components/_base-checkbox-list.vue","webpack:///./src/helpers/get-replace-me-selected-day-text.js","webpack:///./src/plugins/vue-mq.js","webpack:///./src/utils/markdown-to-html-converter.js","webpack:///./src/plugins/firebase.js","webpack:///./src/components/general/lottie.vue?c239","webpack:///src/components/general/lottie.vue","webpack:///./src/components/general/lottie.vue?0ad3","webpack:///./src/components/general/lottie.vue","webpack:///./src/services/toasts/index.js","webpack:///./src/shared/constants/error/ErrorPageCodes.js","webpack:///./src/shared/constants/replaceMe/ReplaceMeSelectionType.js","webpack:///./src/router/views/_error.vue?5d77","webpack:///./src/services/error/ErrorPageFactory.js","webpack:///src/router/views/_error.vue","webpack:///./src/router/views/_error.vue?3c63","webpack:///./src/router/views/_error.vue","webpack:///./src/common/configFactory.js","webpack:///./src/main.js","webpack:///./src/app.vue?0e1c","webpack:///./src/models/general/mediaQueryBreakPoint.js","webpack:///./src/shared/constants/core/MediaQueryBreakPoints.js","webpack:///./src/mixins/baseMixin.js","webpack:///./src/components/_base-icon.vue?8dc5","webpack:///src/components/_base-icon.vue","webpack:///./src/components/_base-icon.vue?b312","webpack:///./src/components/_base-icon.vue","webpack:///./src/components/app/service-status-alert.vue?cafc","webpack:///./src/components/app/service-status-dialog.vue?32af","webpack:///src/components/app/service-status-dialog.vue","webpack:///./src/components/app/service-status-dialog.vue?b3ff","webpack:///./src/components/app/service-status-dialog.vue","webpack:///src/components/app/service-status-alert.vue","webpack:///./src/components/app/service-status-alert.vue?d2a9","webpack:///./src/components/app/service-status-alert.vue","webpack:///./src/utils/sanitize-html.js","webpack:///./src/shared/constants/permissions/PermissionRequirement.js","webpack:///./src/models/error/unknownAppError.js","webpack:///./src/models/error/promiseRejectionError.js","webpack:///./src/services/logging/AppLogger.js","webpack:///./src/app.vue?5dfb","webpack:///src/app.vue","webpack:///./src/app.vue?da35","webpack:///./src/app.vue","webpack:///./src/shared/constants/routes/routeDefinitions.js","webpack:///./src/components/_base-button.vue?3203","webpack:///src/components/_base-button.vue","webpack:///./src/components/_base-button.vue?2a7c","webpack:///./src/components/_base-button.vue","webpack:///./src/shared/constants/assets/LogoForm.js","webpack:///./src/helpers/result-helper.js","webpack:///./src/plugins/msal.js","webpack:///./src/helpers/cache-helpers.js","webpack:///./src/helpers/http-status-helpers.js","webpack:///./src/shared/constants/permissions/Tags.js","webpack:///./src/utils/object-has-keys.js","webpack:///./src/shared/constants/error/ErrorResponseType.js","webpack:///./src/models/error/ErrorResponse.js","webpack:///./src/services/error/ErrorResponseFactory.js","webpack:///./src/state/modules/auth.js","webpack:///./src/state/modules/users.js","webpack:///./src/state/modules/single-invoice.js","webpack:///./src/models/locations/addressViewModel.js","webpack:///./src/models/overview/clientGroupOverviewViewModel.js","webpack:///./src/models/overview/clientGroupOverviewWithFillRateViewModel.js","webpack:///./src/state/modules/client.js","webpack:///./src/state/modules/invoices.js","webpack:///./src/models/timesheets/timesheetsSummaryClientViewModel.js","webpack:///./src/models/timesheets/timesheetsSummaryCandidateViewModel.js","webpack:///./src/models/timesheets/timesheetsSummaryViewModel.js","webpack:///./src/models/timesheets/timesheetsViewModel.js","webpack:///./src/shared/constants/api/HttpStatusCodes.js","webpack:///./src/state/modules/timesheets.js","webpack:///./src/state/modules/candidate.js","webpack:///./src/state/modules/file.js","webpack:///./src/helpers/vuex-action-builder.js","webpack:///./src/state/modules/bookings.js","webpack:///./src/state/modules/contacts.js","webpack:///./src/models/locations/bookingBlockViewModel.js","webpack:///./src/state/modules/locations.js","webpack:///./src/state/modules/pending-feedback.js","webpack:///./src/state/modules/features.js","webpack:///./src/models/bookings/bookingClientViewModel.js","webpack:///./src/models/bookings/bookingClientGroupViewModel.js","webpack:///./src/models/bookings/bookingCreatedByViewModel.js","webpack:///./src/models/bookings/bookingLocationViewModel.js","webpack:///./src/models/bookings/bookingCoveringViewModel.js","webpack:///./src/models/bookings/bookingCertificationViewModel.js","webpack:///./src/models/bookings/bookingConfirmationViewModel.js","webpack:///./src/models/bookings/bookingClassificationViewModel.js","webpack:///./src/models/bookings/bookingGradeViewModel.js","webpack:///./src/models/bookings/bookingDetailsViewModel.js","webpack:///./src/models/bookings/bookingDateViewModel.js","webpack:///./src/models/bookings/bookingViewModel.js","webpack:///./src/models/bookings/pendingBookingSummaryDetailsViewModel.js","webpack:///./src/models/bookings/pendingBookingSummaryViewModel.js","webpack:///./src/shared/constants/core/LoadingKeys.js","webpack:///./src/utils/sleep.js","webpack:///./src/state/modules/booking-approvals.js","webpack:///./src/state/modules/index.js","webpack:///./src/utils/dispatch-action-for-all-modules.js","webpack:///./src/services/api/BaseApiService.js","webpack:///./src/services/api/SignalRApiService.js","webpack:///./src/services/api/UserApiService.js","webpack:///./src/services/api/InvoicesApiService.js","webpack:///./src/services/api/ClientApiService.js","webpack:///./src/services/api/CandidateApiService.js","webpack:///./src/services/api/FileApiService.js","webpack:///./src/services/api/TimesheetsApiService.js","webpack:///./src/services/api/ContactsApiService.js","webpack:///./src/services/api/LocationsApiService.js","webpack:///./src/services/api/BookingsApiService.js","webpack:///./src/services/api/PendingFeedbackApiServiceApiService.js","webpack:///./src/services/api/ClientGroupApiService.js","webpack:///./src/services/api/PendingBookingsApiService.js","webpack:///./src/services/api/index.js","webpack:///./src/plugins/api.storePlugin.js","webpack:///./src/plugins/i18n.storePlugin.js","webpack:///./src/plugins/appinsights.storePlugin.js","webpack:///./src/helpers/service-status-helper.js","webpack:///./src/state/store.js","webpack:///./src/models/app/treeViewDto.js","webpack:///./src/router/views/_timeout.vue?8fd5","webpack:///./src/components/_base-input-text.vue?37ca","webpack:///./src/shared/constants/permissions/PermissionLevel.js","webpack:///./src/plugins/exception-handler.js","webpack:///./src/components/_base-input-text.vue?86fe","webpack:///src/components/_base-input-text.vue","webpack:///./src/components/_base-input-text.vue?1c1d","webpack:///./src/components/_base-input-text.vue","webpack:///./src/shared/constants/core/Environment.js","webpack:///./src/router/routes.js","webpack:///./src/router/index.js","webpack:///./src/components/_globals.js","webpack:///./lib/version.js","webpack:///./src/common/config.js","webpack:///./src/shared/constants/features/featureToggleOptions.js","webpack:///./src/services/features/featureDecisions.js","webpack:///./src/components/dev/the-debug-bar.vue?871c","webpack:///src/components/dev/the-debug-bar.vue","webpack:///./src/components/dev/the-debug-bar.vue?985d","webpack:///./src/components/dev/the-debug-bar.vue","webpack:///./src/models/locations/clientLoginLocationViewModel.js","webpack:///./src/shared/constants/assets/LogoShade.js","webpack:///./src/components sync nonrecursive _base-[\\w-]+\\.vue$","webpack:///./src/models/shiftRecords/shiftRecordBreakDto.js","webpack:///./src/models/timesheets/timesheetsPendingApprovalViewModel.js","webpack:///./src/components/_base-logo.vue?eb74","webpack:///./src/shared/constants/assets/LogoType.js","webpack:///src/components/_base-logo.vue","webpack:///./src/components/_base-logo.vue?7c97","webpack:///./src/components/_base-logo.vue","webpack:///./src/helpers/array-helpers.js","webpack:///./src/models/clients/clientSelectorTreeViewDto.js","webpack:///./src/shared/constants/error/RequestErrorSource.js","webpack:///./src/components/_base-split-btn.vue?2014","webpack:///src/components/_base-split-btn.vue","webpack:///./src/components/_base-split-btn.vue?7980","webpack:///./src/components/_base-split-btn.vue","webpack:///./src/plugins/vue-toastification.js","webpack:///./src/components/_base-link.vue?5181","webpack:///src/components/_base-link.vue","webpack:///./src/components/_base-link.vue?e14a","webpack:///./src/components/_base-link.vue","webpack:///./src/services/date/index.js","webpack:///./src/router/views/_timeout.vue?8a79","webpack:///./src/filters/truncate-text.js","webpack:///./src/models/error/windowErrorDTO.js","webpack:///./src/router/views/_error.vue?f2ba","webpack:///./src/locales/setup/index.js","webpack:///./src/plugins/vue-i18n.js","webpack:///./src/shared/constants/permissions/PermissionScope.js","webpack:///./src/shared/constants/date/DurationUnits.js","webpack:///./src/models/error/vueErrorDTO.js","webpack:///./src/router/views/_timeout.vue?847d","webpack:///src/router/views/_timeout.vue","webpack:///./src/router/views/_timeout.vue?59e2","webpack:///./src/router/views/_timeout.vue","webpack:///./src/models/error/storeErrorDTO.js","webpack:///./src/components/_base-status-label.vue?9c0d","webpack:///./src/shared/constants/serviceStatus/Severity.js","webpack:///./src/helpers/status-helper.js","webpack:///src/components/_base-status-label.vue","webpack:///./src/components/_base-status-label.vue?bbdf","webpack:///./src/components/_base-status-label.vue","webpack:///./src/components/_base-page-title.vue?2d9e","webpack:///src/components/_base-page-title.vue","webpack:///./src/components/_base-page-title.vue?00da","webpack:///./src/components/_base-page-title.vue"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","jsonpScriptSrc","p","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","LinkType","freeze","GROUP","CLIENT","LOCATION","MissingConfigurationError","constructor","resourceName","super","this","install","Vue","options","config","appInsightsConfig","appInsights","ApplicationInsights","loadAppInsights","trackPageView","onAfterScriptLoaded","router","trackInitialPageView","setupPageTracking","onReady","baseName","beforeEach","route","from","next","context","telemetryTrace","traceID","Util","generateW3CId","startTrackPage","afterEach","url","location","protocol","host","fullPath","stopTrackPage","flush","use","getLanguageBasedOnBaseURL","baseUrl","origin","urls","process","VUE_APP_TEST","warn","entries","listOfUrls","split","map","processedUrl","URL","includes","PermissionModifier","ALL","VIEW","CREATE","MODIFY","DELETE","clientGroupOverviewFeatureFactory","featureDecisions","enabledForClient","canViewDetails","canViewClientGroupOverview","render","_vm","_h","$createElement","_c","_self","attrs","$attrs","label","rules","scopedSlots","_u","fn","ref","errors","_g","_b","on","toggleSelectAll","innerValue","_v","_s","compSelectAllItemsIcon","staticClass","proxy","model","callback","$$v","expression","$listeners","staticRenderFns","components","ValidationProvider","inheritAttrs","props","String","default","computed","items","hasSelectedAllItems","hasSelectedSomeItems","watch","newVal","$emit","methods","$nextTick","component","VDivider","VIcon","VListItem","VListItemAction","VListItemContent","VList","VListItemTitle","VSelect","NullParameterError","UserIdentificationDTO","id","emailAddress","ipAddress","isImpersonating","user_id","user_email","user_host_address","user_is_impersonating","fetchUserIdentityWithIpAddress","store","logIpAddress","user","getters","userIpAddress","XMLHttpRequest","open","send","status","responseJSON","JSON","parse","responseText","ip","ex","compileCustomProperties","properties","logUserDetails","extend","required","max","email","PERMISSION_DELIMITER","transformPermissions","perm","allPerms","splitStr","modifier","permObj","view","modify","delete","processPermissionsPayload","permissions","perms","cloneDeep","transformedPerms","group","access","client","clients","locations","iterateOverPermissionsTree","level","returnType","comparer","values","OperationReturnType","TypeError","list","LIST","SINGLE","getNodeIdKeyBasedOnLevel","toLowerCase","getNodeById","nodeId","item","getNodePermission","permissionTree","scope","node","PermissionScope","scopedPermission","hasPermissionAtAnyLevel","convertPermissionLevelToLinkType","permissionLevel","PermissionLevel","GROUP_AND_BELOW","CLIENT_AND_BELOW","SELECTED_CLIENT_AND_BELOW","hasAccessToRoute","routeTo","targetId","meta","hasPermission","permission","requirement","PermissionRequirement","ONE","flattenAccessTree","numLocations","clientId","clientName","clientGroupId","groupId","clientGroupName","groupName","flattenPermissionsWithLocations","locationId","locationName","defaultOptions","handleAnimation","_t","TheDebugBar","mixins","baseMixin","VApp","VContainer","VFlex","VLayout","VMain","title","$t","Layout","Lottie","loop","autoplay","animationData","animationSpeed","anim","ServiceStatusAlert","Vuetify","VCard","VSnackbar","VBtn","VChip","VTextField","VTooltip","directives","Ripple","theme","themes","light","primary","blue","info","secondary","indigo","dark","grey","_l","itemValue","itemLabel","$event","selected","Array","preselect","VCheckbox","selectedDay","isNextDayMonday","dayText","i18n","ReplaceMeSelectionType","TOMORROW","VueMq","breakpoints","xs","sm","md","lg","xl","Infinity","markdownToHtmlConverter","markdownString","DOMPurify","sanitize","marked","USE_PROFILES","html","firebase","initializeApp","style","width","height","overflow","margin","container","$refs","lottieContainer","renderer","rendererSettings","toastOptions","duration","position","POSITION","BOTTOM_CENTER","success","$toast","warning","show","debug","clear","INTERNAL_SERVER_ERROR","statusCode","routeName","PAGE_NOT_FOUND","UNAUTHORIZED","FORBIDDEN","BAD_REQUEST","ACTION_LOCKED","ACCOUNT_LOAD_FAILURE","EXPIRED","NO_SERVER_RESPONSE","TODAY","staticStyle","factory","desc","showErrorCode","errorCode","errorText","class","$mq","rawName","isUserLoggedIn","currentUser","isMobileViewPort","signOut","goBackURL","domProps","goBackText","BaseErrorPage","errorStatusText","httpStatus","subDesc","ErrorPageFactory","ErrorPageCodes","InternalServerError","PageNotFoundError","UnauthorizedError","ForbiddenError","BadRequestError","ActionLockedError","AccountLoadFailedError","ExpiredError","NoServerResponseError","base","companyName","$route","logout","development","fetch","$dayjs","valueOf","response","json","production","loadConfig","environment","Environment","productionTip","e2e","errorHandler","Cypress","cy","onUncaughtException","configFactory","configResponse","$config","require","vuetify","appinsights","App","sanitizeHtml","env","truncateText","app","filter","directive","el","binding","innerHTML","VueGoogleMaps","load","installComponents","auth","onAuthStateChanged","h","$mount","handleRedirectPromise","dispatch","catch","__app__","MediaQueryBreakPoint","size","mapGetters","isDebug","isDarkMode","hasImpersonateContactId","isExtraSmall","MediaQueryBreakPoints","isSmall","isMedium","isLarge","isExtraLarge","isSmallOrLower","isMediumOrLower","isLargeOrLower","isSmallOrHigher","isMediumOrHigher","isLargeOrHigher","isDev","heightOfDevBar","routeDefinitions","source","customIconClass","_e","$style","_f","bannerTitle","showDialog","serviceStatus","severity","region","fetchServiceStatus","VCardText","VListItemSubtitle","VSpacer","VToolbar","VToolbarTitle","ServiceStatusDialog","isSuccess","VAlert","VDialog","dirtyHtml","UnknownAppError","PromiseRejectionError","AppLogger","initLogger","log","logError","VueErrorDTO","vm","$options","$appInsights","trackException","exception","WindowErrorDTO","PromiseRejectionEvent","reason","StoreErrorDTO","errorResponse","logger","Loading","isClientInit","serverError","isAppLoading","metaInfo","$store","home","path","myAvailability","clientOverview","clientGroupOverview","timesheets","candidates","help","bookings","bookingsCreate","bookingsPendingApproval","settings","changePassword","login","impersonateLogout","impersonateLogin","finance","invoiceDetails","underConstruction","notFound","unauthorized","forbidden","accountLoadFailure","noServerResponse","actionLocked","assign","commonAttributes","LogoForm","FULL","SHORT","ICON","NONE","initResultObject","msg","fail","PublicClientApplication","isCacheFresh","cacheDuration","durationUnits","lastUpdated","forceRefresh","isEmpty","$date","diff","getSavedState","localStorage","getItem","saveState","state","setItem","stringify","deleteState","removeItem","isHttpStatus","Tags","PRIMARY","CONFIRMED","REPLACE_ME_ENABLED","objectHasKeys","expected","obj","isArray","every","unknown","api","validation","security","notFoundError","ErrorResponse","_error","RequestErrorSource","ErrorResponseType","param","determineRequestErrorType","server","mapApiValidationErrorResponseToError","errorSource","$i18n","baseErrorResponse","mapR2WErrorResponseToError","BASE_ERROR_RESPONSE_OBJ_KEYS","API_VALIDATION_ERROR_OBJ_KEYS","serverErrorResponse","requestErrorResponse","extractClientsForTreeView","clientsList","ClientSelectorTreeViewDto","orderBy","namespaced","account","interactionRequired","accessToken","lastTokenRefresh","loadingCount","generalFiles","impersonateContactId","username","mutations","SET_CURRENT_USER","newValue","SET_ACCOUNT","SET_IMPERSONATE_CONTACT_ID","contactId","SET_USER_PERMISSIONS","SET_USER_GENERALFILES","files","SET_INTERACTION_REQUIRED","SET_ACCESS_TOKEN","token","SET_USER_TO_UNAUTHENTICATED","sessionStorage","FRESH_IMPERSONATE_CLEAR_STORE","START_LOADING","FINISH_LOADING","SET_USERNAME","moduleName","currentUserFullName","firstName","lastName","currentUserEmail","currentUserContactId","currentUserSimple","getUserForEventLogging","impersonator","isClientGroupOverviewEnabled","msalAccount","getUserStandardBookingDetails","standardBookings","isLoadingAuth","isInteractionRequired","msalInstance","msal","permissionsTreeView","permissionsList","tree","TreeViewDto","children","redirectToClientOverview","clientCount","hasMultipleClients","firstAvailableClient","getNode","getGroup","getClient","getClients","ids","getAllClients","getLocation","getClientLocations","getNodeHierarchyByIdAndLevel","linkType","flatTree","find","x","getFirstClientLocationWithReplaceMePermissions","getFirstClientLocationWithPermissions","REPLACE_ME","getAllClientGroups","countAllAvailableLocations","countAllAvailableBookingLocations","locationNode","booking","getTimezoneFromFirstClientGroupLocation","clientGroup","isNonEmptyArray","timeZone","getPermission","hasLocationAccountsPermission","ACCOUNTS","hasLocationBookingPermission","BOOKING","hasLocationPendingApprovalPermission","PENDING_BOOKING","hasLocationBookingCreatePermission","hasLocationTimesheetPermission","TIMESHEETS","hasLocationReplaceMePermission","hasClientAccountsPermission","hasClientBookingPermission","hasClientPendingApprovalPermission","hasClientTimesheetPermission","hasClientReplaceMePermission","hasGroupAccountsPermission","hasGroupBookingPermission","hasGroupTimesheetPermission","hasGroupReplaceMePermission","hasPermissionRegardlessOfLevel","permissionScope","flatAccessTree","getGeneralFiles","firstAuthorisedLocation","getFirstClientLocationWithPermissionsByClientIds","clientIds","locationWithPerm","getAllClientLocationsWithPermission","getAllClientsLocationsWithPermission","getAllClientLocationsWithReplaceMePermission","tags","hasPermissionForAtleastOneClientLocation","targetClients","selectedClients","hasReplaceMePermissionForAtleastOneClientLocation","hasCreateBookingPermissionForAtleastOneClientLocation","hasCreateBookingPermission","hasCreateBookingPermissionForAtleastOneClientLocationByClientIds","actions","init","commit","password","root","signInWithEmailAndPassword","async","finally","currentAccounts","getAllAccounts","nuke","showNotifications","redirect","setUnauthenticated","loginRequest","scopes","loginRedirect","noNotificationReq","some","v","toast","payload","getUserFromMsalProvider","myAccounts","acquireTokenSilent","acquireTokenPopup","isAccessTokenFresh","DurationUnits","MINUTE","getIdToken","idToken","sendPasswordResetEmail","credentials","EmailAuthProvider","credential","reauthenticateWithCredential","updatePassword","newPass","HOUR","$api","contact","links","ErrorResponseFactory","getDefaultState","cached","crudLoadingCount","users","isLoadingUsers","isLoadingUserCRUD","CACHE_USERS","CACHE_USER","newUser","START_LOADING_CRUD","FINISH_LOADING_CRUD","CLEAR_STORE","rootState","matchedUser","axios","isLoading","isLoadingCRUD","invoiceNo","invoices","getInvoiceByInvoiceNo","AddressViewModel","line1","line2","suburb","postcode","country","latitude","longitude","fullAddress","parseFloat","ClientGroupOverviewViewModel","address","openBookings","totalBookings","trim","hasSameName","displayName","ClientGroupOverviewWithFillRateViewModel","filledBookings","fillRatePercentage","percentage","normalisedPercentage","isNaN","Math","round","clientList","grades","owners","classifications","classificationLoadingCount","detailsLoadingCount","gradesLoadingCount","overviewLoadingCount","overviewDataLoadingCount","getSelectedClients","owner","isLoadingClassifications","isLoadingClientDetails","isLoadingGrades","isLoadingOverview","isLoadingOverviewData","mapSelectedClientsToClientsInPermissions","rootGetters","allClientsInPerms","mappedClients","START_LOADING_CLASSIFICATIONS","FINISH_LOADING_CLASSIFICATIONS","START_LOADING_DETAILS","FINISH_LOADING_DETAILS","START_LOADING_GRADES","FINISH_LOADING_GRADES","START_LOADING_OVERVIEW","FINISH_LOADING_OVERVIEW","START_LOADING_OVERVIEW_DATA","FINISH_LOADING_OVERVIEW_DATA","SET_CLIENT","SET_CLIENTS","sortedClientIds","sort","a","b","UPSERT_CLIENT_GRADES","found","UPSERT_ADDITIONAL_DETAILS","UPSERT_CLIENT_CLASSIFICATIONS","setClient","cId","isCached","getAdditionalDetails","getClientGrades","getClientClassifications","clientExistsInPermissionTree","filterDate","clientGroups","getOverviewData","overviewVM","setClientList","downloadingFileCount","invoicesTotal","serverCurrentPage","isDownloadingFile","SET_INVOICES","SET_INVOICES_TOTAL","total","SET_SERVER_CURRENT_PAGE","page","START_DOWNLOADING_FILE","FINISH_DOWNLOADING_FILE","pageSize","skip","take","currentPage","getOustandingInvoicesCount","outstandingInvoicesCount","invoiceId","getInvoiceFile","createObjectURL","Blob","toastErrorMessage","responseObject","text","TimesheetsSummaryClientViewModel","approvedCount","pendingReviewCount","pendingApprovalCount","TimesheetsSummaryCandidateViewModel","candidateId","candidateName","TimesheetsSummaryViewModel","clientTimesheetsSummary","candidateTimesheetsSummary","totalApprovedCount","totalPendingReviewCount","totalPendingApprovalCount","candidate","TimesheetsViewModel","pendingApprovalList","pendingApproval","TimesheetsPendingApprovalViewModel","Continue","SwitchingProtocols","Processing","Ok","Created","Accepted","NonAuthoritativeInformation","NoContent","ResetContent","PartialContent","MultiStatus","AlreadyReported","ImUsed","MultipleChoices","MovedPermanently","Found","SeeOther","NotModified","UseProxy","SwitchProxy","TemporaryRedirect","PermanentRedirect","BadRequest","Unauthorized","PaymentRequired","Forbidden","NotFound","MethodNotAllowed","NotAcceptable","ProxyAuthenticationRequired","RequestTimeout","Conflict","Gone","LengthRequired","PreconditionFailed","PayloadTooLarge","UriTooLong","UnsupportedMediaType","RangeNotSatisfiable","ExpectationFailed","IAmATeapot","MisdirectedRequest","UnprocessableEntity","Locked","FailedDependency","UpgradeRequired","PreconditionRequired","TooManyRequests","RequestHeaderFieldsTooLarge","UnavailableForLegalReasons","NotImplemented","BadGateway","ServiceUnavailable","GatewayTimeout","HttpVersionNotSupported","VariantAlsoNegotiates","InsufficientStorage","LoopDetected","NotExtended","NetworkAuthenticationRequired","cIds","getTimesheetsSummary","getTimesheetsFilteredByCandidate","post","HttpStatusCodes","timesheetRecordId","downloadTimesheetFile","canListLoadingCount","displayPic","file","candidateList","isCanListLoading","START_CANLIST_LOADING","FINISH_CANLIST_LOADING","SET_CANDIDATE_LIST","getCandidateDetails","clientID","getCandidateList","getDisplayPic","base64ProfileImg","fileId","createFileAccessToken","accessKey","baseURL","fileURL","fileResponse","toasts","filePath","getGeneralFile","getType","VuexResponse","withCommit","updateFnName","withSetState","withPagination","commitKey","transform","transformFn","withSuccessToast","withFailureToast","withLoading","loadingKey","logResult","transformer","headers","bookingSummaryLoadingCount","feedbackFormUrlLoadingCount","quickFeedbackSubmittingCount","replaceMeStatusCheckLoadingCount","submitReplaceMeBookingLoadingCount","cancelBookingLoadingCount","recentLocations","replaceMeStatusChecks","bookingOverview","isLoadingBookingSummary","isLoadingFeedbackFormUrl","isLoadingReplaceMeStatusCheck","isSubmittingQuickFeedback","isSubmitReplaceMeLoading","isLoadingCancelBooking","START_LOADING_SELECTED_DATE_BOOKINGS","FINISH_LOADING_SELECTED_DATE_BOOKINGS","START_LOADING_BOOKINGS_OVERVIEW","FINISH_LOADING_BOOKINGS_OVERVIEW","START_LOADING_REPLACE_ME_STATUS_CHECK","FINISH_LOADING_REPLACE_ME_STATUS_CHECK","START_LOADING_SUBMIT_REPLACE_ME","FINISH_LOADING_SUBMIT_REPLACE_ME","START_LOADING_CANCEL_BOOKING","FINISH_LOADING_CANCEL_BOOKING","SET_RECENT_BOOKING_LOCATION","timestamp","dayjs","SET_BOOKING_OVERVIEW","START_LOADING_FEEDBACK_FORM_URL","FINISH_LOADING_FEEDBACK_FORM_URL","START_SUBMITTING_QUICK_FEEDBACK","FINISH_SUBMITTING_QUICK_FEEDBACK","UPSERT_REPLACE_ME_STATUS_CHECK_FOR_CLIENT","statusCheck","setRecentLocation","getSummaryBookingsByDate","go","getBookingOverview","year","getFeedbackFormUrl","bookingId","submitQuickFeedback","checkReplaceMeStatus","submitReplaceMeBooking","getSelectedDayText","isNextMonday","cancelBooking","cancelReason","date","bookingContacts","bookingContactsLoadingCount","standardBookingDetailsLoadingCount","contacts","isLoadingBookingContacts","START_LOADING_BOOKING_CONTACTS","FINISH_LOADING_BOOKING_CONTACTS","SET_CLIENT_BOOKING_CONTACTS","hasContacts","getBookingContacts","BookingBlockViewModel","datesLocal","messageMarkDown","Number","bookingLocations","certifications","locationRestrictions","bookingLocationLoadingCount","certificationLoadingCount","bookingBlocksLoadingCount","isLoadingCertifications","isLoadingBookingLocations","isLoadingBookingBlocks","getRestrictionDetailsByLocationId","restriction","START_LOADING_BOOKING_LOCATIONS","FINISH_LOADING_BOOKING_LOCATIONS","START_LOADING_CERTIFICATIONS","FINISH_LOADING_CERTIFICATIONS","START_LOADING_BOOKING_BLOCKS","FINISH_LOADING_BOOKING_BLOCKS","SET_BOOKING_LOCATIONS","UPSERT_CERTIFICATIONS","SET_LOCATION_RESTRICTIONS","restrictions","getBookingLocations","mappedLocations","ClientLoginLocationViewModel","getLocationCertifications","getLocationBookingBlocks","pendingFeedback","feedback","pendingFeedbackCacheObj","SET_PENDING_FEEDBACK","SET_FEEDBACK_AS_COMPLETE","foundClientFeedbackList","foundBookingFeedback","bookingID","feedbackCompleted","pendingfeedbacks","getPendingFeedbacks","setFeedbackAsComplete","toggles","featureToggles","SET_FEATURE_TOGGLES","setFeatureToggles","createFeatureDecisions","clientGroupOverviewFeatureToggles","BookingClientViewModel","params","BookingClientGroupViewModel","BookingCreatedByViewModel","BookingLocationViewModel","BookingCoveringViewModel","BookingCertificationViewModel","BookingConfirmationViewModel","sms","voice","BookingClassificationViewModel","onlineTitle","BookingGradeViewModel","BookingDetailsViewModel","startTime","endTime","earliestDate","latestDate","areDatesConsecutive","notes","room","covering","isNullOrEmptyArray","certification","confirmations","confirmation","classification","BookingDateViewModel","BookingViewModel","createdBy","createdOnUtc","details","dates","PendingBookingSummaryDetailsViewModel","PendingBookingSummaryViewModel","days","defaultLoadingKey","bookingApprovals","loadingApprovalCount","loadingApprovalDetails","loadingSubmitPendingApproval","ms","flyout","isLoadingApprovalsList","isLoadingByKey","LoadingKeys","isLoadingFlyout","isLoadingSubmitPendingApproval","activeBooking","showFlyout","flyoutHasError","showDetailsContent","SET_FLYOUT","RESET_FLYOUT","SET_STATE","sleep","pendingBookings","action","companyNameShort","openFlyout","setFlyout","resetFlyout","bookingApprovalsModule","features","featuresModule","locationsModule","contactsModule","bookingsModule","timesheetsModule","fileModule","singleInvoice","singleInvoiceModule","clientModule","invoicesModule","candidateModule","authModule","usersModule","pendingFeedbacksModule","dispatchActionForAllModules","actionName","allModules","modulePrefix","flags","moduleDefinition","dispatchGlobal","BaseApiService","resource","GET","POST","PATCH","PUT","getUrl","args","query","apiVersion","mapQueryParams","retry","method","providedHeaders","isBlob","impersonateHeader","Authorization","responseType","compileRequestConfig","handleErrors","execute","queryParams","keys","join","ReadOnlyApiService","executeAnon","executeBlob","ModelApiService","SignalRApiService","UserApiService","InvoicesApiService","getBlob","ClientApiService","newDate","Date","dateFromString","startOf","format","dateUntilString","endOf","getBookingsByDateRange","dateFromStringLocal","dateUntilStringLocal","CandidateApiService","FileApiService","fileName","TimesheetsApiService","urlArgs","URLSearchParams","append","ContactsApiService","LocationsApiService","BookingsApiService","dateFromLocal","dateToLocal","PendingFeedbackApiServiceApiService","ClientGroupApiService","PendingBookingsApiService","signalR","extractHeaderData","reduce","acc","header","keyAndValue","getServiceStatus","ok","markdownText","fileLines","replace","statusHeader","headerElements","_md","Vuex","debugMessages","activeLoaders","appLoadingCount","debugActivateCounter","darkMode","initialAppLoad","embedded","drawer","serviceStatusLoadingCount","Store","plugins","strict","indexOf","isLoadingApp","isLoadingServiceStatus","hasLoadedAppOnce","isError","isDebugModeActive","isDarkModeActive","isDrawerOpen","indexOfLoader","START_SERVICE_STATUS_LOADING","FINISH_SERVICE_STATUS_LOADING","INCREMENT_APP_LOADING","DECREMENT_APP_LOADING","SET_APP_AS_LOADED","RESET_APP_LOADING_STATE","SET_ERROR","ACTIVATE_DEBUG","INCREMENT_DEBUG","RESET_DEBUG","ENABLE_DARKMODE","DISABLE_DARKMODE","OPEN_DRAWER","CLOSE_DRAWER","CLEAR","ADD_DEBUG_MESSAGE","INSERT_SERVICE_STATUS","addDebugMessage","startLoadingApp","finishLoadingApp","startLoading","finishLoading","setAppAsLoaded","resetAppLoadingState","toggleDebugMode","toggleDarkMode","toggleDrawer","clearStore","locale","setFavicon","favicon","querySelector","logStoreException","trackClickEvent","trackEvent","locked","SELECTED_CLIENT","lineno","colno","handlePromiseRejection","addEventListener","injectStyles","locals","unit","lazyLoadView","public","beforeResolve","routeFrom","authRequiredOnPreviousRoute","matched","authRequired","icon","AsyncView","AsyncHandler","loading","delay","functional","VueRouter","VueMeta","keyName","routes","scrollBehavior","to","savedPosition","y","startRouteLoading","NProgress","start","stopRouteLoading","done","isPublic","validToken","redirectToLandingPage","loadUserProfileResult","getErrorPageRedirectByStatusCode","language","redirectToErrorPage","allClients","decideRouteBasedOnFeatureToggles","errorPageName","requireComponent","forEach","componentConfig","componentName","kebab","charAt","toUpperCase","version","has","set","merge","appVersion","sameDayBookingCutOffTime","minChars","allowedCharsRegex","enabled","disabled","isEnabled","featureToggle","featureToggleOptions","clientEnabled","getRouteToggle","routeToggle","redirectFrom","displayNavItem","debugToggle","toggleDebug","VSwitch","VSystemBar","clientTypeInt","locationLunchBreakMinutes","submittedByTemplateRequired","addressLine1","addressLine2","LogoShade","DARK","LIGHT","WHITE","webpackContext","req","webpackContextResolve","ShiftRecordBreakDto","locationTimeZone","payOptionType","payOptionTypes","unitType","startTimeLocal","endTimeLocal","startTimeUTC","endTimeUTC","candidateFirstName","candidateLastName","candidatePreferredName","candidateFullName","breakMinutes","isApprovedByCandidate","breaks","timesheetMethod","bookingStatus","candidateBookingModifications","utc","breakTaken","compHref","compTarget","compSrc","compAltText","LogoType","COMPANY","APP","validator","form","shade","VImg","arr","dense","Boolean","buttonModel","VItemGroup","VMenu","Toast","routerLinkTo","allowInsecure","hideExternalIcon","test","isTelOrEmailLink","isExternalLink","validateProps","customParseFormat","objectSupport","isSameOrBefore","timezone","isBetween","advancedFormat","relativeTime","localizedFormat","isoWeek","isToday","isYesterday","localeData","limit","delimiter","substring","vueI18nSettings","messages","en","enUS","enCA","enNZ","enGB","enAU","numberFormats","currency","dateTimeFormats","time","hour","minute","hour12","time24","dateShort","day","month","dateFormatted","silentTranslationWarn","silentFallbackWarn","VueI18n","DAY","WEEK","QUARTER","MONTH","YEAR","SECOND","MILLISECOND","offlineConfirmed","content","capitalize","tooltip","color","mobile","outlined","badge","index","Severity","HEALTHY","DEGRADED","UNHEALTHY","ADVISORY","getStatusLabelHashMap","Map","iconType","getBadgeFromStr","created","str","badges","subtitleClass","subtitle","subtitleOnTop","backButton"],"mappings":"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","file":"js/app.43791434.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"app\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-0b879bd2\":\"f92c1963\",\"chunk-2d0b99d7\":\"bf8d47a0\",\"chunk-2d0f0a4c\":\"4e4c0af4\",\"chunk-3ce83f1c\":\"1ce3dbef\",\"chunk-2d0db300\":\"77952933\",\"chunk-3b487c08\":\"5b22f7e2\",\"chunk-510d4593\":\"09686981\",\"chunk-07392760\":\"7a2f6cf6\",\"chunk-26396c83\":\"cec1b60b\",\"chunk-4bd531f9\":\"71f2d0c5\",\"chunk-d81bd55c\":\"fba279d7\",\"chunk-5516e8da\":\"1c2315cc\",\"chunk-395987b0\":\"d63a55df\",\"chunk-a16864ee\":\"315e78d0\",\"chunk-1f92a8aa\":\"859f34bb\",\"chunk-26465802\":\"797b53ec\",\"chunk-5e4fc95a\":\"e36b9ec3\",\"chunk-7554eb40\":\"301c0099\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"chunk-0b879bd2\":1,\"chunk-3ce83f1c\":1,\"chunk-3b487c08\":1,\"chunk-510d4593\":1,\"chunk-07392760\":1,\"chunk-26396c83\":1,\"chunk-4bd531f9\":1,\"chunk-d81bd55c\":1,\"chunk-5516e8da\":1,\"chunk-395987b0\":1,\"chunk-a16864ee\":1,\"chunk-1f92a8aa\":1,\"chunk-26465802\":1,\"chunk-7554eb40\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-0b879bd2\":\"9f9b1ac8\",\"chunk-2d0b99d7\":\"31d6cfe0\",\"chunk-2d0f0a4c\":\"31d6cfe0\",\"chunk-3ce83f1c\":\"ff8712e9\",\"chunk-2d0db300\":\"31d6cfe0\",\"chunk-3b487c08\":\"3d526433\",\"chunk-510d4593\":\"1a19e091\",\"chunk-07392760\":\"370cb369\",\"chunk-26396c83\":\"47f181db\",\"chunk-4bd531f9\":\"6dc87de6\",\"chunk-d81bd55c\":\"de8f6ab7\",\"chunk-5516e8da\":\"6f62dafc\",\"chunk-395987b0\":\"62946bd9\",\"chunk-a16864ee\":\"83a6a8c2\",\"chunk-1f92a8aa\":\"88909fa1\",\"chunk-26465802\":\"a97dd4fc\",\"chunk-5e4fc95a\":\"31d6cfe0\",\"chunk-7554eb40\":\"89e62107\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export const LinkType = Object.freeze({\n GROUP: 'group',\n CLIENT: 'client',\n LOCATION: 'location',\n})\n","/**\n * Used to identify errors thrown when required config is missing or empty\n */\nexport default class MissingConfigurationError extends Error {\n /**\n * @param {String} resourceName name of config resource that wasn't found\n */\n constructor({ message = null, resourceName = null }) {\n super(message || `Required config was not found or null: '${resourceName}'`)\n this.name = 'MissingConfigurationError'\n }\n}\n","/**\n * Code sourced from: https://github.com/latelierco/vue-application-insights/blob/master/src/index.js on 21/10/2022 3:24 PM\n * Adjusting the code to suit our needs and to ensure it conforms to the latest appinsights requirements, as the package\n * has not been maintained for some time.\n */\n\nimport MissingConfigurationError from '@/models/error/missingConfigurationError'\nimport { ApplicationInsights, Util } from '@microsoft/applicationinsights-web'\n\n/**\n * Vue plugin for application insights package\n *\n * @param Vue\n * @param options\n */\nfunction install(Vue, options) {\n // More info: https://github.com/microsoft/ApplicationInsights-JS#configuration\n const config = options.appInsightsConfig || null\n\n if (!config)\n throw new MissingConfigurationError({ resourceName: 'appInsightsConfig' })\n\n Vue.appInsights = new ApplicationInsights({ config })\n Vue.appInsights.loadAppInsights()\n Vue.appInsights.trackPageView()\n\n if (typeof options.onAfterScriptLoaded === 'function') {\n options.onAfterScriptLoaded(Vue.appInsights)\n }\n\n const router = options.router\n\n // Watch route event if router option is defined.\n if (router) {\n if (options.trackInitialPageView !== false) {\n setupPageTracking(options, Vue)\n } else {\n router.onReady(() => setupPageTracking(options, Vue))\n }\n }\n\n Object.defineProperty(Vue.prototype, '$appInsights', {\n get: () => Vue.appInsights,\n })\n}\n\n/**\n * Track route changes as page views with AppInsights\n * @param options\n */\nfunction setupPageTracking(options, Vue) {\n const router = options.router\n\n const baseName = options.baseName || '(Vue App)'\n\n router.beforeEach((route, from, next) => {\n const name = baseName + ' / ' + route.name\n Vue.appInsights.context.telemetryTrace.traceID = Util.generateW3CId()\n Vue.appInsights.context.telemetryTrace.name = route.name\n Vue.appInsights.startTrackPage(name)\n next()\n })\n\n router.afterEach((route) => {\n const name = baseName + ' / ' + route.name\n const url = location.protocol + '//' + location.host + route.fullPath\n Vue.appInsights.stopTrackPage(name, url)\n Vue.appInsights.flush()\n })\n}\n\n// auto install for navigator\nif (typeof window !== 'undefined' && window.Vue) {\n window.Vue.use(install)\n}\n\nexport default install\n","import config from '@/common/config'\n\n/**\n * DEPRECIATED: Don't use, okay for a best guess but often users don't know what their browser's language is set to\n * Attempts to detect the first language selected from the browser (since modern browsers come with an array of preferred languages).\n * It is also backwards compatible with older browsers and mobile.\n *\n * Sourced from https://stackoverflow.com/a/46514247 on 06/09/2021 01:46 PM\n * @returns String | null\n */\nexport const getFirstBrowserLanguage = () => {\n var nav = window.navigator\n var browserLanguagePropertyKeys = [\n 'language',\n 'browserLanguage',\n 'systemLanguage',\n 'userLanguage',\n ]\n var i\n var language\n var len\n var shortLanguage = null\n\n // support for HTML 5.1 \"navigator.languages\"\n if (Array.isArray(nav.languages)) {\n for (i = 0; i < nav.languages.length; i++) {\n language = nav.languages[i]\n len = language.length\n if (!shortLanguage && len) {\n shortLanguage = language\n }\n if (language && len > 2) {\n return language\n }\n }\n }\n\n // support for other well known properties in browsers\n for (i = 0; i < browserLanguagePropertyKeys.length; i++) {\n language = nav[browserLanguagePropertyKeys[i]]\n // skip this loop iteration if property is null/undefined. IE11 fix.\n if (language == null) {\n continue\n }\n len = language.length\n if (!shortLanguage && len) {\n shortLanguage = language\n }\n if (language && len > 2) {\n return language\n }\n }\n\n return shortLanguage\n}\n\n/**\n * Returns language key based on URL client used to access CL\n * @returns {String} Language key (e.g. en-US)\n */\nexport const getLanguageBasedOnBaseURL = () => {\n const baseUrl = window.location.origin\n\n // key-pair { langKey: url }\n // e.g. { 'en-US': 'https://example.com' }\n const urls = config.get('i18n.urls')\n\n if (!urls || urls.length === 0) {\n // Suppress warning while unit testing\n if (process.env.VUE_APP_TEST !== 'unit')\n console.warn(\"Unable to parse url config. Defaulting language to 'en'\")\n return config.get('i18n.locale')\n }\n\n // Iterate over supported urls to find a match\n for (const [key, value] of Object.entries(urls)) {\n const listOfUrls = value.split(',')\n\n if (\n listOfUrls.length !== 0 &&\n listOfUrls\n .map((url) => {\n let processedUrl\n\n // Can throw invalid URL if malformed or empty string provided\n try {\n processedUrl = new URL(url).origin\n } catch {\n // Ignore invalid urls\n return ''\n }\n\n return processedUrl || ''\n })\n .includes(baseUrl)\n )\n return key\n }\n\n // Defaults to en\n return config.get('i18n.locale')\n}\n","export const PermissionModifier = Object.freeze({\n ALL: 'all',\n VIEW: 'view',\n CREATE: 'create',\n MODIFY: 'modify',\n DELETE: 'delete',\n})\n","/**\n * Generate feature toggles object for client group overview components/logic\n * @param {Object} featureDecisions Object returned from `services/features/featureDecisions.js`\n */\nconst clientGroupOverviewFeatureFactory = (\n featureDecisions,\n enabledForClient = false\n) => {\n return {\n canViewDetails: featureDecisions.canViewClientGroupOverview(\n enabledForClient\n ),\n }\n}\n\nexport default clientGroupOverviewFeatureFactory\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ValidationProvider',{attrs:{\"name\":_vm.$attrs.label,\"rules\":_vm.rules},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar errors = ref.errors;\nreturn [_c('v-select',_vm._g(_vm._b({attrs:{\"error-messages\":errors},scopedSlots:_vm._u([(_vm.$attrs.multiple)?{key:\"prepend-item\",fn:function(){return [_c('v-list-item',{attrs:{\"ripple\":\"\"},on:{\"click\":_vm.toggleSelectAll}},[_c('v-list-item-action',[_c('v-icon',{attrs:{\"color\":_vm.innerValue.length > 0 ? 'blue' : ''}},[_vm._v(\" \"+_vm._s(_vm.compSelectAllItemsIcon)+\" \")])],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\" Select All \")])],1)],1),_c('v-divider',{staticClass:\"mt-2\"})]},proxy:true}:null],null,true),model:{value:(_vm.innerValue),callback:function ($$v) {_vm.innerValue=$$v},expression:\"innerValue\"}},'v-select',_vm.$attrs,false),_vm.$listeners))]}}])})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-input-select.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-input-select.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./_base-input-select.vue?vue&type=template&id=23f322be&\"\nimport script from \"./_base-input-select.vue?vue&type=script&lang=js&\"\nexport * from \"./_base-input-select.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAction } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VSelect } from 'vuetify/lib/components/VSelect';\ninstallComponents(component, {VDivider,VIcon,VListItem,VListItemAction,VListItemContent,VListItemTitle,VSelect})\n","/**\n * Thrown when a paramter expected to be set was passed in null or undefined\n */\nexport default class NullParameterError extends Error {\n /**\n * @param {String} name name of parameter\n */\n constructor({ message = null, name = null }) {\n super(message || `Required parameter was null or undefined: '${name}'`)\n this.name = 'NullParameterError'\n }\n}\n","/**\n * To contain user data for logging purposes\n */\nexport default class UserIdentificationDTO {\n constructor({ id, emailAddress, ipAddress, isImpersonating = false } = {}) {\n /**\n * @type {Number} User's unique ID\n */\n this.user_id = id\n\n /**\n * @type {String}\n */\n this.user_email = emailAddress\n\n /**\n * @type {String}\n */\n this.user_host_address = ipAddress\n\n /**\n * @type {Boolean}\n */\n this.user_is_impersonating = isImpersonating\n }\n}\n","import NullParameterError from '@/models/error/nullParameterError'\nimport UserIdentificationDTO from '@/models/user/userIndentificationDTO'\n\n/**\n * Retrieves user identity (with optional IP address) for logging purposes\n * @param {VuexStore} store\n * @param {Boolean} logIpAddress Will not log ip address if false\n * @returns {UserIdentificationDTO}\n */\nconst fetchUserIdentityWithIpAddress = (store, logIpAddress = false) => {\n if (!store) throw new NullParameterError('store')\n\n const user = store.getters['auth/currentUserSimple']\n let userIpAddress = 'Instructed not to grab IP address'\n\n if (logIpAddress) {\n try {\n const request = new XMLHttpRequest()\n request.open('GET', 'https://api.ipify.org?format=json', false)\n\n request.send(null)\n\n if (request.status === 200) {\n const responseJSON = JSON.parse(request.responseText)\n userIpAddress = responseJSON.ip\n } else {\n throw new Error(\n `Unable to retrieve IP address. Status code: ${request.status}`\n )\n }\n } catch (ex) {\n userIpAddress = `Failed to get IP address. Reason: ${ex}`\n }\n }\n\n return new UserIdentificationDTO({\n id: user?.id,\n emailAddress: user?.emailAddress,\n ipAddress: userIpAddress,\n isImpersonating: user?.isImpersonating,\n })\n}\n\n/**\n * Compiles custom properties object for logging\n * @param {VuexStore} store\n * @param {Object} properties\n * @param {Boolean} logUserDetails Will log the details of the current user\n * @returns\n */\nconst compileCustomProperties = (store, properties, logUserDetails = false) => {\n if (!logUserDetails) return properties\n\n const user = fetchUserIdentityWithIpAddress(store, true)\n\n return { ...properties, ...user }\n}\n\nexport { fetchUserIdentityWithIpAddress, compileCustomProperties }\n","import { required, email, max } from 'vee-validate/dist/rules'\nimport { extend } from 'vee-validate'\n\nextend('required', {\n ...required,\n message: 'This field is required',\n})\n\nextend('max', {\n ...max,\n message: 'This field must be {length} characters or less',\n})\n\nextend('email', {\n ...email,\n message: 'This field must be a valid email',\n})\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./public.vue?vue&type=style&index=0&id=06378447&lang=scss&scoped=true&\"","export const PERMISSION_DELIMITER = '_'\n","import { PermissionModifier } from '@/shared/constants/permissions/PermissionModifier'\nimport { PermissionScope } from '@/shared/constants/permissions/PermissionScope'\nimport { PERMISSION_DELIMITER } from '@/shared/constants/permissions/PermissionDelimiter'\nimport { LinkType } from '@/shared/constants/permissions/LinkType'\nimport { PermissionLevel } from '@/shared/constants/permissions/PermissionLevel'\nimport { cloneDeep } from 'lodash'\nimport { OperationReturnType } from '@/shared/constants/permissions/OperationReturnType'\nimport { PermissionRequirement } from '@/shared/constants/permissions/PermissionRequirement'\n\n/**\n * Transforms permission text into an object\n * @param {string} perm Unmodified permission string\n * @param {Object|null} allPerms Any previously transformed permissions object\n * @returns\n */\nexport const transformPermissions = (perm, allPerms = {}) => {\n let splitStr = ''\n let modifier = ''\n let key = ''\n\n // 1. Split permission string by delimiter\n splitStr = perm.split(PERMISSION_DELIMITER)\n\n // 2. Validate size of split string (should contain 2 parts, key and perm modifier)\n if (splitStr.length !== 2) return null\n\n // 3. Extract permission parts\n key = splitStr[0]\n modifier = splitStr[1]\n\n const permObj =\n allPerms && Object.prototype.hasOwnProperty.call(allPerms, key)\n ? allPerms[key]\n : {\n view: false,\n modify: false,\n delete: false,\n create: false,\n }\n\n // 4. Assign permissions to transformed perm object\n if (modifier !== PermissionModifier.ALL) {\n permObj[modifier] = true\n } else {\n // Iterate over all available permissions and set to true\n for (const property in permObj) {\n permObj[property] = true\n }\n }\n\n // 5. Return transformed perm object in expected format (e.g. { account: { view: true, ...}})\n return { [key]: permObj }\n}\n\n/**\n * Iterates over permissions payload and transforms each node into a permissions object\n * @param {Array} permissions Permissions payload\n * @returns\n */\nexport const processPermissionsPayload = (permissions) => {\n const perms = cloneDeep(permissions)\n let transformedPerms\n for (const group of perms) {\n // Process group permission\n transformedPerms = {}\n if (group.access.permissions.length > 0) {\n for (const perm of group.access.permissions) {\n transformedPerms = {\n ...transformedPerms,\n ...transformPermissions(perm, transformedPerms),\n }\n }\n }\n group.access.permissions = transformedPerms\n\n // Process client permissions\n for (const client of group.clients) {\n transformedPerms = {}\n if (client.access.permissions.length > 0) {\n for (const perm of client.access.permissions) {\n transformedPerms = {\n ...transformedPerms,\n ...transformPermissions(perm, transformedPerms),\n }\n }\n }\n client.access.permissions = transformedPerms\n\n // Process location permissions\n for (const location of client.locations) {\n transformedPerms = {}\n if (location.access.permissions.length > 0) {\n for (const perm of location.access.permissions) {\n transformedPerms = {\n ...transformedPerms,\n ...transformPermissions(perm, transformedPerms),\n }\n }\n }\n location.access.permissions = transformedPerms\n }\n }\n }\n\n return perms\n}\n\n/**\n * Iterates of permissions/access tree at a specified level, returning a specific item or places those items in an array by checking some condition\n * @param {Array} permissions Entire permissions tree\n * @param {LinkType} level GROUP|CLIENT|LOCATION\n * @param {OperationReturnType} returnType Object or Array type. Return a list of items (Array) or return a single item (Object)\n * @param {Function} comparer Compares the current item against some condition. Needs to return true or false.\n * @returns\n */\nexport const iterateOverPermissionsTree = (\n permissions,\n level,\n returnType,\n comparer = () => {\n return true\n }\n) => {\n if (!Object.values(OperationReturnType).includes(returnType))\n throw TypeError(\n `Return type must be list or single. Received: ${returnType}`\n )\n\n if (!permissions || permissions.length === 0)\n throw Error(`Permissions tree is empty`)\n\n const list = []\n for (const group of permissions) {\n if (level === LinkType.GROUP) {\n if (comparer(group)) {\n if (returnType === OperationReturnType.LIST) list.push(group)\n else if (returnType === OperationReturnType.SINGLE) return group\n }\n continue\n }\n\n for (const client of group.clients) {\n if (level === LinkType.CLIENT) {\n if (comparer(client)) {\n if (returnType === OperationReturnType.LIST) list.push(client)\n else if (returnType === OperationReturnType.SINGLE) return client\n }\n continue\n }\n\n for (const location of client.locations) {\n if (level === LinkType.LOCATION) {\n if (comparer(location)) {\n if (returnType === OperationReturnType.LIST) list.push(location)\n else if (returnType === OperationReturnType.SINGLE) return location\n }\n continue\n }\n }\n }\n }\n\n return returnType === OperationReturnType.LIST ? list : null\n}\n\n/**\n * Returns the appropriate id key name based on level\n * @param {LinkType} level\n */\nexport const getNodeIdKeyBasedOnLevel = (level) => {\n // Validate level\n if (!Object.values(LinkType).includes(level))\n throw TypeError(`Invalid level supplied. Received: ${level}`)\n\n return `${level.toLowerCase()}Id`\n}\n\n/**\n * Returns a permissions node by Id from a specified level\n * @param {Array} permissions Entire permissions tree\n * @param {Number} nodeId Id of requested node (e.g. locationId)\n * @param {LinkType} level\n * @returns\n */\nexport const getNodeById = (permissions, nodeId, level) => {\n return iterateOverPermissionsTree(\n permissions,\n level,\n OperationReturnType.SINGLE,\n (item) => {\n return item[getNodeIdKeyBasedOnLevel(level)] === nodeId\n }\n )\n}\n\n/**\n * Returns Boolean indicating if user has permission\n * @param {Array} permissionTree\n * @param {Number} nodeId\n * @param {LinkType} level\n * @param {PermissionScope} scope\n * @param {PermissionModifier} modifier\n * @returns Boolean\n */\nexport const getNodePermission = (\n permissionTree,\n nodeId,\n level,\n scope,\n modifier\n) => {\n const node = getNodeById(permissionTree, nodeId, level)\n if (!node) return false\n\n // Validate scope\n if (!Object.values(PermissionScope).includes(scope))\n throw TypeError(`Invalid scope supplied. Received: ${scope}`)\n\n // If node doesn't have the scope, user doesn't have permissions within that scope\n if (!Object.prototype.hasOwnProperty.call(node.access.permissions, scope))\n return false\n\n if (modifier !== PermissionModifier.ALL)\n return node.access.permissions[scope][modifier]\n\n for (const scopedPermission in node.access.permissions[scope]) {\n if (!node.access.permissions[scope][scopedPermission]) return false\n }\n\n return true\n}\n\n/**\n * Retrieves all permission nodes at a given level\n * @param {Array} permissions\n * @param {LinkType} level\n * @returns\n */\nexport const getAllNodesByLevel = (permissions, level) => {\n return iterateOverPermissionsTree(\n permissions,\n level,\n OperationReturnType.LIST\n )\n}\n\n/**\n * Counts all permission nodes at a given level\n * @param {Array} permissions\n * @param {LinkType} level\n * @returns\n */\nexport const countAllNodesByLevel = (permissions, level) => {\n return iterateOverPermissionsTree(\n permissions,\n level,\n OperationReturnType.LIST\n ).length\n}\n\n/**\n * Returns true if the user has the provided permissions scope at any level\n * @param {Array} permissions\n * @param {PermissionScope} scope\n * @returns Boolean\n */\nexport const hasPermissionAtAnyLevel = (permissions, scope, modifier) => {\n for (const level in LinkType) {\n const result = iterateOverPermissionsTree(\n permissions,\n level.toLowerCase(),\n OperationReturnType.SINGLE,\n (item) => {\n return !!item.access.permissions[scope]?.[modifier]\n }\n )\n\n if (result) return true\n }\n\n return false\n}\n\nconst convertPermissionLevelToLinkType = (permissionLevel) => {\n switch (permissionLevel) {\n case null:\n case PermissionLevel.GROUP:\n case PermissionLevel.GROUP_AND_BELOW:\n return LinkType.GROUP\n case PermissionLevel.CLIENT:\n case PermissionLevel.CLIENT_AND_BELOW:\n case PermissionLevel.SELECTED_CLIENT_AND_BELOW:\n return LinkType.CLIENT\n case PermissionLevel.LOCATION:\n return LinkType.LOCATION\n default:\n throw new Error('Invalid permission level')\n }\n}\n\n/**\n * Determines if a user has access to a given route\n * @param {Object} routeTo\n * @param {Vuex} store\n * @param {Number} targetId Id of entity in permissions tree to target\n * @returns Boolean\n */\nexport const hasAccessToRoute = (routeTo, store, targetId = -1) => {\n // No permissions set for route, no action needed\n if (!routeTo?.meta?.permissions || routeTo.meta.permissions.list.length === 0)\n return true\n\n let hasPermission = false\n\n for (const permission of routeTo.meta.permissions.list) {\n switch (permission.level) {\n case null:\n case PermissionLevel.GROUP_AND_BELOW:\n hasPermission = store.getters['auth/hasPermissionRegardlessOfLevel'](\n permission.scope,\n permission.modifier\n )\n break\n case PermissionLevel.GROUP:\n case PermissionLevel.CLIENT:\n case PermissionLevel.LOCATION:\n hasPermission = store.getters['auth/getPermission'](\n targetId,\n convertPermissionLevelToLinkType(permission.level),\n permission.scope,\n permission.modifier\n )\n break\n case PermissionLevel.CLIENT_AND_BELOW:\n hasPermission = store.getters[\n 'auth/hasPermissionForAtleastOneClientLocation'\n ](targetId, permission.scope, permission.modifier)\n break\n case PermissionLevel.SELECTED_CLIENT_AND_BELOW:\n hasPermission = store.getters[\n 'auth/hasPermissionForAtleastOneClientLocation'\n ](\n store.getters['client/getSelectedClients'],\n permission.scope,\n permission.modifier\n )\n break\n default:\n throw new Error('Invalid permission level')\n }\n\n // Only one permission required\n if (\n routeTo.meta.permissions.requirement === PermissionRequirement.ONE &&\n hasPermission\n )\n return true\n\n // All permissions in list are required\n if (\n routeTo.meta.permissions.requirement === PermissionRequirement.ALL &&\n !hasPermission\n )\n return false\n }\n\n // At this point, if require one permission, return false as user didn't have\n // at least one permission. If require all, return true as user had all perms\n return routeTo.meta.permissions.requirement === PermissionRequirement.ALL\n}\n\nexport const flattenAccessTree = (permissions) => {\n if (!permissions || permissions.length === 0)\n throw Error(`Permissions tree is empty`)\n\n const list = []\n for (const group of permissions) {\n for (const client of group.clients) {\n list.push({\n locations: client.locations,\n numLocations: client.locations.length,\n clientId: client.clientId,\n clientName: client.clientName,\n clientGroupId: group.groupId,\n clientGroupName: group.groupName,\n })\n }\n }\n\n return list\n}\n\nexport const flattenPermissionsWithLocations = (permissions) => {\n if (!permissions || permissions.length === 0)\n throw Error(`Permissions tree is empty`)\n\n const list = []\n for (const group of permissions) {\n for (const client of group.clients) {\n for (const location of client.locations) {\n list.push({\n locationId: location.locationId,\n locationName: location.locationName,\n clientId: client.clientId,\n clientName: client.clientName,\n clientGroupId: group.groupId,\n clientGroupName: group.groupName,\n })\n }\n }\n }\n\n return list\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Layout',[_c('v-flex',{staticClass:\"text-center\"},[_c('Lottie',{attrs:{\"options\":_vm.defaultOptions,\"height\":250,\"width\":250},on:{\"animCreated\":_vm.handleAnimation}}),_c('h2',{staticClass:\"mt-4 font-weight-bold opacity-8\"},[_vm._v(\"Loading...\")])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-app',{attrs:{\"id\":\"client-login\"}},[_c('TheDebugBar'),_c('v-main',{staticClass:\"r2b_bg\"},[_c('v-container',{staticClass:\"fill-height\",attrs:{\"fluid\":\"\"}},[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-center\":\"\"}},[_c('v-flex',{attrs:{\"xs12\":\"\",\"sm8\":\"\",\"md6\":\"\"}},[_vm._t(\"default\")],2)],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./loading.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./loading.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./loading.vue?vue&type=template&id=17774f5f&\"\nimport script from \"./loading.vue?vue&type=script&lang=js&\"\nexport * from \"./loading.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VApp } from 'vuetify/lib/components/VApp';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VFlex } from 'vuetify/lib/components/VGrid';\nimport { VLayout } from 'vuetify/lib/components/VGrid';\nimport { VMain } from 'vuetify/lib/components/VMain';\ninstallComponents(component, {VApp,VContainer,VFlex,VLayout,VMain})\n","\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_loading.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_loading.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./_loading.vue?vue&type=template&id=a29ac892&\"\nimport script from \"./_loading.vue?vue&type=script&lang=js&\"\nexport * from \"./_loading.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VFlex } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VFlex})\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"font-monospace\":\"_base-input-text_font-monospace_101i8\",\"text-overflow-unset\":\"_base-input-text_text-overflow-unset_39Lh4\",\"text-overflow-clip\":\"_base-input-text_text-overflow-clip_N7Ziy\",\"text-overflow-ellipsis\":\"_base-input-text_text-overflow-ellipsis_1gb63\",\"text-overflow-fade\":\"_base-input-text_text-overflow-fade_1U0gS\",\"white-space-unset\":\"_base-input-text_white-space-unset_RNj_f\",\"white-space-normal\":\"_base-input-text_white-space-normal_105kb\",\"white-space-nowrap\":\"_base-input-text_white-space-nowrap_3iODQ\",\"white-space-pre\":\"_base-input-text_white-space-pre_1PKNL\",\"white-space-pre-wrap\":\"_base-input-text_white-space-pre-wrap_UWxHZ\",\"white-space-pre-line\":\"_base-input-text_white-space-pre-line_TEBu0\",\"white-space-break-spaces\":\"_base-input-text_white-space-break-spaces_2JXO9\",\"animation--clockwise\":\"_base-input-text_animation--clockwise__HxRZ\",\"clockwise\":\"_base-input-text_clockwise_2hBDN\",\"animation--anti-clockwise\":\"_base-input-text_animation--anti-clockwise_2s7Eh\",\"anti-clockwise\":\"_base-input-text_anti-clockwise_33YKS\",\"animation--rotating\":\"_base-input-text_animation--rotating_1Z2JF\",\"rotating\":\"_base-input-text_rotating_3vpxz\",\"animation--rotating-diagonal\":\"_base-input-text_animation--rotating-diagonal_18GnR\",\"rotating-diagonal\":\"_base-input-text_rotating-diagonal_2NpQQ\",\"animation\":\"_base-input-text_animation_3Q6La\",\"typed-cursor\":\"_base-input-text_typed-cursor_2af2D\",\"blink\":\"_base-input-text_blink_3b_e5\",\"floating\":\"_base-input-text_floating_3-JRK\",\"jump\":\"_base-input-text_jump_2sspr\",\"fade-out\":\"_base-input-text_fade-out_2jiLH\",\"bubble-v\":\"_base-input-text_bubble-v_2RQCU\",\"bubble-v-left\":\"_base-input-text_bubble-v-left_1lXIM\",\"bubble-v-right\":\"_base-input-text_bubble-v-right_3Nqiv\",\"shake-v\":\"_base-input-text_shake-v_2Ldnb\"};","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-app',{attrs:{\"id\":\"client-login\"}},[_c('ServiceStatusAlert'),_c('TheDebugBar'),_c('v-main',{staticClass:\"r2b_bg\"},[_c('v-container',{staticClass:\"fill-height\",attrs:{\"fluid\":\"\"}},[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-center\":\"\"}},[_c('v-flex',{attrs:{\"xs12\":\"\",\"sm8\":\"\",\"md6\":\"\"}},[_vm._t(\"default\")],2)],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./public.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./public.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./public.vue?vue&type=template&id=06378447&scoped=true&\"\nimport script from \"./public.vue?vue&type=script&lang=js&\"\nexport * from \"./public.vue?vue&type=script&lang=js&\"\nimport style0 from \"./public.vue?vue&type=style&index=0&id=06378447&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"06378447\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VApp } from 'vuetify/lib/components/VApp';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VFlex } from 'vuetify/lib/components/VGrid';\nimport { VLayout } from 'vuetify/lib/components/VGrid';\nimport { VMain } from 'vuetify/lib/components/VMain';\ninstallComponents(component, {VApp,VContainer,VFlex,VLayout,VMain})\n","import Vue from 'vue'\nimport Vuetify, {\n VApp,\n VIcon,\n VCard,\n VSnackbar,\n VBtn,\n VChip,\n VSelect,\n VTextField,\n VTooltip,\n} from 'vuetify/lib'\nimport { Ripple } from 'vuetify/lib/directives'\n\nVue.use(Vuetify, {\n components: {\n VApp,\n VIcon,\n VCard,\n VSnackbar,\n VBtn,\n VChip,\n VSelect,\n VTextField,\n VTooltip,\n },\n directives: {\n Ripple,\n },\n})\n\nexport default new Vuetify({\n theme: {\n themes: {\n light: {\n primary: '#00acef',\n blue: '#00acef',\n info: '#00acef',\n secondary: '#1867c0',\n indigo: '#04193f',\n },\n dark: {\n primary: '#00acef',\n blue: '#00acef',\n info: '#00acef',\n grey: '#212121',\n secondary: '#1867c0',\n indigo: '#fff',\n },\n },\n },\n})\n","export const OperationReturnType = Object.freeze({\n LIST: 'list',\n SINGLE: 'single',\n})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('article',_vm._l((_vm.items),function(item){return _c('v-checkbox',{key:item[_vm.itemValue],staticClass:\"mb-0 mt-2 base-checkbox__list-item\",attrs:{\"label\":item[_vm.itemLabel],\"value\":item[_vm.itemValue],\"hide-details\":\"\"},on:{\"change\":function($event){return _vm.$emit('updated', _vm.selected)}},model:{value:(_vm.selected),callback:function ($$v) {_vm.selected=$$v},expression:\"selected\"}})}),1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-checkbox-list.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-checkbox-list.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./_base-checkbox-list.vue?vue&type=template&id=8a4b16e8&\"\nimport script from \"./_base-checkbox-list.vue?vue&type=script&lang=js&\"\nexport * from \"./_base-checkbox-list.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\ninstallComponents(component, {VCheckbox})\n","import { ReplaceMeSelectionType } from '@/shared/constants/replaceMe/ReplaceMeSelectionType'\nimport i18n from '@plugins/vue-i18n'\n\n/**\n * Simple helper that returns the localised text for the selected day\n * @param {String} selectedDay Value of ReplaceMeSelectionType enum\n * @param {Boolean} isNextDayMonday Affects returned string if next day is monday\n * @return Locaised selected day text\n */\nexport default (selectedDay, isNextDayMonday = false) => {\n let dayText = i18n.t('replaceMe.todayLabel')\n\n if (selectedDay === ReplaceMeSelectionType.TOMORROW) {\n dayText = isNextDayMonday\n ? i18n.t('replaceMe.nextMondayLabel')\n : i18n.t('replaceMe.tomorrowLabel')\n }\n return dayText\n}\n","import Vue from 'vue'\nimport VueMq from 'vue-mq'\n\nVue.use(VueMq, {\n breakpoints: {\n xs: 600,\n sm: 960,\n md: 1264,\n lg: 1904,\n xl: Infinity,\n },\n})\n","import DOMPurify from 'dompurify'\nimport { marked } from 'marked'\n\nexport default function markdownToHtmlConverter(markdownString) {\n return DOMPurify.sanitize(marked.parse(markdownString), {\n USE_PROFILES: { html: true },\n })\n}\n","// Firebase App (the core Firebase SDK) is always required and must be listed first\nimport firebase from 'firebase/app'\nimport config from '@/common/config'\n\n// Add the Firebase products that you want to use\nimport 'firebase/auth'\n\n// If you enabled Analytics in your project, add the Firebase SDK for Analytics\n// import \"firebase/analytics\";\n\n// firebase init goes here\nfirebase.initializeApp(config.get('firebase'))\n\n// firebase utils\nexport default firebase\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"lottieContainer\",style:(_vm.style || { width: 'auto' })})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./lottie.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./lottie.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./lottie.vue?vue&type=template&id=5601a750&\"\nimport script from \"./lottie.vue?vue&type=script&lang=js&\"\nexport * from \"./lottie.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\nimport { POSITION } from 'vue-toastification'\n\n// https://github.com/Maronato/vue-toastification/tree/main#toast-options-object\nconst toastOptions = {\n duration: 5000,\n position: POSITION.BOTTOM_CENTER,\n}\n\nexport default {\n success(message, options = toastOptions) {\n Vue.prototype.$toast.success(message, options)\n },\n error(message, options = toastOptions) {\n Vue.prototype.$toast.error(message, options)\n },\n warning(message, options = toastOptions) {\n Vue.prototype.$toast.warning(message, options)\n },\n info(message, options = toastOptions) {\n Vue.prototype.$toast.info(message, options)\n },\n show(message, options = toastOptions) {\n Vue.prototype.$toast(message, options)\n },\n debug(message, options = toastOptions) {\n Vue.prototype.$toast(message, options)\n },\n clear() {\n Vue.prototype.$toast.clear()\n },\n}\n","export default Object.freeze({\n /**\n * Server responded with 500 status code or some other unrecoverable error\n */\n INTERNAL_SERVER_ERROR: {\n id: 'internalServerError',\n statusCode: 500,\n routeName: 'ErrorPage',\n },\n /**\n * Resource or page was not found\n */\n PAGE_NOT_FOUND: {\n id: 'pageNotFoundError',\n statusCode: 404,\n routeName: 'NotFoundPage',\n },\n /**\n * User is not authenticated\n */\n UNAUTHORIZED: {\n id: 'unAuthorizedError',\n statusCode: 401,\n routeName: 'UnauthorizedPage',\n },\n /**\n * User is not authorized to access resource\n */\n FORBIDDEN: {\n id: 'forbiddenError',\n statusCode: 403,\n routeName: 'ForbiddenPage',\n },\n /**\n * Generic page for bad request responses (400)\n */\n BAD_REQUEST: {\n id: 'badRequestError',\n statusCode: 400,\n routeName: 'ErrorPage',\n },\n /**\n * Similar to 401 but can provide more reasoning as to why a certain action was blocked\n */\n ACTION_LOCKED: {\n id: 'accountLockedError',\n statusCode: 401,\n routeName: 'ActionLocked',\n },\n /**\n * For scenarios when the user's account couldn't be retrieved from the server\n */\n ACCOUNT_LOAD_FAILURE: {\n id: 'accountLoadError',\n statusCode: 400,\n routeName: 'AccountLoadFailedPage',\n },\n /**\n * For expired access tokens etc\n */\n EXPIRED: {\n id: 'expiredError',\n statusCode: 410,\n routeName: 'ErrorPage',\n },\n /**\n * For expired access tokens etc\n */\n NO_SERVER_RESPONSE: {\n id: 'noServerResponseError',\n statusCode: 500,\n routeName: 'NoServerResponsePage',\n },\n})\n","export const ReplaceMeSelectionType = Object.freeze({\n /**\n * Today - Today button selected\n */\n TODAY: 'Today',\n /**\n * Tomorrow - Tomorrow or Next Monday button selected\n */\n TOMORROW: 'Tomorrow',\n})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Layout',{staticClass:\"slide-1\"},[_c('div',{staticClass:\"shapes-container\"},[_c('div',{staticClass:\"animation-shape shape-ring animation--rotating-diagonal\"},[_c('div')]),_c('div',{staticClass:\"animation-shape shape-circle animation--clockwise\"},[_c('div')]),_c('div',{staticClass:\"animation-shape shape-triangle animation--anti-clockwise\"},[_c('div',{staticClass:\"animation--rotating\"})]),_c('div',{staticClass:\"animation-shape shape-diamond animation--anti-clockwise\"},[_c('div',{staticClass:\"animation--rotating\"})]),_c('div',{staticClass:\"static-shape shape-ring-1\"}),_c('div',{staticClass:\"static-shape shape-ring-2\"}),_c('div',{staticClass:\"static-shape shape-circle-1\"}),_c('div',{staticClass:\"static-shape pattern-dots-1\"}),_c('div',{staticClass:\"static-shape pattern-dots-2\"})]),_c('div',{staticClass:\"text-center white--text\"},[_c('div',{staticClass:\"d-flex flex-column align-center\"},[_c('h3',{staticClass:\"error-title font-weight-black my-10 text-center\",staticStyle:{\"width\":\"fit-content\"}},[_c('div',{staticClass:\"errorHeader\"},[_c('div',{staticClass:\"bgHighlight pr-4\"}),_c('div',{staticClass:\"text display-4 z-index-1\"},[_vm._v(\" \"+_vm._s(_vm.factory.title)+\" \")])])]),_c('p',{staticClass:\"error-desc display-1 font-weight-bold mt-0 z-index-1\"},[_vm._v(\" \"+_vm._s(_vm.factory.desc)+\" \")]),_c('p',{staticClass:\"error-sub-desc subtitle-1 font-weight-medium z-index-1 ws-pre\"},[_vm._v(\" \"+_vm._s(((_vm.factory.showErrorCode ? '(' + _vm.factory.errorCode + ') ' : '') + \" \" + (_vm.factory.subDesc)))+\" \")]),_c('div',{staticClass:\"error-code\",attrs:{\"data-error-code\":_vm.factory.errorText}}),_c('div',{class:[\n 'd-flex justify-center mt-10',\n _vm.$mq === 'sm' || _vm.$mq === 'xs' ? 'flex-column ' : '' ]},[_c('BaseButton',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isUserLoggedIn || _vm.currentUser),expression:\"isUserLoggedIn || currentUser\"}],class:[\n 'rounded-lg text-capitalize no-letter-spacing',\n _vm.isMobileViewPort ? 'mb-2' : 'mr-2' ],attrs:{\"id\":\"error-page-logout-btn\",\"x-large\":\"\",\"text\":\"\",\"outlined\":\"\",\"color\":\"white\"},on:{\"click\":_vm.signOut}},[_c('v-icon',{staticClass:\"white--text\",attrs:{\"left\":\"\"}},[_vm._v(\"mdi-arrow-left\")]),_vm._v(\" \"+_vm._s(_vm.$t('error.errorGenericLogOutButtonText'))+\" \")],1),_c('BaseButton',{class:[\n 'rounded-lg text-capitalize no-letter-spacing white--text',\n _vm.isMobileViewPort ? '' : 'ml-2' ],attrs:{\"id\":\"error-page-go-home-btn\",\"x-large\":\"\",\"light\":\"\",\"color\":\"blue\",\"href\":_vm.factory.goBackURL},domProps:{\"textContent\":_vm._s(_vm.factory.goBackText)}})],1)])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import httpStatus from 'statuses'\nimport i18n from '@plugins/vue-i18n'\nimport ErrorPageCodes from '@/shared/constants/error/ErrorPageCodes'\n\n// Abstract Product\nconst BaseErrorPage = (errorCode) => {\n let errorStatusText = ''\n try {\n errorStatusText = httpStatus(errorCode)\n } catch (error) {\n errorStatusText = 'Unknown'\n }\n\n return {\n // Properties\n showErrorCode: true,\n errorCode,\n errorText: `${errorCode} ${errorStatusText}`,\n title: i18n.t('error.errorGenericTitle'),\n desc: i18n.t('error.errorGenericDescription'),\n subDesc: i18n.t('error.errorGenericSubDescription'),\n goBackURL: '/',\n goBackText: i18n.t('error.errorGenericReturnButtonText'),\n }\n}\n\n// Factory\nexport function ErrorPageFactory(errorCode) {\n switch (errorCode) {\n case ErrorPageCodes.INTERNAL_SERVER_ERROR.id:\n return InternalServerError()\n case ErrorPageCodes.PAGE_NOT_FOUND.id:\n return PageNotFoundError()\n case ErrorPageCodes.UNAUTHORIZED.id:\n return UnauthorizedError()\n case ErrorPageCodes.FORBIDDEN.id:\n return ForbiddenError()\n case ErrorPageCodes.BAD_REQUEST.id:\n return BadRequestError()\n case ErrorPageCodes.ACTION_LOCKED.id:\n return ActionLockedError()\n case ErrorPageCodes.ACCOUNT_LOAD_FAILURE.id:\n return AccountLoadFailedError()\n case ErrorPageCodes.EXPIRED.id:\n return ExpiredError()\n case ErrorPageCodes.NO_SERVER_RESPONSE.id:\n return NoServerResponseError()\n default:\n return BaseErrorPage(ErrorPageCodes.INTERNAL_SERVER_ERROR.statusCode)\n }\n}\n\n// Concrete Products\nconst InternalServerError = () => {\n return BaseErrorPage(ErrorPageCodes.INTERNAL_SERVER_ERROR.statusCode)\n}\n\nconst BadRequestError = () => {\n const base = BaseErrorPage(ErrorPageCodes.BAD_REQUEST.statusCode)\n base.desc = i18n.t('error.badRequestDesc')\n base.subDesc = i18n.t('error.badRequestSubDesc')\n base.showErrorCode = true\n return base\n}\n\nconst PageNotFoundError = () => {\n const base = BaseErrorPage(ErrorPageCodes.PAGE_NOT_FOUND.statusCode)\n base.title = i18n.t('error.errorNotFoundTitle')\n base.desc = i18n.t('error.errorNotFoundDescription')\n base.subDesc = i18n.t('error.errorNotFoundSubDescription')\n base.showErrorCode = true\n return base\n}\n\nconst UnauthorizedError = () => {\n const base = BaseErrorPage(ErrorPageCodes.UNAUTHORIZED.statusCode)\n base.desc = i18n.t('error.errorUnauthorizedDescription')\n base.subDesc = i18n.t('error.errorUnauthorizedSubDescription', {\n companyName: i18n.t('app.companyName'),\n })\n base.showErrorCode = true\n return base\n}\n\nconst ForbiddenError = () => {\n const base = BaseErrorPage(ErrorPageCodes.FORBIDDEN.statusCode)\n base.desc = i18n.t('error.errorUnauthorizedDescription')\n base.subDesc = i18n.t('error.errorUnauthorizedSubDescription', {\n companyName: i18n.t('app.companyName'),\n })\n base.showErrorCode = true\n return base\n}\n\nconst ActionLockedError = () => {\n const base = BaseErrorPage(ErrorPageCodes.ACTION_LOCKED.statusCode)\n\n base.desc = i18n.t('error.errorActionLockedDescription')\n base.subDesc = i18n.t('error.errorActionLockedSubDescription')\n base.showErrorCode = false\n return base\n}\n\nconst ExpiredError = () => {\n const base = BaseErrorPage(ErrorPageCodes.EXPIRED.statusCode)\n base.title = i18n.t('error.errorExpiredTitle')\n base.desc = i18n.t('error.errorExpiredDescription')\n base.subDesc = ''\n base.showErrorCode = false\n return base\n}\n\nconst AccountLoadFailedError = () => {\n const base = BaseErrorPage(ErrorPageCodes.ACCOUNT_LOAD_FAILURE.statusCode)\n base.desc = i18n.t('error.accountLoadFailureDesc')\n base.subDesc = i18n.t('error.accountLoadFailureSubDesc', {\n companyName: i18n.t('app.companyName'),\n })\n base.showErrorCode = false\n base.errorText = i18n.t('error.accountLoadFailureDesc')\n return base\n}\n\nconst NoServerResponseError = () => {\n const base = BaseErrorPage(ErrorPageCodes.NO_SERVER_RESPONSE.statusCode)\n base.desc = i18n.t('error.noServerResponseDesc')\n base.subDesc = i18n.t('error.noServerResponseSubDesc', {\n companyName: i18n.t('app.companyName'),\n })\n base.showErrorCode = false\n base.errorText = i18n.t('error.noServerResponseDesc')\n return base\n}\n","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_error.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_error.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./_error.vue?vue&type=template&id=4161b4e7&scoped=true&\"\nimport script from \"./_error.vue?vue&type=script&lang=js&\"\nexport * from \"./_error.vue?vue&type=script&lang=js&\"\nimport style0 from \"./_error.vue?vue&type=style&index=0&id=4161b4e7&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4161b4e7\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VIcon } from 'vuetify/lib/components/VIcon';\ninstallComponents(component, {VIcon})\n","import $dayjs from '@/services/date'\nimport Environment from '@/shared/constants/core/Environment'\n\nconst development = () =>\n fetch(\n `${process.env.BASE_URL}config.dev.json?t=${$dayjs().valueOf()}`\n ).then((response) => response.json())\n\nconst production = () =>\n fetch(\n `${process.env.BASE_URL}config.runtime.json?t=${$dayjs().valueOf()}`\n ).then((response) => response.json())\n\nconst loadConfig = (environment) => {\n switch (environment) {\n case Environment.production:\n return production()\n case Environment.development:\n default:\n return development()\n }\n}\n\nexport default async () => await loadConfig(process.env.NODE_ENV)\n","import Vue from 'vue'\nimport * as VueGoogleMaps from 'vue2-google-maps'\nimport configFactory from './common/configFactory'\nimport Environment from './shared/constants/core/Environment'\n\n// Don't warn about using the dev version of Vue in development.\nVue.config.productionTip = process.env.NODE_ENV === 'production'\n\n// If running inside Cypress...\nif (process.env.VUE_APP_TEST === Environment.e2e) {\n // Ensure tests fail when Vue emits an error.\n Vue.config.errorHandler = window.Cypress.cy.onUncaughtException\n}\n\n// Ensure config is loaded before Vue is init\nconfigFactory().then((configResponse) => {\n // Store config as a global\n Vue.prototype.$config = configResponse\n\n const config = require('@/common/config').default\n\n // Plugins are loaded using require to ensure import occurs after config\n const router = require('@router').default\n const store = require('@state/store').default\n const vuetify = require('@plugins/vuetify').default\n require('@plugins/vee-validate')\n require('@plugins/vue-mq')\n require('@plugins/vue-toastification')\n const i18n = require('@plugins/vue-i18n').default\n const firebase = require('@plugins/firebase').default\n const appinsights = require('@/plugins/appinsights').default\n // const signalRHub = require('@plugins/signalr-hub.js').default\n const App = require('./app.vue').default\n const sanitizeHtml = require('@/utils/sanitize-html').default\n\n // Globally register all `_base`-prefixed components\n require('@components/_globals')\n\n // TODO: Uncomment hub when SignalR has been implemented\n // Vue.use(signalRHub)\n\n if (config.env === Environment.production)\n Vue.use(appinsights, {\n appInsightsConfig: config.appInsightsConfig,\n router,\n })\n\n require('@/plugins/exception-handler')\n\n // Filters\n const truncateText = require('@filters/truncate-text').default\n Vue.filter('truncateText', truncateText)\n\n // Custom directives\n Vue.directive('sanitized-html', (el, binding) => {\n el.innerHTML = sanitizeHtml(binding.value)\n })\n\n // Init google maps component\n Vue.use(VueGoogleMaps, {\n load: {\n key: config.get('maps.googleMaps.apiKey'),\n },\n installComponents: true,\n })\n\n let app\n\n // Ensure firebase has loaded before app does\n firebase.auth().onAuthStateChanged(() => {\n if (!app)\n app = new Vue({\n router,\n store,\n vuetify,\n i18n,\n render: (h) => h(App),\n }).$mount('#app')\n })\n\n // Handle auth redirect on app load\n if (store.getters['auth/hasImpersonateContactId'])\n store.getters['auth/msalInstance']\n .handleRedirectPromise()\n .then((response) => {\n return store.dispatch('auth/handleRedirect', response)\n })\n .catch(() => {})\n\n // If running e2e tests...\n if (process.env.VUE_APP_TEST === Environment.e2e) {\n // Attach the app to the window, which can be useful\n // for manually setting state in Cypress commands\n // such as `cy.logIn()`.\n window.__app__ = app\n }\n})\n","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./app.vue?vue&type=style&index=0&lang=scss&\"","/**\n * Describes a media query breakpoint\n */\nexport default class MediaQueryBreakPoint {\n constructor({ code = 'md', size = 0 } = {}) {\n /**\n * Break point code 'xs'|'sm'|'md'|'lg'|'xl'\n * @type {String}\n */\n this.code = code\n\n /**\n * Size of breakpoint\n * @type {Number}\n */\n this.size = size\n }\n}\n","import MediaQueryBreakPoint from '@/models/general/mediaQueryBreakPoint'\n\n/**\n * Device pixel breakpoints to be used in conjunction with VueMQ & Vuetify components.\n * Pixel breakpoints are based on Vuetify's breakpoint values: https://vuetifyjs.com/en/features/breakpoints/\n */\nexport default Object.freeze({\n /**\n * Extra small - Small to large phone\n */\n xs: new MediaQueryBreakPoint({\n code: 'xs',\n size: 600,\n }),\n /**\n * Small - Small to medium tablet\n */\n sm: new MediaQueryBreakPoint({\n code: 'sm',\n size: 960,\n }),\n /**\n * Medium - Large tablet to laptop\n */\n md: new MediaQueryBreakPoint({\n code: 'md',\n size: 1264,\n }),\n /**\n * Large - Desktop\n */\n lg: new MediaQueryBreakPoint({\n code: 'lg',\n size: 1904,\n }),\n /**\n * Extra large - \t4k and ultra-wide\n */\n xl: new MediaQueryBreakPoint({\n code: 'xl',\n size: Infinity,\n }),\n})\n","import { mapGetters } from 'vuex'\nimport config from '@/common/config'\nimport Environment from '@/shared/constants/core/Environment'\nimport MediaQueryBreakPoints from '@/shared/constants/core/MediaQueryBreakPoints'\nimport routeDefinitions from '@/shared/constants/routes/routeDefinitions'\n\nexport default {\n computed: {\n ...mapGetters({\n isDebug: 'isDebugModeActive',\n isDarkMode: 'isDarkModeActive',\n hasImpersonateContactId: 'auth/hasImpersonateContactId',\n }),\n isExtraSmall() {\n return this.$mq === MediaQueryBreakPoints.xs.code\n },\n isSmall() {\n return this.$mq === MediaQueryBreakPoints.sm.code\n },\n isMedium() {\n return this.$mq === MediaQueryBreakPoints.md.code\n },\n isLarge() {\n return this.$mq === MediaQueryBreakPoints.lg.code\n },\n isExtraLarge() {\n return this.$mq === MediaQueryBreakPoints.xl.code\n },\n isSmallOrLower() {\n return this.isSmall || this.isExtraSmall\n },\n isMediumOrLower() {\n return this.isSmall || this.isExtraSmall || this.isMedium\n },\n isLargeOrLower() {\n return this.isSmall || this.isExtraSmall || this.isMedium || this.isLarge\n },\n isSmallOrHigher() {\n return this.isSmall || this.isMedium || this.isLarge || this.isExtraLarge\n },\n isMediumOrHigher() {\n return this.isMedium || this.isLarge || this.isExtraLarge\n },\n isLargeOrHigher() {\n return this.isLarge || this.isExtraLarge\n },\n isMobileViewPort() {\n return this.isExtraSmall || this.isSmall || this.isMedium\n },\n isDev() {\n return config.get('env') === Environment.development\n },\n isImpersonating() {\n return this.hasImpersonateContactId\n },\n heightOfDevBar() {\n return this.isDev ? 24 : 0 // in pixels\n },\n routeDefinitions() {\n return routeDefinitions\n },\n },\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.source === 'mdi')?_c('v-icon',_vm._b({},'v-icon',_vm.$attrs,false),[_vm._v(_vm._s(_vm.name))]):(_vm.source === 'custom')?_c('span',_vm._b({class:_vm.customIconClass},'span',_vm.$attrs,false)):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-icon.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-icon.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./_base-icon.vue?vue&type=template&id=5c8cd9da&\"\nimport script from \"./_base-icon.vue?vue&type=script&lang=js&\"\nexport * from \"./_base-icon.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VIcon } from 'vuetify/lib/components/VIcon';\ninstallComponents(component, {VIcon})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.status)?_c('article',{staticClass:\"w-100\",staticStyle:{\"z-index\":\"6\"}},[_c('v-alert',{staticClass:\"mb-0\",attrs:{\"tile\":\"\",\"dark\":\"\"}},[_c('section',{staticClass:\" d-flex justify-space-between align-center\"},[_c('header',{staticClass:\"d-flex\"},[_c('v-icon',{staticClass:\"mr-4\",attrs:{\"left\":\"\"}},[_vm._v(\"mdi-broadcast\")]),_c('h4',{class:_vm.isMobileViewPort ? 'body-2' : '',attrs:{\"title\":\"Service status alert title\"}},[_vm._v(\" \"+_vm._s(_vm._f(\"truncateText\")(_vm.status.bannerTitle,_vm.isMobileViewPort ? 60 : 0))+\" \")])],1),_c('div',{staticClass:\"d-flex align-center\"},[_c('v-btn',{attrs:{\"outlined\":\"\",\"dark\":\"\",\"small\":_vm.isMobileViewPort},on:{\"click\":function($event){_vm.showDialog = true}}},[_vm._v(\" Learn More \")])],1)])]),_c('v-dialog',{attrs:{\"max-width\":\"800\",\"scrollable\":\"\",\"content-class\":\"rounded-0\"},on:{\"input\":function($event){_vm.showDialog = false}},model:{value:(_vm.showDialog),callback:function ($$v) {_vm.showDialog=$$v},expression:\"showDialog\"}},[(_vm.showDialog)?_c('ServiceStatusDialog',{on:{\"closeModal\":function($event){_vm.showDialog = false}}}):_vm._e()],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.serviceStatus)?_c('v-card',{attrs:{\"tile\":\"\"}},[_c('v-toolbar',{attrs:{\"dark\":\"\",\"flat\":\"\"}},[_c('v-btn',{attrs:{\"icon\":\"\",\"dark\":\"\"},on:{\"click\":function($event){return _vm.$emit('closeModal')}}},[_c('v-icon',[_vm._v(\"mdi-close\")])],1),_c('v-toolbar-title',{class:[_vm.isMobileViewPort ? 'body-2' : 'font-weight-bold']},[_vm._v(\" \"+_vm._s(_vm.serviceStatus.bannerTitle)+\" \")]),_c('v-spacer')],1),_c('v-card-text',[_c('v-list',[_c('v-list-item',{class:_vm.isMobileViewPort ? 'pl-0 ml-0' : ''},[_c('v-list-item-content',[_c('v-list-item-subtitle',[_vm._v(\"Severity\")]),_c('v-list-item-title',[_c('BaseStatusLabel',{attrs:{\"text\":_vm.serviceStatus.severity,\"icon\":\"\"}})],1)],1)],1),_c('v-list-item',{class:_vm.isMobileViewPort ? 'pl-0 ml-0' : ''},[_c('v-list-item-content',[_c('v-list-item-subtitle',[_vm._v(\"Region\")]),_c('v-list-item-title',[_vm._v(\" \"+_vm._s(_vm.serviceStatus.region)+\" \")])],1)],1)],1),_c('div',{class:_vm.isMobileViewPort ? '' : 'mx-4',attrs:{\"id\":\"service-status-dialog__body-content\"}})],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./service-status-dialog.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./service-status-dialog.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./service-status-dialog.vue?vue&type=template&id=32ee5578&\"\nimport script from \"./service-status-dialog.vue?vue&type=script&lang=js&\"\nexport * from \"./service-status-dialog.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemSubtitle } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VToolbar } from 'vuetify/lib/components/VToolbar';\nimport { VToolbarTitle } from 'vuetify/lib/components/VToolbar';\ninstallComponents(component, {VBtn,VCard,VCardText,VIcon,VList,VListItem,VListItemContent,VListItemSubtitle,VListItemTitle,VSpacer,VToolbar,VToolbarTitle})\n","\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./service-status-alert.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./service-status-alert.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./service-status-alert.vue?vue&type=template&id=5a2885d8&\"\nimport script from \"./service-status-alert.vue?vue&type=script&lang=js&\"\nexport * from \"./service-status-alert.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VAlert } from 'vuetify/lib/components/VAlert';\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\ninstallComponents(component, {VAlert,VBtn,VDialog,VIcon})\n","import DOMPurify from 'dompurify'\n\n/**\n * Sanitzies strings containing html to remove potentially harmful code and XSS attacks\n * @param {String} dirtyHtml Potentially unsanitised HTML\n * @returns\n */\nexport default function sanitizeHtml(dirtyHtml) {\n return DOMPurify.sanitize(dirtyHtml, {\n USE_PROFILES: { html: true },\n })\n}\n","export const PermissionRequirement = Object.freeze({\n /**\n * Every permission in the permissions list is required\n */\n ALL: 'all',\n /**\n * At least one permission out of the list is required\n */\n ONE: 'one',\n})\n","/**\n * Provided as a catch all and ideally shouldn't be thrown\n */\nexport default class UnknownAppError extends Error {\n constructor(message) {\n super(message || 'Caught an unhandled client side error')\n this.name = 'UnknownAppError'\n }\n}\n","/**\n * Used to track PromiseRejectionEvents\n */\nexport default class PromiseRejectionError extends Error {\n constructor(message) {\n super(message || 'Caught an unhandled promise rejection')\n this.name = 'PromiseRejectionError'\n }\n}\n","/**\n * Code sourced from https://github.com/arunredhu/vuejs_boilerplate/blob/master/src/app/shared/services/app-logger/app-logger.js\n * on 24/10/2022 9:52 AM\n */\n\n/* eslint no-console: [\"off\"] */\nimport config from '@/common/config'\nimport UnknownAppError from '@/models/error/unknownAppError'\nimport VueErrorDTO from '@/models/error/vueErrorDTO'\nimport WindowErrorDTO from '@/models/error/windowErrorDTO'\nimport Environment from '@/shared/constants/core/Environment'\nimport Vue from 'vue'\nimport store from '@state/store.js'\nimport { compileCustomProperties } from '@/helpers/log-helper'\nimport StoreErrorDTO from '@/models/error/storeErrorDTO'\nimport PromiseRejectionError from '@/models/error/promiseRejectionError'\n\n/**\n * @description Logger class\n * This is responsible for logging of all kinds of info in the application\n * Default, we are using the console api for logging and this provides the basic level of logging such as\n * you can use the available method of console in developement but in production these will be replaced with empty methods\n * This can be extended with the help of adding Log level functionality\n */\nclass AppLogger {\n /**\n * @constructor AppLogger\n */\n constructor() {\n /** Initializing the configuration of logger */\n this.initLogger()\n }\n\n /**\n * @description Initializing the configuration such as if environment is production then all log method will be replaced with empty methods\n * except logError, which will be responsible for logging the important info on server or logging service\n */\n initLogger() {\n // Checking the environment\n if (config.get('env') !== Environment.production) {\n this.log = console.log.bind(console)\n\n this.debug = console.debug.bind(console)\n\n this.info = console.info.bind(console)\n\n this.warn = console.warn.bind(console)\n\n this.error = console.error.bind(console)\n\n this.logError = this.error\n } else {\n // In case of production replace the functions definition\n this.log = this.debug = this.info = this.warn = this.error = () => {}\n\n this.logError = (err) => {\n switch (true) {\n case err instanceof VueErrorDTO: {\n const properties = compileCustomProperties(\n store,\n {\n info: err.info,\n route: err.vm?.$route?.name,\n component:\n err.vm?.$options?.name ||\n 'Name prop not set for this component',\n },\n true\n )\n\n Vue.prototype.$appInsights.trackException({\n exception: err.err,\n properties,\n })\n break\n }\n\n case err instanceof WindowErrorDTO: {\n const properties = compileCustomProperties(store, err, true)\n\n Vue.prototype.$appInsights.trackException({\n exception: err.error,\n properties,\n })\n break\n }\n\n case err instanceof PromiseRejectionEvent: {\n const properties = compileCustomProperties(\n store,\n {\n reason: err?.reason,\n type: err?.type,\n },\n true\n )\n\n Vue.prototype.$appInsights.trackException({\n exception: new PromiseRejectionError(err.reason),\n properties,\n })\n break\n }\n case err instanceof StoreErrorDTO: {\n const properties = compileCustomProperties(\n store,\n {\n module: err.module,\n errorResponse: {\n source: err?.errorResponse?.source,\n type: err?.errorResponse?.type,\n message: err?.errorResponse?.message,\n },\n },\n true\n )\n\n Vue.prototype.$appInsights.trackException({\n exception: err.err,\n properties,\n })\n break\n }\n\n default: {\n const properties = compileCustomProperties(\n store,\n {\n error: err,\n },\n true\n )\n\n Vue.prototype.$appInsights.trackException({\n exception: new UnknownAppError(),\n properties,\n })\n break\n }\n }\n }\n }\n }\n}\n\n/** Creating the instance of logger */\nconst logger = new AppLogger()\n\nexport { logger }\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[(_vm.isAppLoading)?_c('Loading'):_c('RouterView',{key:_vm.$route.fullPath})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./app.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./app.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./app.vue?vue&type=template&id=2f3aa39f&\"\nimport script from \"./app.vue?vue&type=script&lang=js&\"\nexport * from \"./app.vue?vue&type=script&lang=js&\"\nimport style0 from \"./app.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","export default Object.freeze({\n home: {\n name: 'home',\n path: '/',\n },\n myAvailability: {\n name: 'myAvailability',\n path: '/availability',\n },\n clientOverview: {\n path: '/overview',\n name: 'client-overview',\n },\n clientGroupOverview: {\n path: '/group-overview',\n name: 'clientGroupOverview',\n },\n timesheets: {\n path: '/timesheets',\n name: 'timesheets',\n },\n candidates: {\n path: '/candidates',\n name: 'candidates',\n },\n help: {\n path: '/help',\n name: 'help',\n },\n bookings: {\n path: '/bookings',\n },\n bookingsCreate: {\n path: 'create',\n name: 'bookings-create',\n },\n bookingsPendingApproval: {\n path: 'pending-approval',\n name: 'Bookings Pending Approval',\n },\n settings: {\n name: 'settings',\n path: '/settings',\n },\n changePassword: {\n name: 'changePassword',\n path: '/settings/change-password',\n },\n login: {\n name: 'login',\n path: '/login',\n },\n impersonateLogout: {\n name: 'impersonateLogout',\n path: '/user/impersonate/logout',\n },\n impersonateLogin: {\n name: 'impersonateLogin',\n path: '/user/impersonate/:contactId',\n },\n finance: {\n name: 'finance',\n path: '/finance',\n },\n invoiceDetails: {\n path: '/finance/invoices/:invoiceNo',\n name: 'invoice-view',\n },\n logout: {\n name: 'logout',\n path: '/logout',\n },\n underConstruction: {\n name: 'underConstruction',\n path: '/under-construction',\n },\n notFound: {\n name: 'NotFoundPage',\n path: '/404',\n },\n error: {\n name: 'ErrorPage',\n path: '/500',\n },\n unauthorized: {\n name: 'UnauthorizedPage',\n path: '/401',\n },\n forbidden: {\n name: 'ForbiddenPage',\n path: '/403',\n },\n accountLoadFailure: {\n name: 'AccountLoadFailedPage',\n },\n noServerResponse: {\n name: 'NoServerResponsePage',\n },\n actionLocked: {\n name: 'accountLockedError',\n },\n})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-btn',_vm._g(_vm._b({},'v-btn',Object.assign({}, _vm.commonAttributes, _vm.$attrs),false),_vm.$listeners),[_vm._t(\"default\")],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-button.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-button.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./_base-button.vue?vue&type=template&id=bc3ebc9e&\"\nimport script from \"./_base-button.vue?vue&type=script&lang=js&\"\nexport * from \"./_base-button.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\ninstallComponents(component, {VBtn})\n","export const LogoForm = Object.freeze({\n FULL: 'Full',\n SHORT: 'Short',\n ICON: 'Icon',\n NONE: '',\n})\n","const initResultObject = (\n isSuccess = false,\n error = null,\n data = null,\n message = '',\n statusCode = null\n) => {\n return { isSuccess, error, data, message, statusCode }\n}\n\n/**\n * Successful operation. isSuccess is set to true\n * @param {*} data\n * @param {String} msg\n * @param {Number} statusCode\n * @returns\n */\nexport const success = (data = null, msg = '', statusCode = 200) =>\n initResultObject(true, null, data, msg, statusCode)\n\n/**\n * Failed operation. isSuccess is set to false\n * @param {Object} error\n * @param {String} msg\n * @param {Number} statusCode\n * @returns\n */\nexport const fail = (error = null, msg = '', statusCode = 400) =>\n initResultObject(false, error, null, msg, statusCode)\n","import config from '@common/config.js'\nimport { PublicClientApplication } from '@azure/msal-browser'\n\nexport default new PublicClientApplication(config.get('msalConfig'))\n","import $date from '@/services/date'\nimport { isEmpty } from 'lodash'\n\nconst isCacheFresh = ({\n cacheDuration,\n durationUnits,\n lastUpdated,\n forceRefresh = false,\n}) => {\n // If not being forced to refresh and it hasn't been longer than staleness threshold\n // return resource without API call\n return (\n !isEmpty(lastUpdated) &&\n !forceRefresh &&\n $date().diff(lastUpdated, durationUnits) < cacheDuration\n )\n}\n\nconst getSavedState = (key) => {\n const item = window.localStorage.getItem(key)\n return item && item !== 'undefined' ? JSON.parse(item) : ''\n}\n\nconst saveState = (key, state) => {\n window.localStorage.setItem(key, JSON.stringify(state))\n}\n\nconst deleteState = (key) => {\n saveState(key, null) // extra precaution\n window.localStorage.removeItem(key)\n}\n\nexport { isCacheFresh, saveState, deleteState, getSavedState }\n","import httpStatus from 'statuses'\n\nconst isHttpStatus = (response, statusCode = 'OK') => {\n return response === httpStatus(statusCode)\n}\n\nconst isSuccess = (response) => {\n return (\n isHttpStatus(response, 'OK') ||\n isHttpStatus(response, 'No Content') ||\n isHttpStatus(response, 'Created')\n )\n}\n\nexport { isSuccess, isHttpStatus }\n","export const Tags = Object.freeze({\n /**\n * This is the primary location/client or group for this contact\n */\n PRIMARY: 'primary',\n /**\n * This contact will be notified of any bookings at this location/client or group\n * (aka confirmed contact)\n */\n CONFIRMED: 'confirmed',\n /**\n * Signifies that the replace me feature is enabled at this location/client or group\n */\n REPLACE_ME_ENABLED: 'replace_me_feature_enabled',\n})\n","/**\n * Validates that an object has every key provided in the expected array\n * @param {Array} expected\n * @param {Object} obj\n * @returns {Boolean}\n */\nexport default function objectHasKeys(expected = [], obj = {}) {\n if (!expected || !Array.isArray(expected) || expected.length === 0)\n throw Error('Expected array needs to be a valid, non-empty array')\n\n if (!obj) throw Error('Object needs to be non-empty')\n\n return expected.every((key) => Object.prototype.hasOwnProperty.call(obj, key))\n}\n","export default Object.freeze({\n /**\n * Error is undetermined\n */\n unknown: 'unknownError',\n /**\n * An internal api error.\n */\n api: 'apiError',\n /**\n * One or more of the input parameters failed validation.\n */\n validation: 'validationError',\n /**\n * An authorisation or authentication error.\n */\n security: 'securityError',\n /**\n * Resource not found\n */\n notFoundError: 'notFoundError',\n})\n","import ErrorResponseType from '@/shared/constants/error/ErrorResponseType'\nimport RequestErrorSource from '@/shared/constants/error/RequestErrorSource'\n\nexport default class ErrorResponse {\n constructor({\n _error = null,\n data = null,\n source = RequestErrorSource.unknown,\n type = ErrorResponseType.unknown,\n code = '',\n message = '',\n param = null,\n } = {}) {\n /**\n * @property {Object} The original error object returned from request attempt\n */\n this._error = _error\n\n /**\n * @property {Object} Container prop to transmit any relevant data down the pipeline\n */\n this.data = data\n\n /**\n * @property {RequestErrorSource} Indicates at what stage the error was triggered when attempting the request\n */\n this.source = source\n\n /**\n * @property {ErrorResponseType} The type of error received from the response (set to unknown if response wasn't received)\n */\n this.type = type\n\n /**\n * @property {string} Error code that may be received from the response or determined locally\n */\n this.code = code\n\n /**\n * @property {string} Message to relate error information to the user\n */\n this.message = message\n\n /**\n * @property {string} Contains the parameter in error (if applicable)\n */\n this.param = param\n }\n}\n","import objectHasKeys from '@/utils/object-has-keys'\nimport ErrorResponseType from '@/shared/constants/error/ErrorResponseType'\nimport RequestErrorSource from '@/shared/constants/error/RequestErrorSource'\nimport ErrorResponse from '@/models/error/ErrorResponse'\nimport { isEmpty } from 'lodash'\n\n// Utils\n\nconst determineRequestErrorType = (error) => {\n if (error?.response) return RequestErrorSource.server\n else if (error?.request) return RequestErrorSource.request\n else return RequestErrorSource.unknown\n}\n\n/**\n * Default API request validation response\n *\n * Object Structure:\n * ```json\n * {\n errors: Object,\n status: Number,\n title: String?,\n traceId: String?,\n type: String?,\n }\n * ```\n *\n * @param {Object} responseData\n * @returns\n */\nconst mapApiValidationErrorResponseToError = (error, errorSource, $i18n) => {\n const base = baseErrorResponse(error, errorSource, $i18n)\n base.data = error.response?.data?.errors\n base.type = error.response?.data?.type || ErrorResponseType.api\n base.message = error.response?.data?.title || base.message\n\n return base\n}\n\n/**\n * Ready2WorkAPI.DTOs.V1.Core.ErrorResponse\n *\n * Object Structure:\n * ```json\n * {\n type: String?,\n code: String?,\n message: String?,\n param: String?,\n }\n * ```\n *\n * @returns\n */\nconst mapR2WErrorResponseToError = (error, errorSource, $i18n) => {\n const base = baseErrorResponse(error, errorSource, $i18n)\n base.type = error.response?.data?.type || ErrorResponseType.api\n base.code = error.response?.data?.code || base.code\n base.message = error.response?.data?.message || base.message\n base.param = error.response?.data?.param\n return base\n}\n\n// Constants\nconst BASE_ERROR_RESPONSE_OBJ_KEYS = ['type', 'code', 'param']\nconst API_VALIDATION_ERROR_OBJ_KEYS = [\n 'errors',\n 'status',\n 'title',\n 'traceId',\n 'type',\n]\n\n// Abstract Product\nconst baseErrorResponse = (error, errorSource, $i18n) => {\n return new ErrorResponse({\n _error: error,\n source: errorSource,\n type: ErrorResponseType.unknown,\n message: $i18n.t('error.genericApiError'),\n })\n}\n\n// Factory\nexport default function(error, $i18n) {\n const errorSource = determineRequestErrorType(error)\n\n switch (errorSource) {\n case RequestErrorSource.server:\n return serverErrorResponse(error, errorSource, $i18n)\n case RequestErrorSource.request:\n return requestErrorResponse(error, errorSource, $i18n)\n default:\n return baseErrorResponse(error, errorSource, $i18n)\n }\n}\n\n// Concrete Products\nconst serverErrorResponse = (error, errorSource, $i18n) => {\n if (!error?.response || isEmpty(error?.response) || !error?.response?.data)\n return baseErrorResponse(error, errorSource, $i18n)\n\n // Case: Default API request validation response\n if (objectHasKeys(API_VALIDATION_ERROR_OBJ_KEYS, error.response?.data)) {\n return mapApiValidationErrorResponseToError(error, errorSource, $i18n)\n }\n\n // Case: Ready2WorkAPI.DTOs.V1.Core.ErrorResponse\n if (objectHasKeys(BASE_ERROR_RESPONSE_OBJ_KEYS, error.response?.data))\n return mapR2WErrorResponseToError(error, errorSource, $i18n)\n\n // Default Case\n return baseErrorResponse(error, errorSource, $i18n)\n}\n\nconst requestErrorResponse = (error, errorSource, $i18n) => {\n return baseErrorResponse(error, errorSource, $i18n)\n}\n","import { fail, success } from '@/helpers/result-helper.js'\nimport router from '@router'\nimport firebase from '@/plugins/firebase'\nimport toast from '@/services/toasts/index.js'\nimport msal from '@plugins/msal'\nimport $date from '@/services/date/index.js'\nimport {\n isCacheFresh,\n getSavedState,\n saveState,\n deleteState,\n} from '@/helpers/cache-helpers'\nimport { DurationUnits } from '@/shared/constants/date/DurationUnits.js'\nimport { isSuccess } from '@/helpers/http-status-helpers'\nimport { LinkType } from '@/shared/constants/permissions/LinkType'\nimport {\n processPermissionsPayload,\n getNodeById,\n getNodePermission,\n hasPermissionAtAnyLevel,\n iterateOverPermissionsTree,\n flattenAccessTree,\n flattenPermissionsWithLocations,\n} from '@/helpers/permissions-helpers'\nimport { PermissionModifier } from '@/shared/constants/permissions/PermissionModifier'\nimport { PermissionScope } from '@/shared/constants/permissions/PermissionScope'\nimport { OperationReturnType } from '@/shared/constants/permissions/OperationReturnType'\nimport { Tags } from '@/shared/constants/permissions/Tags.js'\nimport config from '@common/config.js'\nimport { getLanguageBasedOnBaseURL } from '@/helpers/language-helpers'\nimport ErrorResponseFactory from '@/services/error/ErrorResponseFactory'\nimport StoreErrorDTO from '@/models/error/storeErrorDTO'\nimport { isNonEmptyArray } from '@/helpers/array-helpers'\n// eslint-disable-next-line no-unused-vars\nimport TreeViewDto from '@/models/app/treeViewDto'\nimport ClientSelectorTreeViewDto from '@/models/clients/clientSelectorTreeViewDto'\nimport { orderBy } from 'lodash'\n\n/**\n *\n * @param {{access: [], clientId: number, clientName: string, locations: [], tags: []}[]} clients\n */\nconst extractClientsForTreeView = (clients) => {\n if (!clients || clients.length === 0) return []\n\n /**\n * @type {ClientSelectorTreeViewDto[]}\n */\n const clientsList = []\n\n for (const client of clients) {\n clientsList.push(\n new ClientSelectorTreeViewDto({\n id: client.clientId,\n name: client.clientName,\n locations: client.locations.map((location) => location.locationName),\n })\n )\n }\n\n return orderBy(clientsList, 'name', 'asc')\n}\n\nexport default {\n namespaced: true,\n state: {\n // MSAL User\n account: getSavedState('auth.account'),\n interactionRequired: true,\n // User Profile from DB\n currentUser: getSavedState('auth.currentUser'),\n accessToken: '', // Bearer token\n lastTokenRefresh: null,\n loadingCount: 0,\n auth: firebase,\n permissions: [],\n generalFiles: [],\n impersonateContactId: getSavedState('auth.impersonateContactId'),\n username: null, // used to track errors when user profile is not set\n },\n\n mutations: {\n SET_CURRENT_USER(state, newValue) {\n state.currentUser = { ...newValue, ...{ lastUpdated: $date() } }\n saveState('auth.currentUser', state.currentUser)\n },\n SET_ACCOUNT(state, newValue) {\n state.account = newValue\n saveState('auth.account', newValue)\n },\n SET_IMPERSONATE_CONTACT_ID(state, contactId) {\n state.impersonateContactId = contactId\n saveState('auth.impersonateContactId', contactId)\n },\n SET_USER_PERMISSIONS(state, permissions) {\n state.permissions = processPermissionsPayload(permissions)\n },\n SET_USER_GENERALFILES(state, files) {\n state.generalFiles = files\n },\n SET_INTERACTION_REQUIRED(state, newValue) {\n state.interactionRequired = newValue\n },\n SET_ACCESS_TOKEN(state, token) {\n state.accessToken = token\n state.interactionRequired = false\n state.lastTokenRefresh = $date()\n },\n SET_USER_TO_UNAUTHENTICATED(state) {\n state.account = null\n state.interactionRequired = true\n state.currentUser = null\n state.impersonateContactId = null\n deleteState('auth.account')\n deleteState('auth.currentUser')\n deleteState('auth.impersonateContactId')\n deleteState('client.id')\n deleteState('client.name')\n state.accessToken = null\n state.username = null\n\n sessionStorage.clear()\n localStorage.clear()\n },\n FRESH_IMPERSONATE_CLEAR_STORE(state) {\n state.currentUser = null\n state.impersonateContactId = null\n state.permission = []\n deleteState('auth.currentUser')\n deleteState('auth.impersonateContactId')\n deleteState('client.id')\n deleteState('client.name')\n },\n START_LOADING(state) {\n state.loadingCount++\n },\n FINISH_LOADING(state) {\n state.loadingCount--\n },\n SET_USERNAME(state, username) {\n state.username = username\n },\n },\n\n getters: {\n moduleName: () => 'auth',\n currentUserFullName: (state) =>\n state.currentUser\n ? `${state.currentUser.firstName} ${state.currentUser.lastName}`\n : '',\n currentUserEmail: (state) =>\n state.currentUser\n ? state.currentUser.emailAddress\n : state.username || 'not_specified',\n currentUser: (state) => state.currentUser,\n currentUserContactId: (state) =>\n state.currentUser?.id || state.impersonateContactId || 'not_specified',\n currentUserSimple: (state, getters) => {\n return {\n id: getters.currentUserContactId || '',\n emailAddress: getters.currentUserEmail || '',\n isImpersonating: getters.hasImpersonateContactId,\n }\n },\n getUserForEventLogging: (state, getters) => {\n return {\n contactId: getters.currentUserContactId,\n isImpersonating: getters.hasImpersonateContactId,\n impersonator: getters.hasImpersonateContactId\n ? state.account?.name\n : null,\n }\n },\n isClientGroupOverviewEnabled: (state, getters) =>\n getters.currentUser?.isClientGroupOverviewEnabled,\n msalAccount: (state) => state.account,\n impersonateContactId: (state) => state.impersonateContactId,\n hasImpersonateContactId: (state) => !!state.impersonateContactId,\n getUserStandardBookingDetails: (state) => {\n const standardBookings = state.currentUser?.standardBookings\n if (!standardBookings || standardBookings.length === 0) return null\n return standardBookings[0]\n },\n accessToken: (state) => state.accessToken,\n lastTokenRefresh: (state) => state.lastTokenRefresh,\n isUserLoggedIn: (state) =>\n state.accessToken && (!state.interactionRequired || !!state.account),\n\n isLoadingAuth: (state) => state.loadingCount > 0,\n isInteractionRequired: (state) => state.interactionRequired,\n auth: (state) => state.auth,\n msalInstance: (state) => msal,\n permissions: (state) => state.permissions,\n permissionsTreeView: (state) => {\n if (!state.permissions || state.permissions.length === 0) return []\n\n /**\n * @type {{ access: [], clients: [], groupId: number, groupName: string }[]}\n */\n const permissionsList = state.permissions\n\n /**\n * @type {TreeViewDto[]}\n */\n const tree = []\n\n for (const group of permissionsList) {\n tree.push(\n new TreeViewDto({\n id: group.groupId,\n name: group.groupName,\n children: extractClientsForTreeView(group.clients),\n })\n )\n }\n\n return orderBy(tree, 'name', 'asc')\n },\n redirectToClientOverview: (state) => {\n let clientCount = 0\n\n if (!state.permissions || state.permissions.length === 0) return false\n\n for (const group of state.permissions) {\n clientCount += group.clients.length\n }\n\n return clientCount > 1\n },\n hasMultipleClients: (state, getters) => {\n return getters.redirectToClientOverview\n },\n firstAvailableClient: (state) => {\n return state.permissions[0].clients[0]\n },\n getNode: (state) => (nodeId, level) => {\n return getNodeById(state.permissions, nodeId, level)\n },\n getGroup: (state, getters) => (id) => {\n return getters.getNode(id, LinkType.GROUP)\n },\n getClient: (state, getters) => (id) => {\n return getters.getNode(id, LinkType.CLIENT)\n },\n getClients: (state, getters) => (ids) => {\n return getters.getAllClients.filter((client) =>\n ids.includes(client.clientId)\n )\n },\n getLocation: (state, getters) => (id) => {\n return getters.getNode(id, LinkType.LOCATION)\n },\n getClientLocations: (state, getters) => (id) => {\n const client = getters.getClient(id)\n return client.locations\n },\n getNodeHierarchyByIdAndLevel: (state) => (id, linkType) => {\n const flatTree = flattenPermissionsWithLocations(state.permissions)\n if (!flatTree) return null\n\n switch (linkType) {\n case LinkType.GROUP:\n return flatTree.find((x) => x.groupId === id)\n case LinkType.CLIENT:\n return flatTree.find((x) => x.clientId === id)\n case LinkType.LOCATION:\n return flatTree.find((x) => x.locationId === id)\n default:\n return null\n }\n },\n getFirstClientLocationWithReplaceMePermissions: (state, getters) => (\n clientId\n ) => {\n return getters.getFirstClientLocationWithPermissions(\n clientId,\n PermissionScope.REPLACE_ME\n )\n },\n getAllClients: (state, getters) => {\n return iterateOverPermissionsTree(\n state.permissions,\n LinkType.CLIENT,\n OperationReturnType.LIST\n )\n },\n getAllClientGroups: (state, getters) => {\n return iterateOverPermissionsTree(\n state.permissions,\n LinkType.GROUP,\n OperationReturnType.LIST\n )\n },\n countAllAvailableLocations: (state, getters) => {\n return iterateOverPermissionsTree(\n state.permissions,\n LinkType.LOCATION,\n OperationReturnType.LIST\n ).length\n },\n countAllAvailableBookingLocations: (state, getters) => {\n const list = iterateOverPermissionsTree(\n state.permissions,\n LinkType.LOCATION,\n OperationReturnType.LIST\n )\n\n return list.filter(\n (locationNode) => locationNode?.access?.permissions?.booking?.view\n ).length\n },\n getTimezoneFromFirstClientGroupLocation: (state, getters) => (\n clientGroupId\n ) => {\n const clientGroup = getters.getGroup(clientGroupId)\n\n if (\n !clientGroup ||\n !isNonEmptyArray(clientGroup?.clients) ||\n !isNonEmptyArray(clientGroup?.clients[0]?.locations)\n )\n return ''\n\n return clientGroup?.clients[0]?.locations[0]?.timeZone\n },\n getPermission: (state) => (\n id,\n level,\n scope,\n modifier = PermissionModifier.VIEW\n ) => {\n return getNodePermission(state.permissions, id, level, scope, modifier)\n },\n hasLocationAccountsPermission: (state, getters) => (id) => {\n return getters.getPermission(\n id,\n LinkType.LOCATION,\n PermissionScope.ACCOUNTS\n )\n },\n hasLocationBookingPermission: (state, getters) => (id) => {\n return getters.getPermission(\n id,\n LinkType.LOCATION,\n PermissionScope.BOOKING\n )\n },\n hasLocationPendingApprovalPermission: (state, getters) => (id) => {\n return getters.getPermission(\n id,\n LinkType.LOCATION,\n PermissionScope.PENDING_BOOKING\n )\n },\n hasLocationBookingCreatePermission: (state, getters) => (id) => {\n return getters.getPermission(\n id,\n LinkType.LOCATION,\n PermissionScope.BOOKING,\n PermissionModifier.CREATE\n )\n },\n hasLocationTimesheetPermission: (state, getters) => (id) => {\n return getters.getPermission(\n id,\n LinkType.LOCATION,\n PermissionScope.TIMESHEETS\n )\n },\n hasLocationReplaceMePermission: (state, getters) => (id) => {\n return getters.getPermission(\n id,\n LinkType.LOCATION,\n PermissionScope.REPLACE_ME\n )\n },\n hasClientAccountsPermission: (state, getters) => (id) => {\n return getters.getPermission(\n id,\n LinkType.CLIENT,\n PermissionScope.ACCOUNTS\n )\n },\n hasClientBookingPermission: (state, getters) => (id) => {\n return getters.getPermission(id, LinkType.CLIENT, PermissionScope.BOOKING)\n },\n hasClientPendingApprovalPermission: (state, getters) => (id) => {\n return getters.getPermission(\n id,\n LinkType.CLIENT,\n PermissionScope.PENDING_BOOKING\n )\n },\n hasClientTimesheetPermission: (state, getters) => (id) => {\n return getters.getPermission(\n id,\n LinkType.CLIENT,\n PermissionScope.TIMESHEETS\n )\n },\n hasClientReplaceMePermission: (state, getters) => (id) => {\n return getters.getPermission(\n id,\n LinkType.CLIENT,\n PermissionScope.REPLACE_ME\n )\n },\n hasGroupAccountsPermission: (state, getters) => (id) => {\n return getters.getPermission(id, LinkType.GROUP, PermissionScope.ACCOUNTS)\n },\n hasGroupBookingPermission: (state, getters) => (id) => {\n return getters.getPermission(id, LinkType.GROUP, PermissionScope.BOOKING)\n },\n hasGroupTimesheetPermission: (state, getters) => (id) => {\n return getters.getPermission(\n id,\n LinkType.GROUP,\n PermissionScope.TIMESHEETS\n )\n },\n hasGroupReplaceMePermission: (state, getters) => (id) => {\n return getters.getPermission(\n id,\n LinkType.GROUP,\n PermissionScope.REPLACE_ME\n )\n },\n hasPermissionRegardlessOfLevel: (state, getters) => (\n permissionScope,\n modifier\n ) => {\n return hasPermissionAtAnyLevel(\n state.permissions,\n permissionScope,\n modifier\n )\n },\n flatAccessTree: (state) => {\n return flattenAccessTree(state.permissions)\n },\n getGeneralFiles: (state) => state.generalFiles,\n getFirstClientLocationWithPermissions: (state, getters) => (\n clientId,\n permissionScope\n ) => {\n const client = getters.getClient(clientId)\n if (!client) return null\n if (client.locations.length === 0) return null\n\n // If client has permission, return first location\n if (getters.getPermission(clientId, LinkType.CLIENT, permissionScope)) {\n return client.locations[0]\n }\n\n // Otherwise find first client location with permissions\n const firstAuthorisedLocation = client.locations.find(\n (x) => x.access?.permissions?.[permissionScope]\n )\n return firstAuthorisedLocation\n },\n getFirstClientLocationWithPermissionsByClientIds: (state, getters) => (\n clientIds,\n permissionScope\n ) => {\n let locationWithPerm = null\n\n for (const clientId of clientIds) {\n locationWithPerm = getters.getFirstClientLocationWithPermissions(\n clientId,\n permissionScope\n )\n if (locationWithPerm) break\n }\n\n return locationWithPerm\n },\n getAllClientLocationsWithPermission: (state, getters) => (\n clientId,\n permissionScope\n ) => {\n return getters.getAllClientsLocationsWithPermission(\n [clientId],\n permissionScope\n )\n },\n getAllClientsLocationsWithPermission: (state, getters) => (\n clientIds,\n permissionScope\n ) => {\n const clients = getters.getClients(clientIds)\n\n if (!clients || clients?.length === 0) return false\n\n const locations = []\n for (const client of clients) {\n for (const location of client.locations) {\n if (\n getters.getPermission(\n location.locationId,\n LinkType.LOCATION,\n permissionScope\n )\n )\n locations.push(location)\n }\n }\n\n return locations\n },\n getAllClientLocationsWithReplaceMePermission: (state, getters) => (\n clientId\n ) => {\n const client = getters.getClient(clientId)\n if (!client || client?.locations.length === 0) return false\n\n const locations = []\n for (const location of client.locations) {\n if (\n !!location.tags.find((tag) => tag === Tags.REPLACE_ME_ENABLED) &&\n getters.hasLocationReplaceMePermission(location.locationId)\n )\n locations.push(location)\n }\n\n return locations\n },\n hasPermissionForAtleastOneClientLocation: (state, getters) => (\n clientIds,\n permissionScope,\n modifier\n ) => {\n const clients = getters.getAllClients\n\n const targetClients = clientIds\n\n const selectedClients = clients.filter((client) =>\n targetClients.includes(client.clientId)\n )\n\n // Confirm that there's at least one location to be checked\n if (\n !selectedClients ||\n selectedClients.length === 0 ||\n selectedClients[0].locations.length === 0\n )\n return false\n\n for (const client of selectedClients) {\n // Check if client has permission\n if (\n getters.getPermission(\n client.clientId,\n LinkType.CLIENT,\n permissionScope,\n modifier\n )\n )\n return true\n\n // Check if at least one location has the permission\n for (const location of client.locations) {\n if (\n getters.getPermission(\n location.locationId,\n LinkType.LOCATION,\n permissionScope,\n modifier\n )\n )\n return true\n }\n }\n\n return false\n },\n hasReplaceMePermissionForAtleastOneClientLocation: (state, getters) => (\n clientId\n ) => {\n const client = getters.getClient(clientId)\n if (!client || client?.locations.length === 0) return false\n for (const location of client.locations) {\n if (\n !!location.tags.find((tag) => tag === Tags.REPLACE_ME_ENABLED) &&\n getters.hasLocationReplaceMePermission(location.locationId)\n )\n return true\n }\n\n return false\n },\n hasCreateBookingPermissionForAtleastOneClientLocation: (state, getters) => (\n clientId\n ) => {\n const hasCreateBookingPermission = getters.getFirstClientLocationWithPermissions(\n clientId,\n PermissionScope.BOOKING\n )\n\n return !!hasCreateBookingPermission\n },\n hasCreateBookingPermissionForAtleastOneClientLocationByClientIds: (\n state,\n getters\n ) => (clientIds) => {\n const hasCreateBookingPermission = getters.getFirstClientLocationWithPermissionsByClientIds(\n clientIds,\n PermissionScope.BOOKING\n )\n\n return !!hasCreateBookingPermission\n },\n },\n\n actions: {\n // This is automatically run in `src/state/store.js` when the app\n // starts, along with any other actions named `init` in other modules.\n init({ dispatch }) {},\n\n // Login via firebase\n async logIn({ dispatch, getters, commit }, { username, password }) {\n // Clean out localStorage to ensure AAD credentials don't remain\n dispatch('clearStore', null, { root: true })\n\n // Setting username in the store to assist with logging\n commit('SET_USERNAME', username)\n\n if (getters.isUserLoggedIn) return dispatch('refreshToken')\n\n commit('START_LOADING')\n\n return await firebase\n .auth()\n .signInWithEmailAndPassword(username, password)\n .then(async (response) => {\n if (!response.user)\n return Promise.reject(\n fail([], this.$i18n.t('auth.loginGetProfileFailureErrorText'))\n )\n commit('SET_INTERACTION_REQUIRED', false)\n return success()\n })\n .catch((error) => {\n let message = ''\n if (error.code === 'auth/wrong-password')\n message = this.$i18n.t('auth.loginWrongPasswordErrorText')\n else if (error.code === 'auth/user-not-found')\n message = this.$i18n.t('auth.loginUserNotFoundErrorText')\n else message = error.message\n\n return fail([], message)\n })\n .finally(() => {\n commit('FINISH_LOADING')\n })\n },\n\n /**\n * Handles redirect auth from MSAL\n * @param {Object} response Response will be populated on msal login\n */\n async handleRedirect({ dispatch }, response) {\n // Redirect to home after login\n if (response !== null) {\n await dispatch('getUserFromMsalProvider')\n router.push({ name: 'home' })\n }\n\n // In case multiple accounts exist, you can select\n const currentAccounts = msal.getAllAccounts()\n if (currentAccounts.length > 0) {\n // TODO: Add choose account code here\n await dispatch('getUserFromMsalProvider')\n }\n },\n\n // Handles already logged in impersonate redirect from login page\n async msalAlreadyLoggedInRedirect(\n { dispatch, commit },\n impersonateContactId\n ) {\n // Attempt to log out of firebase & clear out store in preperation\n try {\n await dispatch('firebaseLogOut', {\n nuke: false,\n showNotifications: false,\n redirect: false,\n setUnauthenticated: false,\n })\n } catch {}\n\n // Clear out certain values that need to be retrieved from API\n await dispatch('client/clear', null, { root: true })\n commit('FRESH_IMPERSONATE_CLEAR_STORE')\n\n // Set the new impersonate contact Id\n commit('SET_IMPERSONATE_CONTACT_ID', impersonateContactId)\n\n // Redirect to dashboard\n router.push({ name: 'home' })\n },\n\n async clearImpersonateId({ commit }) {\n commit('FRESH_IMPERSONATE_CLEAR_STORE')\n },\n\n // Logs in the current user.\n async msalLogIn({ dispatch, getters, commit }, impersonateContactId) {\n // Attempt to log out of firebase & clear out store in preperation\n try {\n await dispatch('firebaseLogOut', {\n nuke: true,\n showNotifications: false,\n redirect: false,\n setUnauthenticated: false,\n })\n } catch {}\n\n commit('SET_IMPERSONATE_CONTACT_ID', impersonateContactId)\n\n if (getters.isUserLoggedIn) return dispatch('msalRefreshToken')\n\n const loginRequest = {\n scopes: ['openid'],\n }\n\n msal.loginRedirect(loginRequest).catch((error) => {\n commit('SET_USER_TO_UNAUTHENTICATED')\n\n const errorCode = error.errorCode\n\n const noNotificationReq = ['user_cancelled']\n\n // Filter through errors that don't require a notifiction\n if (noNotificationReq.some((v) => errorCode.includes(v)))\n return fail(error)\n\n toast.error('Failed to login as impersonated contact')\n return fail(error)\n })\n },\n\n // Logs out the current user.\n async msalLogOut(\n { commit, dispatch },\n payload = { redirect: true, nuke: true }\n ) {\n const { redirect, nuke } = payload\n\n commit('START_LOADING')\n\n return await msal\n .logout({})\n .then(() => {\n commit('SET_USER_TO_UNAUTHENTICATED')\n // Nuke store\n if (nuke) dispatch('clearStore', null, { root: true })\n if (redirect)\n router.push({ path: `${getLanguageBasedOnBaseURL()}/landing` })\n\n return success()\n })\n .catch((error) => {\n toast.error(this.$i18n.t('auth.signOutFailureErrorText'))\n return fail(error)\n })\n .finally(() => {\n commit('FINISH_LOADING')\n })\n },\n\n // Retrieves user account from auth provider\n getUserFromMsalProvider({ commit, dispatch }) {\n if (!msal) return Promise.resolve(null)\n\n try {\n const myAccounts = msal.getAllAccounts()\n commit('SET_ACCOUNT', myAccounts[0])\n } catch {\n commit('SET_ACCOUNT', null)\n }\n },\n\n // Validates the current user's token and refreshes it\n // with new data from the API.\n async msalRefreshToken({ dispatch, commit, state }) {\n if (!msal) return Promise.resolve(fail()) // Prevents trying to access auth object before it is initialised\n await dispatch('getUserFromMsalProvider')\n if (!state.account) return Promise.resolve(fail())\n\n commit('SET_USERNAME', state.account?.username)\n\n commit('START_LOADING')\n\n const request = {\n scopes: [config.get('scopes.openId'), config.get('scopes.read')],\n account: state.account,\n }\n\n let response\n\n try {\n response = await msal.acquireTokenSilent(request)\n commit('SET_ACCESS_TOKEN', response.accessToken)\n return success()\n } catch (error) {\n console.warn('Silent token acquisition failed. Using interactive mode')\n return await msal\n .acquireTokenPopup(request)\n .then((response) => {\n commit('SET_ACCESS_TOKEN', response.accessToken)\n return success()\n })\n .catch(() => {\n toast.error('Failed to authenticate as impersonated contact')\n return fail()\n })\n } finally {\n commit('FINISH_LOADING')\n }\n },\n\n // Logs out the current user.\n async logOut({ getters, dispatch }, payload) {\n return dispatch(\n getters.impersonateContactId ? 'msalLogOut' : 'firebaseLogOut',\n payload\n )\n },\n\n // Logs out the current user.\n async firebaseLogOut(\n { commit, dispatch },\n payload = {\n redirect: true,\n nuke: true,\n showNotifications: true,\n setUnauthenticated: true,\n }\n ) {\n const { redirect, nuke, showNotifications, setUnauthenticated } = payload\n\n commit('START_LOADING')\n return await firebase\n .auth()\n .signOut()\n .then(() => {\n if (setUnauthenticated) commit('SET_USER_TO_UNAUTHENTICATED')\n // Nuke store\n if (nuke) dispatch('clearStore', null, { root: true })\n if (redirect)\n window.location.href = `/${getLanguageBasedOnBaseURL()}/landing`\n\n return success()\n })\n .catch((error) => {\n if (showNotifications)\n toast.error(this.$i18n.t('auth.signOutFailureErrorText'))\n return fail(error)\n })\n .finally(() => {\n commit('FINISH_LOADING')\n })\n },\n\n async refreshToken({ dispatch, getters }, forceRefresh = false) {\n return await dispatch(\n getters.impersonateContactId\n ? 'msalRefreshToken'\n : 'firebaseRefreshToken',\n forceRefresh\n )\n },\n\n /**\n * Checks freshness of access token and will force refresh the token if token\n * is considered stale\n * @param {*} context Vuex context\n * @param {Boolean} forceRefresh Forces a token refresh\n * @returns Access token\n */\n async getAccessTokenOrRefresh({ dispatch, getters }, forceRefresh = false) {\n const isAccessTokenFresh = isCacheFresh({\n cacheDuration: 30,\n durationUnits: DurationUnits.MINUTE,\n lastUpdated: getters.lastTokenRefresh,\n forceRefresh,\n })\n\n if (!isAccessTokenFresh) {\n await dispatch('refreshToken', true)\n }\n\n return getters.accessToken\n },\n\n // Validates the current user's token and refreshes it using Firebase\n // with new data from the API.\n async firebaseRefreshToken({ commit }, forceRefresh = false) {\n const currentUser = firebase.auth().currentUser\n commit('SET_USERNAME', currentUser?.email)\n\n return currentUser\n .getIdToken(forceRefresh)\n .then(function(idToken) {\n commit('SET_ACCESS_TOKEN', idToken)\n return Promise.resolve(success())\n })\n .catch(function(error) {\n console.warn(error)\n\n // Handle error\n commit('SET_USER_TO_UNAUTHENTICATED')\n return Promise.resolve(fail(error))\n })\n },\n\n async resetPasswordAsync({ commit }, payload) {\n commit('START_LOADING')\n\n return await firebase\n .auth()\n .sendPasswordResetEmail(payload.email)\n .then(() => {\n toast.success(this.$i18n.t('auth.resetPasswordSuccessText'))\n return success()\n })\n .catch((error) => {\n let message = ''\n if (error.code === 'auth/user-not-found')\n message = this.$i18n.t(\n 'auth.resetPasswordAccountDoesNotExistErrorText'\n )\n else message = error.message\n\n return fail([], message)\n })\n .finally(() => commit('FINISH_LOADING'))\n },\n\n /**\n * Used to reauthenticate a user before a sensative action (e.g. change password, change email address)\n * This is a security requirement enforced by firebase.\n * Read more: https://firebase.google.com/docs/reference/js/firebase.User#reauthenticatewithcredential\n * @param {String} password\n */\n async reauthenticateWithCredentialsAsync({ commit }, password) {\n commit('START_LOADING')\n\n const user = firebase.auth().currentUser\n\n // Prepare auth credentials\n const credentials = firebase.auth.EmailAuthProvider.credential(\n user.email,\n password\n )\n\n // Use credentials to reauthenticate user\n return await user\n .reauthenticateWithCredential(credentials)\n .then(() => {\n return success()\n })\n .catch(() => {\n toast.error(\n this.$i18n.t('auth.failedToAuthenticateWithCredsErrorText')\n )\n return fail()\n })\n .finally(() => commit('FINISH_LOADING'))\n },\n\n async changePasswordAsync({ commit }, payload) {\n commit('START_LOADING')\n\n const user = firebase.auth().currentUser\n\n return await user\n .updatePassword(payload.newPass)\n .then(() => {\n toast.success(this.$i18n.t('auth.changePasswordSuccessText'))\n return success()\n })\n .catch((error) => {\n return fail(error)\n })\n .finally(() => commit('FINISH_LOADING'))\n },\n\n /**\n * Loads user profile from ClientLogin API.\n * @param {Boolean} forceRefresh forces refresh of user profile, bypassing the cache\n * @returns\n */\n async getCurrentUserProfile(\n { commit, dispatch, getters },\n forceRefresh = false\n ) {\n // 1. Check cache freshness\n if (\n getters.currentUser &&\n getters.permissions &&\n getters.permissions.length > 0 &&\n isCacheFresh({\n cacheDuration: 2,\n durationUnits: DurationUnits.HOUR,\n lastUpdated: getters.currentUser.lastUpdated,\n forceRefresh,\n })\n )\n return success(getters.currentUser)\n\n // 2. Load profile from API & cache user profile\n commit('START_LOADING')\n\n try {\n const response = await this.$api.user.get()\n if (isSuccess(response.status)) {\n commit('SET_CURRENT_USER', response.data.contact)\n commit('SET_USER_PERMISSIONS', response.data.links)\n\n // After permission tree is set, verify that currently selected client\n // existing within tree\n dispatch('client/validateSelectedClient', null, { root: true })\n\n commit('SET_USER_GENERALFILES', response.data.generalFiles)\n\n return success(getters.currentUser)\n }\n } catch (ex) {\n const errorResponse = ErrorResponseFactory(ex, this.$i18n)\n\n await dispatch(\n 'logStoreException',\n new StoreErrorDTO({\n err: ex,\n module: getters.moduleName,\n errorResponse,\n }),\n { root: true }\n )\n\n return fail(errorResponse)\n } finally {\n commit('FINISH_LOADING')\n }\n },\n\n clear({ commit }) {\n commit('SET_USER_TO_UNAUTHENTICATED')\n },\n },\n}\n","import axios from 'axios'\nimport $date from '@services/date/index.js'\n\nconst getDefaultState = () => {\n return {\n cached: {\n list: [],\n lastUpdated: null,\n },\n loadingCount: 0,\n crudLoadingCount: 0,\n }\n}\n\nconst state = getDefaultState()\n\nexport default {\n namespaced: true,\n state,\n getters: {\n moduleName: () => 'users',\n user: (state) => (id) => {\n return state.cached.find((user) => user.id === id)\n },\n users: (state) => {\n return state.cached\n },\n isLoadingUsers: (state) => state.loadingCount > 0,\n isLoadingUserCRUD: (state) => state.crudLoadingCount > 0,\n },\n mutations: {\n CACHE_USERS(state, users) {\n state.cached.list = users\n state.cached.lastUpdated = users ? $date() : null\n },\n CACHE_USER(state, newUser) {\n state.cached.list.push(newUser)\n },\n START_LOADING(state) {\n state.loadingCount++\n },\n FINISH_LOADING(state) {\n state.loadingCount--\n },\n START_LOADING_CRUD(state) {\n state.crudLoadingCount++\n },\n FINISH_LOADING_CRUD(state) {\n state.crudLoadingCount--\n },\n CLEAR_STORE(state) {\n // Resets store to default state\n Object.assign(state, getDefaultState())\n },\n },\n actions: {\n async fetchUser({ commit, state, rootState }, { username }) {\n // 1. Check if we already have the user as a current user.\n const { currentUser } = rootState.auth\n if (currentUser && currentUser.username === username) {\n return Promise.resolve(currentUser)\n }\n\n // 2. Check if we've already fetched and cached the user.\n const matchedUser = state.cached.list.find(\n (user) => user.username === username\n )\n if (matchedUser) {\n return Promise.resolve(matchedUser)\n }\n\n // 3. Fetch the user from the API and cache it in case\n // we need it again in the future.\n return axios.get(`/api/users/${username}`).then((response) => {\n const user = response.data\n commit('CACHE_USER', user)\n return user\n })\n },\n /**\n * Resets store to default state.\n */\n clear({ commit }) {\n commit('CLEAR_STORE')\n },\n },\n}\n","import { fail, success } from '@helpers/result-helper.js'\nimport toast from '@services/toasts/index.js'\nimport { isSuccess, isHttpStatus } from '@/helpers/http-status-helpers'\n\nexport default {\n namespaced: true,\n state: {\n loadingCount: 0,\n crudLoadingCount: 0,\n },\n getters: {\n moduleName: () => 'single-invoice',\n isLoading: (state) => state.loadingCount > 0,\n isLoadingCRUD: (state) => state.crudLoadingCount > 0,\n },\n mutations: {\n START_LOADING(state) {\n state.loadingCount++\n },\n FINISH_LOADING(state) {\n state.loadingCount--\n },\n START_LOADING_CRUD(state) {\n state.crudLoadingCount++\n },\n FINISH_LOADING_CRUD(state) {\n state.crudLoadingCount--\n },\n },\n actions: {\n async getInvoiceByInvoiceNo({ commit }, invoiceNo) {\n commit('START_LOADING')\n\n try {\n const response = await this.$api.invoices.getInvoiceByInvoiceNo(\n invoiceNo\n )\n\n if (isSuccess(response.status)) {\n return success(response.data)\n }\n } catch (ex) {\n if (isHttpStatus(ex.response.status, 'Forbidden')) {\n return fail(null, '', 403)\n }\n\n toast.error('Cannot load invoice')\n return fail()\n } finally {\n commit('FINISH_LOADING')\n }\n },\n },\n}\n","export default class AddressViewModel {\n constructor({\n line1,\n line2,\n suburb,\n state,\n postcode,\n country,\n latitude,\n longitude,\n fullAddress,\n } = {}) {\n /**\n * Street address, line 1\n * @type {String}\n * @example '44 Diamond Avenue'\n */\n this.line1 = line1\n\n /**\n * Street address, line 2\n * @type {String}\n * @example 'Level 14'\n */\n this.line2 = line2\n\n /**\n * @type {String}\n * @example 'Collingwood'\n */\n this.suburb = suburb\n\n /**\n * @type {String}\n * @example 'Victoria'\n */\n this.state = state\n\n /**\n * @type {String}\n * @example '3000'\n */\n this.postcode = postcode\n\n /**\n * @type {String}\n * @example 'Australia'\n */\n this.country = country\n\n /**\n * @type {Number}\n * @example 34.51223\n */\n this.latitude = parseFloat(latitude)\n\n /**\n * @type {Number}\n * @example -145.92812\n */\n this.longitude = parseFloat(longitude)\n\n /**\n * The combination of all the address parts into a single string\n * @type {String}\n * @example '44 Diamond Avenue Level 14 Collingwood Victoria 3000 Australia'\n */\n this.fullAddress = fullAddress\n }\n}\n","import AddressViewModel from '../locations/addressViewModel'\n\nexport default class ClientGroupOverviewViewModel {\n constructor({\n address = null,\n clientId,\n clientName,\n locationId,\n locationName,\n openBookings = 0,\n totalBookings = 0,\n } = {}) {\n /**\n * Location's address\n * @type {AddressViewModel}\n */\n this.address = address ? new AddressViewModel(address) : null\n\n /**\n * @type {Number}\n */\n this.clientId = clientId\n\n /**\n * @type {String}\n */\n this.clientName = clientName.trim()\n\n /**\n * @type {Number}\n */\n this.locationId = locationId\n\n /**\n * @type {String}\n */\n this.locationName = locationName.trim()\n\n const hasSameName =\n this.clientName === this.locationName || !this.locationName\n\n /**\n * Name to display in the UI. It's a combination of the client and location name.\n * If the loction name is the same or unset, it will just display the client name.\n * @type {String}\n */\n this.displayName = `${this.clientName}${hasSameName ? '' : ' - '}${\n hasSameName ? '' : this.locationName\n }`\n\n /**\n * Number of unfilled bookings\n * @type {Number}\n */\n this.openBookings = openBookings\n\n /**\n * Number of total bookings\n * @type {Number}\n */\n this.totalBookings = totalBookings\n }\n}\n","import ClientGroupOverviewViewModel from './clientGroupOverviewViewModel'\n\nexport default class ClientGroupOverviewWithFillRateViewModel extends ClientGroupOverviewViewModel {\n constructor({\n address = null,\n clientId,\n clientName,\n locationId,\n locationName,\n openBookings = 0,\n totalBookings = 0,\n } = {}) {\n super({\n address,\n clientId,\n clientName,\n locationId,\n locationName,\n openBookings,\n totalBookings,\n })\n\n this.filledBookings = totalBookings - openBookings\n\n let fillRatePercentage = -1\n\n if (!totalBookings && !openBookings) {\n fillRatePercentage = -1\n } else {\n const percentage = ((totalBookings - openBookings) / totalBookings) * 100\n\n const normalisedPercentage =\n percentage <= 0 || isNaN(percentage) ? 0 : percentage\n\n fillRatePercentage = Math.round(normalisedPercentage)\n }\n\n /**\n * A rounded percent of the number of bookings filled for this location\n * @type {Number}\n */\n this.fillRatePercentage = fillRatePercentage\n }\n}\n","import { fail, success } from '@/helpers/result-helper'\nimport toast from '@/services/toasts/index'\nimport { isSuccess, isHttpStatus } from '@/helpers/http-status-helpers'\nimport { orderBy } from 'lodash'\nimport { getSavedState, saveState, deleteState } from '@/helpers/cache-helpers'\nimport { isNonEmptyArray } from '@/helpers/array-helpers'\nimport ClientGroupOverviewWithFillRateViewModel from '@/models/overview/clientGroupOverviewWithFillRateViewModel'\n\nconst getDefaultState = () => {\n return {\n id: getSavedState('client.id'),\n name: getSavedState('client.name'),\n clientList: getSavedState('selectedClients') || [],\n grades: [],\n owners: [],\n classifications: [],\n loadingCount: 0,\n crudLoadingCount: 0,\n classificationLoadingCount: 0,\n detailsLoadingCount: 0,\n gradesLoadingCount: 0,\n overviewLoadingCount: 0,\n overviewDataLoadingCount: 0,\n }\n}\n\nconst state = getDefaultState()\n\nexport default {\n namespaced: true,\n state,\n getters: {\n moduleName: () => 'client',\n getSelectedClients: (state) => state.clientList,\n grades: (state) => (clientId) => {\n const grades = state.grades.find((x) => x.clientId === clientId)\n\n return grades ? orderBy(grades.list, ['name'], ['asc']) : []\n },\n owner: (state) => (clientId) => {\n const owner = state.owners.find((x) => x.clientId === clientId)\n return owner?.data\n },\n classifications: (state) => (clientId) => {\n const classifications = state.classifications.find(\n (x) => x.clientId === clientId\n )\n\n return classifications?.list || []\n },\n isLoading: (state) => state.loadingCount > 0,\n isLoadingCRUD: (state) => state.crudLoadingCount > 0,\n isLoadingClassifications: (state) => state.classificationLoadingCount > 0,\n isLoadingClientDetails: (state) => state.detailsLoadingCount > 0,\n isLoadingGrades: (state) => state.gradesLoadingCount > 0,\n isLoadingOverview: (state) => state.overviewLoadingCount > 0,\n isLoadingOverviewData: (state) => state.overviewDataLoadingCount > 0,\n mapSelectedClientsToClientsInPermissions: (\n state,\n getters,\n rootState,\n rootGetters\n ) => {\n const allClientsInPerms = rootGetters['auth/getAllClients']\n const mappedClients = allClientsInPerms.filter((client) =>\n getters.getSelectedClients.includes(client.clientId)\n )\n\n return mappedClients\n },\n },\n mutations: {\n START_LOADING(state) {\n state.loadingCount++\n },\n FINISH_LOADING(state) {\n state.loadingCount--\n },\n START_LOADING_CRUD(state) {\n state.crudLoadingCount++\n },\n FINISH_LOADING_CRUD(state) {\n state.crudLoadingCount--\n },\n START_LOADING_CLASSIFICATIONS(state) {\n state.classificationLoadingCount++\n },\n FINISH_LOADING_CLASSIFICATIONS(state) {\n state.classificationLoadingCount--\n },\n START_LOADING_DETAILS(state) {\n state.detailsLoadingCount++\n },\n FINISH_LOADING_DETAILS(state) {\n state.detailsLoadingCount--\n },\n START_LOADING_GRADES(state) {\n state.gradesLoadingCount++\n },\n FINISH_LOADING_GRADES(state) {\n state.gradesLoadingCount--\n },\n START_LOADING_OVERVIEW(state) {\n state.overviewLoadingCount++\n },\n FINISH_LOADING_OVERVIEW(state) {\n state.overviewLoadingCount--\n },\n START_LOADING_OVERVIEW_DATA(state) {\n state.overviewDataLoadingCount++\n },\n FINISH_LOADING_OVERVIEW_DATA(state) {\n state.overviewDataLoadingCount--\n },\n /**\n * TODO: Remove\n */\n SET_CLIENT(state, { clientId, clientName }) {\n state.id = clientId\n state.name = clientName\n\n saveState('client.id', clientId)\n saveState('client.name', clientName)\n },\n /**\n * @param {*} state\n * @param {number[]} clientsIds List of client ids\n */\n SET_CLIENTS(state, clientIds) {\n const sortedClientIds = clientIds.sort((a, b) => a - b) // Asc number sort\n\n state.clientList = sortedClientIds\n saveState('selectedClients', sortedClientIds)\n },\n UPSERT_CLIENT_GRADES(state, payload) {\n const found = state.grades.find((x) => x.clientId === payload.clientId)\n\n if (!found) {\n return state.grades.push({\n clientId: payload.clientId,\n list: payload.grades,\n })\n }\n\n found.list = payload.grades\n },\n UPSERT_ADDITIONAL_DETAILS(state, payload) {\n const found = state.owners.find((x) => x.clientId === payload.clientId)\n\n if (!found) {\n return state.owners.push({\n clientId: payload.clientId,\n data: payload.owner,\n })\n }\n\n found.data = payload.owner\n },\n UPSERT_CLIENT_CLASSIFICATIONS(state, payload) {\n const found = state.classifications.find(\n (x) => x.clientId === payload.clientId\n )\n\n if (!found) {\n return state.classifications.push({\n clientId: payload.clientId,\n list: payload.classifications,\n })\n }\n\n found.list = payload.classifications\n },\n CLEAR_STORE(state) {\n // Clear out LocalStorage\n deleteState('client.id')\n deleteState('client.name')\n\n // Resets store to default state\n Object.assign(state, getDefaultState())\n },\n },\n actions: {\n setClient({ commit, rootGetters, dispatch }, clientId) {\n const client = rootGetters['auth/getClient'](clientId)\n\n if (!client) {\n toast.error(this.$i18n.t('client.clientNotFoundErrorText'))\n return fail()\n }\n\n dispatch('loadClientAdditionalInformation', clientId)\n\n // Clear store modules of client specific data before switching\n dispatch('invoices/clear', {}, { root: true })\n dispatch('bookings/clear', {}, { root: true })\n dispatch('contacts/clear', {}, { root: true })\n dispatch('timesheets/clear', {}, { root: true })\n\n commit('SET_CLIENT', client)\n return success()\n },\n async loadClientAdditionalInformation({ commit, getters }, clientId) {\n const cId = clientId\n\n if (!cId)\n return Promise.resolve(\n fail('', 'Must select a client first before loading client details')\n )\n\n // Check cache\n const isCached = getters.owner(cId)\n\n if (isCached) return Promise.resolve(success(isCached))\n\n commit('START_LOADING_DETAILS')\n\n try {\n const response = await this.$api.client.getAdditionalDetails(cId)\n\n if (isSuccess(response.status)) {\n commit('UPSERT_ADDITIONAL_DETAILS', {\n owner: isHttpStatus(response.status, 204) ? [] : response.data,\n clientId: cId,\n })\n return success(response.data)\n }\n } catch (ex) {\n toast.error('Cannot load client details')\n return fail()\n } finally {\n commit('FINISH_LOADING_DETAILS')\n }\n },\n async loadClientGrades({ commit, getters }, clientId) {\n const cId = clientId\n\n // Check cached client grades for selected client\n const isCached = getters.grades(cId)\n\n if (isCached && isCached.length > 0)\n return Promise.resolve(success(isCached))\n\n commit('START_LOADING_GRADES')\n\n try {\n const response = await this.$api.client.getClientGrades(cId)\n\n if (isSuccess(response.status)) {\n commit('UPSERT_CLIENT_GRADES', {\n grades: isHttpStatus(response.status, 204) ? [] : response.data,\n clientId: cId,\n })\n return success(response.data)\n }\n } catch (ex) {\n toast.error('Cannot load grades')\n return fail()\n } finally {\n commit('FINISH_LOADING_GRADES')\n }\n },\n async loadClientClassifications({ commit, getters }, clientId) {\n const cId = clientId\n\n // Check cached client classifications for selected client\n const isCached = getters.classifications(cId)\n\n if (isCached && isCached.length > 0)\n return Promise.resolve(success(isCached))\n\n commit('START_LOADING_CLASSIFICATIONS')\n\n try {\n const response = await this.$api.client.getClientClassifications(cId)\n\n if (isSuccess(response.status)) {\n commit('UPSERT_CLIENT_CLASSIFICATIONS', {\n classifications: isHttpStatus(response.status, 204)\n ? []\n : response.data,\n clientId: cId,\n })\n return success(response.data)\n }\n } catch (ex) {\n toast.error('Cannot load classifications')\n return fail()\n } finally {\n commit('FINISH_LOADING_CLASSIFICATIONS')\n }\n },\n /**\n * Validates that the user has the permission to access the currently\n * selected client. If not, this client will be removed and another\n * will be selected\n */\n async validateSelectedClient({ rootGetters, dispatch }) {\n if (!getSavedState('client.id')) return\n\n const clientExistsInPermissionTree = rootGetters['auth/getClient'](\n getSavedState('client.id')\n )\n\n // If client exists, no further action required\n if (clientExistsInPermissionTree) return\n\n // User doesn't have access to current client, select first available client\n const firstAvailableClient = rootGetters['auth/firstAvailableClient']\n await dispatch('setClient', firstAvailableClient.clientId)\n },\n async loadClientGroupOverviewSchoolStatus(\n { commit, rootGetters },\n { clientGroupId, filterDate }\n ) {\n commit('START_LOADING_OVERVIEW_DATA')\n\n try {\n const timeZone = rootGetters[\n 'auth/getTimezoneFromFirstClientGroupLocation'\n ](clientGroupId)\n\n const response = await this.$api.clientGroups.getOverviewData(\n clientGroupId,\n filterDate,\n timeZone\n )\n\n if (isSuccess(response.status)) {\n return success(\n isNonEmptyArray(response.data)\n ? response.data.map(\n (overviewVM) =>\n new ClientGroupOverviewWithFillRateViewModel(overviewVM)\n )\n : []\n )\n }\n } catch (ex) {\n return fail(\n ex.response?.data || {\n message: this.$i18n.t(\n 'clientGroupOverview.error.noMessageFromServer'\n ),\n }\n )\n } finally {\n commit('FINISH_LOADING_OVERVIEW_DATA')\n }\n },\n setClientList({ commit }, clients) {\n commit('SET_CLIENTS', clients)\n },\n /**\n * Resets store to default state.\n */\n clear({ commit }) {\n commit('CLEAR_STORE')\n },\n },\n}\n","import { fail, success } from '@helpers/result-helper'\nimport toast from '@services/toasts/index'\nimport { isSuccess } from '@/helpers/http-status-helpers'\n\nconst getDefaultState = () => {\n return {\n loadingCount: 0,\n crudLoadingCount: 0,\n downloadingFileCount: 0,\n invoices: [],\n invoicesTotal: 0,\n serverCurrentPage: 0,\n }\n}\n\nconst state = getDefaultState()\n\nexport default {\n namespaced: true,\n state,\n getters: {\n moduleName: () => 'invoices',\n isLoading: (state) => state.loadingCount > 0,\n isLoadingCRUD: (state) => state.crudLoadingCount > 0,\n isDownloadingFile: (state) => state.downloadingFileCount > 0,\n invoices: (state) => state.invoices,\n invoicesTotal: (state) => state.invoicesTotal,\n serverCurrentPage: (state) => state.serverCurrentPage,\n },\n mutations: {\n START_LOADING(state) {\n state.loadingCount++\n },\n FINISH_LOADING(state) {\n state.loadingCount--\n },\n START_LOADING_CRUD(state) {\n state.crudLoadingCount++\n },\n FINISH_LOADING_CRUD(state) {\n state.crudLoadingCount--\n },\n SET_INVOICES(state, invoices) {\n state.invoices = invoices\n },\n SET_INVOICES_TOTAL(state, total) {\n state.invoicesTotal = total\n },\n SET_SERVER_CURRENT_PAGE(state, page) {\n state.serverCurrentPage = page\n },\n START_DOWNLOADING_FILE(state) {\n state.downloadingFileCount++\n },\n FINISH_DOWNLOADING_FILE(state) {\n state.downloadingFileCount--\n },\n CLEAR_STORE(state) {\n // Resets store to default state\n Object.assign(state, getDefaultState())\n },\n },\n actions: {\n async loadInvoices({ commit }, { page, pageSize }) {\n commit('START_LOADING')\n\n try {\n const response = await this.$api.invoices.get('', {\n skip: (page - 1) * pageSize,\n take: pageSize,\n })\n\n if (isSuccess(response.status)) {\n commit('SET_INVOICES', response.data.invoices)\n commit('SET_INVOICES_TOTAL', response.data.total)\n commit('SET_SERVER_CURRENT_PAGE', response.data.currentPage)\n\n return success(response.data)\n }\n } catch {\n toast.error(this.$i18n.t('error.errorGenericApiErrorText'))\n return fail()\n } finally {\n commit('FINISH_LOADING')\n }\n },\n async getOustandingInvoicesCount({ commit }) {\n commit('START_LOADING')\n try {\n const response = await this.$api.invoices.getOustandingInvoicesCount()\n if (isSuccess(response.status)) {\n return success(response.data.outstandingInvoicesCount)\n }\n } catch {\n toast.error(`Failed to load Oustanding Invoices Count`)\n return fail()\n } finally {\n commit('FINISH_LOADING')\n }\n },\n async downloadInvoiceFile({ commit }, invoiceId) {\n commit('START_DOWNLOADING_FILE')\n\n try {\n const response = await this.$api.invoices.getInvoiceFile(invoiceId)\n\n if (isSuccess(response.status)) {\n const url = window.URL.createObjectURL(\n new Blob([response.data], { type: 'application/pdf' })\n )\n return success(url)\n }\n } catch (ex) {\n let toastErrorMessage = this.$i18n.t('error.errorGenericApiErrorText')\n // Try to resolve error response. Response type is Blob, need to convert\n // from blob to json\n try {\n const responseObject = JSON.parse(await ex.response.data.text())\n if (responseObject) toastErrorMessage = responseObject.message\n } catch {}\n\n toast.error(toastErrorMessage)\n return fail()\n } finally {\n commit('FINISH_DOWNLOADING_FILE')\n }\n },\n /**\n * Resets store to default state.\n */\n clear({ commit }) {\n commit('CLEAR_STORE')\n },\n },\n}\n","export default class TimesheetsSummaryClientViewModel {\n constructor({\n clientId = 0,\n clientName = '',\n approvedCount = 0,\n pendingReviewCount = 0,\n pendingApprovalCount = 0,\n } = {}) {\n /**\n * @type {Number}\n */\n this.clientId = clientId\n /**\n * @type {String}\n */\n this.clientName = clientName\n /**\n * @type {Number}\n */\n this.approvedCount = approvedCount\n /**\n * @type {Number}\n */\n this.pendingReviewCount = pendingReviewCount\n /**\n * @type {Number}\n */\n this.pendingApprovalCount = pendingApprovalCount\n }\n}\n","export default class TimesheetsSummaryCandidateViewModel {\n constructor({\n candidateId = 0,\n candidateName = '',\n approvedCount = 0,\n pendingReviewCount = 0,\n pendingApprovalCount = 0,\n } = {}) {\n /**\n * @type {Number}\n */\n this.candidateId = candidateId\n /**\n * @type {String}\n */\n this.candidateName = candidateName\n /**\n * @type {Number}\n */\n this.approvedCount = approvedCount\n /**\n * @type {Number}\n */\n this.pendingReviewCount = pendingReviewCount\n /**\n * @type {Number}\n */\n this.pendingApprovalCount = pendingApprovalCount\n }\n}\n","import { isNonEmptyArray } from '@/helpers/array-helpers'\nimport TimesheetsSummaryClientViewModel from './timesheetsSummaryClientViewModel'\nimport TimesheetsSummaryCandidateViewModel from './timesheetsSummaryCandidateViewModel'\n\nexport default class TimesheetsSummaryViewModel {\n constructor({\n clientTimesheetsSummary = [],\n candidateTimesheetsSummary = [],\n totalApprovedCount = 0,\n totalPendingReviewCount = 0,\n totalPendingApprovalCount = 0,\n } = {}) {\n /**\n * @type {Number}\n */\n this.totalApprovedCount = totalApprovedCount\n /**\n * @type {Number}\n */\n this.totalPendingReviewCount = totalPendingReviewCount\n /**\n * @type {Number}\n */\n this.totalPendingApprovalCount = totalPendingApprovalCount\n /**\n * @type {Array}\n */\n this.clientTimesheetsSummary = isNonEmptyArray(clientTimesheetsSummary)\n ? clientTimesheetsSummary.map(\n (client) => new TimesheetsSummaryClientViewModel(client)\n )\n : []\n /**\n * @type {Array}\n */\n this.candidateTimesheetsSummary = isNonEmptyArray(\n candidateTimesheetsSummary\n )\n ? candidateTimesheetsSummary.map(\n (candidate) => new TimesheetsSummaryCandidateViewModel(candidate)\n )\n : []\n }\n}\n","import { isNonEmptyArray } from '@/helpers/array-helpers'\nimport TimesheetsPendingApprovalViewModel from './timesheetsPendingApprovalViewModel'\n\nexport default class TimesheetsViewModel {\n constructor({\n approvedCount = 0,\n pendingReviewCount = 0,\n pendingApprovalList = [],\n } = {}) {\n /**\n * @type {Number}\n */\n this.approvedCount = approvedCount\n\n /**\n * @type {Number}\n */\n this.pendingReviewCount = pendingReviewCount\n\n /**\n * @type {Array}\n */\n this.pendingApprovalList = isNonEmptyArray(pendingApprovalList)\n ? pendingApprovalList.map(\n (pendingApproval) =>\n new TimesheetsPendingApprovalViewModel(pendingApproval)\n )\n : []\n }\n}\n","/**\n * Hypertext Transfer Protocol (HTTP) response status codes.\n *\n * @see {@link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes}\n * @see {@link https://gist.github.com/RWOverdijk/6cef816cfdf5722228e01cc05fd4b094}\n */\nexport default Object.freeze({\n /**\n * The server has received the request headers and the client should proceed to send the request body\n * (in the case of a request for which a body needs to be sent; for example, a POST request).\n * Sending a large request body to a server after a request has been rejected for inappropriate headers would be inefficient.\n * To have a server check the request's headers, a client must send Expect: 100-continue as a header in its initial request\n * and receive a 100 Continue status code in response before sending the body. The response 417 Expectation Failed indicates the request should not be continued.\n */\n Continue: 100,\n\n /**\n * The requester has asked the server to switch protocols and the server has agreed to do so.\n */\n SwitchingProtocols: 101,\n\n /**\n * A WebDAV request may contain many sub-requests involving file operations, requiring a long time to complete the request.\n * This code indicates that the server has received and is processing the request, but no response is available yet.\n * This prevents the client from timing out and assuming the request was lost.\n */\n Processing: 102,\n\n /**\n * Standard response for successful HTTP requests.\n * The actual response will depend on the request method used.\n * In a GET request, the response will contain an entity corresponding to the requested resource.\n * In a POST request, the response will contain an entity describing or containing the result of the action.\n */\n Ok: 200,\n\n /**\n * The request has been fulfilled, resulting in the creation of a new resource.\n */\n Created: 201,\n\n /**\n * The request has been accepted for processing, but the processing has not been completed.\n * The request might or might not be eventually acted upon, and may be disallowed when processing occurs.\n */\n Accepted: 202,\n\n /**\n * SINCE HTTP/1.1\n * The server is a transforming proxy that received a 200 OK from its origin,\n * but is returning a modified version of the origin's response.\n */\n NonAuthoritativeInformation: 203,\n\n /**\n * The server successfully processed the request and is not returning any content.\n */\n NoContent: 204,\n\n /**\n * The server successfully processed the request, but is not returning any content.\n * Unlike a 204 response, this response requires that the requester reset the document view.\n */\n ResetContent: 205,\n\n /**\n * The server is delivering only part of the resource (byte serving) due to a range header sent by the client.\n * The range header is used by HTTP clients to enable resuming of interrupted downloads,\n * or split a download into multiple simultaneous streams.\n */\n PartialContent: 206,\n\n /**\n * The message body that follows is an XML message and can contain a number of separate response codes,\n * depending on how many sub-requests were made.\n */\n MultiStatus: 207,\n\n /**\n * The members of a DAV binding have already been enumerated in a preceding part of the (multistatus) response,\n * and are not being included again.\n */\n AlreadyReported: 208,\n\n /**\n * The server has fulfilled a request for the resource,\n * and the response is a representation of the result of one or more instance-manipulations applied to the current instance.\n */\n ImUsed: 226,\n\n /**\n * Indicates multiple options for the resource from which the client may choose (via agent-driven content negotiation).\n * For example, this code could be used to present multiple video format options,\n * to list files with different filename extensions, or to suggest word-sense disambiguation.\n */\n MultipleChoices: 300,\n\n /**\n * This and all future requests should be directed to the given URI.\n */\n MovedPermanently: 301,\n\n /**\n * This is an example of industry practice contradicting the standard.\n * The HTTP/1.0 specification (RFC 1945) required the client to perform a temporary redirect\n * (the original describing phrase was \"Moved Temporarily\"), but popular browsers implemented 302\n * with the functionality of a 303 See Other. Therefore, HTTP/1.1 added status codes 303 and 307\n * to distinguish between the two behaviours. However, some Web applications and frameworks\n * use the 302 status code as if it were the 303.\n */\n Found: 302,\n\n /**\n * SINCE HTTP/1.1\n * The response to the request can be found under another URI using a GET method.\n * When received in response to a POST (or PUT/DELETE), the client should presume that\n * the server has received the data and should issue a redirect with a separate GET message.\n */\n SeeOther: 303,\n\n /**\n * Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-None-Match.\n * In such case, there is no need to retransmit the resource since the client still has a previously-downloaded copy.\n */\n NotModified: 304,\n\n /**\n * SINCE HTTP/1.1\n * The requested resource is available only through a proxy, the address for which is provided in the response.\n * Many HTTP clients (such as Mozilla and Internet Explorer) do not correctly handle responses with this status code, primarily for security reasons.\n */\n UseProxy: 305,\n\n /**\n * No longer used. Originally meant \"Subsequent requests should use the specified proxy.\"\n */\n SwitchProxy: 306,\n\n /**\n * SINCE HTTP/1.1\n * In this case, the request should be repeated with another URI; however, future requests should still use the original URI.\n * In contrast to how 302 was historically implemented, the request method is not allowed to be changed when reissuing the original request.\n * For example, a POST request should be repeated using another POST request.\n */\n TemporaryRedirect: 307,\n\n /**\n * The request and all future requests should be repeated using another URI.\n * 307 and 308 parallel the behaviors of 302 and 301, but do not allow the HTTP method to change.\n * So, for example, submitting a form to a permanently redirected resource may continue smoothly.\n */\n PermanentRedirect: 308,\n\n /**\n * The server cannot or will not process the request due to an apparent client error\n * (e.g., malformed request syntax, too large size, invalid request message framing, or deceptive request routing).\n */\n BadRequest: 400,\n\n /**\n * Similar to 403 Forbidden, but specifically for use when authentication is required and has failed or has not yet\n * been provided. The response must include a WWW-Authenticate header field containing a challenge applicable to the\n * requested resource. See Basic access authentication and Digest access authentication. 401 semantically means\n * \"unauthenticated\",i.e. the user does not have the necessary credentials.\n */\n Unauthorized: 401,\n\n /**\n * Reserved for future use. The original intention was that this code might be used as part of some form of digital\n * cash or micro payment scheme, but that has not happened, and this code is not usually used.\n * Google Developers API uses this status if a particular developer has exceeded the daily limit on requests.\n */\n PaymentRequired: 402,\n\n /**\n * The request was valid, but the server is refusing action.\n * The user might not have the necessary permissions for a resource.\n */\n Forbidden: 403,\n\n /**\n * The requested resource could not be found but may be available in the future.\n * Subsequent requests by the client are permissible.\n */\n NotFound: 404,\n\n /**\n * A request method is not supported for the requested resource;\n * for example, a GET request on a form that requires data to be presented via POST, or a PUT request on a read-only resource.\n */\n MethodNotAllowed: 405,\n\n /**\n * The requested resource is capable of generating only content not acceptable according to the Accept headers sent in the request.\n */\n NotAcceptable: 406,\n\n /**\n * The client must first authenticate itself with the proxy.\n */\n ProxyAuthenticationRequired: 407,\n\n /**\n * The server timed out waiting for the request.\n * According to HTTP specifications:\n * \"The client did not produce a request within the time that the server was prepared to wait. The client MAY repeat the request without modifications at any later time.\"\n */\n RequestTimeout: 408,\n\n /**\n * Indicates that the request could not be processed because of conflict in the request,\n * such as an edit conflict between multiple simultaneous updates.\n */\n Conflict: 409,\n\n /**\n * Indicates that the resource requested is no longer available and will not be available again.\n * This should be used when a resource has been intentionally removed and the resource should be purged.\n * Upon receiving a 410 status code, the client should not request the resource in the future.\n * Clients such as search engines should remove the resource from their indices.\n * Most use cases do not require clients and search engines to purge the resource, and a \"404 Not Found\" may be used instead.\n */\n Gone: 410,\n\n /**\n * The request did not specify the length of its content, which is required by the requested resource.\n */\n LengthRequired: 411,\n\n /**\n * The server does not meet one of the preconditions that the requester put on the request.\n */\n PreconditionFailed: 412,\n\n /**\n * The request is larger than the server is willing or able to process. Previously called \"Request Entity Too Large\".\n */\n PayloadTooLarge: 413,\n\n /**\n * The URI provided was too long for the server to process. Often the result of too much data being encoded as a query-string of a GET request,\n * in which case it should be converted to a POST request.\n * Called \"Request-URI Too Long\" previously.\n */\n UriTooLong: 414,\n\n /**\n * The request entity has a media type which the server or resource does not support.\n * For example, the client uploads an image as image/svg+xml, but the server requires that images use a different format.\n */\n UnsupportedMediaType: 415,\n\n /**\n * The client has asked for a portion of the file (byte serving), but the server cannot supply that portion.\n * For example, if the client asked for a part of the file that lies beyond the end of the file.\n * Called \"Requested Range Not Satisfiable\" previously.\n */\n RangeNotSatisfiable: 416,\n\n /**\n * The server cannot meet the requirements of the Expect request-header field.\n */\n ExpectationFailed: 417,\n\n /**\n * This code was defined in 1998 as one of the traditional IETF April Fools' jokes, in RFC 2324, Hyper Text Coffee Pot Control Protocol,\n * and is not expected to be implemented by actual HTTP servers. The RFC specifies this code should be returned by\n * teapots requested to brew coffee. This HTTP status is used as an Easter egg in some websites, including Google.com.\n */\n IAmATeapot: 418,\n\n /**\n * The request was directed at a server that is not able to produce a response (for example because a connection reuse).\n */\n MisdirectedRequest: 421,\n\n /**\n * The request was well-formed but was unable to be followed due to semantic errors.\n */\n UnprocessableEntity: 422,\n\n /**\n * The resource that is being accessed is locked.\n */\n Locked: 423,\n\n /**\n * The request failed due to failure of a previous request (e.g., a PROPPATCH).\n */\n FailedDependency: 424,\n\n /**\n * The client should switch to a different protocol such as TLS/1.0, given in the Upgrade header field.\n */\n UpgradeRequired: 426,\n\n /**\n * The origin server requires the request to be conditional.\n * Intended to prevent \"the 'lost update' problem, where a client\n * GETs a resource's state, modifies it, and PUTs it back to the server,\n * when meanwhile a third party has modified the state on the server, leading to a conflict.\"\n */\n PreconditionRequired: 428,\n\n /**\n * The user has sent too many requests in a given amount of time. Intended for use with rate-limiting schemes.\n */\n TooManyRequests: 429,\n\n /**\n * The server is unwilling to process the request because either an individual header field,\n * or all the header fields collectively, are too large.\n */\n RequestHeaderFieldsTooLarge: 431,\n\n /**\n * A server operator has received a legal demand to deny access to a resource or to a set of resources\n * that includes the requested resource. The code 451 was chosen as a reference to the novel Fahrenheit 451.\n */\n UnavailableForLegalReasons: 451,\n\n /**\n * A generic error message, given when an unexpected condition was encountered and no more specific message is suitable.\n */\n InternalServerError: 500,\n\n /**\n * The server either does not recognize the request method, or it lacks the ability to fulfill the request.\n * Usually this implies future availability (e.g., a new feature of a web-service API).\n */\n NotImplemented: 501,\n\n /**\n * The server was acting as a gateway or proxy and received an invalid response from the upstream server.\n */\n BadGateway: 502,\n\n /**\n * The server is currently unavailable (because it is overloaded or down for maintenance).\n * Generally, this is a temporary state.\n */\n ServiceUnavailable: 503,\n\n /**\n * The server was acting as a gateway or proxy and did not receive a timely response from the upstream server.\n */\n GatewayTimeout: 504,\n\n /**\n * The server does not support the HTTP protocol version used in the request\n */\n HttpVersionNotSupported: 505,\n\n /**\n * Transparent content negotiation for the request results in a circular reference.\n */\n VariantAlsoNegotiates: 506,\n\n /**\n * The server is unable to store the representation needed to complete the request.\n */\n InsufficientStorage: 507,\n\n /**\n * The server detected an infinite loop while processing the request.\n */\n LoopDetected: 508,\n\n /**\n * Further extensions to the request are required for the server to fulfill it.\n */\n NotExtended: 510,\n\n /**\n * The client needs to authenticate to gain network access.\n * Intended for use by intercepting proxies used to control access to the network (e.g., \"captive portals\" used\n * to require agreement to Terms of Service before granting full Internet access via a Wi-Fi hotspot).\n */\n NetworkAuthenticationRequired: 511,\n})\n","import { fail, success } from '@helpers/result-helper'\nimport toast from '@services/toasts/index'\nimport { isSuccess } from '@/helpers/http-status-helpers'\nimport TimesheetsSummaryViewModel from '@/models/timesheets/timesheetsSummaryViewModel'\nimport TimesheetsViewModel from '@/models/timesheets/timesheetsViewModel'\nimport HttpStatusCodes from '@/shared/constants/api/HttpStatusCodes'\n\nconst getDefaultState = () => {\n return {\n // Place any new state properties here\n loadingCount: 0,\n crudLoadingCount: 0,\n }\n}\n\nconst state = getDefaultState()\n\nexport default {\n namespaced: true,\n state,\n getters: {\n moduleName: () => 'timesheets',\n isLoading: (state) => state.loadingCount > 0,\n isLoadingCRUD: (state) => state.crudLoadingCount > 0,\n },\n mutations: {\n START_LOADING(state) {\n state.loadingCount++\n },\n FINISH_LOADING(state) {\n state.loadingCount--\n },\n START_LOADING_CRUD(state) {\n state.crudLoadingCount++\n },\n FINISH_LOADING_CRUD(state) {\n state.crudLoadingCount--\n },\n CLEAR_STORE(state) {\n // Resets store to default state\n Object.assign(state, getDefaultState())\n },\n },\n actions: {\n async loadTimesheetsSummary({ commit, rootGetters }) {\n commit('START_LOADING')\n try {\n const cIds = rootGetters['client/getSelectedClients']\n const response = await this.$api.timesheets.getTimesheetsSummary(cIds)\n\n if (isSuccess(response.status)) {\n return success(new TimesheetsSummaryViewModel(response.data))\n }\n } catch {\n toast.error(this.$i18n.t('timesheets.summarytLoadFailureToastText'))\n return fail()\n } finally {\n commit('FINISH_LOADING')\n }\n },\n async loadTimesheets({ commit }, clientId) {\n commit('START_LOADING')\n\n try {\n const response = await this.$api.timesheets.get(clientId)\n\n if (isSuccess(response.status)) {\n return success(new TimesheetsViewModel(response.data))\n }\n } catch {\n toast.error(this.$i18n.t('timesheets.loadFailureToastText'))\n return fail()\n } finally {\n commit('FINISH_LOADING')\n }\n },\n async loadTimesheetsFilteredByCandidate(\n { commit, rootGetters },\n candidateId\n ) {\n commit('START_LOADING')\n\n try {\n const cIds = rootGetters['client/getSelectedClients']\n const response = await this.$api.timesheets.getTimesheetsFilteredByCandidate(\n candidateId,\n cIds\n )\n\n if (isSuccess(response.status)) {\n return success(new TimesheetsViewModel(response.data))\n }\n } catch {\n toast.error(this.$i18n.t('timesheets.loadFailureToastText'))\n return fail()\n } finally {\n commit('FINISH_LOADING')\n }\n },\n async submitTimesheetsForApproval({ commit }, timesheets) {\n commit('START_LOADING_CRUD')\n\n try {\n const response = await this.$api.timesheets.post('', timesheets)\n\n // Check if there were any timesheets that couldn't be processed\n if (response.status === HttpStatusCodes.MultiStatus) {\n toast.error(\n this.$i18n.t('timesheets.submit.toasts.submittedWithIssues')\n )\n } else {\n toast.success(this.$i18n.t('timesheets.submissionSuccessToastText'))\n }\n\n return success(response.data, null, response.status)\n } catch {\n toast.error(this.$i18n.t('timesheets.submissionFailureToastText'))\n return fail()\n } finally {\n commit('FINISH_LOADING_CRUD')\n }\n },\n async downloadTimesheet({ commit }, timesheetRecordId) {\n commit('START_LOADING')\n try {\n const response = await this.$api.timesheets.downloadTimesheetFile(\n timesheetRecordId\n )\n\n if (isSuccess(response.status)) {\n const url = window.URL.createObjectURL(\n new Blob([response.data], { type: 'application/pdf' })\n )\n return success(url)\n }\n } catch (ex) {\n let toastErrorMessage = this.$i18n.t('error.errorGenericApiErrorText')\n // Try to resolve error response. Response type is Blob, need to convert\n // from blob to json\n try {\n const responseObject = JSON.parse(await ex.response.data.text())\n if (responseObject) toastErrorMessage = responseObject.message\n } catch {}\n\n toast.error(toastErrorMessage)\n\n return fail()\n } finally {\n commit('FINISH_LOADING')\n }\n },\n /**\n * Resets store to default state.\n */\n clear({ commit }) {\n commit('CLEAR_STORE')\n },\n },\n}\n","import { fail, success } from '@helpers/result-helper.js'\nimport toast from '@services/toasts/index.js'\nimport { isHttpStatus, isSuccess } from '@/helpers/http-status-helpers'\n\nexport default {\n namespaced: true,\n state: {\n canListLoadingCount: 0,\n loadingCount: 0,\n crudLoadingCount: 0,\n displayPic: null,\n file: null,\n candidateList: [],\n },\n getters: {\n moduleName: () => 'candidate',\n isCanListLoading: (state) => state.canListLoadingCount > 0,\n isLoading: (state) => state.loadingCount > 0,\n isLoadingCRUD: (state) => state.crudLoadingCount > 0,\n },\n mutations: {\n START_LOADING(state) {\n state.loadingCount++\n },\n START_CANLIST_LOADING(state) {\n state.canListLoadingCount++\n },\n FINISH_LOADING(state) {\n state.loadingCount--\n },\n FINISH_CANLIST_LOADING(state) {\n state.canListLoadingCount--\n },\n START_LOADING_CRUD(state) {\n state.crudLoadingCount++\n },\n FINISH_LOADING_CRUD(state) {\n state.crudLoadingCount--\n },\n SET_CANDIDATE_LIST(state, data) {\n state.candidateList = data\n },\n },\n actions: {\n async loadCandidate({ commit }, id) {\n commit('START_LOADING')\n try {\n const response = await this.$api.candidate.getCandidateDetails(id)\n if (isSuccess(response.status)) {\n return success(response.data)\n }\n } catch {\n toast.error('Candidate data failed to load')\n return fail()\n } finally {\n commit('FINISH_LOADING')\n }\n },\n\n async getCandidateList({ commit }, clientID) {\n commit('START_CANLIST_LOADING')\n try {\n const response = await this.$api.candidate.getCandidateList(clientID)\n if (isSuccess(response.status)) {\n commit('SET_CANDIDATE_LIST', response.data)\n return success(response.data)\n }\n } catch (ex) {\n if (isHttpStatus(ex.response.status, 'Forbidden')) {\n return fail([], '', 403)\n }\n\n toast.error(this.$i18n.t('candidateList.candidateListErrorCannotLoad'))\n return fail()\n } finally {\n commit('FINISH_CANLIST_LOADING')\n }\n },\n\n async getDisplayPic({ commit }, id) {\n commit('START_LOADING')\n try {\n const response = await this.$api.candidate.getDisplayPic(id)\n if (isSuccess(response.status)) {\n return success(response.data.base64ProfileImg)\n }\n } catch {\n return fail()\n } finally {\n commit('FINISH_LOADING')\n }\n },\n },\n}\n","import config from '@/common/config'\nimport { fail, success } from '@/helpers/result-helper'\nimport { isSuccess } from '@/helpers/http-status-helpers'\nimport toasts from '@/services/toasts/index'\nimport { getType } from 'mime'\n\nconst getDefaultState = () => {\n return {\n // Place any new state properties here\n loadingCount: 0,\n crudLoadingCount: 0,\n }\n}\n\nconst state = getDefaultState()\n\nexport default {\n namespaced: true,\n state,\n getters: {\n moduleName: () => 'file',\n isLoading: (state) => state.loadingCount > 0,\n isLoadingCRUD: (state) => state.crudLoadingCount > 0,\n },\n mutations: {\n START_LOADING(state) {\n state.loadingCount++\n },\n FINISH_LOADING(state) {\n state.loadingCount--\n },\n START_LOADING_CRUD(state) {\n state.crudLoadingCount++\n },\n FINISH_LOADING_CRUD(state) {\n state.crudLoadingCount--\n },\n CLEAR_STORE(state) {\n // Resets store to default state\n Object.assign(state, getDefaultState())\n },\n },\n actions: {\n async download({ commit }, fileId) {\n commit('START_LOADING')\n try {\n const response = await this.$api.file.createFileAccessToken(fileId)\n if (isSuccess(response.status)) {\n const token = response.data.accessKey\n const baseURL = `${config.get('apiUrl')}v${config.get('apiVersion')}`\n const fileURL = `${baseURL}/file/(${token})`\n try {\n const fileResponse = await this.$api.file.get(`(${token})`)\n if (isSuccess(fileResponse.status)) {\n window.location = fileURL\n }\n } catch (ex) {\n throw Error('Download Failed')\n }\n return success()\n } else {\n toasts.error('Download Failed')\n }\n } catch {\n toasts.error('Download Failed')\n return fail()\n } finally {\n commit('FINISH_LOADING')\n }\n },\n async downloadGeneralFile({ commit }, filePath) {\n commit('START_LOADING')\n\n try {\n const response = await this.$api.file.getGeneralFile(filePath)\n\n if (isSuccess(response.status)) {\n const url = window.URL.createObjectURL(\n new Blob([response.data], { type: getType(filePath) })\n )\n return success(url)\n }\n } catch (ex) {\n let toastErrorMessage = this.$i18n.t('error.errorGenericApiErrorText')\n // Try to resolve error response. Response type is Blob, need to convert\n // from blob to json\n try {\n const responseObject = JSON.parse(await ex.response.data.text())\n if (responseObject) toastErrorMessage = responseObject.message\n } catch {}\n\n toasts.error(toastErrorMessage)\n\n return fail()\n } finally {\n commit('FINISH_LOADING')\n }\n },\n },\n}\n","import { isSuccess } from '@helpers/http-status-helpers'\nimport { success, fail } from '@helpers/result-helper'\nimport toast from '@/services/toasts/index.js'\n\n/**\n * This class is intended for use inside vuex actions.\n * The only required methods are the request and go methods which will execute any function and go starts the operation\n * All requests are wrapped in try catch so the caller need not worry.\n * All other methods return the same instance which allows method chaining different configuration.\n *\n * @example\n * return await new VuexResponse(commit)\n * .request(() => this.$api.locationRestriction.loadAllUpcomingAlerts())\n * .withCommit(\"UPDATE_ALERTS\")\n * .go()\n */\nexport class VuexResponse {\n #commit = null\n constructor(commit) {\n this.#commit = commit\n return this\n }\n\n #requestFn = null\n #updateFn = null\n #stateKey = null\n #showSuccessToast = false\n #showFailureToast = false\n #successToastMessage = ''\n #failToastMessage = ''\n #loadingKey = ''\n #logResult = false\n #isPaginated = false\n #paginationKey = null\n #transformFns = []\n\n /**\n * Provide an api call to be called. Use an arrow function.\n * @param fn\n * @returns {VuexResponse}\n */\n request(fn) {\n this.#requestFn = fn\n return this\n }\n\n /**\n * Provide the name of the commit update function to pass the request data to on successful request.\n * @param updateFnName\n * @returns {VuexResponse}\n */\n withCommit(updateFnName) {\n this.#updateFn = updateFnName\n return this\n }\n\n withSetState(key) {\n this.#stateKey = key\n return this\n }\n\n /**\n * This will enrich the response data with pagination information found in the x-pagination header of the response\n * @param commitKey - optionally provide the commitKey which is passed to the commit function, this can be used to cache the page results\n */\n withPagination(commitKey = null) {\n this.#isPaginated = true\n this.#paginationKey = commitKey\n return this\n }\n\n /**\n * Pass in a transformation function such as map filter or reduce\n * Ensure you return the data in the same format.\n * This function can be called as many times as you like and will queue a list of transformation functions.\n * This will perform the transforms before committing the data\n * @param transformFn\n * @retuns {VuexResponse}\n */\n transform(transformFn) {\n this.#transformFns.push(transformFn)\n return this\n }\n\n /**\n * Enables a success toast if the request is successfull. Optionally provide a custom message\n * @param message\n * @returns {VuexResponse}\n */\n withSuccessToast(message = 'Successfully made change') {\n this.#showSuccessToast = true\n if (message) {\n this.#successToastMessage = message\n }\n return this\n }\n\n /**\n * Enables the failure toast. Optionally provide a message\n * @param message\n * @returns {VuexResponse}\n */\n withFailureToast(message = 'There was an error making the update') {\n this.#showFailureToast = true\n if (message) {\n this.#failToastMessage = message\n }\n return this\n }\n\n /**\n * Provide the commit function names for any custom loaders.\n * These are called at the start and end of the request\n * @param startName\n * @param finishName\n * @returns {VuexResponse}\n */\n withLoading(loadingKey) {\n if (!loadingKey)\n throw new Error('Vuex Action Builder: Loading key required')\n this.#loadingKey = loadingKey\n return this\n }\n\n /**\n * For help debugging. Will log the success data from the response.\n * @returns {VuexResponse}\n */\n logResult() {\n this.#logResult = true\n return this\n }\n\n /**\n * Starts the built operation.\n * @returns {Promise<{data: null, message: string, errors: [], isSuccess: boolean, statusCode: null}>}\n */\n async go() {\n if (!this.#commit) {\n console.error('The commit function has not been passed to the helper.')\n }\n\n if (this.#loadingKey) {\n this.#commit('START_LOADING', this.#loadingKey, { root: true })\n }\n\n try {\n const response = await this.#requestFn()\n\n if (this.#logResult) {\n // eslint-disable-next-line no-console\n console.info(response)\n }\n\n if (isSuccess(response.status)) {\n let data = response.data\n\n while (this.#transformFns.length) {\n const transformer = this.#transformFns.shift()\n data = transformer(data)\n }\n\n if (this.#isPaginated) {\n data = this.#enrichResponseDataWithPagination(response)\n if (this.#paginationKey) data = { ...data, key: this.#paginationKey }\n }\n\n // Map response from server\n if (this.#updateFn) {\n this.#commit(this.#updateFn, data)\n }\n\n if (this.#stateKey) {\n this.#commit('SET_STATE', {\n key: this.#stateKey,\n value: response.data,\n })\n }\n\n if (this.#showSuccessToast) {\n toast.success(this.#successToastMessage)\n }\n\n return success(data)\n }\n } catch (e) {\n console.error(e)\n if (this.#showFailureToast) {\n const message = e.response.data?.error || this.#failToastMessage\n toast.error(message)\n }\n return fail(e.response)\n } finally {\n if (this.#loadingKey) {\n this.#commit('FINISH_LOADING', this.#loadingKey, { root: true })\n }\n }\n }\n\n #enrichResponseDataWithPagination(response) {\n return {\n ...JSON.parse(response.headers['x-pagination']),\n data: response.data,\n }\n }\n}\n","import { fail, success } from '@helpers/result-helper.js'\nimport toast from '@services/toasts/index.js'\nimport { isSuccess, isHttpStatus } from '@/helpers/http-status-helpers'\nimport dayjs from '@/services/date/index.js'\nimport { isCacheFresh } from '@/helpers/cache-helpers'\nimport getSelectedDayText from '@/helpers/get-replace-me-selected-day-text'\nimport { VuexResponse } from '@/helpers/vuex-action-builder'\n// eslint-disable-next-line\nimport { BookingOverviewCountsViewModel } from '@/models/bookings/responses/bookingOverviewCountsViewModel'\n\nconst getDefaultState = () => {\n return {\n // Place any new state properties here\n loadingCount: 0,\n bookingSummaryLoadingCount: 0,\n crudLoadingCount: 0,\n feedbackFormUrlLoadingCount: 0,\n quickFeedbackSubmittingCount: 0,\n replaceMeStatusCheckLoadingCount: 0,\n submitReplaceMeBookingLoadingCount: 0,\n cancelBookingLoadingCount: 0,\n recentLocations: [],\n replaceMeStatusChecks: [],\n bookingOverview: [],\n }\n}\n\nconst state = getDefaultState()\n\nexport default {\n namespaced: true,\n state,\n getters: {\n moduleName: () => 'bookings',\n isLoading: (state) => state.loadingCount > 0,\n isLoadingBookingSummary: (state) => state.bookingSummaryLoadingCount > 0,\n isLoadingCRUD: (state) => state.crudLoadingCount > 0,\n recentLocations: (state) => state.recentLocations,\n isLoadingFeedbackFormUrl: (state) => state.feedbackFormUrlLoadingCount > 0,\n isLoadingReplaceMeStatusCheck: (state) =>\n state.replaceMeStatusCheckLoadingCount > 0,\n isSubmittingQuickFeedback: (state) =>\n state.quickFeedbackSubmittingCount > 0,\n replaceMeStatusChecks: (state) => (clientId) =>\n state.replaceMeStatusChecks.find((x) => x.clientId === clientId),\n isSubmitReplaceMeLoading: (state) =>\n state.submitReplaceMeBookingLoadingCount > 0,\n isLoadingCancelBooking: (state) => state.cancelBookingLoadingCount > 0,\n bookingOverview: (state) => state.bookingOverview,\n },\n mutations: {\n START_LOADING(state) {\n state.loadingCount++\n },\n FINISH_LOADING(state) {\n state.loadingCount--\n },\n START_LOADING_SELECTED_DATE_BOOKINGS(state) {\n state.bookingSummaryLoadingCount++\n },\n FINISH_LOADING_SELECTED_DATE_BOOKINGS(state) {\n state.bookingSummaryLoadingCount--\n },\n START_LOADING_BOOKINGS_OVERVIEW(state) {\n state.bookingSummaryLoadingCount++\n },\n FINISH_LOADING_BOOKINGS_OVERVIEW(state) {\n state.bookingSummaryLoadingCount--\n },\n START_LOADING_REPLACE_ME_STATUS_CHECK(state) {\n state.replaceMeStatusCheckLoadingCount++\n },\n FINISH_LOADING_REPLACE_ME_STATUS_CHECK(state) {\n state.replaceMeStatusCheckLoadingCount--\n },\n START_LOADING_SUBMIT_REPLACE_ME(state) {\n state.submitReplaceMeBookingLoadingCount++\n },\n FINISH_LOADING_SUBMIT_REPLACE_ME(state) {\n state.submitReplaceMeBookingLoadingCount--\n },\n START_LOADING_CANCEL_BOOKING(state) {\n state.cancelBookingLoadingCount++\n },\n FINISH_LOADING_CANCEL_BOOKING(state) {\n state.cancelBookingLoadingCount--\n },\n START_LOADING_CRUD(state) {\n state.crudLoadingCount++\n },\n FINISH_LOADING_CRUD(state) {\n state.crudLoadingCount--\n },\n SET_RECENT_BOOKING_LOCATION(state, locationId) {\n const found = state.recentLocations.find(\n (x) => x.locationId === locationId\n )\n\n if (found) {\n found.timestamp = dayjs()\n return\n }\n\n state.recentLocations.push({ locationId, timestamp: dayjs() })\n },\n /**\n * @param {*} state\n * @param {BookingOverviewCountsViewModel[]} data\n */\n SET_BOOKING_OVERVIEW(state, data) {\n state.bookingOverview = data\n },\n CLEAR_STORE(state) {\n // Resets store to default state\n Object.assign(state, getDefaultState())\n },\n START_LOADING_FEEDBACK_FORM_URL(state) {\n state.feedbackFormUrlLoadingCount++\n },\n FINISH_LOADING_FEEDBACK_FORM_URL(state) {\n state.feedbackFormUrlLoadingCount--\n },\n START_SUBMITTING_QUICK_FEEDBACK(state) {\n state.quickFeedbackSubmittingCount++\n },\n FINISH_SUBMITTING_QUICK_FEEDBACK(state) {\n state.quickFeedbackSubmittingCount--\n },\n UPSERT_REPLACE_ME_STATUS_CHECK_FOR_CLIENT(state, { payload, clientId }) {\n let found = state.replaceMeStatusChecks.find(\n (x) => x.clientId === clientId\n )\n\n if (found) {\n found = payload\n found.timestamp = dayjs()\n return\n }\n\n const statusCheck = {\n ...payload,\n clientId,\n timestamp: dayjs(),\n }\n\n state.replaceMeStatusChecks.push(statusCheck)\n },\n },\n actions: {\n setRecentLocation({ commit }, locationId) {\n commit('SET_RECENT_BOOKING_LOCATION', locationId)\n },\n async loadBookingsByClientAndDate({ rootGetters, commit }, payload) {\n return await new VuexResponse(commit)\n .request(() =>\n this.$api.bookings.getSummaryBookingsByDate(\n rootGetters['client/getSelectedClients'],\n payload\n )\n )\n .withLoading(\n 'START_LOADING_SELECTED_DATE_BOOKINGS',\n 'FINISH_LOADING_SELECTED_DATE_BOOKINGS'\n )\n .withFailureToast('Cannot load bookings')\n .go()\n },\n async loadYearOfBookingOverviewData({ commit }, payload) {\n return await new VuexResponse(commit)\n .request(() =>\n this.$api.bookings.getBookingOverview(payload.clientIds, payload.year)\n )\n .withLoading(\n 'START_LOADING_BOOKINGS_OVERVIEW',\n 'FINISH_LOADING_BOOKINGS_OVERVIEW'\n )\n .withFailureToast('Cannot load bookings')\n .withCommit('SET_BOOKING_OVERVIEW')\n .go()\n },\n async submitBooking({ commit }, payload) {\n commit('START_LOADING_CRUD')\n\n try {\n const response = await this.$api.bookings.post('', payload)\n\n if (isSuccess(response.status)) {\n return success(response.data)\n }\n } catch (ex) {\n return fail(ex.response.data)\n } finally {\n commit('FINISH_LOADING_CRUD')\n }\n },\n async requestFeedbackFormUrl({ commit }, payload) {\n commit('START_LOADING_FEEDBACK_FORM_URL')\n try {\n const response = await this.$api.bookings.getFeedbackFormUrl(\n payload.bookingId\n )\n\n if (isSuccess(response.status)) {\n return success(response.data)\n }\n } catch (ex) {\n toast.error('Cannot load feedback form url')\n return fail()\n } finally {\n commit('FINISH_LOADING_FEEDBACK_FORM_URL')\n }\n },\n // TODO: This function will likely be reworked to accept a passed in\n // client ID\n async submitQuickFeedback({ commit, dispatch, rootGetters }, payload) {\n commit('START_SUBMITTING_QUICK_FEEDBACK')\n try {\n const response = await this.$api.bookings.submitQuickFeedback(\n payload.bookingId,\n payload.data\n )\n\n if (isSuccess(response.status)) {\n await dispatch(\n 'pendingfeedbacks/setFeedbackAsComplete',\n {\n bookingId: payload.bookingId,\n clientId: rootGetters['client/getSelectedClients'][0], // TODO: Remove\n },\n { root: true }\n )\n return success()\n }\n } catch (ex) {\n return fail(ex.response.data)\n } finally {\n commit('FINISH_SUBMITTING_QUICK_FEEDBACK')\n }\n },\n // TODO: This function will likely be reworked to accept a passed in\n // client ID\n async checkReplaceMeStatus(\n { commit, getters, rootGetters },\n forceRefresh = false\n ) {\n const cId = rootGetters['client/getSelectedClients'][0] // TODO: Remove\n\n // Check if user has access to replace me\n if (\n !rootGetters['auth/hasReplaceMePermissionForAtleastOneClientLocation'](\n cId\n )\n )\n return success()\n\n // Check cached replace me status\n const isCached = getters.replaceMeStatusChecks(cId)\n\n if (\n isCached &&\n isCacheFresh({\n cacheDuration: 5,\n durationUnits: 'minutes',\n lastUpdated: isCached?.timestamp,\n forceRefresh,\n })\n )\n return Promise.resolve(success(isCached))\n\n commit('START_LOADING_REPLACE_ME_STATUS_CHECK')\n\n try {\n const response = await this.$api.bookings.checkReplaceMeStatus(cId)\n\n if (isSuccess(response.status)) {\n commit('UPSERT_REPLACE_ME_STATUS_CHECK_FOR_CLIENT', {\n payload: response.data,\n clientId: cId,\n })\n return success(response.data)\n }\n } catch (ex) {\n // Ignore alert if 403 since the user doesn't have permission for replace me\n // and likely doesn't need to be notified they don't. Would just be alert spam\n if (!isHttpStatus(ex.response.status, 'Forbidden'))\n toast.error(\n ex.response?.data?.message\n ? ex.response.data?.message\n : this.$i18n('replaceMe.checkReplaceMeStatusErrorGenericText')\n )\n return fail()\n } finally {\n commit('FINISH_LOADING_REPLACE_ME_STATUS_CHECK')\n }\n },\n async submitReplaceMeBooking({ commit }, payload) {\n commit('START_LOADING_SUBMIT_REPLACE_ME')\n\n try {\n const response = await this.$api.bookings.submitReplaceMeBooking(\n payload\n )\n\n if (isSuccess(response.status)) {\n const selectedDay = getSelectedDayText(\n payload.selectedDay,\n payload.isNextMonday\n )\n toast.success(\n this.$i18n.t('replaceMe.successNotificationText', { selectedDay })\n )\n return success(response.data)\n }\n } catch (ex) {\n toast.error(\n ex.response?.data?.message\n ? ex.response.data?.message\n : this.$i18n.t('error.genericFailedRequestMessage')\n )\n return fail()\n } finally {\n commit('FINISH_LOADING_SUBMIT_REPLACE_ME')\n }\n },\n async cancelBooking({ commit }, payload) {\n commit('START_LOADING_CANCEL_BOOKING')\n\n try {\n const response = await this.$api.bookings.cancelBooking(\n payload.bookingId,\n {\n cancelReason: payload.cancelReason,\n }\n )\n\n if (isSuccess(response.status)) {\n toast.success(\n this.$i18n.t('booking.cancelBookingSuccessText', {\n date: payload.date,\n })\n )\n return success(response.data)\n }\n } catch (ex) {\n toast.error(\n ex.response?.data?.message\n ? ex.response.data?.message\n : this.$i18n.t('error.genericFailedRequestMessage')\n )\n return fail()\n } finally {\n commit('FINISH_LOADING_CANCEL_BOOKING')\n }\n },\n /**\n * Resets store to default state.\n */\n clear({ commit }) {\n commit('CLEAR_STORE')\n },\n },\n}\n","import { fail, success } from '@/helpers/result-helper'\nimport toast from '@/services/toasts/index'\nimport { isSuccess, isHttpStatus } from '@/helpers/http-status-helpers'\nimport { orderBy } from 'lodash'\n\nconst getDefaultState = () => {\n return {\n bookingContacts: [],\n loadingCount: 0,\n crudLoadingCount: 0,\n bookingContactsLoadingCount: 0,\n standardBookingDetailsLoadingCount: 0,\n }\n}\n\nconst state = getDefaultState()\n\nexport default {\n namespaced: true,\n state,\n getters: {\n moduleName: () => 'contacts',\n bookingContacts: (state) => (locationId) => {\n const contacts = state.bookingContacts.find(\n (x) => x.locationId === locationId\n )\n\n return contacts ? orderBy(contacts.list, ['fullName'], ['asc']) : []\n },\n isLoading: (state) => state.loadingCount > 0,\n isLoadingCRUD: (state) => state.crudLoadingCount > 0,\n isLoadingBookingContacts: (state) => state.bookingContactsLoadingCount > 0,\n },\n mutations: {\n START_LOADING(state) {\n state.loadingCount++\n },\n FINISH_LOADING(state) {\n state.loadingCount--\n },\n START_LOADING_CRUD(state) {\n state.crudLoadingCount++\n },\n FINISH_LOADING_CRUD(state) {\n state.crudLoadingCount--\n },\n START_LOADING_BOOKING_CONTACTS(state) {\n state.bookingContactsLoadingCount++\n },\n FINISH_LOADING_BOOKING_CONTACTS(state) {\n state.bookingContactsLoadingCount--\n },\n SET_CLIENT_BOOKING_CONTACTS(state, payload) {\n const found = state.bookingContacts.find(\n (x) => x.locationId === payload.locationId\n )\n\n if (!found) {\n return state.bookingContacts.push({\n locationId: payload.locationId,\n list: payload.contacts,\n })\n }\n\n found.list = payload.contacts\n },\n CLEAR_STORE(state) {\n // Resets store to default state\n Object.assign(state, getDefaultState())\n },\n },\n actions: {\n async loadBookingContacts({ commit, getters }, locationId) {\n // Check cached contacts\n const hasContacts = getters.bookingContacts(locationId)\n\n if (hasContacts && hasContacts.length > 0)\n return Promise.resolve(success(hasContacts))\n\n commit('START_LOADING_BOOKING_CONTACTS')\n\n try {\n const response = await this.$api.contacts.getBookingContacts(locationId)\n\n if (isSuccess(response.status)) {\n commit('SET_CLIENT_BOOKING_CONTACTS', {\n contacts: isHttpStatus(response.status, 204) ? [] : response.data,\n locationId,\n })\n return success(response.data)\n }\n } catch (ex) {\n toast.error('Cannot load booking contacts')\n return fail()\n } finally {\n commit('FINISH_LOADING_BOOKING_CONTACTS')\n }\n },\n /**\n * Resets store to default state.\n */\n clear({ commit }) {\n commit('CLEAR_STORE')\n },\n },\n}\n","import { isNonEmptyArray } from '@/helpers/array-helpers'\nimport dayjs from '@/services/date'\n\n/**\n * @class\n * @public\n */\nexport default class BookingBlockViewModel {\n constructor({ locationId, datesLocal = [], messageMarkDown = '' } = {}) {\n /**\n * @type {Number}\n */\n this.locationId = Number(locationId)\n /**\n * @type {Array}\n */\n this.datesLocal = isNonEmptyArray(datesLocal)\n ? datesLocal.map((date) => dayjs(date))\n : []\n /**\n * Mark down text to be displayed to the user\n * @type {String}\n */\n this.messageMarkDown = messageMarkDown\n }\n}\n","import { fail, success } from '@/helpers/result-helper'\nimport toast from '@/services/toasts/index'\nimport { isSuccess, isHttpStatus } from '@/helpers/http-status-helpers'\nimport { orderBy } from 'lodash'\nimport BookingBlockViewModel from '@/models/locations/bookingBlockViewModel'\nimport { isNonEmptyArray } from '@/helpers/array-helpers'\nimport ClientLoginLocationViewModel from '@/models/locations/clientLoginLocationViewModel'\n\nconst getDefaultState = () => {\n return {\n // Place any new state properties here\n bookingLocations: [],\n certifications: [],\n locationRestrictions: [],\n loadingCount: 0,\n crudLoadingCount: 0,\n bookingLocationLoadingCount: 0,\n certificationLoadingCount: 0,\n bookingBlocksLoadingCount: 0,\n }\n}\n\nconst state = getDefaultState()\n\nexport default {\n namespaced: true,\n state,\n getters: {\n moduleName: () => 'locations',\n bookingLocations: (state) => state.bookingLocations,\n certifications: (state) => (locationId) => {\n const certifications = state.certifications.find(\n (x) => x.locationId === locationId\n )\n\n return certifications\n ? orderBy(certifications.list, ['name'], ['asc'])\n : []\n },\n isLoading: (state) => state.loadingCount > 0,\n isLoadingCRUD: (state) => state.crudLoadingCount > 0,\n isLoadingCertifications: (state) => state.certificationLoadingCount > 0,\n isLoadingBookingLocations: (state) => state.bookingLocationLoadingCount > 0,\n isLoadingBookingBlocks: (state) => state.bookingBlocksLoadingCount > 0,\n getRestrictionDetailsByLocationId: (state) => (locationId) => {\n if (!locationId || locationId < 1) throw Error('Location Id is required')\n\n return state.locationRestrictions?.find(\n (restriction) => restriction.locationId === locationId\n )\n },\n },\n mutations: {\n START_LOADING(state) {\n state.loadingCount++\n },\n FINISH_LOADING(state) {\n state.loadingCount--\n },\n START_LOADING_CRUD(state) {\n state.crudLoadingCount++\n },\n FINISH_LOADING_CRUD(state) {\n state.crudLoadingCount--\n },\n START_LOADING_BOOKING_LOCATIONS(state) {\n state.bookingLocationLoadingCount++\n },\n FINISH_LOADING_BOOKING_LOCATIONS(state) {\n state.bookingLocationLoadingCount--\n },\n START_LOADING_CERTIFICATIONS(state) {\n state.certificationLoadingCount++\n },\n FINISH_LOADING_CERTIFICATIONS(state) {\n state.certificationLoadingCount--\n },\n START_LOADING_BOOKING_BLOCKS(state) {\n state.bookingBlocksLoadingCount++\n },\n FINISH_LOADING_BOOKING_BLOCKS(state) {\n state.bookingBlocksLoadingCount--\n },\n /**\n *\n * @param {*} state\n * @param {ClientLoginLocationViewModel[]} payload\n */\n SET_BOOKING_LOCATIONS(state, payload) {\n state.bookingLocations = payload\n },\n UPSERT_CERTIFICATIONS(state, payload) {\n const found = state.certifications.find(\n (x) => x.locationId === payload.locationId\n )\n\n if (!found) {\n return state.certifications.push({\n locationId: payload.locationId,\n list: payload.certifications,\n })\n }\n\n found.list = payload.certifications\n },\n SET_LOCATION_RESTRICTIONS(state, restrictions) {\n state.locationRestrictions = isNonEmptyArray(restrictions)\n ? restrictions.map(\n (restriction) => new BookingBlockViewModel(restriction)\n )\n : []\n },\n CLEAR_STORE(state) {\n // Resets store to default state\n Object.assign(state, getDefaultState())\n },\n },\n actions: {\n async loadBookingLocations({ commit, getters }) {\n const isCached = getters.bookingLocations\n\n if (isCached && isCached.length > 0)\n return Promise.resolve(success(isCached))\n\n commit('START_LOADING_BOOKING_LOCATIONS')\n\n try {\n const response = await this.$api.locations.getBookingLocations()\n\n if (isSuccess(response.status)) {\n const mappedLocations = isHttpStatus(response.status, 204)\n ? []\n : response.data.map(\n (location) => new ClientLoginLocationViewModel(location)\n )\n\n commit('SET_BOOKING_LOCATIONS', mappedLocations)\n return success(mappedLocations)\n }\n } catch (ex) {\n toast.error('Cannot load locations')\n return fail()\n } finally {\n commit('FINISH_LOADING_BOOKING_LOCATIONS')\n }\n },\n async loadLocationCertifications({ commit, getters }, locationId) {\n const isCached = getters.certifications(locationId)\n\n if (isCached && isCached.length > 0)\n return Promise.resolve(success(isCached))\n\n commit('START_LOADING_CERTIFICATIONS')\n\n try {\n const response = await this.$api.locations.getLocationCertifications(\n locationId\n )\n\n if (isSuccess(response.status)) {\n commit('UPSERT_CERTIFICATIONS', {\n certifications: isHttpStatus(response.status, 204)\n ? []\n : response.data,\n locationId,\n })\n return success(response.data)\n }\n } catch (ex) {\n toast.error('Cannot load certifications for this location')\n return fail()\n } finally {\n commit('FINISH_LOADING_CERTIFICATIONS')\n }\n },\n /**\n * Loads the booking blocks for all contact locations\n * booking on a particular day\n * @param {{commit: Function, dispatch: Function}} vuexContext\n * @returns\n */\n async loadLocationBookingBlocks({ commit }) {\n commit('START_LOADING_BOOKING_BLOCKS')\n\n try {\n const response = await this.$api.locations.getLocationBookingBlocks()\n\n if (isSuccess(response.status)) {\n commit('SET_LOCATION_RESTRICTIONS', response.data)\n return success(response.data)\n }\n } catch (ex) {\n return fail()\n } finally {\n commit('FINISH_LOADING_BOOKING_BLOCKS')\n }\n },\n /**\n * Resets store to default state.\n */\n clear({ commit }) {\n commit('CLEAR_STORE')\n },\n },\n}\n","import { fail, success } from '@helpers/result-helper'\nimport toast from '@services/toasts/index'\nimport { isSuccess, isHttpStatus } from '@/helpers/http-status-helpers'\nimport dayjs from '@/services/date/index'\nimport { isCacheFresh } from '@/helpers/cache-helpers'\n\nconst getDefaultState = () => {\n return {\n loadingCount: 0,\n crudLoadingCount: 0,\n pendingFeedback: [],\n }\n}\n\nconst state = getDefaultState()\n\nexport default {\n namespaced: true,\n state,\n getters: {\n moduleName: () => 'pending-feedback',\n isLoading: (state) => state.loadingCount > 0,\n isLoadingCRUD: (state) => state.crudLoadingCount > 0,\n pendingFeedback: (state) => (clientId) =>\n state.pendingFeedback.find((feedback) => feedback.clientId === clientId)\n ?.list || [],\n pendingFeedbackCacheObj: (state) => (clientId) =>\n state.pendingFeedback.find((feedback) => feedback.clientId === clientId),\n },\n mutations: {\n START_LOADING(state) {\n state.loadingCount++\n },\n FINISH_LOADING(state) {\n state.loadingCount--\n },\n START_LOADING_CRUD(state) {\n state.crudLoadingCount++\n },\n FINISH_LOADING_CRUD(state) {\n state.crudLoadingCount--\n },\n SET_PENDING_FEEDBACK(state, { clientId, feedback }) {\n const found = state.pendingFeedback.find(\n (feedback) => feedback.clientId === clientId\n )\n\n if (found) {\n found.list = feedback\n found.lastUpdated = dayjs()\n return\n }\n\n state.pendingFeedback.push({\n clientId,\n list: feedback,\n lastUpdated: dayjs(),\n })\n },\n SET_FEEDBACK_AS_COMPLETE(state, { bookingId, clientId }) {\n const foundClientFeedbackList = state.pendingFeedback.find(\n (feedback) => feedback.clientId === clientId\n )\n\n if (!foundClientFeedbackList) return\n\n const foundBookingFeedback = foundClientFeedbackList.list.find(\n (feedback) => feedback.bookingID === bookingId\n )\n\n if (!foundBookingFeedback) return\n\n foundBookingFeedback.feedbackCompleted = true\n },\n },\n actions: {\n async getPendingFeedbacks({ commit, getters }, clientId) {\n // Check if cached\n const isCached = getters.pendingFeedbackCacheObj(clientId)\n\n if (\n isCached &&\n isCacheFresh({\n cacheDuration: 5,\n durationUnits: 'minutes',\n lastUpdated: isCached?.lastUpdated,\n })\n )\n return Promise.resolve(success(isCached.list))\n\n commit('START_LOADING')\n try {\n const response = await this.$api.pendingfeedbacks.getPendingFeedbacks(\n clientId\n )\n\n if (isSuccess(response.status)) {\n commit('SET_PENDING_FEEDBACK', { clientId, feedback: response.data })\n return success(response.data)\n }\n } catch (ex) {\n if (isHttpStatus(ex.response.status, 'Forbidden')) {\n return fail(null, '', 403)\n }\n\n toast.error(this.$i18n.t('pendingFeedbacks.pendingFeedbacksError'))\n return fail()\n } finally {\n commit('FINISH_LOADING')\n }\n },\n setFeedbackAsComplete({ commit }, { bookingId, clientId }) {\n commit('SET_FEEDBACK_AS_COMPLETE', { bookingId, clientId })\n },\n },\n}\n","import config from '@/common/config'\nimport clientGroupOverviewFeatureFactory from '@/services/features/clientGroupOverviewFeatureFactory'\nimport { createFeatureDecisions } from '@/services/features/featureDecisions'\n\nconst getDefaultState = () => {\n return {\n toggles: config.get('app.featureToggles'),\n loadingCount: 0,\n crudLoadingCount: 0,\n }\n}\n\nconst state = getDefaultState()\n\nexport default {\n namespaced: true,\n state,\n getters: {\n moduleName: () => 'features',\n featureToggles: (state) => state.toggles,\n isLoading: (state) => state.loadingCount > 0,\n isLoadingCRUD: (state) => state.crudLoadingCount > 0,\n },\n mutations: {\n START_LOADING(state) {\n state.loadingCount++\n },\n FINISH_LOADING(state) {\n state.loadingCount--\n },\n START_LOADING_CRUD(state) {\n state.crudLoadingCount++\n },\n FINISH_LOADING_CRUD(state) {\n state.crudLoadingCount--\n },\n CLEAR_STORE(state) {\n // Resets store to default state\n Object.assign(state, getDefaultState())\n },\n SET_FEATURE_TOGGLES(state, toggles) {\n state.toggles = toggles\n },\n },\n actions: {\n setFeatureToggles({ commit }, toggles) {\n commit('SET_FEATURE_TOGGLES', toggles)\n },\n /**\n * Is used to decide if the client group overview page is enabled for this user.\n * @param {{ rootGetters: Object }} VuexAction\n * @returns {Boolean}\n */\n isClientGroupOverviewEnabled({ getters, rootGetters }) {\n const featureDecisions = createFeatureDecisions(getters.featureToggles)\n\n const enabledForClient = rootGetters['auth/isClientGroupOverviewEnabled']\n\n const clientGroupOverviewFeatureToggles = clientGroupOverviewFeatureFactory(\n featureDecisions,\n enabledForClient\n )\n\n return clientGroupOverviewFeatureToggles.canViewDetails\n },\n /**\n * Resets store to default state.\n */\n clear({ commit }) {\n commit('CLEAR_STORE')\n },\n },\n}\n","/**\n * @typedef {Object} BookingClientViewModelType\n * @property {number} id - Unique identifier\n * @property {string} name - The name of the client\n */\n\n/**\n * @class\n */\nexport default class BookingClientViewModel {\n /**\n * Create a new BookingClientViewModel.\n * @param {...BookingClientViewModelType} params\n */\n constructor(params) {\n this.id = params.id\n this.name = params.name\n }\n}\n","/**\n * @typedef {Object} BookingClientGroupViewModelType\n * @property {number} id - Unique identifier\n * @property {string} name - The name of the client group\n */\n\n/**\n * @class\n */\nexport default class BookingClientGroupViewModel {\n /**\n * Create a new BookingClientGroupViewModel.\n * @param {...BookingClientGroupViewModelType} params\n */\n constructor(params) {\n this.id = params.id\n this.name = params.name\n }\n}\n","/**\n * @typedef {Object} BookingCreatedByViewModelType\n * @property {number} id - Unique identifier\n * @property {string} name - Name of the contact who created the booking\n */\n\n/**\n * @class\n */\nexport default class BookingCreatedByViewModel {\n /**\n * Create a new BookingCreatedByViewModel.\n * @param {...BookingCreatedByViewModelType} params\n */\n constructor(params) {\n this.id = params.id\n this.name = params.name\n }\n}\n","/**\n * @typedef {Object} BookingLocationViewModelType\n * @property {number} id - Unique identifier\n * @property {string} name - The name of the location\n * @property {string} timeZone - The location's time zone\n *\n\n/**\n * @class\n */\nexport default class BookingLocationViewModel {\n /**\n * Create a new BookingLocationViewModel.\n * @param {...BookingLocationViewModelType} params\n */\n constructor(params) {\n this.id = params.id\n this.name = params.name\n this.timeZone = params.timeZone\n }\n}\n","/**\n * @typedef {Object} BookingCoveringViewModelType\n * @property {number} id - Unique identifier\n * @property {string} name - Name of the contact who is being covered\n * @property {string} reason - The reason why the booking was created\n */\n\n/**\n * @class\n */\nexport default class BookingCoveringViewModel {\n /**\n * Create a new BookingCoveringViewModel.\n * @param {...BookingCoveringViewModelType} params\n */\n constructor(params) {\n this.id = params.id\n this.name = params.name\n this.reason = params.reason\n }\n}\n","/**\n * @typedef {Object} BookingCertificationViewModelType\n * @property {number} id - The certification type identifier\n * @property {string} name - The name of the certification\n */\n\n/**\n * @class\n */\nexport default class BookingCertificationViewModel {\n /**\n * Create a new BookingCertificationViewModel.\n * @param {...BookingCertificationViewModelType} params\n */\n constructor(params) {\n this.id = params.id\n this.name = params.name\n }\n}\n","/**\n * @typedef {Object} BookingConfirmationViewModelType\n * @property {number} id - Unique identifier\n * @property {string} name - The name of the confirmation contact\n * @property {string} email - The confirmation contact's email address\n * @property {BookingConfirmationPhoneViewModel} sms - The phone details for sms confirmations\n * @property {BookingConfirmationPhoneViewModel} voice - The phone details for voice confirmations\n */\n\n/**\n * @class\n */\nexport default class BookingConfirmationViewModel {\n /**\n * Create a new BookingConfirmationViewModel.\n * @param {...BookingConfirmationVewModelType} params\n */\n constructor(params) {\n this.id = params.id\n this.name = params.name\n this.email = params.email\n this.sms = params.sms ? params.sms : null\n this.voice = params.voice ? params.voice : null\n }\n}\n","/**\n * @typedef {Object} BookingClassificationViewModelType\n * @property {number} id - Unique identifier\n * @property {string} onlineTitle - The online friendly name for the classification\n */\n\n/**\n * @class\n */\nexport default class BookingClassificationViewModel {\n /**\n * Create a new BookingClassificationViewModel.\n * @param {...BookingClassificationViewModelType} params\n */\n constructor(params) {\n this.id = params.id\n this.onlineTitle = params.onlineTitle\n }\n}\n","/**\n * @typedef {Object} BookingGradeViewModelType\n * @property {number} id - Unique identifier\n * @property {string} title - The name for the grade\n */\n\n/**\n * @class\n */\nexport default class BookingGradeViewModel {\n /**\n * Create a new BookingGradeViewModel.\n * @param {...BookingGradeViewModelType} params\n */\n constructor(params) {\n this.id = params.id\n this.title = params.title\n }\n}\n","import { isNullOrEmptyArray } from '@/helpers/array-helpers'\nimport BookingCoveringViewModel from './bookingCoveringViewModel'\nimport BookingCertificationViewModel from './bookingCertificationViewModel'\nimport BookingConfirmationViewModel from './bookingConfirmationViewModel'\nimport BookingClassificationViewModel from './bookingClassificationViewModel'\nimport BookingGradeViewModel from './bookingGradeViewModel'\n\n/**\n * @typedef {Object} BookingDetailsViewModelType\n * @property {string} startTime - The start time of the booking\n * @property {string} endTime - The end time of the booking\n * @property {string} earliestDate - The date of the earliest booking within the booking group\n * @property {string} latestDate - The date of the latest booking within the booking group\n * @property {boolean} areDatesConsecutive - True if there are no working day gaps from the earliest booking to the latest booking in the group\n * @property {string} notes - Notes added to the booking\n * @property {string} room - Information on the room\n * @property {BookingCoveringViewModel} covering - The contact\n * @property {BookingClassificationViewModel} classification - The booking's classification\n */\n\n/**\n * @class\n */\nexport default class BookingDetailsViewModel {\n /**\n * Create a new BookingDetailsViewModel.\n * @param {...BookingDetailsViewModelType} params\n */\n constructor(params) {\n this.startTime = params.startTime\n this.endTime = params.endTime\n this.earliestDate = params.earliestDate\n this.latestDate = params.latestDate\n this.areDatesConsecutive = params.areDatesConsecutive\n this.notes = params.notes\n this.room = params.room\n this.covering = params.covering\n ? new BookingCoveringViewModel(params.covering)\n : null\n this.certifications = !isNullOrEmptyArray(params.certifications)\n ? params.certifications.map(\n (certification) => new BookingCertificationViewModel(certification)\n )\n : []\n this.confirmations = !isNullOrEmptyArray(params.confirmations)\n ? params.confirmations.map(\n (confirmation) => new BookingConfirmationViewModel(confirmation)\n )\n : []\n this.classification = params.classification\n ? new BookingClassificationViewModel(params.classification)\n : null\n this.grades = !isNullOrEmptyArray(params.grades)\n ? params.grades.map(\n (confirmation) => new BookingGradeViewModel(confirmation)\n )\n : []\n }\n}\n","/**\n * @typedef {Object} BookingDateViewModelType\n * @property {number} id - Unique identifier (of a booking in the same group)\n * @property {string} date - The date of the booking without any time data\n */\n\n/**\n * @class\n */\nexport default class BookingDateViewModel {\n /**\n * Create a new BookingDateViewModel.\n * @param {...BookingDateViewModelType} params\n */\n constructor(params) {\n this.id = params.id\n this.date = params.date\n }\n}\n","import dayjs from '@/services/date/index'\nimport { isNullOrEmptyArray } from '@/helpers/array-helpers'\nimport BookingClientViewModel from './bookingClientViewModel'\nimport BookingClientGroupViewModel from './bookingClientGroupViewModel'\nimport BookingCreatedByViewModel from './bookingCreatedByViewModel'\nimport BookingLocationViewModel from './bookingLocationViewModel'\nimport BookingDetailsViewModel from './bookingDetailsViewModel'\nimport BookingDateViewModel from './bookingDateViewModel'\n\nexport default class BookingViewModel {\n constructor(params) {\n this.id = params.id\n this.status = params.status\n this.createdBy = params.createdBy\n ? new BookingCreatedByViewModel(params.createdBy)\n : null\n this.createdOnUtc = params.createdOnUtc ? dayjs(params.createdOnUtc) : null\n this.client = params.client\n ? new BookingClientViewModel(params.client)\n : null\n this.clientGroup = params.clientGroup\n ? new BookingClientGroupViewModel(params.clientGroup)\n : null\n this.location = params.location\n ? new BookingLocationViewModel(params.location)\n : null\n this.details = params.details\n ? new BookingDetailsViewModel(params.details)\n : null\n this.dates = !isNullOrEmptyArray(params.dates)\n ? params.dates.map((date) => new BookingDateViewModel(date))\n : []\n }\n}\n","import BookingCoveringViewModel from './bookingCoveringViewModel'\n\nexport default class PendingBookingSummaryDetailsViewModel {\n constructor(params) {\n this.startTime = params.startTime\n this.endTime = params.endTime\n this.earliestDate = params.earliestDate\n this.latestDate = params.latestDate\n this.areDatesConsecutive = params.areDatesConsecutive\n this.covering = params.covering\n ? new BookingCoveringViewModel(params.covering)\n : null\n }\n}\n","import dayjs from '@/services/date/index'\nimport BookingClientViewModel from './bookingClientViewModel'\nimport BookingClientGroupViewModel from './bookingClientGroupViewModel'\nimport BookingCreatedByViewModel from './bookingCreatedByViewModel'\nimport BookingLocationViewModel from './bookingLocationViewModel'\nimport PendingBookingSummaryDetailsViewModel from './pendingBookingSummaryDetailsViewModel'\n\nexport default class PendingBookingSummaryViewModel {\n constructor(params) {\n this.id = params.id\n this.status = params.status\n this.createdBy = params.createdBy\n ? new BookingCreatedByViewModel(params.createdBy)\n : null\n this.createdOnUtc = params.createdOnUtc ? dayjs(params.createdOnUtc) : null\n this.days = params.days\n this.client = params.client\n ? new BookingClientViewModel(params.client)\n : null\n this.clientGroup = params.clientGroup\n ? new BookingClientGroupViewModel(params.clientGroup)\n : null\n this.location = params.location\n ? new BookingLocationViewModel(params.location)\n : null\n this.details = params.details\n ? new PendingBookingSummaryDetailsViewModel(params.details)\n : null\n }\n}\n","/**\n * Dictionary of keys used to track loading states across the app.\n * When loading is triggered, the base store assigns the key to store.loadingKeys\n * with a count against each key (based on how many requests are loading)\n */\nexport default Object.freeze({\n defaultLoadingKey: 'defaultLoadingKey',\n bookingApprovals: {\n loadingApprovalCount: 'loadingApprovalCount',\n loadingApprovalDetails: 'loadingApprovalDetailsTest',\n loadingSubmitPendingApproval: 'loadingSubmitPendingApproval',\n },\n})\n","/**\n * Sleep util\n * @param {Number} ms milliseconds program should sleep for\n * ```js\n * import sleep from '@utils/sleep.js'\n * await sleep(500) // sleep for 500ms\n * ```\n */\nexport default (ms) => new Promise((resolve) => setTimeout(resolve, ms))\n","import { VuexResponse } from '@/helpers/vuex-action-builder'\nimport BookingViewModel from '@/models/bookings/bookingViewModel'\nimport PendingBookingSummaryViewModel from '@/models/bookings/pendingBookingSummaryViewModel'\nimport LoadingKeys from '@/shared/constants/core/LoadingKeys'\nimport sleep from '@/utils/sleep'\n\nconst getDefaultState = () => {\n return {\n flyout: {\n booking: {},\n show: false,\n error: false,\n },\n }\n}\n\nconst state = getDefaultState()\n\nexport default {\n namespaced: true,\n state,\n getters: {\n moduleName: () => 'booking-approvals',\n isLoadingApprovalsList: (state, getters, rootState, rootGetters) =>\n rootGetters.isLoadingByKey(\n LoadingKeys.bookingApprovals.loadingApprovalCount\n ),\n isLoadingFlyout: (state, getters, rootState, rootGetters) =>\n rootGetters.isLoadingByKey(\n LoadingKeys.bookingApprovals.loadingApprovalDetails\n ),\n isLoadingSubmitPendingApproval: (state, getters, rootState, rootGetters) =>\n rootGetters.isLoadingByKey(\n LoadingKeys.bookingApprovals.loadingSubmitPendingApproval\n ),\n activeBooking: (state) => state.flyout.booking,\n showFlyout: (state) => state.flyout.show,\n flyoutHasError: (state) => state.flyout.error,\n showDetailsContent: (state) => !!state.flyout.booking?.id,\n },\n mutations: {\n SET_FLYOUT(state, { key, value }) {\n state.flyout[key] = value\n },\n RESET_FLYOUT(state) {\n state.flyout = {\n booking: {},\n show: false,\n error: false,\n }\n },\n SET_STATE(state, { key, value }) {\n state[key] = value\n },\n CLEAR_STORE(state) {\n // Resets store to default state\n Object.assign(state, getDefaultState())\n },\n },\n actions: {\n async mockSubmitPendingApproval() {\n await sleep(1500)\n return {\n status: 204,\n data: {},\n }\n },\n async loadPendingApprovals({ commit }) {\n return await new VuexResponse(commit)\n .request(() => this.$api.pendingBookings.get())\n .withLoading(LoadingKeys.bookingApprovals.loadingApprovalCount)\n .transform((data) =>\n data.map((item) => new PendingBookingSummaryViewModel(item))\n )\n .go()\n },\n async loadApprovalDetails({ commit }, bookingId) {\n return await new VuexResponse(commit)\n .request(() => this.$api.bookings.get(bookingId))\n .withLoading(LoadingKeys.bookingApprovals.loadingApprovalDetails)\n .transform((data) => new BookingViewModel(data))\n .go()\n },\n async submitPendingApproval({ commit, dispatch }, payload) {\n return await new VuexResponse(commit)\n .request(() => this.$api.pendingBookings.action(payload))\n .withLoading(LoadingKeys.bookingApprovals.loadingSubmitPendingApproval)\n .withSuccessToast(\n payload.action === 'accept'\n ? this.$i18n.t('booking.details.approvals.submit.acceptToast', {\n companyNameShort: this.$i18n.t('app.companyNameShort'),\n })\n : this.$i18n.t('booking.details.approvals.submit.rejectToast')\n )\n .withFailureToast(\n this.$i18n.t('booking.details.approvals.submit.failureToast')\n )\n .go()\n },\n openFlyout({ commit }) {\n commit('SET_FLYOUT', { key: 'show', value: true })\n },\n setFlyout({ commit }, data) {\n commit('SET_FLYOUT', data)\n },\n resetFlyout({ commit }) {\n return commit('RESET_FLYOUT')\n },\n /**\n * Resets store to default state.\n */\n clear({ commit }) {\n commit('CLEAR_STORE')\n },\n },\n}\n","import authModule from './auth'\nimport usersModule from './users'\nimport singleInvoiceModule from './single-invoice'\nimport clientModule from './client'\nimport invoicesModule from './invoices'\nimport timesheetsModule from './timesheets'\nimport candidateModule from './candidate'\nimport fileModule from './file'\nimport bookingsModule from './bookings'\nimport contactsModule from './contacts'\nimport locationsModule from './locations'\nimport pendingFeedbacksModule from './pending-feedback'\nimport featuresModule from './features'\nimport bookingApprovalsModule from './booking-approvals'\n\nexport default {\n bookingApprovals: bookingApprovalsModule,\n features: featuresModule,\n locations: locationsModule,\n contacts: contactsModule,\n bookings: bookingsModule,\n timesheets: timesheetsModule,\n file: fileModule,\n singleInvoice: singleInvoiceModule,\n client: clientModule,\n invoices: invoicesModule,\n candidate: candidateModule,\n auth: authModule,\n users: usersModule,\n pendingfeedbacks: pendingFeedbacksModule,\n}\n","import allModules from '@state/modules'\nimport store from '@state/store'\n\nexport default function dispatchActionForAllModules(\n actionName,\n { modules = allModules, modulePrefix = '', flags = {} } = {}\n) {\n // For every module...\n for (const moduleName in modules) {\n const moduleDefinition = modules[moduleName]\n\n // If the action is defined on the module...\n if (moduleDefinition.actions && moduleDefinition.actions[actionName]) {\n // Dispatch the action if the module is namespaced. Otherwise,\n // set a flag to dispatch the action globally at the end.\n if (moduleDefinition.namespaced) {\n store.dispatch(`${modulePrefix}${moduleName}/${actionName}`)\n } else {\n flags.dispatchGlobal = true\n }\n }\n\n // If there are any nested sub-modules...\n if (moduleDefinition.modules) {\n // Also dispatch the action for these sub-modules.\n dispatchActionForAllModules(actionName, {\n modules: moduleDefinition.modules,\n modulePrefix: modulePrefix + moduleName + '/',\n flags,\n })\n }\n }\n\n // If this is the root and at least one non-namespaced module\n // was found with the action...\n if (!modulePrefix && flags.dispatchGlobal) {\n // Dispatch the action globally.\n store.dispatch(actionName)\n }\n}\n","import config from '@/common/config'\nimport store from '@state/store'\nimport { isHttpStatus } from '@/helpers/http-status-helpers'\nimport axios from 'axios'\n\nclass BaseApiService {\n /**\n * Api version (e.g. 1.0)\n */\n apiVersion = config.get('apiVersion')\n\n /**\n * Axios client\n */\n client = axios.create({\n baseURL: config.get('apiUrl'),\n json: true,\n })\n\n /**\n * HTTP methods\n */\n method = {\n GET: 'get',\n POST: 'post',\n DELETE: 'delete',\n PATCH: 'patch',\n PUT: 'put',\n }\n\n /**\n * A particular resource, e.i. users, posts, comments etc.\n */\n resource\n\n constructor(resource) {\n if (!resource) throw new Error('Resource is not provided')\n this.resource = resource\n }\n\n /**\n * Gets the full url for the endpoint\n * @param {String} args has the remaining fragement of the url\n * @param {Object} query key pair list of query args that will be mapped if provided e.g. `{ first: 'value', second: 'value' }`\n * @returns {String} full url including base\n */\n getUrl(args = '', query = null) {\n return `v${this.apiVersion}/${this.resource}${args ? `/${args}` : ''}${\n query ? `?${this.mapQueryParams(query)}` : ''\n }`\n }\n\n async handleErrors(err) {\n // If unauthorised, renew access token then retry\n if (isHttpStatus(err?.response?.status, 'Unauthorized')) {\n await store.dispatch('auth/getAccessTokenOrRefresh', true)\n\n return {\n retry: true,\n err,\n }\n }\n\n throw err\n }\n\n /**\n * Compiles request configuration and handles tasks like generating headers\n * list and retrieving the auth token\n * @param {String} method HTTP Method (GET, POST, PATCH, DELETE, PUT)\n * @param {String} url Endpoint url\n * @param {*} data Payload to send to server\n * @param {*} headers Request headers to send to server\n * @param {Boolean} isBlob Sets the response type to 'blob'\n * @returns Request config object\n */\n async compileRequestConfig(\n method,\n url,\n data,\n providedHeaders,\n isBlob = false\n ) {\n const accessToken = await store.dispatch('auth/getAccessTokenOrRefresh')\n if (typeof accessToken === 'undefined' || !accessToken) {\n throw Error('An access token is required for authenticated requests')\n }\n\n let impersonateHeader = {}\n\n // Set impersonate header if impersonate id is present\n if (store.getters['auth/hasImpersonateContactId']) {\n impersonateHeader = {\n 'Impersonated-Contact': store.getters['auth/impersonateContactId'],\n }\n }\n\n // Replace versioned URLs to use accept header to request API version\n const headers = {\n Authorization: `Bearer ${accessToken}`,\n 'Accept-Version': this.apiVersion,\n ...providedHeaders,\n ...impersonateHeader,\n }\n\n let config = {\n method,\n url,\n data,\n headers,\n }\n\n if (isBlob) config = { ...config, ...{ responseType: 'blob' } }\n\n return config\n }\n\n /**\n * Executes an authenticated HTTP request\n * @param {String} method HTTP Method (GET, POST, PATCH, DELETE, PUT)\n * @param {String} url Endpoint url\n * @param {*} data Payload to send to server\n * @param {*} headers Request headers to send to server\n * @param {Boolean} isBlob Sets the response type to 'blob'\n * @returns Http response\n */\n async execute(method, url, data, providedHeaders, isBlob = false) {\n let config = await this.compileRequestConfig(\n method,\n url,\n data,\n providedHeaders,\n isBlob\n )\n\n try {\n return await this.client(config)\n } catch (err) {\n const response = await this.handleErrors(err)\n\n if (response.retry) {\n // Recompile config to utilise new auth token\n config = await this.compileRequestConfig(\n method,\n url,\n data,\n providedHeaders,\n isBlob\n )\n\n return await this.client(config)\n }\n }\n }\n\n /**\n * Executes an authenticated HTTP request for blob files\n * @param {String} method HTTP Method (GET, POST, PATCH, DELETE, PUT)\n * @param {String} url Endpoint url\n * @param {*} data Payload to send to server\n * @param {*} headers Request headers to send to server\n * @returns Http response\n */\n async executeBlob(method, url, data, providedHeaders) {\n return this.execute(method, url, data, providedHeaders, true)\n }\n\n /**\n * Executes an unauthenticated HTTP request\n * @param {String} method HTTP Method (GET, POST, PATCH, DELETE, PUT)\n * @param {String} url Endpoint url\n * @param {*} data Payload to send to server\n * @returns Http response\n */\n async executeAnon(method, url, data) {\n return this.client({\n method,\n url,\n data,\n headers: {\n 'Accept-Version': this.apiVersion,\n },\n })\n }\n\n /**\n * Mapper that accepts a 1D object and generates a query string to be appended to a URL\n * @param {Object} queryParams key value object { key: value, ... }\n * @returns A query string e.g. ?key=value&key2=value2...\n */\n mapQueryParams(queryParams) {\n return queryParams\n ? Object.keys(queryParams)\n .map(function(key) {\n return key + '=' + queryParams[key]\n })\n .join('&')\n : ''\n }\n}\n\nclass ReadOnlyApiService extends BaseApiService {\n /**\n * Generic configurable authenticated HTTP request\n * @param {String} method HTTP Method (GET, POST, PATCH, DELETE, PUT)\n * @param {String} url Endpoint url\n * @param {*} data Payload to send to server\n * @param {*} headers Request headers to send to server\n * @returns Http response\n */\n async fetch(method, url, data, headers) {\n return this.execute(method, url, data, headers)\n }\n\n /**\n * HTTP Get authenticated request\n * @param {*} args\n * @param {*} query query object {key: value}\n * @returns\n */\n async get(args, query = null) {\n return this.execute(this.method.GET, this.getUrl(args, query))\n }\n\n /**\n * Generic configurable unauthenticated HTTP request\n * @param {String} method HTTP Method (GET, POST, PATCH, DELETE, PUT)\n * @param {String} url Endpoint url\n * @param {*} data Payload to send to server\n * @param {*} headers Request headers to send to server\n * @returns Http response\n */\n async fetchAnon(method, url, data, headers) {\n return this.executeAnon(method, url, data, headers)\n }\n\n /**\n * HTTP Get unauthenticated request\n * @param {*} args\n * @param {*} query query object {key: value}\n * @returns\n */\n async getAnon(args, query = null) {\n return this.executeAnon(this.method.GET, this.getUrl(args, query))\n }\n\n /**\n * Generic configurable Authenticated HTTP request - Response type: Blob\n * @param {String} method HTTP Method (GET, POST, PATCH, DELETE, PUT)\n * @param {String} url Endpoint url\n * @param {*} data Payload to send to server\n * @param {*} headers Request headers to send to server\n * @returns Http response\n */\n async fetchBlob(method, url, data, headers) {\n return this.executeBlob(method, url, data, headers)\n }\n\n /**\n * HTTP Get authenticated request - Response type: Blob\n * @param {*} args\n * @param {*} query query object {key: value}\n * @returns\n */\n async getBlob(args, query = null) {\n return this.executeBlob(this.method.GET, this.getUrl(args, query))\n }\n}\n\nclass ModelApiService extends ReadOnlyApiService {\n /**\n * HTTP Post authenticated request\n * @param {String} args Url arguments\n * @param {*} data Payload\n * @param {*} query query object {key: value}\n * @returns\n */\n async post(args, data = {}, query = null) {\n return this.execute(this.method.POST, this.getUrl(args, query), data)\n }\n\n /**\n * HTTP Post unauthenticated request\n * @param {String} args Url arguments\n * @param {*} data Payload\n * @param {*} query query object {key: value}\n * @returns\n */\n async postAnon(args, data = {}, query = null) {\n return this.executeAnon(this.method.POST, this.getUrl(args, query), data)\n }\n\n /**\n * HTTP Post authenticated request - Response type: Blob\n * @param {String} args Url arguments\n * @param {*} data Payload\n * @param {*} query query object {key: value}\n * @returns\n */\n async postBlob(args, data = {}, query = null) {\n return this.executeBlob(this.method.POST, this.getUrl(args, query), data)\n }\n\n /**\n * HTTP Put authenticated request\n * @param {String} args Url arguments\n * @param {*} data Payload\n * @param {*} query query object {key: value}\n * @returns\n */\n async put(args, data = {}, query = null) {\n return this.execute(this.method.PUT, this.getUrl(args, query), data)\n }\n\n /**\n * HTTP Put unauthenticated request\n * @param {String} args Url arguments\n * @param {*} data Payload\n * @param {*} query query object {key: value}\n * @returns\n */\n async putAnon(args, data = {}, query = null) {\n return this.executeAnon(this.method.PUT, this.getUrl(args, query), data)\n }\n\n /**\n * HTTP Put authenticated request - Response type: Blob\n * @param {String} args Url arguments\n * @param {*} data Payload\n * @param {*} query query object {key: value}\n * @returns\n */\n async putBlob(args, data = {}, query = null) {\n return this.executeBlob(this.method.PUT, this.getUrl(args, query), data)\n }\n\n /**\n * HTTP Patch authenticated request\n * @param {String} args Url arguments\n * @param {*} data Payload\n * @param {*} query query object {key: value}\n * @returns\n */\n async patch(args, data = {}, query = null) {\n return this.execute(this.method.PATCH, this.getUrl(args, query), data)\n }\n\n /**\n * HTTP Patch unauthenticated request\n * @param {String} args Url arguments\n * @param {*} data Payload\n * @param {*} query query object {key: value}\n * @returns\n */\n async patchAnon(args, data = {}, query = null) {\n return this.executeAnon(this.method.PATCH, this.getUrl(args, query), data)\n }\n\n /**\n * HTTP Delete authenticated request\n * @param {String} args Url arguments\n * @param {*} data Payload\n * @param {*} query query object {key: value}\n * @returns\n */\n async delete(args, data = {}, query = null) {\n return this.execute(this.method.DELETE, this.getUrl(args, query), data)\n }\n\n /**\n * HTTP Delete unauthenticated request\n * @param {String} args Url arguments\n * @param {*} data Payload\n * @param {*} query query object {key: value}\n * @returns\n */\n async deleteAnon(args, data = {}, query = null) {\n return this.executeAnon(this.method.DELETE, this.getUrl(args, query), data)\n }\n}\n\nexport { ReadOnlyApiService, ModelApiService }\n","import { ModelApiService } from './BaseApiService'\n\nexport default class SignalRApiService extends ModelApiService {\n constructor() {\n super('SignalR')\n }\n}\n","import { ModelApiService } from './BaseApiService'\n\nexport default class UserApiService extends ModelApiService {\n constructor() {\n super('me')\n }\n}\n","import { ModelApiService } from './BaseApiService'\n\nexport default class InvoicesApiService extends ModelApiService {\n constructor() {\n super('invoices')\n }\n\n async getInvoiceByInvoiceNo(invoiceNo) {\n return this.get(`GetInvoice/${invoiceNo}`)\n }\n\n async getOustandingInvoicesCount() {\n return this.get(`outstanding-invoices-count`)\n }\n\n async getInvoiceFile(invoiceId) {\n return this.getBlob(`${invoiceId}/file`)\n }\n}\n","import dayjs from '@/services/date'\nimport { ModelApiService } from './BaseApiService'\n\nexport default class ClientApiService extends ModelApiService {\n constructor() {\n super('clients')\n }\n\n async getBookingsByYear(clientId, timeZone, year) {\n const newDate = new Date(year, 1, 1)\n\n const dateFromString = dayjs(newDate)\n .startOf('year')\n .format('YYYY-MM-DD')\n const dateUntilString = dayjs(newDate)\n .endOf('year')\n .format('YYYY-MM-DD')\n\n return this.getBookingsByDateRange(\n clientId,\n timeZone,\n dateFromString,\n dateUntilString\n )\n }\n\n async getBookingsByDateRange(\n clientId,\n timeZone,\n dateFromStringLocal,\n dateUntilStringLocal\n ) {\n return this.get(\n `${clientId}/bookings/summary?timeZone=${timeZone}&dateFromLocal=${dateFromStringLocal}&dateToLocal=${dateUntilStringLocal}`\n )\n }\n\n async getBookingsByClientAndDate(clientId, dateFromStringLocal) {\n return this.get(`${clientId}/bookings?dateFromLocal=${dateFromStringLocal}`)\n }\n\n async getClientGrades(clientId) {\n return this.get(`${clientId}/grades`)\n }\n\n async getClientClassifications(clientId) {\n return this.get(`${clientId}/pay-classes`)\n }\n\n async getAdditionalDetails(clientId) {\n return this.get(`${clientId}/additional-details`)\n }\n}\n","import { ModelApiService } from './BaseApiService'\n\nexport default class CandidateApiService extends ModelApiService {\n constructor() {\n super('candidate')\n }\n\n async getCandidateDetails(id) {\n return this.get(`${id}/details`)\n }\n\n getCandidateList(id) {\n return this.get(`CandidateList?ClientId=${id}`)\n }\n\n async getDisplayPic(id) {\n if (id && id >= 0) {\n return this.get(`profile-image/${id}`)\n }\n }\n}\n","import { ModelApiService } from './BaseApiService'\n\nexport default class FileApiService extends ModelApiService {\n constructor() {\n super('file')\n }\n\n async createFileAccessToken(fileId) {\n return this.get(`generateAccessToken/${fileId}`)\n }\n\n async getGeneralFile(fileName) {\n return this.getBlob('general', { filePath: fileName })\n }\n}\n","import { ModelApiService } from './BaseApiService'\n\nexport default class TimesheetsApiService extends ModelApiService {\n constructor() {\n super('timesheets')\n }\n\n async getTimesheetsSummary(clientIds) {\n const urlArgs = new URLSearchParams(\n clientIds.map((clientId) => ['clientIds', clientId])\n )\n return this.get(`overview?${urlArgs}`)\n }\n\n async getTimesheetsFilteredByCandidate(candidateId, clientIds) {\n const urlArgs = new URLSearchParams(\n clientIds.map((clientId) => ['clientIds', clientId])\n )\n urlArgs.append('candidateId', candidateId)\n\n return this.get(`candidate?${urlArgs}`)\n }\n\n async downloadTimesheetFile(timesheetRecordId) {\n return this.getBlob(`download/${timesheetRecordId}`)\n }\n}\n","import { ModelApiService } from './BaseApiService'\n\nexport default class ContactsApiService extends ModelApiService {\n constructor() {\n super('contacts')\n }\n\n async getBookingContacts(locationId) {\n return this.get(`booking-contacts`, { locationId })\n }\n}\n","import { ModelApiService } from './BaseApiService'\n\nexport default class LocationsApiService extends ModelApiService {\n constructor() {\n super('locations')\n }\n\n async getBookingLocations() {\n return this.get(`booking-location-list`)\n }\n\n async getLocationCertifications(locationId) {\n return this.get(`${locationId}/certifications`)\n }\n\n async getLocationBookingBlocks() {\n return this.get(`booking-blocks`)\n }\n}\n","import dayjs from '@/services/date'\n// eslint-disable-next-line\nimport { ShortTermBooking } from '@/models/bookings/responses/shortTermBooking'\n// eslint-disable-next-line\nimport { BookingOverviewCountsViewModel } from '@/models/bookings/responses/bookingOverviewCountsViewModel'\nimport { ModelApiService } from './BaseApiService'\n\nexport default class BookingsApiService extends ModelApiService {\n constructor() {\n super('bookings')\n }\n\n async getFeedbackFormUrl(bookingId) {\n return await this.get(`${bookingId}/feedback-form`)\n }\n\n async submitQuickFeedback(bookingId, data) {\n return await this.post(`${bookingId}/quick-feedback`, data)\n }\n\n async checkReplaceMeStatus(clientId) {\n return await this.get('replace-me-status', { clientId })\n }\n\n async submitReplaceMeBooking(payload) {\n return await this.post('replaceMe', payload)\n }\n\n async cancelBooking(bookingId, payload) {\n return await this.post(`${bookingId}/cancel`, payload)\n }\n\n /**\n * Returns booking overview statistics for a given year and by the selected client ids\n * @param {number[]} clientIds\n * @param {number|string} year\n * @returns {Promise}\n */\n async getBookingOverview(clientIds, year) {\n const newDate = new Date(year, 1, 1)\n\n const dateFromLocal = dayjs(newDate)\n .startOf('year')\n .format('YYYY-MM-DD')\n const dateToLocal = dayjs(newDate)\n .endOf('year')\n .format('YYYY-MM-DD')\n\n const urlArgs = new URLSearchParams(\n clientIds.map((clientId) => ['clientIds', clientId])\n )\n\n urlArgs.append('dateFromLocal', dateFromLocal)\n urlArgs.append('dateToLocal', dateToLocal)\n\n return this.get(`overview?${urlArgs}`)\n }\n\n /**\n * Returns booking summaries for a given date and by the selected client ids\n * @param {number[]} clientIds\n * @param {string} dateFromStringLocal\n * @returns {Promise}\n */\n async getSummaryBookingsByDate(clientIds, dateFromLocal) {\n const urlArgs = new URLSearchParams(\n clientIds.map((clientId) => ['clientIds', clientId])\n )\n urlArgs.append('dateFromLocal', dateFromLocal)\n\n return this.get(`summary?${urlArgs}`)\n }\n}\n","import { ModelApiService } from './BaseApiService'\n\nexport default class PendingFeedbackApiServiceApiService extends ModelApiService {\n constructor() {\n super('feedbacks')\n }\n\n async getPendingFeedbacks(clientID) {\n return this.get(`getBookingsPendingFeedback?clientId=${clientID}`)\n }\n}\n","import { ModelApiService } from './BaseApiService'\n\nexport default class ClientGroupApiService extends ModelApiService {\n constructor() {\n super('client-groups')\n }\n\n async getOverviewData(clientGroupId, filterDate, timeZone) {\n return this.get(`${clientGroupId}/overview`, { filterDate, timeZone })\n }\n}\n","import { ModelApiService } from './BaseApiService'\n\nexport default class PendingBookingsApiService extends ModelApiService {\n constructor() {\n super('pending-bookings')\n }\n\n async action({ bookingId, action, reason }) {\n return this.post(`${bookingId}/action`, { action, reason })\n }\n}\n","import SignalRApiService from './SignalRApiService'\nimport UserApiService from './UserApiService'\nimport InvoicesApiService from './InvoicesApiService'\nimport ClientApiService from './ClientApiService'\nimport CandidateApiService from './CandidateApiService'\nimport FileApiService from './FileApiService'\nimport TimesheetsApiService from './TimesheetsApiService'\nimport ContactsApiService from './ContactsApiService'\nimport LocationsApiService from './LocationsApiService'\nimport BookingsApiService from './BookingsApiService'\nimport PendingFeedbackApiServiceApiService from './PendingFeedbackApiServiceApiService'\nimport ClientGroupApiService from './ClientGroupApiService'\nimport PendingBookingsApiService from './PendingBookingsApiService'\n\nexport default {\n pendingfeedbacks: new PendingFeedbackApiServiceApiService(),\n bookings: new BookingsApiService(),\n locations: new LocationsApiService(),\n contacts: new ContactsApiService(),\n timesheets: new TimesheetsApiService(),\n file: new FileApiService(),\n invoices: new InvoicesApiService(),\n client: new ClientApiService(),\n clientGroups: new ClientGroupApiService(),\n candidate: new CandidateApiService(),\n user: new UserApiService(),\n signalR: new SignalRApiService(),\n pendingBookings: new PendingBookingsApiService(),\n}\n","import api from '@/services/api'\n\nexport default function(store) {\n store.$api = api\n}\n","import i18n from '@plugins/vue-i18n'\n\nexport default function(store) {\n store.$i18n = i18n\n}\n","import appinsights from '@plugins/appinsights'\n\nexport default function(store) {\n store.$appInsights = appinsights\n}\n","import markdownToHtmlConverter from '@/utils/markdown-to-html-converter.js'\nimport config from '@/common/config'\nimport { success, fail } from './result-helper'\n\nconst extractHeaderData = (headers) => {\n return headers.split('|').reduce((acc, header) => {\n const keyAndValue = header.split(':')\n return {\n ...acc,\n ...{\n [keyAndValue[0]]: keyAndValue[1],\n },\n }\n }, {})\n}\n\nexport const getServiceStatus = async () => {\n try {\n return await fetch(config.get('app.status.url'))\n .then((response) => {\n if (!response.ok) return fail()\n return response.text()\n })\n .then((markdownText) => {\n // Extract header\n const fileLines = markdownText.replace(/\\r\\n/g, '\\n').split('\\n')\n const statusHeader = fileLines[0]\n fileLines.shift()\n\n const headerElements = extractHeaderData(statusHeader)\n\n return Promise.resolve(\n success({\n ...{\n _md: markdownText,\n html: markdownToHtmlConverter(fileLines.join('\\n')),\n },\n ...headerElements,\n })\n )\n })\n } catch (e) {\n return fail({ error: e, message: e.message })\n }\n}\n","import dispatchActionForAllModules from '@utils/dispatch-action-for-all-modules'\nimport Vue from 'vue'\nimport Vuex from 'vuex'\nimport toast from '@services/toasts/index.js'\nimport api from '@/plugins/api.storePlugin'\nimport i18n from '@/plugins/i18n.storePlugin'\nimport appInsights from '@/plugins/appinsights.storePlugin'\nimport { getServiceStatus } from '@/helpers/service-status-helper.js'\nimport { isCacheFresh } from '@/helpers/cache-helpers'\nimport { DurationUnits } from '@/shared/constants/date/DurationUnits.js'\nimport { success } from '@/helpers/result-helper.js'\nimport dayjs from '@/services/date'\nimport { logger } from '@/services/logging/AppLogger'\nimport Environment from '@/shared/constants/core/Environment'\nimport config from '@/common/config'\nimport modules from './modules'\n\nVue.use(Vuex)\n\nconst getDefaultState = () => {\n return {\n debugMessages: [],\n loadingCount: 0,\n activeLoaders: [],\n appLoadingCount: 0,\n debugActivateCounter: 0,\n darkMode: JSON.parse(localStorage.getItem('darkMode')),\n initialAppLoad: false, // Prevents full page loader on subsequent loads\n embedded: false, // App is embedded within RR\n drawer:\n localStorage.getItem('drawer') === undefined ||\n localStorage.getItem('drawer') === null\n ? false\n : JSON.parse(localStorage.getItem('drawer')),\n serviceStatus: null,\n serviceStatusLoadingCount: 0,\n }\n}\n\nconst state = getDefaultState()\n\nconst store = new Vuex.Store({\n modules,\n state,\n plugins: [api, i18n, appInsights],\n // Enable strict mode in development to get a warning\n // when mutating state outside of a mutation.\n // https://vuex.vuejs.org/guide/strict.html\n strict: process.env.NODE_ENV !== 'production',\n getters: {\n moduleName: () => 'root-store',\n isLoadingByKey: (state) => (key) => state.activeLoaders.indexOf(key) > -1,\n isLoadingApp: (state) => state.appLoadingCount > 0,\n serviceStatus: (state) => {\n if (!state.serviceStatus || !state.serviceStatus?.html) return null\n return state.serviceStatus\n },\n isLoadingServiceStatus: (state) => state.serviceStatusLoadingCount > 0,\n hasLoadedAppOnce: (state) => state.initialAppLoad,\n isError: (state) => state.error,\n isDebugModeActive: (state) => state.debugActivateCounter >= 10,\n isDarkModeActive: (state) => state.darkMode,\n isDrawerOpen: (state) => state.drawer,\n },\n mutations: {\n START_LOADING(state, key) {\n state.activeLoaders.push(key)\n },\n FINISH_LOADING(state, key) {\n const indexOfLoader = state.activeLoaders.indexOf(key)\n if (indexOfLoader === -1) return\n state.activeLoaders.splice(indexOfLoader, 1)\n },\n START_SERVICE_STATUS_LOADING(state) {\n state.serviceStatusLoadingCount++\n },\n FINISH_SERVICE_STATUS_LOADING(state) {\n state.serviceStatusLoadingCount--\n },\n INCREMENT_APP_LOADING(state) {\n state.appLoadingCount++\n },\n DECREMENT_APP_LOADING(state) {\n state.appLoadingCount--\n },\n SET_APP_AS_LOADED(state) {\n state.initialAppLoad = true\n },\n RESET_APP_LOADING_STATE(state) {\n state.initialAppLoad = false\n },\n SET_ERROR(state) {\n state.error = true\n },\n ACTIVATE_DEBUG(state) {\n state.debugActivateCounter = 10\n },\n INCREMENT_DEBUG(state) {\n state.debugActivateCounter++\n },\n RESET_DEBUG(state) {\n state.debugActivateCounter = 0\n },\n ENABLE_DARKMODE(state) {\n state.darkMode = true\n localStorage.setItem('darkMode', true)\n },\n DISABLE_DARKMODE(state) {\n state.darkMode = false\n localStorage.setItem('darkMode', false)\n },\n OPEN_DRAWER(state) {\n state.drawer = true\n localStorage.setItem('drawer', true)\n },\n CLOSE_DRAWER(state) {\n state.drawer = false\n localStorage.setItem('drawer', false)\n },\n CLEAR(state) {\n // Clear out local and session storage\n localStorage.clear()\n sessionStorage.clear()\n\n Object.assign(state, getDefaultState())\n },\n ADD_DEBUG_MESSAGE(state, obj) {\n state.debugMessages.push(obj)\n },\n INSERT_SERVICE_STATUS(state, serviceStatus) {\n state.serviceStatus = {\n ...{\n lastUpdated: dayjs(),\n },\n ...serviceStatus,\n }\n },\n },\n actions: {\n addDebugMessage({ commit, getters }, message) {\n if (getters.isDebugModeActive) {\n commit('ADD_DEBUG_MESSAGE', { date: new Date(), message: message })\n toast.debug(message)\n // eslint-disable-next-line no-console\n console.log(message)\n }\n },\n startLoadingApp({ commit }) {\n commit('INCREMENT_APP_LOADING')\n },\n finishLoadingApp({ commit }) {\n commit('DECREMENT_APP_LOADING')\n },\n startLoading({ commit }) {\n commit('START_LOADING')\n },\n finishLoading({ commit }) {\n commit('FINISH_LOADING')\n },\n setAppAsLoaded({ commit }) {\n commit('SET_APP_AS_LOADED')\n },\n resetAppLoadingState({ commit }) {\n commit('RESET_APP_LOADING_STATE')\n },\n toggleDebugMode({ commit, dispatch }) {\n if (this.state.debugActivateCounter <= 0) {\n commit('ACTIVATE_DEBUG')\n dispatch('addDebugMessage', 'Debug mode on')\n } else {\n dispatch('addDebugMessage', 'Debug mode off')\n commit('RESET_DEBUG')\n }\n },\n toggleDarkMode({ commit }) {\n this.state.darkMode\n ? commit('DISABLE_DARKMODE')\n : commit('ENABLE_DARKMODE')\n },\n toggleDrawer({ commit }) {\n this.state.drawer ? commit('CLOSE_DRAWER') : commit('OPEN_DRAWER')\n },\n clearStore({ commit }) {\n dispatchActionForAllModules('clear')\n\n commit('CLEAR')\n },\n async setLocale({ dispatch }, locale) {\n this.$i18n.locale = locale\n await dispatch('setFavicon')\n },\n setFavicon(context) {\n const favicon = document.querySelector(\"link[rel~='icon']\")\n favicon.href = this.$i18n.t('app.favicon')\n },\n async fetchServiceStatus({ commit, getters }, forceRefresh) {\n // 1. Check data is cached\n if (\n isCacheFresh({\n cacheDuration: 1,\n durationUnits: DurationUnits.HOUR,\n lastUpdated: state.serviceStatus?.lastUpdated,\n forceRefresh,\n })\n )\n return success({ data: getters.serviceStatus })\n\n // 2. Fetch fresh data\n commit('START_SERVICE_STATUS_LOADING')\n\n const response = await getServiceStatus()\n\n commit('INSERT_SERVICE_STATUS', response.isSuccess ? response.data : null)\n\n commit('FINISH_SERVICE_STATUS_LOADING')\n return response\n },\n /**\n * Logs store exceptions via the app logger\n * @param {*} param0\n * @param {StoreErrorDTO} payload\n */\n logStoreException(context, payload) {\n logger.logError(payload)\n },\n trackClickEvent(context, { name, properties }) {\n if (config.get('env') === Environment.development) {\n // eslint-disable-next-line no-console\n console.debug({ name, properties })\n } else {\n Vue.prototype.$appInsights.trackEvent({ name, properties })\n }\n },\n },\n})\n\nexport default store\n\n// Automatically run the `init` action for every module,\n// if one exists.\ndispatchActionForAllModules('init')\n","/**\n * @typedef {Object} TreeViewDtoType\n * @property {number} id - Unique identifier\n * @property {string} name\n * @property {boolean} locked - Disables node and children\n * @property {TreeViewDtoType[]} children\n */\n\n/**\n * @class\n */\nexport default class TreeViewDto {\n /**\n * Create a new TreeViewDto.\n * @param {...TreeViewDtoType} params\n */\n constructor(params) {\n this.id = params.id\n this.name = params.name\n this.locked = params.locked\n this.children = params.children ?? []\n }\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"title\":\"_timeout_title_QmghM\"};","export { default } from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-0-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-0-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-0-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-0-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-input-text.vue?vue&type=style&index=0&lang=scss&module=true&\"; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-0-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-0-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-0-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-0-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-input-text.vue?vue&type=style&index=0&lang=scss&module=true&\"","export const PermissionLevel = Object.freeze({\n /**\n * Can be either group, client or location level\n */\n GROUP_AND_BELOW: 'group_and_below',\n /**\n * Permissions for strictly the group level\n */\n GROUP: 'group',\n /**\n * Can be either client or location level\n */\n CLIENT_AND_BELOW: 'client_and_below',\n /**\n * Permissions for strictly the client level\n */\n CLIENT: 'client',\n /**\n * Can be either the currently selected client or one of the client's locations\n */\n SELECTED_CLIENT_AND_BELOW: 'selected_client_and_below',\n /**\n * Permissions for strictly the selected client\n */\n SELECTED_CLIENT: 'selected_client',\n /**\n * Permissions for strictly the location level\n */\n LOCATION: 'location',\n})\n","import Vue from 'vue'\nimport { logger } from '@/services/logging/AppLogger'\nimport VueErrorDTO from '@/models/error/vueErrorDTO'\nimport WindowErrorDTO from '@/models/error/windowErrorDTO'\n\n/**\n * Captures the errors that are specific to Vue instances. It would not be able\n * to capture the errors which are outside of Vue instances such as utils files,\n * services etc.\n * @param {*} err complete error trace, contains the `message` and `error stack`\n * @param {*} vm Vue component/instance in which error is occurred\n * @param {*} info Vue specific error information such as lifecycle hooks, events etc.\n */\nVue.config.errorHandler = (err, vm, info) => {\n logger.logError(new VueErrorDTO({ err, vm, info }))\n}\n\n/**\n * Captures unhandled expections outside of the Vue instance\n * @param {String} message A string containing a human-readable error message describing the problem. Same as `ErrorEvent.event`\n * @param {String} source A string containing the URL of the script that generated the error.\n * @param {Number} lineno An integer containing the line number of the script file on which the error occurred.\n * @param {Number} colno An integer containing the column number of the script file on which the error occurred.\n * @param {Error} error The error being thrown. Usually an `Error` object.\n */\nwindow.onerror = function(message, source, lineno, colno, error) {\n logger.logError(new WindowErrorDTO({ message, source, lineno, colno, error }))\n}\n\n/**\n * Captures promise rejections that are not handled by window.onerror\n * @tutorial https://developer.mozilla.org/en-US/docs/Web/API/Window/unhandledrejection_event\n *\n * @param {PromiseRejectionEvent} event\n */\nconst handlePromiseRejection = function(event) {\n logger.logError(event)\n}\n\nwindow.addEventListener('unhandledrejection', handlePromiseRejection)\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ValidationProvider',{attrs:{\"name\":_vm.$attrs.label,\"rules\":_vm.rules},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar errors = ref.errors;\nreturn [_c('v-text-field',_vm._g(_vm._b({attrs:{\"type\":_vm.type,\"error-messages\":errors},model:{value:(_vm.innerValue),callback:function ($$v) {_vm.innerValue=$$v},expression:\"innerValue\"}},'v-text-field',\n _vm.$attrs\n // https://vuejs.org/v2/guide/components-props.html#Disabling-Attribute-Inheritance\n ,false),\n _vm.$listeners\n // https://vuejs.org/v2/guide/components-custom-events.html#Binding-Native-Events-to-Components\n ))]}}])})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-input-text.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-input-text.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./_base-input-text.vue?vue&type=template&id=6c2d00da&\"\nimport script from \"./_base-input-text.vue?vue&type=script&lang=js&\"\nexport * from \"./_base-input-text.vue?vue&type=script&lang=js&\"\nimport style0 from \"./_base-input-text.vue?vue&type=style&index=0&lang=scss&module=true&\"\n\n\n\n\nfunction injectStyles (context) {\n \n this[\"$style\"] = (style0.locals || style0)\n\n}\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n injectStyles,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VTextField } from 'vuetify/lib/components/VTextField';\ninstallComponents(component, {VTextField})\n","/**\n * Describes environment types related to process.env.NODE_ENV and some custom types\n */\nexport default Object.freeze({\n production: 'production',\n development: 'development',\n unit: 'unit',\n e2e: 'e2e',\n})\n","import store from '@state/store'\nimport i18n from '@plugins/vue-i18n'\nimport { PermissionLevel } from '@/shared/constants/permissions/PermissionLevel'\nimport { PermissionScope } from '@/shared/constants/permissions/PermissionScope'\nimport { PermissionModifier } from '@/shared/constants/permissions/PermissionModifier'\nimport { PermissionRequirement } from '@/shared/constants/permissions/PermissionRequirement'\nimport ErrorPageCodes from '@/shared/constants/error/ErrorPageCodes'\nimport routeDefinitions from '@/shared/constants/routes/routeDefinitions'\n\nexport default [\n {\n ...routeDefinitions.home,\n component: () => lazyLoadView(import('@views/home.vue')),\n meta: {\n title: i18n.t('home.homePageTitle'),\n },\n },\n {\n ...routeDefinitions.timesheets,\n component: () => lazyLoadView(import('@views/timesheets.vue')),\n meta: {\n title: i18n.t('timesheets.pageTitle'),\n permissions: {\n requirement: PermissionRequirement.ALL,\n list: [\n {\n level: PermissionLevel.SELECTED_CLIENT_AND_BELOW,\n scope: PermissionScope.TIMESHEETS,\n modifier: PermissionModifier.VIEW,\n },\n ],\n },\n },\n },\n {\n ...routeDefinitions.candidates,\n component: () => lazyLoadView(import('@views/candidates.vue')),\n meta: {\n title: i18n.t('candidates.pageTitle'),\n permissions: {\n requirement: PermissionRequirement.ONE,\n list: [\n {\n level: PermissionLevel.GROUP_AND_BELOW,\n scope: PermissionScope.BOOKING,\n modifier: PermissionModifier.VIEW,\n },\n {\n level: PermissionLevel.SELECTED_CLIENT_AND_BELOW,\n scope: PermissionScope.TIMESHEETS,\n modifier: PermissionModifier.VIEW,\n },\n {\n level: PermissionLevel.GROUP_AND_BELOW,\n scope: PermissionScope.ACCOUNTS,\n modifier: PermissionModifier.VIEW,\n },\n ],\n },\n },\n },\n {\n ...routeDefinitions.help,\n component: () => lazyLoadView(import('@views/help.vue')),\n meta: {\n title: i18n.t('help.pageTitle'),\n },\n },\n {\n ...routeDefinitions.bookings,\n component: {\n render(c) {\n return c('router-view')\n },\n },\n children: [\n {\n ...routeDefinitions.bookingsCreate,\n component: () => import('@/router/views/bookings/booking-create.vue'),\n meta: {\n title: i18n.t('bookingCreate.pageTitle'),\n permissions: {\n requirement: PermissionRequirement.ONE,\n list: [\n {\n level: PermissionLevel.GROUP_AND_BELOW,\n scope: PermissionScope.BOOKING,\n modifier: PermissionModifier.VIEW,\n },\n {\n level: PermissionLevel.GROUP_AND_BELOW,\n scope: PermissionScope.PENDING_BOOKING,\n modifier: PermissionModifier.CREATE,\n },\n ],\n },\n },\n },\n {\n ...routeDefinitions.bookingsPendingApproval,\n component: () => import('@/router/views/bookings/pending-approval.vue'),\n meta: {\n title: i18n.t('booking.pendingApproval.pageTitle'),\n permissions: {\n requirement: PermissionRequirement.ONE,\n list: [\n {\n level: PermissionLevel.GROUP_AND_BELOW,\n scope: PermissionScope.PENDING_BOOKING,\n modifier: PermissionModifier.VIEW,\n },\n {\n level: PermissionLevel.GROUP_AND_BELOW,\n scope: PermissionScope.PENDING_BOOKING,\n modifier: PermissionModifier.CREATE,\n },\n ],\n },\n },\n },\n ],\n },\n {\n ...routeDefinitions.settings,\n component: () =>\n lazyLoadView(import('@/router/views/settings/settings.vue')),\n },\n {\n ...routeDefinitions.changePassword,\n component: () =>\n lazyLoadView(\n import('@/router/views/settings/settings-change-password.vue')\n ),\n },\n {\n ...routeDefinitions.login,\n component: () => lazyLoadView(import('@views/login.vue')),\n meta: {\n public: true,\n title: i18n.t('login.loginPageTitle'),\n beforeResolve(routeTo, routeFrom, next) {\n // If the user is already logged in\n if (store.getters['auth/isUserLoggedIn']) {\n // Redirect to the home page instead\n next({ name: routeDefinitions.home.name })\n } else {\n // Continue to the login page\n next()\n }\n },\n },\n },\n {\n ...routeDefinitions.impersonateLogout,\n component: () => lazyLoadView(import('@views/impersonate-logout.vue')),\n meta: {\n public: true,\n title: 'Impersonate Logout',\n },\n },\n {\n ...routeDefinitions.impersonateLogin,\n component: () => lazyLoadView(import('@views/login.vue')),\n meta: {\n public: true,\n title: 'Impersonate Login',\n beforeResolve(routeTo, routeFrom, next) {\n // If the user is already logged in\n if (store.getters['auth/isUserLoggedIn']) {\n // Redirect to the home page instead\n next({ name: routeDefinitions.home.name })\n } else {\n // Continue to the login page\n next()\n }\n },\n },\n },\n {\n ...routeDefinitions.finance,\n component: () => lazyLoadView(import('@views/finance.vue')),\n meta: {\n permissions: {\n requirement: PermissionRequirement.ALL,\n list: [\n {\n level: null,\n scope: PermissionScope.ACCOUNTS,\n modifier: PermissionModifier.VIEW,\n },\n ],\n },\n },\n },\n {\n ...routeDefinitions.invoiceDetails,\n component: () =>\n lazyLoadView(import('@/router/views/finance/invoice-view.vue')),\n meta: {\n title: i18n.t('finance.invoiceViewPageTitle'),\n permissions: {\n requirement: PermissionRequirement.ALL,\n list: [\n {\n level: PermissionLevel.GROUP_AND_BELOW,\n scope: PermissionScope.ACCOUNTS,\n modifier: PermissionModifier.VIEW,\n },\n ],\n },\n },\n },\n {\n ...routeDefinitions.logout,\n meta: {\n beforeResolve(routeTo, routeFrom, next) {\n store.dispatch('auth/logOut')\n const authRequiredOnPreviousRoute = routeFrom.matched.some(\n (route) => route.meta.authRequired\n )\n // Navigate back to previous page, or home as a fallback\n next(\n authRequiredOnPreviousRoute\n ? { name: routeDefinitions.home.name }\n : { ...routeFrom }\n )\n },\n },\n },\n {\n path: '/404',\n name: '404',\n redirect: { name: routeDefinitions.notFound.name },\n meta: {\n public: true,\n label: 'Error',\n type: ErrorPageCodes.PAGE_NOT_FOUND.id,\n },\n // Allows props to be passed to the 404 page through route\n // params, such as `resource` to define what wasn't found.\n props: true,\n },\n // Redirect any unmatched routes to the 404 page. This may\n // require some server configuration to work in production:\n // https://router.vuejs.org/en/essentials/history-mode.html#example-server-configurations\n {\n path: '*',\n component: require('@views/_error.vue').default,\n props: true,\n name: routeDefinitions.notFound.name,\n meta: {\n public: true,\n label: 'NotFound',\n type: ErrorPageCodes.PAGE_NOT_FOUND.id,\n },\n },\n {\n path: '/500',\n redirect: { name: routeDefinitions.error.name },\n meta: {\n public: true,\n label: 'Error',\n type: ErrorPageCodes.INTERNAL_SERVER_ERROR.id,\n },\n },\n {\n path: '/401',\n redirect: { name: routeDefinitions.unauthorized.name },\n meta: {\n public: true,\n label: 'Unauthorized',\n type: ErrorPageCodes.UNAUTHORIZED.id,\n icon: 'mdi-account-cancel',\n },\n },\n {\n path: '/403',\n redirect: { name: routeDefinitions.forbidden.name },\n meta: {\n public: true,\n label: 'Forbidden',\n type: ErrorPageCodes.FORBIDDEN.id,\n icon: 'mdi-account-cancel',\n },\n },\n {\n path: '/error',\n redirect: { name: routeDefinitions.error.name },\n meta: {\n public: true,\n label: 'Error',\n type: ErrorPageCodes.INTERNAL_SERVER_ERROR.id,\n },\n },\n {\n path: '*',\n component: require('@views/_error.vue').default,\n props: true,\n name: routeDefinitions.error.name,\n meta: {\n public: true,\n label: 'Error',\n type: ErrorPageCodes.INTERNAL_SERVER_ERROR.id,\n },\n },\n {\n path: '*',\n component: require('@views/_error.vue').default,\n props: true,\n name: routeDefinitions.unauthorized.name,\n meta: {\n public: true,\n label: 'Unauthorized',\n type: ErrorPageCodes.UNAUTHORIZED.id,\n icon: 'mdi-account-cancel',\n },\n },\n {\n path: '*',\n component: require('@views/_error.vue').default,\n props: true,\n name: routeDefinitions.forbidden.name,\n meta: {\n public: true,\n label: 'Forbidden',\n type: ErrorPageCodes.FORBIDDEN.id,\n icon: 'mdi-account-cancel',\n },\n },\n {\n path: '*',\n component: require('@views/_error.vue').default,\n props: true,\n name: routeDefinitions.accountLoadFailure.name,\n meta: {\n public: true,\n label: 'Failed To Load Account',\n type: ErrorPageCodes.ACCOUNT_LOAD_FAILURE.id,\n icon: 'mdi-account-cancel',\n },\n },\n {\n path: '*',\n component: require('@views/_error.vue').default,\n props: true,\n name: routeDefinitions.noServerResponse.name,\n meta: {\n public: true,\n label: 'Unable to contact server',\n type: ErrorPageCodes.NO_SERVER_RESPONSE.id,\n icon: 'mdi-account-cancel',\n },\n },\n {\n path: '*',\n component: require('@views/_error.vue').default,\n props: true,\n name: routeDefinitions.actionLocked.name,\n meta: {\n public: true,\n label: 'Action Locked',\n type: ErrorPageCodes.ACTION_LOCKED.id,\n icon: 'mdi-shield-alert',\n },\n },\n {\n path: '/under-construction',\n name: 'underConstruction',\n component: () => lazyLoadView(import('@views/_under-construction.vue')),\n meta: {\n public: true,\n title: i18n.t('underConstruction.pageTitle'),\n },\n },\n]\n\n/** Lazy-loads view components, but with better UX. A loading view\n * will be used if the component takes a while to load, falling\n * back to a timeout view in case the page fails to load. You can\n * use this component to lazy-load a route with:\n *\n * component: () => lazyLoadView(import('@views/my-view'))\n *\n * NOTE: Components loaded with this strategy DO NOT have access\n * to in-component guards, such as beforeRouteEnter,\n * beforeRouteUpdate, and beforeRouteLeave. You must either use\n * route-level guards instead or lazy-load the component directly:\n *\n * component: () => import('@views/my-view')\n */\nfunction lazyLoadView(AsyncView) {\n const AsyncHandler = () => ({\n component: AsyncView,\n // A component to use while the component is loading.\n loading: require('@views/_loading.vue').default,\n // Delay before showing the loading component.\n // Default: 200 (milliseconds).\n delay: 400,\n // A fallback component in case the timeout is exceeded\n // when loading the component.\n error: require('@views/_timeout.vue').default,\n // Time before giving up trying to load the component.\n // Default: Infinity (milliseconds).\n timeout: 10000,\n })\n\n return Promise.resolve({\n functional: true,\n render(h, { data, children }) {\n // Transparently pass any props or children\n // to the view component.\n return h(AsyncHandler, data, children)\n },\n })\n}\n","import store from '@state/store'\nimport Vue from 'vue'\nimport VueRouter from 'vue-router'\n// https://github.com/declandewet/vue-meta\nimport VueMeta from 'vue-meta'\n// Adds a loading bar at the top during page loads.\nimport NProgress from 'nprogress/nprogress'\nimport { hasAccessToRoute } from '@/helpers/permissions-helpers.js'\nimport ErrorPageCodes from '@/shared/constants/error/ErrorPageCodes'\nimport { getLanguageBasedOnBaseURL } from '@/helpers/language-helpers'\nimport RequestErrorSource from '@/shared/constants/error/RequestErrorSource'\nimport { decideRouteBasedOnFeatureToggles } from '@/services/features/featureDecisions.js'\nimport routeDefinitions from '@/shared/constants/routes/routeDefinitions'\nimport routes from './routes'\n\nVue.use(VueRouter)\nVue.use(VueMeta, {\n // The component option name that vue-meta looks for meta info on.\n keyName: 'metaInfo',\n})\n\nconst router = new VueRouter({\n routes,\n // Use the HTML5 history API (i.e. normal-looking routes)\n // instead of routes with hashes (e.g. example.com/#/about).\n // This may require some server configuration in production:\n // https://router.vuejs.org/en/essentials/history-mode.html#example-server-configurations\n mode: 'history',\n // Simulate native-like scroll behavior when navigating to a new\n // route and using back/forward buttons.\n scrollBehavior(to, from, savedPosition) {\n if (savedPosition) {\n return savedPosition\n } else {\n return { x: 0, y: 0 }\n }\n },\n})\n\nconst startRouteLoading = () => {\n // Begin loading animation. Only really required for initial page loads/refreshes.\n if (!store.getters.hasLoadedAppOnce) {\n store.dispatch('startLoadingApp')\n }\n\n // Only display the top loading bar after initial load\n if (store.getters.hasLoadedAppOnce) NProgress.start()\n}\nconst stopRouteLoading = () => {\n // Prevents full page loader showing up on every route change\n if (store.getters.isLoadingApp) {\n store.dispatch('setAppAsLoaded')\n }\n\n // Complete the full page loading animation\n store.dispatch('finishLoadingApp')\n NProgress.done()\n}\n\n// Before each route evaluates...\nrouter.beforeEach(async (routeTo, routeFrom, next) => {\n // Check if auth is required on this route\n // (including nested routes).\n const isPublic = routeTo.matched.some((route) => route.meta.public)\n\n // If auth isn't required for the route, just continue.\n if (isPublic) return next()\n\n startRouteLoading()\n\n // If auth is required and the user isn't logged in...\n if (!store.getters['auth/isUserLoggedIn']) {\n // Retrieve another access token...\n try {\n const validToken = await store.dispatch('auth/refreshToken')\n\n // Then continue if the token is valid & was acquired successfully,\n // otherwise redirect to login.\n if (!validToken.isSuccess || !store.getters['auth/isUserLoggedIn']) {\n throw new Error('Could not refresh access token')\n }\n } catch {\n return redirectToLandingPage()\n }\n }\n\n // Get user's profile if not already set or isn't fresh\n if (\n !store.getters['auth/currentUser'] ||\n !store.getters['auth/permissions'] ||\n store.getters['auth/permissions'].length === 0\n ) {\n try {\n // throw new Error()\n const loadUserProfileResult = await store.dispatch(\n 'auth/getCurrentUserProfile'\n )\n\n if (!loadUserProfileResult.isSuccess)\n return getErrorPageRedirectByStatusCode(loadUserProfileResult)\n\n // Set locale loaded in with profile\n await store.dispatch('setLocale', loadUserProfileResult.data.language)\n } catch (ex) {\n return redirectToErrorPage(ErrorPageCodes.ACCOUNT_LOAD_FAILURE.routeName)\n }\n }\n\n // If auth is required and the user is NOT currently logged in,\n // redirect to login.\n if (\n !store.getters['auth/isUserLoggedIn'] ||\n !store.getters['auth/currentUser']\n )\n redirectToLandingPage()\n\n // Check if the cached selected clients exist within loaded permissions\n if (\n store.getters['client/mapSelectedClientsToClientsInPermissions'].length ===\n 0\n ) {\n const allClients = store.getters['auth/getAllClients']\n\n if (!allClients || allClients.length === 0) {\n return redirectToErrorPage()\n }\n\n await store.dispatch(\n 'client/setClientList',\n allClients.map((client) => client.clientId)\n )\n }\n\n // TODO: Handle client owner details TASK #12722\n // Loading the first client's owner for now\n // Load the contact's rep if they aren't loaded yet\n if (\n !store.getters['client/owner'](\n store.getters['client/getSelectedClients'][0]\n )\n ) {\n store.dispatch(\n 'client/loadClientAdditionalInformation',\n store.getters['client/getSelectedClients'][0]\n )\n }\n\n // Check if permissions are required for route\n if (!hasAccessToRoute(routeTo, store))\n redirectToErrorPage(ErrorPageCodes.FORBIDDEN.routeName)\n\n return decideRouteBasedOnFeatureToggles(\n store.getters['features/featureToggles'],\n routeTo,\n next\n )\n\n function redirectToLandingPage() {\n stopRouteLoading()\n\n // To complete the redirect auth step for MSAL they should be directed to\n // impersonate login instead of the landing page\n if (store.getters['auth/hasImpersonateContactId']) {\n return next({ name: routeDefinitions.login.name })\n }\n\n // Pass the original route to the login component\n window.location.href = `${getLanguageBasedOnBaseURL()}/landing`\n }\n\n function redirectToErrorPage(errorPageName = 'ErrorPage') {\n stopRouteLoading()\n next({ name: errorPageName, params: [routeTo.path], replace: true })\n }\n\n function getErrorPageRedirectByStatusCode(response) {\n switch (response.error.source) {\n case RequestErrorSource.server: {\n const statusCode = response.error._error.response.status\n switch (statusCode) {\n case ErrorPageCodes.FORBIDDEN.statusCode:\n return redirectToErrorPage(ErrorPageCodes.FORBIDDEN.routeName)\n case ErrorPageCodes.UNAUTHORIZED.statusCode:\n return redirectToErrorPage(ErrorPageCodes.UNAUTHORIZED.routeName)\n case ErrorPageCodes.BAD_REQUEST.statusCode:\n return redirectToErrorPage(ErrorPageCodes.BAD_REQUEST.routeName)\n default:\n return redirectToErrorPage(\n ErrorPageCodes.INTERNAL_SERVER_ERROR.routeName\n )\n }\n }\n case RequestErrorSource.request:\n return redirectToErrorPage(ErrorPageCodes.NO_SERVER_RESPONSE.routeName)\n default:\n return redirectToErrorPage(\n ErrorPageCodes.ACCOUNT_LOAD_FAILURE.routeName\n )\n }\n }\n})\n\nrouter.beforeResolve(async (routeTo, routeFrom, next) => {\n // Create a `beforeResolve` hook, which fires whenever\n // `beforeRouteEnter` and `beforeRouteUpdate` would. This\n // allows us to ensure data is fetched even when params change,\n // but the resolved route does not. We put it in `meta` to\n // indicate that it's a hook we created, rather than part of\n // Vue Router (yet?).\n try {\n // For each matched route...\n for (const route of routeTo.matched) {\n await new Promise((resolve, reject) => {\n // If a `beforeResolve` hook is defined, call it with\n // the same arguments as the `beforeEnter` hook.\n if (route.meta && route.meta.beforeResolve) {\n route.meta.beforeResolve(routeTo, routeFrom, (...args) => {\n // If the user chose to redirect...\n if (args.length) {\n // If redirecting to the same route we're coming from...\n if (routeFrom.name === args[0].name) {\n // Complete the animation of the route progress bar.\n NProgress.done()\n }\n // Complete the redirect.\n next(...args)\n reject(new Error('Redirected'))\n } else {\n resolve()\n }\n })\n } else {\n // Otherwise, continue resolving the route.\n resolve()\n }\n })\n }\n // If a `beforeResolve` hook chose to redirect, just return.\n } catch (error) {\n return\n }\n\n // If we reach this point, continue resolving the route.\n next()\n})\n\n// When each route is finished evaluating...\nrouter.afterEach((routeTo, routeFrom) => {\n // Complete the animation of the route progress bar.\n stopRouteLoading()\n})\n\nexport default router\n","// Globally register all base components for convenience, because they\n// will be used very frequently. Components are registered using the\n// PascalCased version of their file name.\n\nimport Vue from 'vue'\n\n// https://webpack.js.org/guides/dependency-management/#require-context\nconst requireComponent = require.context(\n // Look for files in the current directory\n '.',\n // Do not look in subdirectories\n false,\n // Only include \"_base-\" prefixed .vue files\n /_base-[\\w-]+\\.vue$/\n)\n\n// For each matching file name...\nrequireComponent.keys().forEach((fileName) => {\n // Get the component config\n const componentConfig = requireComponent(fileName)\n // Get the PascalCase version of the component name\n const componentName = fileName\n // Remove the \"./_\" from the beginning\n .replace(/^\\.\\/_/, '')\n // Remove the file extension from the end\n .replace(/\\.\\w+$/, '')\n // Split up kebabs\n .split('-')\n // Upper case\n .map((kebab) => kebab.charAt(0).toUpperCase() + kebab.slice(1))\n // Concatenated\n .join('')\n\n // Globally register the component\n Vue.component(componentName, componentConfig.default || componentConfig)\n})\n","// generated by genversion\nexport const version = '1.0.0';\n","import Vue from 'vue'\nimport { version } from '@root/lib/version'\nconst { get, has, set, merge } = require('lodash')\n\n// Load config based on environment\nconst env = process.env.NODE_ENV\n\n// Merge in additional config\nconst config = {\n // Props\n env,\n appVersion: version,\n sameDayBookingCutOffTime: '08:00', // Should be moved to another setting later, possible client by client basis\n password: {\n minChars: 8,\n allowedCharsRegex: /[(@!#?$%^&*)(+=._-]{1,}/,\n },\n ...Vue.prototype.$config,\n\n // Methods\n get(path) {\n return get(this, path)\n },\n has(path) {\n return has(this, path)\n },\n set(path, value) {\n return set(this, path, value)\n },\n load(obj) {\n merge(this, obj)\n },\n}\n\nexport default config\n","export default Object.freeze({\n /**\n * Denotes that the associated feature is enabled\n */\n enabled: 'enabled',\n /**\n * Denotes that the associated feature is disabled\n */\n disabled: 'disabled',\n /**\n * Used by route feature toggles. Will redirect user to under construction page if set.\n */\n underConstruction: 'underConstruction',\n})\n","import featureToggleOptions from '@/shared/constants/features/featureToggleOptions'\nimport routeDefinitions from '@/shared/constants/routes/routeDefinitions'\n\nconst isEnabled = (key, featureToggles) => {\n if (\n !featureToggles ||\n !Object.prototype.hasOwnProperty.call(featureToggles, key)\n )\n return false\n\n const featureToggle = featureToggles[key]\n return featureToggle === featureToggleOptions.enabled\n}\n\n/**\n * Generates a series of feature toggle functions that will instruct which features\n * are enabled or not\n * @param {Object} featureToggles Dictionary of feature toggles\n */\nexport const createFeatureDecisions = (featureToggles) => {\n return {\n // #region Client Group Overview\n\n /**\n * UI level feature toggle that will display the client group overview UI if\n * the client enabled flag and the feature is enabled\n * @param {Boolean} clientEnabled\n * @returns\n */\n canViewClientGroupOverview(clientEnabled = false) {\n return (\n isEnabled('feature_clientGroupOverview_view', featureToggles) &&\n clientEnabled\n )\n },\n // #endregion\n }\n}\n\n/**\n * Returns value of route toggle if set or undefined\n * @param {Object} featureToggles Dictionary of feature toggles\n * @param {String} routeName\n * @returns\n */\nconst getRouteToggle = (featureToggles, routeName) => {\n if (\n !featureToggles ||\n !Object.prototype.hasOwnProperty.call(featureToggles, `route_${routeName}`)\n )\n return featureToggleOptions.enabled\n return featureToggles[`route_${routeName}`]\n}\n\n/**\n * Makes routing decisions based on feature toggles and the desired next route\n * @param {Object} featureToggles Dictionary of feature toggles\n * @param {*} routeTo\n * @param {Function} next\n */\nexport const decideRouteBasedOnFeatureToggles = (\n featureToggles,\n routeTo,\n next\n) => {\n // Check if route toggle exists. If yes, decide based on value. If not, assume enabled\n const routeToggle = getRouteToggle(featureToggles, routeTo.name)\n\n switch (routeToggle) {\n case featureToggleOptions.enabled:\n case undefined:\n return next()\n case featureToggleOptions.underConstruction:\n return next({\n name: routeDefinitions.underConstruction.name,\n query: { redirectFrom: routeTo.fullPath },\n })\n case featureToggleOptions.disabled:\n default:\n return next({\n name: routeDefinitions.notFound.name,\n params: [routeTo.fullPath],\n replace: true,\n })\n }\n}\n\n/**\n * Checks route toggles to determine if a nav item should be displayed or not\n * @param {Object} featureToggles Dictionary of feature toggles\n * @param {String} routeName\n * @returns\n */\nexport const displayNavItem = (featureToggles, routeName) => {\n const routeToggle = getRouteToggle(featureToggles, routeName)\n return routeToggle === featureToggleOptions.enabled\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.isDev)?_c('v-system-bar',{attrs:{\"app\":\"\",\"dark\":\"\",\"color\":\"purple\"}},[_c('v-icon',[_vm._v(\"mdi-wrench\")]),_c('span',[_vm._v(\" Dev Mode \")]),_c('v-spacer'),_c('span',{staticClass:\"mr-4 caption\"},[_c('v-switch',{attrs:{\"id\":\"debug-toggle\",\"input-value\":_vm.debugToggle},on:{\"change\":_vm.toggleDebugMode},scopedSlots:_vm._u([{key:\"label\",fn:function(){return [_c('span',{staticClass:\"caption\"},[_vm._v(\"Enable Debug Mode\")])]},proxy:true}],null,false,3585174715)})],1),(!_vm.isMobileViewPort)?_c('span',{staticClass:\"mr-4\"},[_c('v-icon',[_vm._v(\"mdi-code-tags\")]),_c('span',[_vm._v(_vm._s((\"v\" + _vm.appVersion)))])],1):_vm._e()],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./the-debug-bar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./the-debug-bar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./the-debug-bar.vue?vue&type=template&id=1d4309ae&\"\nimport script from \"./the-debug-bar.vue?vue&type=script&lang=js&\"\nexport * from \"./the-debug-bar.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VSwitch } from 'vuetify/lib/components/VSwitch';\nimport { VSystemBar } from 'vuetify/lib/components/VSystemBar';\ninstallComponents(component, {VIcon,VSpacer,VSwitch,VSystemBar})\n","/**\n * @typedef {Object} ClientLoginLocationViewModelType\n * @property {number} locationId - The ID of the location.\n * @property {string} locationName - The name of the location.\n * @property {number} clientId - The ID of the client.\n * @property {string} clientName - The name of the client.\n * @property {number} clientTypeInt - The integer representation of the client type.\n * @property {number} clientGroupId - The ID of the client group.\n * @property {string} clientGroupName - The name of the client group.\n * @property {string} startTime - The start time of operations.\n * @property {string} endTime - The end time of operations.\n * @property {number} locationLunchBreakMinutes - The duration of the lunch break in minutes.\n * @property {boolean} submittedByTemplateRequired - Indicates if submission by template is required.\n * @property {string} addressLine1 - The first line of the address.\n * @property {string} addressLine2 - The second line of the address.\n * @property {string} suburb - The suburb of the location.\n * @property {string} postcode - The postcode of the location.\n * @property {string} state - The state of the location.\n * @property {string} country - The country of the location.\n * @property {string} timeZone - The timezone of the location.\n */\n\nexport default class ClientLoginLocationViewModel {\n /** @param {ClientLoginLocationViewModelType} params */\n constructor(params) {\n this.locationId = params.locationId\n this.locationName = params.locationName\n this.clientId = params.clientId\n this.clientName = params.clientName\n this.clientTypeInt = params.clientTypeInt\n this.clientGroupId = params.clientGroupId\n this.clientGroupName = params.clientGroupName\n this.startTime = params.startTime\n this.endTime = params.endTime\n this.locationLunchBreakMinutes = params.locationLunchBreakMinutes\n this.submittedByTemplateRequired = params.submittedByTemplateRequired\n this.addressLine1 = params.addressLine1\n this.addressLine2 = params.addressLine2\n this.suburb = params.suburb\n this.postcode = params.postcode\n this.state = params.state\n this.country = params.country\n this.timeZone = params.timeZone\n }\n}\n","export const LogoShade = Object.freeze({\n DARK: 'Dark',\n LIGHT: 'Light',\n WHITE: 'White',\n})\n","var map = {\n\t\"./_base-button.vue\": \"8339\",\n\t\"./_base-checkbox-list.vue\": \"4626\",\n\t\"./_base-icon.vue\": \"670f\",\n\t\"./_base-input-select.vue\": \"16e5\",\n\t\"./_base-input-text.vue\": \"9c57\",\n\t\"./_base-link.vue\": \"cbd4\",\n\t\"./_base-logo.vue\": \"b7c5\",\n\t\"./_base-page-title.vue\": \"feda\",\n\t\"./_base-split-btn.vue\": \"c3bd\",\n\t\"./_base-status-label.vue\": \"f8f2\"\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 = \"b526\";","export default class ShiftRecordBreakDto {\n constructor({ type, startTime, endTime } = {}) {\n /**\n * The type of break that was taken\n * @type {String}\n * @see {ShiftRecordBreakType} for valid range of values\n */\n this.type = type\n /**\n * Start time of block in 24 hr format\n * @type {String}\n * @example 08:30\n */\n this.startTime = startTime\n /**\n * End time of block in 24 hr format\n * @type {String}\n * @example 15:30\n */\n this.endTime = endTime\n }\n}\n","/* eslint-disable no-unused-vars */\nimport { isNonEmptyArray } from '@/helpers/array-helpers'\nimport dayjs from '@/services/date/index'\nimport ShiftRecordBreakDto from '../shiftRecords/shiftRecordBreakDto'\nimport CandidateTimesheetModificationsViewModel from './candidateTimesheetModificationsViewModel'\n\nexport default class TimesheetsPendingApprovalViewModel {\n constructor({\n locationId = 0,\n locationName,\n locationTimeZone,\n clientId = 0,\n clientName,\n clientGroupId = 0,\n payOptionType,\n payOptionTypes = [],\n unitType,\n bookingId = 0,\n startTimeLocal,\n endTimeLocal,\n startTimeUTC,\n endTimeUTC,\n candidateId = 0,\n candidateFirstName,\n candidateLastName,\n candidatePreferredName,\n candidateFullName,\n breakMinutes = 0,\n isApprovedByCandidate = true,\n breaks = [],\n timesheetMethod,\n bookingStatus,\n candidateBookingModifications,\n } = {}) {\n /**\n * @type {Number}\n */\n this.locationId = locationId\n\n /**\n * @type {String}\n */\n this.locationName = locationName\n\n /**\n * @type {String}\n */\n this.locationTimeZone = locationTimeZone\n\n /**\n * @type {Number}\n */\n this.clientId = clientId\n\n /**\n * @type {String}\n */\n this.clientName = clientName\n\n /**\n * @type {Number}\n */\n this.clientGroupId = clientGroupId\n\n /**\n * @type {String}\n */\n this.payOptionType = payOptionType\n\n /**\n * @type {Array}\n */\n this.payOptionTypes = isNonEmptyArray(payOptionTypes) ? payOptionTypes : []\n\n /**\n * @type {String}\n * @see {RateUnitType} for valid range of values\n */\n this.unitType = unitType\n\n /**\n * @type {Number}\n */\n this.bookingId = bookingId\n\n /**\n * @type {Date}\n */\n this.startTimeLocal = startTimeLocal ? dayjs(startTimeLocal) : null\n\n /**\n * @type {Date}\n */\n this.endTimeLocal = endTimeLocal ? dayjs(endTimeLocal) : null\n\n /**\n * @type {Date}\n */\n this.startTimeUTC = startTimeUTC ? dayjs.utc(startTimeUTC) : null\n\n /**\n * @type {Date}\n */\n this.endTimeUTC = endTimeUTC ? dayjs.utc(endTimeUTC) : null\n\n /**\n * @type {Number}\n */\n this.candidateId = candidateId\n\n /**\n * @type {String}\n */\n this.candidateFirstName = candidateFirstName\n\n /**\n * @type {String}\n */\n this.candidateLastName = candidateLastName\n\n /**\n * @type {String}\n */\n this.candidatePreferredName = candidatePreferredName\n\n /**\n * @type {String}\n */\n this.candidateFullName = candidateFullName\n\n /**\n * @type {Number}\n */\n this.breakMinutes = breakMinutes\n\n /**\n * @type {Boolean}\n */\n this.isApprovedByCandidate = isApprovedByCandidate\n\n /**\n * @type {Array}\n */\n this.breaks = isNonEmptyArray(breaks)\n ? breaks.map((breakTaken) => new ShiftRecordBreakDto(breakTaken))\n : []\n\n /**\n * @type {String}\n * @see {TimesheetMethod} for valid range of values\n */\n this.timesheetMethod = timesheetMethod\n\n /**\n * @type {Number}\n * @see {BookingStatus} for valid range of values\n */\n this.bookingStatus = bookingStatus\n\n /**\n * @type {CandidateTimesheetModificationsViewModel}\n */\n this.candidateBookingModifications = candidateBookingModifications\n }\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('a',{attrs:{\"href\":_vm.compHref,\"target\":_vm.compTarget}},[_c('v-img',_vm._g(_vm._b({staticClass:\"base-logo\",attrs:{\"src\":_vm.compSrc,\"title\":_vm.compAltText,\"alt\":_vm.compAltText,\"contain\":\"\"}},'v-img',Object.assign({}, _vm.commonAttributes, _vm.$attrs),false),_vm.$listeners))],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export const LogoType = Object.freeze({\n COMPANY: 'company', // Company logo\n APP: 'app', // App logo (Ready2Book)\n})\n","\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-logo.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-logo.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./_base-logo.vue?vue&type=template&id=201a930c&\"\nimport script from \"./_base-logo.vue?vue&type=script&lang=js&\"\nexport * from \"./_base-logo.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VImg } from 'vuetify/lib/components/VImg';\ninstallComponents(component, {VImg})\n","/**\n * Checks if an array contains any items.\n * @param {Array} arr The array to check.\n * @returns True, if the array contains items. Otherwise, false.\n * @obsolete Use isNullOrEmptyArray instead\n */\nexport const isNonEmptyArray = (arr) => !isNullOrEmptyArray(arr)\n\n/**\n * Checks whether an object is both an array and is empty.\n * @param arr {any}\n * @return {boolean} true if not an array or empty. Otherwise, false.\n */\nexport const isNullOrEmptyArray = (arr) =>\n !arr || !Array.isArray(arr) || arr.length === 0\n\n/**\n * Checks whether all elements within the given array are of a certain type e.g. typeof === 'string'\n * @param arr\n * @param type {string}\n * @return {boolean} true if all elements are of type. False if not array or not all elements are of same type\n */\nexport const isArrayOfType = (arr, type) => {\n return (\n arr &&\n Array.isArray(arr) &&\n arr.length &&\n // eslint-disable-next-line valid-typeof\n arr.every((i) => typeof i === type)\n )\n}\n","/**\n * @typedef {Object} ClientSelectorTreeViewDtoType\n * @property {number} id - Unique identifier\n * @property {string} name\n * @property {boolean} locked - Disables node and children\n * @property {string[]} locations\n */\n\n/**\n * @class\n */\nexport default class ClientSelectorTreeViewDto {\n /**\n * Create a new ClientSelectorTreeViewDto.\n * @param {...ClientSelectorTreeViewDtoType} params\n */\n constructor(params) {\n this.id = params.id\n this.name = params.name\n this.locked = params.locked\n this.locations = params.locations\n }\n}\n","export default Object.freeze({\n /**\n * Something happened in setting up the request that triggered an Error\n */\n unknown: 'unknown',\n /**\n * The request was made and the server responded with a status code\n * that falls out of the range of 2xx\n */\n server: 'server',\n /**\n * The request was made but no response was received\n */\n request: 'request',\n})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-item-group',{class:['v-btn-toggle', _vm.dense ? 'v-btn-toggle--dense' : '']},[_c('v-btn',_vm._g(_vm._b({},'v-btn',_vm.$attrs,false),_vm.$listeners),[_vm._t(\"default\")],2),_c('v-menu',{attrs:{\"offset-y\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('v-btn',_vm._g(_vm._b({},'v-btn',Object.assign({}, attrs, _vm.$attrs),false),on),[_c('v-icon',[_vm._v(\"mdi-chevron-down\")])],1)]}}])},[_vm._t(\"menu\",[_c('v-list',{attrs:{\"dense\":\"\"}},[_c('v-list-item',[_c('v-list-item-title',[_vm._v(\"Item 1\")])],1)],1)])],2)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-split-btn.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-split-btn.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./_base-split-btn.vue?vue&type=template&id=3dc910f6&\"\nimport script from \"./_base-split-btn.vue?vue&type=script&lang=js&\"\nexport * from \"./_base-split-btn.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VItemGroup } from 'vuetify/lib/components/VItemGroup';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\ninstallComponents(component, {VBtn,VIcon,VItemGroup,VList,VListItem,VListItemTitle,VMenu})\n","import Vue from 'vue'\nimport Toast, { POSITION } from 'vue-toastification'\nimport 'vue-toastification/dist/index.css'\n\n// Options: https://github.com/Maronato/vue-toastification/tree/main#plugin-registration-vueuse\nconst options = {\n position: POSITION.BOTTOM_CENTER,\n}\n\nVue.use(Toast, options)\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.href)?_c('a',_vm._g(_vm._b({attrs:{\"href\":_vm.href,\"target\":\"_blank\"}},'a',_vm.$attrs,false),_vm.$listeners),[_vm._t(\"default\"),(_vm.showExternalLinkIcon)?_c('v-icon',_vm._b({staticClass:\"ml-1\",attrs:{\"small\":\"\"}},'v-icon',_vm.$attrs,false),[_vm._v(\"mdi-open-in-new\")]):_vm._e()],2):_c('RouterLink',_vm._g(_vm._b({attrs:{\"to\":_vm.routerLinkTo}},'RouterLink',_vm.$attrs,false),_vm.$listeners),[_vm._t(\"default\")],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-link.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-link.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./_base-link.vue?vue&type=template&id=882bf89a&\"\nimport script from \"./_base-link.vue?vue&type=script&lang=js&\"\nexport * from \"./_base-link.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VIcon } from 'vuetify/lib/components/VIcon';\ninstallComponents(component, {VIcon})\n","import dayjs from 'dayjs'\nimport relativeTime from 'dayjs/plugin/relativeTime'\nimport localizedFormat from 'dayjs/plugin/localizedFormat'\nimport isoWeek from 'dayjs/plugin/isoWeek'\nimport advancedFormat from 'dayjs/plugin/advancedFormat'\nimport isBetween from 'dayjs/plugin/isBetween'\nimport duration from 'dayjs/plugin/duration'\nimport utc from 'dayjs/plugin/utc'\nimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore'\nimport objectSupport from 'dayjs/plugin/objectSupport'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\nimport isToday from 'dayjs/plugin/isToday'\nimport isYesterday from 'dayjs/plugin/isYesterday'\nimport timezone from 'dayjs/plugin/timezone'\n// TODO: Any new supported i18n locales should have their dayjs equivalent imported here\nimport 'dayjs/locale/en-au'\nimport 'dayjs/locale/en-nz'\nimport 'dayjs/locale/en-ca'\nimport 'dayjs/locale/en-gb'\nimport localeData from 'dayjs/plugin/localeData'\n\ndayjs.extend(customParseFormat)\ndayjs.extend(objectSupport)\ndayjs.extend(isSameOrBefore)\ndayjs.extend(utc)\ndayjs.extend(timezone)\ndayjs.extend(duration)\ndayjs.extend(isBetween)\ndayjs.extend(advancedFormat)\ndayjs.extend(relativeTime)\ndayjs.extend(localizedFormat)\ndayjs.extend(isoWeek)\ndayjs.extend(isToday)\ndayjs.extend(isYesterday)\ndayjs.extend(localeData)\n\nexport default dayjs\n","export { default } from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-0-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-0-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-0-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-0-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_timeout.vue?vue&type=style&index=0&lang=scss&module=true&\"; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-0-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-0-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-0-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-0-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_timeout.vue?vue&type=style&index=0&lang=scss&module=true&\"","/**\n * Truncates any string provided\n * @param {String} text String to be truncated\n * @param {Number} limit String length before truncating. Default: 0\n * @param {String} delimiter Defaults to '...'\n * @returns Truncated string\n */\nexport default (text, limit = 0, delimiter = '...') => {\n if (typeof text !== 'string')\n throw Error('Invalid data type for text (Expected String)')\n\n if (typeof limit !== 'number')\n throw Error('Invalid data type for limit (Expected Number)')\n\n if (typeof delimiter !== 'string')\n throw Error('Invalid data type for delimiter (Expected String)')\n\n if (limit === 0) return text\n\n if (text.length > limit) text = text.substring(0, limit) + delimiter\n\n return text\n}\n","/**\n * The error event is fired on a Window object when a resource failed to load or couldn't be used — for example if a script has an execution error.\n * @tutorial https://developer.mozilla.org/en-US/docs/Web/API/Window/error_event\n */\nexport default class WindowErrorDTO {\n constructor({ message, source, lineno, colno, error } = {}) {\n /**\n * @type {String} message A string containing a human-readable error message describing the problem. Same as `ErrorEvent.event`\n */\n this.message = message\n\n /**\n * @type {String} source A string containing the URL of the script that generated the error.\n */\n this.source = source\n\n /**\n * @type {Number} lineno An integer containing the line number of the script file on which the error occurred.\n */\n this.lineno = lineno\n\n /**\n * @type {Number} colno An integer containing the column number of the script file on which the error occurred.\n */\n this.colno = colno\n\n /**\n * @type {Error} error The error being thrown. Usually an `Error` object.\n */\n this.error = error\n }\n}\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_error.vue?vue&type=style&index=0&id=4161b4e7&lang=scss&scoped=true&\"","// Locales\nimport en from '@/locales/en.json'\nimport enUS from '@/locales/en-US.json'\nimport enCA from '@/locales/en-CA.json'\nimport enNZ from '@/locales/en-NZ.json'\nimport enGB from '@/locales/en-GB.json'\nimport enAU from '@/locales/en-AU.json'\n\n// https://kazupon.github.io/vue-i18n/api/#constructor-options\nconst vueI18nSettings = {\n // messages: The locale messages of localization.\n messages: {\n en,\n 'en-US': enUS,\n 'en-CA': enCA,\n 'en-NZ': enNZ,\n 'en-GB': enGB,\n 'en-AU': enAU,\n },\n numberFormats: {\n 'en-US': {\n currency: {\n style: 'currency',\n currency: 'USD',\n },\n },\n 'en-AU': {\n currency: {\n style: 'currency',\n currency: 'AUD',\n },\n },\n 'en-NZ': {\n currency: {\n style: 'currency',\n currency: 'NZD',\n },\n },\n 'en-GB': {\n currency: {\n style: 'currency',\n currency: 'GBP',\n },\n },\n 'en-CA': {\n currency: {\n style: 'currency',\n currency: 'CAD',\n },\n },\n },\n dateTimeFormats: {\n en: {\n time: {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true,\n },\n time24: {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n },\n dateShort: {\n day: 'numeric',\n month: 'short',\n },\n dateFormatted: {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n },\n },\n 'en-AU': {\n dateShort: {\n day: 'numeric',\n month: 'short',\n },\n dateFormatted: {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n },\n },\n 'en-NZ': {\n dateShort: {\n day: 'numeric',\n month: 'short',\n },\n dateFormatted: {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n },\n },\n 'en-GB': {\n dateShort: {\n day: 'numeric',\n month: 'short',\n },\n dateFormatted: {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n },\n },\n 'en-CA': {\n dateShort: {\n day: 'numeric',\n month: 'short',\n },\n dateFormatted: {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n },\n },\n 'en-US': {\n dateShort: {\n day: 'numeric',\n month: 'short',\n },\n dateFormatted: {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n },\n },\n },\n // silentTranslationWarn: Whether suppress warnings outputted when localization fails.\n silentTranslationWarn: true,\n // silentFallbackWarn: Whether suppress fallback warnings when localization fails.\n silentFallbackWarn: true,\n}\n\nexport default vueI18nSettings\n","import Vue from 'vue'\nimport VueI18n from 'vue-i18n'\nimport { getLanguageBasedOnBaseURL } from '@/helpers/language-helpers'\nimport vueI18nSettings from '@/locales/setup/index'\n\nVue.use(VueI18n)\n\n// https://kazupon.github.io/vue-i18n/api/#constructor-options\nexport default new VueI18n({\n // locale: The locale of localization. If the locale contains a territory and a dialect, this locale contains an implicit fallback.\n locale: getLanguageBasedOnBaseURL(),\n ...vueI18nSettings,\n})\n","export const PermissionScope = Object.freeze({\n ACCOUNTS: 'accounts',\n BOOKING: 'booking',\n TIMESHEETS: 'timesheets',\n REPLACE_ME: 'replaceMe',\n PENDING_BOOKING: 'pendingBooking',\n})\n","/**\n * List of units available from https://day.js.org/docs/en/display/difference\n */\nexport const DurationUnits = Object.freeze({\n DAY: 'd',\n WEEK: 'w',\n QUARTER: 'Q',\n MONTH: 'M',\n YEAR: 'y',\n HOUR: 'h',\n MINUTE: 'm',\n SECOND: 's',\n MILLISECOND: 'ms',\n})\n","export default class VueErrorDTO {\n constructor({ err, vm, info } = {}) {\n /**\n * @type {Object} complete error trace, contains the `message` and `error stack`\n */\n this.err = err\n\n /**\n * @type {Object} Vue component/instance in which error is occurred\n */\n this.vm = vm\n\n /**\n * @type {Object} info Vue specific error information such as lifecycle hooks, events etc.\n */\n this.info = info\n }\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.offlineConfirmed)?_c('Layout',[_c('h1',{class:_vm.$style.title},[_vm._v(\" The page timed out while loading. Are you sure you're still connected to the Internet? \")])]):_c('LoadingView')}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_timeout.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_timeout.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./_timeout.vue?vue&type=template&id=c7520ae8&\"\nimport script from \"./_timeout.vue?vue&type=script&lang=js&\"\nexport * from \"./_timeout.vue?vue&type=script&lang=js&\"\nimport style0 from \"./_timeout.vue?vue&type=style&index=0&lang=scss&module=true&\"\n\n\n\n\nfunction injectStyles (context) {\n \n this[\"$style\"] = (style0.locals || style0)\n\n}\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n injectStyles,\n null,\n null\n \n)\n\nexport default component.exports","export default class StoreErrorDTO {\n constructor({ err, module, errorResponse, logIpAddress = false } = {}) {\n /**\n * @type {Error} complete error trace, contains the `message` and `error stack`\n */\n this.err = err\n\n /**\n * @type {String} Name of module the error occurred in\n */\n this.module = module\n\n /**\n * @type {ErrorResponse} Object that determines which error page to display based on error returned from response\n */\n this.errorResponse = errorResponse\n\n /**\n * @type {Boolean} Indicates whether or not to log the user's IP address\n */\n this.logIpAddress = logIpAddress\n }\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',[(_vm.content && _vm.icon && !Array.isArray(_vm.content))?_c('span',{class:['status-badge', _vm.capitalize ? 'text-capitalize' : '']},[_c('v-tooltip',{attrs:{\"disabled\":!_vm.tooltip,\"bottom\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('span',_vm._g(_vm._b({},'span',attrs,false),on),[_c('v-icon',{class:_vm.content.color + '--text',attrs:{\"left\":\"\",\"small\":\"\"}},[_vm._v(\" \"+_vm._s(_vm.content.icon)+\" \")]),_vm._v(\" \"+_vm._s(_vm.mobile ? '' : _vm.content.title)+\" \")],1)]}}],null,false,2294613669)},[_c('span',[_vm._v(_vm._s(_vm.tooltip))])])],1):(_vm.content && !Array.isArray(_vm.content))?_c('v-chip',{staticClass:\"status-badge\",attrs:{\"x-small\":\"\",\"outlined\":_vm.outlined,\"label\":_vm.label,\"color\":_vm.content.color,\"dark\":\"\"}},[_vm._v(\" \"+_vm._s(_vm.content.title)+\" \")]):(_vm.content && Array.isArray(_vm.content))?_c('div',[_vm._l((_vm.content),function(badge,index){return [_c('v-chip',{key:index,attrs:{\"x-small\":\"\",\"light\":\"\",\"outlined\":_vm.outlined}},[_vm._v(\" \"+_vm._s(badge.title)+\" \")])]})],2):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export const Severity = Object.freeze({\n /**\n * Services are working as expected\n */\n HEALTHY: 'Healthy',\n /**\n * Services may be runing slow but are otherwise functional\n */\n DEGRADED: 'Degraded',\n /**\n * Services may not be functional at all or at a severly reduced rate\n */\n UNHEALTHY: 'Unhealthy',\n /**\n * A notification that could be used to notify of upcoming maintenance or service degredation\n */\n ADVISORY: 'Advisory',\n})\n","import { Severity } from '@/shared/constants/serviceStatus/Severity'\n\n/**\n * getStatusLabelHashMap: Returns a hash map of all the available status labels\n * @returns\n */\nconst getStatusLabelHashMap = function() {\n const map = new Map()\n\n map.set(Severity.HEALTHY, {\n title: Severity.HEALTHY,\n color: 'success',\n icon: 'mdi-check-circle-outline',\n })\n map.set(Severity.DEGRADED, {\n title: Severity.DEGRADED,\n color: 'warning',\n icon: 'mdi-alert-circle-outline',\n })\n map.set(Severity.UNHEALTHY, {\n title: Severity.UNHEALTHY,\n color: 'error',\n icon: 'mdi-alert-circle-outline',\n })\n map.set(Severity.ADVISORY, {\n title: Severity.ADVISORY,\n color: 'info',\n icon: 'mdi-information-outline',\n })\n\n return map\n}\n\nexport { getStatusLabelHashMap }\n","\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-status-label.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-status-label.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./_base-status-label.vue?vue&type=template&id=8b90f0e2&\"\nimport script from \"./_base-status-label.vue?vue&type=script&lang=js&\"\nexport * from \"./_base-status-label.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VChip } from 'vuetify/lib/components/VChip';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VTooltip } from 'vuetify/lib/components/VTooltip';\ninstallComponents(component, {VChip,VIcon,VTooltip})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{class:[_vm.isMobileViewPort ? 'mb-4' : 'mb-8', 'd-flex align-center mt-3']},[_vm._t(\"leftAction\"),_c('header',[(_vm.subtitleOnTop)?_c('h4',{class:[!_vm.isMobileViewPort ? _vm.subtitleClass : 'body-2'],attrs:{\"id\":\"page-subtitle\"}},[_vm._v(\" \"+_vm._s(_vm.subtitle)+\" \")]):_vm._e(),_vm._t(\"title\",[_c('h2',{class:[\n !_vm.isMobileViewPort\n ? 'text-h5 d-inline-block font-weight-medium'\n : 'text-h6 font-weight-medium',\n _vm.subtitleOnTop ? 'mt-0 mb-8' : 'mb-0' ],attrs:{\"id\":\"page-title\"}},[_vm._v(\" \"+_vm._s(_vm.title)+\" \")]),_vm._t(\"appendTitle\")]),_vm._t(\"bottomSubtitle\",[(!_vm.subtitleOnTop)?_c('h4',{class:[!_vm.isMobileViewPort ? _vm.subtitleClass : 'body-2'],attrs:{\"id\":\"page-subtitle\"}},[_vm._v(\" \"+_vm._s(_vm.subtitle)+\" \")]):_vm._e()])],2)],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-page-title.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./_base-page-title.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./_base-page-title.vue?vue&type=template&id=25fdeeb4&\"\nimport script from \"./_base-page-title.vue?vue&type=script&lang=js&\"\nexport * from \"./_base-page-title.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports"],"sourceRoot":""}