{"version":3,"sources":["components/LoadingIndicator/style.module.scss","components/GuideLines/style.module.scss","components/Label/style.module.scss","components/TablePaginationDefault/style.module.scss","components/Forms/Select/style.module.scss","components/Forms/Checkbox/style.module.scss","stores/SessionStore.ts","stores/BaseRequestStore.ts","stores/NavigationStore.ts","helpers/BaseRequest.ts","helpers/Request.ts","stores/BaseStore.ts","helpers/RandomString.ts","helpers/ErrorMessage.ts","helpers/AdfsHelper.ts","stores/AuthStore.ts","types/UserRoleEnum.ts","components/MainNavigation/NavigationItem/index.tsx","components/MainNavigation/index.tsx","components/LoadingIndicator/index.tsx","components/ProfileAvatar/index.tsx","helpers/DateHelper.ts","stores/LastImportTimeStore.ts","types/DeclarationDocumentFlowStatusEnum.ts","components/LastImportTime/index.tsx","components/RefreshLoggedInUser/index.tsx","stores/DeclarationExpireSoonCountStore.ts","components/DeclarationSubMenu/index.tsx","components/GuideLines/index.tsx","components/Layout/index.tsx","components/ScrollToTopOnPageChange/index.tsx","components/ShowOnPrint/index.tsx","components/Forms/Form/index.tsx","components/Forms/Error/index.tsx","components/Label/index.tsx","components/Forms/Input/index.tsx","components/Forms/SubmitButton/index.tsx","components/PageLogin/index.tsx","components/Button/index.tsx","components/PageForgotPassword/index.tsx","components/TablePaginationDefault/index.tsx","helpers/Pagination.ts","helpers/UserRoleHelper.ts","stores/BasePaginationStore.ts","stores/UsersPaginationStore.ts","components/TablePaginationUsers/index.tsx","components/Forms/Select/index.tsx","components/Forms/SelectUserRole/index.tsx","components/Forms/SelectUserStatus/index.tsx","components/PageUsers/Filter/index.tsx","components/PageUsers/index.tsx","components/BackButton/index.tsx","components/LineWithBreak/index.tsx","helpers/NumberHelper.ts","stores/DeclarationLinesPaginationStore.ts","types/DeclarationFileEnum.ts","components/TablePaginationDeclarationLines/index.tsx","stores/DeclarationDetailsStore.ts","stores/DownloadToken.ts","components/PageDeclarationDetails/index.tsx","components/PageLoginAdmin/index.tsx","stores/SelectCustomerNoStore.ts","components/Forms/SelectCustomerNo/index.tsx","components/Modal/index.tsx","components/Modal/ModalConfirm/index.tsx","helpers/HasRole.ts","helpers/FormHelper.ts","stores/UserStore.ts","components/UserCustomerRoleForm/index.tsx","components/UserDeclarationForm/index.tsx","components/Forms/Checkbox/index.tsx","components/UserForm/index.tsx","components/PageUserEdit/index.tsx","components/UserCheckEmailForm/index.tsx","components/PageUserCreate/index.tsx","components/UserProfileForm/index.tsx","stores/UserProfileStore.ts","components/PageUserProfile/index.tsx","components/PageResetPassword/index.tsx","components/LayoutBox/index.tsx","components/PageNotFound/index.tsx","helpers/FlowStatusHelper.ts","components/TablePaginationDeclarations/index.tsx","stores/DeclarationsSearchPaginationStore.ts","components/PageDeclarations/Export/index.tsx","components/Forms/DatePicker/index.tsx","components/Forms/SelectDeclarationFlowStatus/index.tsx","helpers/PaginationStoreFilter.ts","components/PageDeclarations/Filter/index.tsx","components/PageDeclarations/PageSearch/index.tsx","stores/DeclarationsExpireSoonPaginationStore.ts","components/PageDeclarations/PageExpireSoon/index.tsx","components/Routes/index.tsx","index.tsx","components/Layout/style.module.scss","components/ProfileAvatar/style.module.scss","components/DeclarationSubMenu/style.module.scss","components/MainNavigation/NavigationItem/style.module.scss","components/Modal/style.module.scss"],"names":["module","exports","SessionStore","sessionName","sessionProperties","this","constructor","name","autorun","v","data","JSON","parse","key","indexOf","sessionStorage","setItem","stringify","obj","value","sessionStore","properties","getItem","storeData","hasOwnProperty","setProperty","setSession","baseRequestStore","bearerToken","expires","renewToken","requestCount","makeObservable","observable","addRequest","action","removeRequest","resetStore","requestInProgress","computed","initSessionStorage","navigationStore","history","createBrowserHistory","location","lastFewLocations","redirect","url","push","goBack","prevLocation","length","pathname","listen","nextLocation","shift","request","axios","create","baseURL","process","headers","handleRenewToken","config","a","moment","isValid","isSameOrBefore","authStore","routes","pageLogin","setAuthorizationHeader","interceptors","use","keepBearerTokenUpdated","axiosRequest","response","error","Promise","reject","status","StatusCodes","UNAUTHORIZED","configure","enforceActions","BaseStore","get","endpoint","classProperty","force","resolve","res","paginate","pageNumber","orderBy","filters","append","pageSize","hasQueryParameters","firstSeperator","endpointUrl","order","orderByDesc","map","filter","Array","newResults","concat","results","hasNextPage","currentPage","pageCount","post","target","useResponseObject","valObj","id","put","index","_","findIndex","splice","delete","remove","t","randomString","characters","result","charactersLength","i","charAt","Math","floor","random","errorMessage","fallback","statusCodesMessages","isString","errorToast","statusCodeMessage","find","statusCode","toast","message","type","errorToastWithStatusCodeMessages","FORBIDDEN","sha256","plain","TextEncoder","encode","window","crypto","subtle","digest","base64urlencode","str","bytes","Uint8Array","len","byteLength","String","fromCharCode","btoa","replace","dec2hex","dec","toString","substr","generateChallengeByVerifier","verifier","hashed","base64encoded","generateVerifier","array","Uint32Array","getRandomValues","from","join","UserRoleEnum","user","lastRefreshed","removeItem","setAdfsState","adfsState","getAdfsState","setAdfsCodeVerifier","adfsCodeVerifier","getAdfsCodeVerifier","setTokenData","setLoggedInUser","Date","authenticate","emailOrUsername","password","authenticateAdfs","code","codeVerifier","OK","generateAdfsUrl","codeChallenge","encodeURIComponent","requestResetPassword","resetPassword","token","newPassword","forceSetPassword","currentPassword","logout","NavigationItem","props","isActive","exact","to","linkTo","className","subItem","css","navigationLinkSub","navigationLink","activeClassName","navigationLinkActive","label","MainNavigation","observer","useLocation","pageDeclarations","highestRole","User","pageUsers","LoadingIndicator","useState","show","setShow","useEffect","disposer","reaction","delay","style","overlay","src","alt","spinner","ProfileAvatar","document","addEventListener","e","getElementById","contains","wrapper","pageUserProfile","wrapperActive","onClick","content","firstname","toUpperCase","lastname","menuActive","menuHidden","menuItem","menuItemActive","dateFormat","dateValue","format","dateTimeFormat","dateTimeValue","DeclarationDocumentFlowStatusEnum","lastImportTimeStore","lastImportTimeObject","updated","getLastImportTime","LastImportTime","FETCH_INTERVAL_IN_MINUTES","setInterval","lastImportTime","toISOString","RefreshLoggedInUser","subtract","isAfter","declarationExpireSoonCountStore","declarations","count","getDeclarations","Active","DeclarationSubMenu","showBadge","rowCount","subBar","subBarContent","subNavigation","pageDeclarationsExpiresSoon","badge","GuideLines","guideLinkWrapper","href","rel","Layout","top","mainBar","mainBarContent","logo","mainNavigation","profile","middle","children","position","ScrollToTopOnPageChange","scrollTo","ShowOnPrint","compact","Form","formOptions","validation","resolver","yupResolver","yup","shape","methods","useForm","methodsRef","useRef","handleSubmit","current","reset","defaultValues","onSubmit","onValidationError","Error","formState","useFormContext","errorMsg","errors","Label","dataTip","toolTipImagePath","toolTipText","htmlFor","html","backgroundColor","border","borderColor","textColor","tooltip","Input","register","setValue","readOnly","undefined","readOnlyValue","labelToolTipText","labelToolTipImagePath","defaultChecked","defaultValue","disabled","placeholder","onKeyUp","event","onChange","SubmitButton","ctx","isSubmitting","btnClassName","PageLogin","setError","handleLogin","formData","root","string","required","pageForgotPassword","Button","classNames","clickAction","text","PageForgotPassword","orderColumn","columnName","onOrderBy","active","direction","TablePaginationDefault","paginationStore","resizable","rowSelection","onRowClicked","onRowSelection","onPageChange","setCurrentPage","setOrderBy","getItems","paginatedResponse","items","pagination","lastRowOnPage","TableContainer","Table","TableHead","TableRow","TableCell","width","header","align","TableSortLabel","title","appendToHeaderCell","TableBody","row","item","rowCheckbox","checked","selectedItems","selectItem","addSelectedItem","removeSelectedItem","toggleSelectItem","formatter","accessor","emptyPlaceholderText","colSpan","TableFooter","IconButton","NavigateBefore","NavigateNext","getUserRoleText","userRoleValue","SuperUser","GlobalAdmin","BasePaginationStore","defaultEndpoint","defaultPageSize","setFilters","selectedItem","setPageSize","setAppend","isEqual","setEndpoint","generateEndpoint","params","generatePath","usersPaginationStore","TablePaginationUsers","username","roles","role","Chip","pageUserEdit","Select","options","showAsEmpty","classNameData","select","optionIndex","nativeEvent","selectedIndex","opt","SelectUserRole","includeAdmin","SelectUserStatus","UsersFilter","search","state","PageUsers","pageUserCreate","BackButton","LineWithBreak","twoDecimals","num","locale","returnNum","toFixed","Number","toLocaleString","maximumFractionDigits","minimumFractionDigits","DeclarationFileEnum","declarationsLinesPaginationStore","TablePaginationDeclarationLines","declarationId","declarationDetailsStore","declaration","getDeclarationDetails","downloadTokenStore","getToken","PageDeclarationDetails","useParams","NOT_FOUND","pageNotFound","fetch","printDrivingNote","open","DRIVING_NOTE","printWeighings","WEIGHINGS","no","billToName","shipToAddress","shipToPostCode","shipToCity","shipToContact","expirationDate","declaredQuantity","weighedInQuantity","PageLoginAdmin","queryParsed","queryString","pageAdminLogin","isEmpty","loginRedirect","selectCustomerNoStoreByUser","getUser","SelectCustomerNoByUser","userId","fetchUser","forEach","customer","customerNo","Modal","modalShow","modalHide","modalMain","ModalConfirm","split","denyCallback","denyBtnText","confirmCallback","confirmBtnText","hasRole","requiredRoles","includes","isBlankValue","userStore","getUserDetails","checkUserExistence","email","updateUserDetails","specificProperties","prop","removeBlankValues","storeUserDetails","addUserCustomerRole","removeUserCustomerRole","userCustomerRoleId","addUserDeclaration","declarationNo","removeUserDeclaration","deleteUser","UserCustomerRoleForm","showConfirmModal","setShowConfirmModal","setFormData","success","confirmAddCustomerRole","number","userCustomerRole","SelectCustomerNo","UserDeclarationForm","variant","onDelete","Checkbox","checkbox","UserForm","showConfirmDeleteModal","setShowConfirmDeleteModal","userCanBeCreatedOrEdited","notEditable","globalAdmin","PageUserEdit","firstName","lastName","company","updateUser","test","confirmPassword","oneOf","ref","boolean","notifyUserWithEmail","UserCheckEmailForm","PageUserCreate","CreateUserStatusEnum","CheckEmail","createUserState","setCreateUserState","storeUserValidation","when","is","then","min","storeUser","newUser","checkUserEmail","existingUser","AssignPermission","CreateAsNew","UserProfileForm","isGlobalAdmin","pageChangePassword","userProfileStore","userProfile","getUserProfile","updateUserProfile","PageUserProfile","controlPassword","PageResetPassword","setPassword","forceNewPasswordForm","pageForceNewPasssword","notOneOf","LayoutBox","PageNotFound","getFlowStatusText","flowStatus","Request","NotUsed","Exceeded","Completed","getFlowStatusValue","flowStatusText","toLowerCase","TablePaginationDeclarations","statusColor","charge","pageDeclarationDetails","declarationsSearchPaginationStore","DeclarationsExport","ExportType","canExport","exportSelected","form","firstChild","removeChild","input","createElement","appendChild","submit","PDF","XLS","method","InputDatePicker","control","render","field","selected","placeholderText","autoComplete","date","SelectDeclarationFlowStatus","getFilterValue","joinArrayValues","filterArray","DeclarationsFilter","declarationNumbers","replaceAll","declarationNumbersFilterValue","fromFilterValue","toFilterValue","statusFilterValue","toDate","getDefaultValuesFromFilters","nullable","default","add","PageSearchDeclarations","declarationsExpireSoonPaginationStore","PageExpireSoonDeclarations","pageResetPassword","pageNewLogin","isLoggedIn","isLoggedInForPasswordChange","RouterRoutes","path","accessRule","component","layout","getPrivateRoutes","route","getPrivateRoutesPaths","flat","getPublicRoutes","getPublicRoutesPaths","Routes","privateRoutes","privateRoutePaths","publicRoutes","publicRoutePaths","ReactDOM","StrictMode"],"mappings":"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","file":"static/js/main.393219d7.chunk.js","sourcesContent":["// extracted by mini-css-extract-plugin\nmodule.exports = {\"overlay\":\"style_overlay__hwPj2\",\"spinner\":\"style_spinner__2qW_5\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"guideLinkWrapper\":\"style_guideLinkWrapper__13kCQ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"tooltip\":\"style_tooltip__1W2mn\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"rowCheckbox\":\"style_rowCheckbox__2FcLN\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"select\":\"style_select__h5TV8\",\"select--multiple\":\"style_select--multiple__2Tj6-\",\"focus\":\"style_focus__MvnBn\",\"select--disabled\":\"style_select--disabled__12GRg\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"checkbox\":\"style_checkbox__2xf5c\"};","import { autorun } from 'mobx';\n\nexport default abstract class SessionStore {\n private sessionName: string;\n sessionProperties: string[] = [];\n\n constructor(sessionName?: string) {\n this.sessionName = sessionName || this.constructor.name + 'Session';\n }\n\n private setSession() {\n // use autorun to monitor for property changes and update session storage accordingly\n autorun((v) => {\n let data = JSON.parse('{}');\n for (let key in this) {\n if (this.sessionProperties.indexOf(key) !== -1) {\n data[key] = this[key];\n }\n }\n sessionStorage.setItem(this.sessionName, JSON.stringify(data));\n })\n }\n\n private setProperty(obj: T, key: K, value: any) {\n // set 'any' property/key (K) value of a generic object type (T)\n obj[key] = value;\n }\n\n initSessionStorage(sessionStore: T, properties: Array) {\n this.sessionProperties = properties;\n\n // fetch data from session and set in store\n if (sessionStorage.getItem(this.sessionName)) {\n let storeData = sessionStorage.getItem(this.sessionName) as string;\n let data: T = JSON.parse(storeData);\n for (let key in data) {\n if (this.hasOwnProperty(key)) {\n this.setProperty(sessionStore, key, data[key]);\n }\n }\n }\n\n // monitor and set data (sessionProperties) from store into session\n this.setSession();\n }\n}\n","import { observable, action, makeObservable, computed } from 'mobx';\nimport SessionStore from './SessionStore';\n\nexport class BaseRequestStore extends SessionStore {\n\n // auth properties\n bearerToken: string | null = null;\n expires: string | null = null;\n renewToken: string | null = null;\n\n // counter\n requestCount: number = 0;\n\n constructor() {\n super('BaseRequestStore');\n makeObservable(this, {\n bearerToken: observable,\n expires: observable,\n renewToken: observable,\n requestCount: observable,\n\n addRequest: action,\n removeRequest: action,\n resetStore: action,\n\n requestInProgress: computed\n })\n\n // important to init session storage\n this.initSessionStorage(this, ['bearerToken', 'expires', 'renewToken']);\n }\n\n addRequest() {\n this.requestCount++;\n }\n\n removeRequest() {\n this.requestCount = this.requestCount < 0 ? 0 : this.requestCount - 1;\n }\n\n get requestInProgress() {\n return this.requestCount > 0;\n }\n\n resetStore() {\n this.bearerToken = null;\n this.expires = null;\n this.renewToken = null;\n this.requestCount = 0;\n }\n}\n\nexport const baseRequestStore = new BaseRequestStore();","import { createBrowserHistory } from 'history';\nimport { action, makeObservable, observable } from 'mobx';\n\nexport class NavigationStore {\n\n history = createBrowserHistory();\n location: string = '';\n lastFewLocations: any[] = [];\n\n constructor() {\n this.location = this.history.location.pathname;\n\n this.history.listen(nextLocation => {\n this.lastFewLocations.push(nextLocation);\n if (this.lastFewLocations.length >= 5) {\n this.lastFewLocations.shift();\n }\n });\n\n makeObservable(this,\n {\n location: observable,\n lastFewLocations: observable,\n\n redirect: action,\n goBack: action,\n }\n );\n }\n\n redirect = (url: string) => {\n this.history.push(url);\n }\n\n goBack = () => {\n this.history.goBack();\n }\n\n prevLocation = () => {\n return this.lastFewLocations.length > 1 ? this.lastFewLocations[this.lastFewLocations.length - 2] : null;\n }\n}\n\nexport const navigationStore = new NavigationStore();","import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { routes } from \"components/Routes\";\nimport moment from \"moment\";\nimport { authStore } from \"stores/AuthStore\";\nimport { baseRequestStore } from \"stores/BaseRequestStore\";\nimport { navigationStore } from \"stores/NavigationStore\";\n\nconst request = axios.create({\n baseURL: process.env.REACT_APP_API_BASE_URL,\n headers: {\n 'client-key': process.env.REACT_APP_CLIENT_KEY,\n // 'cache-control': 'no-cache'\n }\n});\n\nkeepBearerTokenUpdated();\n\n// set bearer token\nfunction keepBearerTokenUpdated() {\n request.interceptors.request.use(async (config) => {\n\n // check if we need to renew token\n handleRenewToken(config);\n\n if (baseRequestStore.bearerToken) {\n setAuthorizationHeader(config, baseRequestStore.bearerToken);\n }\n return config;\n })\n\n function setAuthorizationHeader(config: AxiosRequestConfig, bearerToken: string) {\n config.headers['Authorization'] = 'bearer ' + bearerToken;\n }\n}\n\nasync function handleRenewToken(config: AxiosRequestConfig) {\n if (\n (\n // when current token is expired or expire date is invalid\n !moment(baseRequestStore.expires).isValid() ||\n moment(baseRequestStore.expires).isSameOrBefore(moment())\n )\n && config.url !== 'auth/renew-token'\n && baseRequestStore.renewToken\n ) {\n try {\n await authStore.renewToken(baseRequestStore.renewToken);\n } catch (err) {\n navigationStore.redirect(routes.pageLogin);\n }\n }\n}\n\n// handle request\nrequest.interceptors.request.use(axiosRequest => {\n // add to request count\n baseRequestStore.addRequest();\n return axiosRequest;\n})\n\n// handle response\nrequest.interceptors.response.use(\n successResponseHandler,\n errorResponseHandler\n)\n\n// handle success responses\nfunction successResponseHandler(response: AxiosResponse) {\n baseRequestStore.removeRequest();\n return response;\n}\n\n// handle error responses\nfunction errorResponseHandler(error: AxiosError): any {\n baseRequestStore.removeRequest();\n return Promise.reject(error);\n}\n\nexport default request;","import { AxiosError, AxiosResponse } from \"axios\";\nimport { StatusCodes } from \"http-status-codes\";\nimport baseRequest from \"./BaseRequest\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { routes } from \"components/Routes\";\n\nconst request = baseRequest;\n\nrequest.interceptors.response.use(\n successResponseHandler,\n errorResponseHandler\n)\n\nfunction successResponseHandler(response: AxiosResponse) {\n return response;\n}\n\nfunction errorResponseHandler(error: AxiosError): any {\n if (error.response?.status) {\n switch (error.response.status) {\n case StatusCodes.UNAUTHORIZED:\n navigationStore.redirect(routes.pageLogin);\n break;\n }\n }\n return Promise.reject(error);\n}\n\nexport default request;\n","\nimport request from 'helpers/Request';\nimport _ from 'lodash';\nimport { action, makeObservable } from 'mobx';\nimport FilterInterface from 'types/FilterInterface';\nimport OrderByInterface from 'types/OrderByInterface';\nimport SessionStore from './SessionStore';\nimport { configure } from \"mobx\";\n\nconfigure({\n enforceActions: \"never\",\n})\n\nexport class BaseStore extends SessionStore {\n\n [key: string]: any;\n sessionProperties = []\n\n constructor() {\n super('BaseStore');\n makeObservable(this, {\n get: action\n });\n }\n\n get = (endpoint: string, classProperty: string, force: boolean = true): any => {\n return new Promise(async (resolve, reject) => {\n try {\n if (force || (!force && (!this[classProperty] || this[classProperty].length === 0))) {\n let res = await request.get(endpoint);\n this[classProperty] = res.data;\n }\n resolve(this[classProperty]);\n }\n catch (error) {\n reject(error);\n }\n });\n }\n\n paginate = (\n endpoint: string,\n pageNumber: number,\n classProperty: string,\n orderBy: OrderByInterface | null = null,\n filters: FilterInterface[] = [],\n append: boolean = false,\n pageSize: number = 15\n ): any => {\n return new Promise(async (resolve, reject) => {\n try {\n // set pagination query first seperator\n const hasQueryParameters = endpoint.indexOf('?') !== -1;\n const firstSeperator = hasQueryParameters ? '&' : '?';\n\n // append pagination to endpoint\n let endpointUrl = `${endpoint}${firstSeperator}pageNumber=${pageNumber}&pageSize=${pageSize}`;\n\n // append order/sort to endpoint\n if (orderBy && orderBy.order && orderBy.orderBy) {\n const orderByDesc = orderBy.order === 'desc';\n endpointUrl += `&orderBy=${orderBy.orderBy}&orderDesc=${orderByDesc}`;\n }\n\n // append filters to endpoint\n if (filters.length > 0) {\n filters.map((filter: FilterInterface) => {\n return endpointUrl += `&${filter.name}=${filter.value}`;\n })\n }\n\n // call endpoint\n let res = await request.get(endpointUrl);\n\n // append data to existing property (\"load more\" / \"infinite scroll\") or replace\n if (append && this[classProperty] && this[classProperty]['results'] instanceof Array) {\n const newResults = this[classProperty]['results'].concat(res.data.results);\n res.data.results = newResults;\n }\n\n // mark if there is a \"next page\"\n res.data.hasNextPage = res.data.currentPage < res.data.pageCount;\n this[classProperty] = res.data;\n resolve(this[classProperty]);\n }\n catch (error) {\n reject(error);\n }\n });\n }\n\n post = (endpoint: string, obj: any, target: any, useResponseObject?: boolean) => {\n return new Promise(async (resolve, reject) => {\n try {\n const res = await request.post(endpoint, obj);\n const valObj = useResponseObject ? res.data : obj;\n\n if (!useResponseObject) {\n valObj.id = res.data.id;\n }\n\n if (target instanceof Array) {\n target.push(valObj);\n } else {\n target = valObj;\n }\n\n resolve(valObj);\n }\n catch (error) {\n reject(error);\n }\n })\n }\n\n put = (endpoint: string, obj: any, target: any, useResponseObject?: boolean) => {\n return new Promise(async (resolve, reject) => {\n try {\n const res = await request.put(endpoint, obj);\n const valObj = useResponseObject ? res.data : obj;\n if (target instanceof Array) {\n const index = _.findIndex(target, { id: valObj.id });\n target.splice(index, 1, valObj);\n }\n else {\n target = valObj;\n }\n\n resolve(valObj);\n }\n catch (error) {\n reject(error);\n }\n })\n }\n\n delete = (endpoint: string, id: string, target: any) => {\n return new Promise(async (resolve, reject) => {\n try {\n await request.delete(endpoint);\n if (target instanceof Array) {\n _.remove(target, (t: any) => t.id === id);\n }\n else {\n target = null;\n }\n\n resolve(true);\n }\n catch (error) {\n reject(error);\n }\n });\n }\n}\n","export function randomString(length: number = 10, characters: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') {\n let result = '';\n let charactersLength = characters.length;\n for (var i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n}","import { StatusCodes } from \"http-status-codes\";\nimport { isString } from \"lodash\";\nimport { toast } from \"react-toastify\";\nimport { StatusCodeMessageInterface } from \"types/StatusCodeMessageInterface\";\n\nexport function errorMessage(error: any, fallback: string, statusCodesMessages?: StatusCodeMessageInterface[]) {\n if (isString(error)) {\n return error;\n }\n\n if (error.response?.data?.error && isString(error.response.data.error)) {\n return error.response.data.error;\n }\n\n if (error.response?.error && isString(error.response?.error)) {\n return error.response?.error;\n }\n\n return fallback;\n}\n\nexport function errorToastWithStatusCodeMessages(error: any, fallback: string, statusCodesMessages?: StatusCodeMessageInterface[],) {\n if (error.response?.status && statusCodesMessages && statusCodesMessages.length > 0) {\n const statusCodeMessage = statusCodesMessages.find(statusCode => statusCode.statusCode === error.response.status);\n if (statusCodeMessage) {\n toast(statusCodeMessage.message, { type: 'error' });\n return;\n }\n }\n\n toast(errorMessage(error, fallback), { type: 'error' });\n}\n\nexport function errorToast(error: any, fallback: string) {\n const statusCodeMessages = [\n {\n statusCode: StatusCodes.FORBIDDEN,\n message: 'Du har ikke de nødvendige rettigheder til denne handling'\n }\n ]\n\n errorToastWithStatusCodeMessages(error, fallback, statusCodeMessages);\n}","//@see https://docs.cotter.app/sdk-reference/api-for-other-mobile-apps/api-for-mobile-apps#step-1-create-a-code-verifier\n\nfunction sha256(plain: string) {\n const encoder = new TextEncoder();\n const data = encoder.encode(plain);\n return window.crypto.subtle.digest('SHA-256', data);\n}\n\nfunction base64urlencode(a: any) {\n var str = \"\";\n var bytes = new Uint8Array(a);\n var len = bytes.byteLength;\n for (var i = 0; i < len; i++) {\n str += String.fromCharCode(bytes[i]);\n }\n return btoa(str)\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/, \"\");\n}\n\nfunction dec2hex(dec: any) {\n return ('0' + dec.toString(16)).substr(-2)\n}\n\nexport async function generateChallengeByVerifier(verifier: string) {\n const hashed = await sha256(verifier);\n const base64encoded = base64urlencode(hashed);\n return base64encoded;\n}\n\nexport function generateVerifier() {\n var array = new Uint32Array(56 / 2);\n window.crypto.getRandomValues(array);\n return Array.from(array, dec2hex).join('');\n}","import { BaseStore } from \"./BaseStore\";\nimport { navigationStore } from \"./NavigationStore\";\nimport { routes } from \"components/Routes\";\nimport request from \"helpers/Request\";\nimport { action, makeObservable, observable } from \"mobx\";\nimport { BearerTokenResponseInterface } from \"types/BearerTokenResponseInterface\";\nimport { baseRequestStore } from \"./BaseRequestStore\";\nimport { StatusCodes } from \"http-status-codes\";\nimport { randomString } from \"helpers/RandomString\";\nimport { UserInterface } from \"types/UserInterface\";\nimport { errorMessage } from \"helpers/ErrorMessage\";\nimport { generateChallengeByVerifier, generateVerifier } from \"helpers/AdfsHelper\";\n\nexport class AuthStore extends BaseStore {\n\n user: UserInterface | null = null;\n lastRefreshed: Date | null = null;\n\n constructor() {\n super();\n\n makeObservable(this, {\n user: observable,\n lastRefreshed: observable,\n\n resetStore: action,\n authenticate: action,\n authenticateAdfs: action,\n logout: action,\n setTokenData: action,\n })\n\n this.initSessionStorage(this, ['user', 'lastRefreshed']);\n }\n\n resetStore = () => {\n this.user = null;\n this.lastRefreshed = null;\n sessionStorage.removeItem('adfsState');\n sessionStorage.removeItem('adfsCodeVerifier');\n\n baseRequestStore.resetStore();\n }\n\n setAdfsState = (adfsState: string) => {\n sessionStorage.setItem('adfsState', adfsState);\n }\n\n getAdfsState = () => {\n return sessionStorage.getItem('adfsState');\n }\n\n setAdfsCodeVerifier = (adfsCodeVerifier: string) => {\n sessionStorage.setItem('adfsCodeVerifier', adfsCodeVerifier);\n }\n\n getAdfsCodeVerifier = () => {\n return sessionStorage.getItem('adfsCodeVerifier');\n }\n\n private setTokenData = (data: BearerTokenResponseInterface) => {\n // set data in requestStore\n baseRequestStore.bearerToken = data.bearerToken;\n baseRequestStore.expires = data.expires;\n baseRequestStore.renewToken = data.renewToken;\n }\n\n setLoggedInUser = async () => {\n await this.get(`users/me`, 'user');\n this.lastRefreshed = new Date();\n }\n\n authenticate = async (emailOrUsername: string, password: string) => {\n return new Promise(async (resolve, reject) => {\n try {\n // send request\n const res = await request.post('auth/token', {\n emailOrUsername: emailOrUsername,\n password: password,\n });\n\n if (!res.data) {\n reject('Ugyldig brugernavn eller adgangskode');\n return;\n }\n\n this.setTokenData(res.data as BearerTokenResponseInterface);\n resolve(true);\n\n } catch (err) {\n reject(errorMessage(err, 'Der skete en fejl ved log ind'));\n }\n })\n }\n\n authenticateAdfs = async (code: string) => {\n return new Promise(async (resolve, reject) => {\n try {\n const codeVerifier = this.getAdfsCodeVerifier();\n // send request\n const res = await request.post('auth/token/adfs', {\n code: code,\n codeVerifier: codeVerifier\n });\n\n // no matter if the request is successful or not - we'll reset the adfs properties\n sessionStorage.removeItem('adfsState');\n sessionStorage.removeItem('adfsCodeVerifier');\n\n if (!res.data || res.status !== StatusCodes.OK) {\n reject('Ugyldig ADFS log ind');\n return;\n }\n\n this.setTokenData(res.data as BearerTokenResponseInterface);\n resolve(true);\n\n } catch (err) {\n reject(errorMessage(err, 'Der skete en fejl ved ADFS log ind'));\n }\n })\n }\n\n generateAdfsUrl = async () => {\n const verifier = generateVerifier()\n\n this.setAdfsCodeVerifier(verifier);\n this.setAdfsState(randomString(12));\n\n const adfsCodeVerifier = this.getAdfsCodeVerifier();\n\n if (adfsCodeVerifier) {\n const codeChallenge = await generateChallengeByVerifier(adfsCodeVerifier);\n return `https://login.microsoftonline.com/${process.env.REACT_APP_AD_TENTANT_ID}/oauth2/authorize?client_id=${process.env.REACT_APP_AD_CLIENT_ID}&response_type=code&scope=https%3A%2F%2Fgraph.microsoft.com%2Femail%20https%3A%2F%2Fgraph.microsoft.com%2Fprofile%20https%3A%2F%2Fgraph.microsoft.com%2FUser.Read&redirect_uri=${encodeURIComponent(process.env.REACT_APP_AD_REDIRECT_TO ?? '')}&response_mode=query&state=${this.getAdfsState()}&code_challenge=${codeChallenge}&code_challenge_method=S256&amr_values=mfa`;\n }\n return '/';\n }\n\n renewToken = async (renewToken: string) => {\n return new Promise(async (resolve, reject) => {\n try {\n const res = await request.post('auth/renew-token', {\n renewToken: renewToken\n });\n\n if (!res.data) {\n reject('Ugyldig fornyelse af token');\n }\n\n this.setTokenData(res.data as BearerTokenResponseInterface);\n resolve(true);\n\n } catch (err) {\n reject(errorMessage(err, 'Fejl ved fornyelse af token'));\n }\n })\n }\n\n requestResetPassword = (emailOrUsername: string) => {\n return this.post(`auth/reset-password`, { emailOrUsername: emailOrUsername }, null);\n }\n\n resetPassword = (token: string, newPassword: string) => {\n return this.post(`auth/set-password`, { token: token, password: newPassword }, null);\n }\n\n forceSetPassword = (currentPassword: string, newPassword: string) => {\n return this.post(`auth/change-password`, { currentPassword: currentPassword, newPassword: newPassword }, null);\n }\n\n logout = () => {\n this.resetStore();\n navigationStore.redirect(routes.pageLogin);\n }\n}\n\nexport const authStore = new AuthStore();","export enum UserRoleEnum {\n User = 0,\n SuperUser = 1,\n GlobalAdmin = 2,\n}","import { NavLink } from \"react-router-dom\";\nimport css from './style.module.scss';\n\ninterface Props {\n label: string,\n linkTo: string,\n isActive?: Function,\n subItem?: boolean,\n className?: string,\n}\n\nconst NavigationItem = (props: Props) => {\n return (\n \n \n {props.label}\n \n \n )\n}\n\nexport default NavigationItem;","import { routes } from \"components/Routes\";\nimport { observer } from \"mobx-react-lite\";\nimport { useLocation } from \"react-router-dom\";\nimport { authStore } from \"stores/AuthStore\";\nimport { UserRoleEnum } from \"types/UserRoleEnum\";\nimport NavigationItem from \"./NavigationItem\";\n\nconst MainNavigation = observer(() => {\n const { pathname } = useLocation();\n return (\n
\n pathname === routes.pageDeclarations || pathname.indexOf(routes.pageDeclarations) === 0}\n />\n {\n authStore.user?.highestRole && authStore.user.highestRole > UserRoleEnum.User &&\n pathname === routes.pageUsers || pathname.indexOf(routes.pageUsers) === 0}\n />\n }\n
\n )\n});\n\nexport default MainNavigation;","import { reaction } from \"mobx\";\nimport { observer } from \"mobx-react-lite\";\nimport { useEffect, useState } from \"react\";\nimport { baseRequestStore } from \"stores/BaseRequestStore\";\nimport style from \"./style.module.scss\";\n\nconst LoadingIndicator = observer(() => {\n const [show, setShow] = useState(false);\n\n useEffect(() => {\n const disposer = reaction(\n () => baseRequestStore.requestInProgress,\n requestInProgress => {\n setShow(requestInProgress);\n }, { delay: 200 }\n )\n\n return () => {\n setShow(false);\n disposer();\n }\n }, [])\n\n\n\n return (show)\n ?\n <>\n
\n \"Loading..\"\n \n : null;\n});\n\nexport default LoadingIndicator;","import { routes } from \"components/Routes\";\nimport { observer } from \"mobx-react-lite\";\nimport { useEffect, useState } from \"react\";\nimport { NavLink, useLocation } from \"react-router-dom\";\nimport { authStore } from \"stores/AuthStore\";\nimport style from \"./style.module.scss\";\n\nconst ProfileAvatar = observer(() => {\n\n const { pathname } = useLocation();\n const [show, setShow] = useState(false);\n\n useEffect(() => {\n // start mouse down event listener to check if clicks should hide profile avatar menu or not \n document.addEventListener('mousedown', (e: any) => {\n if (\n e.target.id !== 'avatar' // avatar is not clicked\n && !document.getElementById('avatar')?.contains(e.target) // avatar children are not clicked\n ) {\n setShow(false)\n }\n }\n );\n\n return () => {\n setShow(false);\n }\n }, []);\n\n return (\n
setShow(!show)} id=\"avatar\">\n
{authStore.user?.firstname[0].toUpperCase()}{authStore.user?.lastname[0].toUpperCase()}
\n
\n pathname === routes.pageUserProfile}\n exact={true}\n to={routes.pageUserProfile}\n className={style.menuItem}\n activeClassName={style.menuItemActive}>\n Vis profil\n \n { return false }}\n exact={true}\n to={routes.pageLogin}\n className={style.menuItem}\n activeClassName={style.menuItemActive}>\n Log ud\n \n
\n
\n );\n});\n\nexport default ProfileAvatar;","import moment from \"moment\";\n\nexport function dateFormat(dateValue: string) {\n return moment(dateValue).isValid() ? moment(dateValue).format('DD-MM-YYYY') : '';\n}\n\nexport function dateTimeFormat(dateTimeValue: string) {\n return moment(dateTimeValue).isValid() ? moment(dateTimeValue).format('DD-MM-YYYY HH:mm') : '';\n}\n","import { action, makeObservable, observable } from \"mobx\";\nimport { BaseStore } from \"./BaseStore\";\n\nexport class LastImportTimeStore extends BaseStore {\n lastImportTimeObject: { lastImportTime: Date | null } | null = null;\n updated: Date | null = null;\n\n constructor() {\n super();\n makeObservable(this,\n {\n lastImportTimeObject: observable,\n updated: observable,\n\n resetStore: action\n }\n );\n }\n\n resetStore = () => {\n this.lastImportTimeObject = null;\n }\n\n getLastImportTime = () => {\n this.updated = new Date();\n return this.get(`declarations/last-imported`, `lastImportTimeObject`, true);\n }\n\n}\n\nexport const lastImportTimeStore = new LastImportTimeStore();","export enum DeclarationDocumentFlowStatusEnum {\n Request = 1,\n NotUsed = 2,\n Active = 3,\n Exceeded = 4,\n Completed = 5,\n}","import { dateTimeFormat } from \"helpers/DateHelper\";\nimport { observer } from \"mobx-react-lite\";\nimport moment from \"moment\";\nimport { useEffect } from \"react\";\nimport { lastImportTimeStore } from \"stores/LastImportTimeStore\";\n\nconst LastImportTime = observer(() => {\n\n const FETCH_INTERVAL_IN_MINUTES = (1000 * 60) * 10; // every 10 minute\n\n useEffect(() => {\n lastImportTimeStore.getLastImportTime();\n setInterval(() => {\n lastImportTimeStore.getLastImportTime();\n }, FETCH_INTERVAL_IN_MINUTES);\n\n return () => {\n lastImportTimeStore.resetStore();\n }\n }, [FETCH_INTERVAL_IN_MINUTES]);\n\n const lastImportTime = lastImportTimeStore.lastImportTimeObject?.lastImportTime\n && moment(lastImportTimeStore.lastImportTimeObject?.lastImportTime).isValid()\n ? dateTimeFormat(moment(lastImportTimeStore.lastImportTimeObject?.lastImportTime).toISOString())\n : '-';\n\n return
Sidst opdateret: {lastImportTime}
\n});\n\nexport default LastImportTime;","import moment from \"moment\";\nimport { useEffect } from \"react\";\nimport { authStore } from \"stores/AuthStore\";\n\nconst RefreshLoggedInUser = () => {\n useEffect(() => {\n // authStore.setLoggedInUser is being called on login, so to avoid double \n // fetching - we will only refresh user if last refresh is null or more \n // than 30 seconds old\n if (authStore.lastRefreshed === null || moment().subtract(30, 'seconds').isAfter(authStore.lastRefreshed)) {\n authStore.setLoggedInUser();\n }\n }, [])\n return <>;\n}\n\nexport default RefreshLoggedInUser;","import { action, makeObservable, observable } from \"mobx\";\nimport { DeclarationDocumentFlowStatusEnum } from \"types/DeclarationDocumentFlowStatusEnum\";\nimport { BaseStore } from \"./BaseStore\";\n\nexport class DeclarationExpireSoonCountStore extends BaseStore {\n declarations: any = null;\n\n constructor() {\n super();\n makeObservable(this,\n {\n declarations: observable,\n\n resetStore: action,\n getDeclarations: action,\n }\n );\n }\n\n resetStore = () => {\n this.count = 0;\n this.declarations = null;\n }\n\n getDeclarations = () => {\n return this.get(`declarations?PageSize=1&PageNumber=1&Status=${DeclarationDocumentFlowStatusEnum.Active}&DaysToExceeded=5`, 'declarations');\n }\n}\n\nexport const declarationExpireSoonCountStore = new DeclarationExpireSoonCountStore();","import NavigationItem from \"components/MainNavigation/NavigationItem\";\nimport { routes } from \"components/Routes\";\nimport { observer } from \"mobx-react-lite\";\nimport { useEffect } from \"react\";\nimport { useLocation } from \"react-router\";\nimport { declarationExpireSoonCountStore } from \"stores/DeclarationExpireSoonCountStore\";\nimport style from \"./style.module.scss\";\n\nconst DeclarationSubMenu = observer(() => {\n const { pathname } = useLocation();\n\n useEffect(() => {\n if (declarationExpireSoonCountStore.declarations === null) {\n declarationExpireSoonCountStore.getDeclarations();\n }\n\n return () => {\n declarationExpireSoonCountStore.resetStore();\n }\n }, [])\n\n const showBadge = declarationExpireSoonCountStore.declarations !== null && declarationExpireSoonCountStore.declarations.rowCount > 0;\n\n return
\n
\n
\n pathname === routes.pageDeclarations}\n subItem={true}\n />\n
\n pathname === routes.pageDeclarationsExpiresSoon}\n subItem={true}\n className=\"ml-12\"\n />\n {\n showBadge && \n {\n declarationExpireSoonCountStore.declarations.rowCount > 9\n ? '9+'\n : declarationExpireSoonCountStore.declarations.rowCount\n }\n \n }\n
\n
\n
\n
\n});\n\nexport default DeclarationSubMenu;","import style from \"./style.module.scss\";\n\nconst GuideLines = () => {\n return \n}\n\nexport default GuideLines;","import MainNavigation from \"components/MainNavigation\";\nimport React from \"react\";\nimport { ToastContainer } from \"react-toastify\";\nimport style from \"./style.module.scss\";\nimport 'react-toastify/dist/ReactToastify.css';\nimport { baseRequestStore } from \"stores/BaseRequestStore\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { routes } from \"components/Routes\";\nimport { observer } from \"mobx-react-lite\";\nimport LoadingIndicator from \"components/LoadingIndicator\";\nimport { useLocation } from \"react-router\";\nimport ProfileAvatar from \"components/ProfileAvatar\";\nimport LastImportTime from \"components/LastImportTime\";\nimport RefreshLoggedInUser from \"components/RefreshLoggedInUser\";\nimport DeclarationSubMenu from \"components/DeclarationSubMenu\";\nimport GuideLines from \"components/GuideLines\";\n\ninterface Props {\n children: React.ReactNode\n}\n\nconst Layout = observer((props: Props) => {\n const { pathname } = useLocation();\n\n if (!baseRequestStore.bearerToken) {\n return null;\n }\n\n const showDeclarationSubMenu = () => {\n return pathname === routes.pageDeclarations || pathname.indexOf(routes.pageDeclarations) === 0\n }\n\n return (\n
\n
\n
\n
\n
{ navigationStore.redirect('/') }}>\n \"Logo\"\n
\n
\n \n
\n
\n \n
\n
\n
\n {\n showDeclarationSubMenu() && \n }\n
\n
\n
\n {props.children}\n
\n
\n \n \n \n \n \n
Teknik- og Miljøforvaltningen | KMC Nordhavn | 33 66 30 70
\n
\n )\n})\n\nexport default Layout;","import { useEffect } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nconst ScrollToTopOnPageChange = () => {\n const { pathname } = useLocation();\n\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [pathname]);\n\n return null;\n}\n\nexport default ScrollToTopOnPageChange;","import './style.scss';\n\ninterface Props {\n children: React.ReactNode,\n compact?: boolean\n}\n\nconst ShowOnPrint = ({ children, compact }: Props) => (\n \n {children}\n \n)\n\nexport default ShowOnPrint;","import React, { useEffect } from \"react\";\nimport { FormProvider, useForm, UseFormProps } from \"react-hook-form\";\nimport { ObjectShape } from \"yup/lib/object\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as yup from 'yup';\nimport { YupInterface } from \"types/YupInterface\";\nimport { useRef } from \"react\";\nimport ShowOnPrint from \"components/ShowOnPrint\";\n\ninterface Props {\n formOptions?: UseFormProps,\n children: React.ReactNode,\n onSubmit: any,\n onValidationError?: any,\n validation?: (yupInstance: YupInterface) => ObjectShape,\n}\n\nconst Form = (props: Props) => {\n\n let formOptions = props.formOptions || {};\n if (props.validation) {\n formOptions.resolver = yupResolver(yup.object().shape(props.validation(yup)));\n }\n\n const methods = useForm(formOptions);\n const methodsRef = useRef(methods);\n const { handleSubmit } = methods;\n\n useEffect(() => {\n methodsRef.current.reset(props.formOptions?.defaultValues);\n }, [props.formOptions?.defaultValues, methodsRef])\n\n return (\n \n \n
\n {props.children}\n
\n
\n
\n );\n}\n\nexport default Form;","import { useFormContext } from \"react-hook-form\";\nimport { get } from 'lodash';\n\ninterface Props {\n name: string\n}\n\nconst Error = (props: Props) => {\n const { formState } = useFormContext();\n const errorMsg = get(formState.errors, (`${props.name}.message`));\n if (!errorMsg) return null;\n\n return (\n
\n {errorMsg}\n
\n )\n}\n\nexport default Error;","import ReactTooltip from 'react-tooltip';\nimport HelpOutlineOutlinedIcon from '@material-ui/icons/HelpOutlineOutlined';\nimport style from \"./style.module.scss\";\n\ninterface Props {\n name: string,\n label?: string\n\n toolTipText?: string,\n toolTipImagePath?: string,\n}\n\nconst Label = (props: Props) => {\n if (!props.label) return null;\n\n // add tooltip (image and text) to label\n let dataTip = '';\n if (props.toolTipImagePath) {\n dataTip = ``;\n }\n if (props.toolTipText) {\n dataTip = dataTip + props.toolTipText;\n }\n\n return (\n \n\n )\n\n}\n\nexport default Label;","import { useFormContext } from \"react-hook-form\";\nimport FormElementInterface from \"types/FormElementInterface\";\nimport Error from \"components/Forms/Error\";\nimport Label from \"components/Label\";\n\ninterface Props extends FormElementInterface {\n type?: 'text' | 'password' | 'email' | 'hidden',\n defaultChecked?: boolean,\n className?: string,\n readOnlyValue?: any\n}\n\nconst Input = (props: Props) => {\n const { register, setValue } = useFormContext();\n\n // handle readOnly property and readOnlyValue (typically set by another element like a select).\n // we are purposely using \"setValue\" because if we populate an edit form with defaultValues it \n // conflicts when trying to conditionally set another using props.defaultValue\n const readOnly = props.readOnly || props.readOnlyValue !== undefined;\n if (props.readOnlyValue) {\n setValue(props.name, props.readOnlyValue);\n }\n\n const onKeyUp = (event: any) => {\n if (props.onChange) {\n props.onChange(props.name, event.target.value);\n }\n }\n\n return (\n
\n
\n )\n}\n\nexport default Input;","import { useFormContext } from \"react-hook-form\";\n\ninterface Props {\n label: string,\n className?: string,\n}\n\nconst SubmitButton = (props: Props) => {\n const ctx = useFormContext();\n const isSubmitting = ctx?.formState?.isSubmitting || false\n\n const btnClassName = \"btn text-lg \" + (props.className ?? \"\");\n return (\n \n {props.label}\n \n )\n}\n\nexport default SubmitButton;","import Form from \"components/Forms/Form\";\nimport Input from \"components/Forms/Input\";\nimport SubmitButton from \"components/Forms/SubmitButton\";\nimport { routes } from \"components/Routes\";\nimport { errorMessage } from \"helpers/ErrorMessage\";\nimport { useEffect, useState } from \"react\";\nimport { authStore } from \"stores/AuthStore\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { YupInterface } from \"types/YupInterface\";\n\nconst PageLogin = () => {\n const [error, setError] = useState(null);\n\n useEffect(() => {\n authStore.resetStore();\n\n return () => {\n setError(null);\n }\n }, []);\n\n const handleLogin = async (formData: { emailOrUsername: string, password: string }) => {\n try {\n await authStore.authenticate(formData.emailOrUsername, formData.password);\n await authStore.setLoggedInUser();\n navigationStore.redirect(routes.root);\n } catch (err) {\n setError(errorMessage(err, 'Der blev indtastet forkert brugernavn eller adgangskode'));\n }\n }\n\n const validation = (yup: YupInterface) => ({\n emailOrUsername: yup.string().required('Brugernavn skal udfyldes'),\n password: yup.string().required('Adgangskode skal udfyldes'),\n });\n\n return (\n
\n
Log ind
\n {\n error &&
{error}
\n }\n
\n \n
\n \n
\n navigationStore.redirect(routes.pageForgotPassword)} className=\"link\">Glemt din adgangskode?\n
\n
\n \n
\n
\n )\n}\n\nexport default PageLogin;","import { ButtonInterface } from \"types/ButtonInterface\";\n\nconst Button = (props: ButtonInterface) => {\n const classNames = (props.className ?? '') + ' btn';\n return props.clickAction()}\n className={classNames}\n disabled={props.disabled ?? false}\n >\n {props.text}\n \n}\n\nexport default Button;","import Button from \"components/Button\";\nimport Form from \"components/Forms/Form\";\nimport Input from \"components/Forms/Input\";\nimport SubmitButton from \"components/Forms/SubmitButton\";\nimport { routes } from \"components/Routes\";\nimport { errorToast } from \"helpers/ErrorMessage\";\nimport { useEffect } from \"react\";\nimport { toast } from \"react-toastify\";\nimport { authStore } from \"stores/AuthStore\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { YupInterface } from \"types/YupInterface\";\n\n\nconst PageForgotPassword = () => {\n useEffect(() => {\n authStore.resetStore();\n }, []);\n\n const validation = (yup: YupInterface) => ({\n emailOrUsername: yup.string().required('Brugernavn skal udfyldes'),\n });\n\n const requestResetPassword = async (formData: { emailOrUsername: string }) => {\n try {\n await authStore.requestResetPassword(formData.emailOrUsername);\n toast('Ny adgang er bestilt - tjek din e-mail', { type: 'success' });\n navigationStore.redirect(routes.pageLogin);\n } catch (err) {\n errorToast(err, 'Ny adgang kunne ikke bestilles');\n }\n }\n\n return (\n
\n
Bestil ny adgang
\n
\n \n
\n
\n )\n}\n\nexport default PageForgotPassword;","import Table from \"@material-ui/core/Table\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableFooter from \"@material-ui/core/TableFooter\";\nimport { TableContainer } from \"@material-ui/core\";\nimport TableSortLabel from '@material-ui/core/TableSortLabel';\nimport OrderByInterface from \"types/OrderByInterface\";\nimport TableHeaderInterface from \"types/TableHeaderInterface\";\nimport _ from \"lodash\";\nimport { BasePaginationStore } from \"stores/BasePaginationStore\";\nimport React, { useEffect } from \"react\";\nimport { extractPagination } from \"helpers/Pagination\";\nimport { observer } from \"mobx-react-lite\";\nimport ShowOnPrint from \"components/ShowOnPrint\";\nimport IconButton from '@material-ui/core/IconButton';\nimport FirstPageIcon from '@material-ui/icons/FirstPage';\nimport LastPageIcon from '@material-ui/icons/LastPage';\nimport { NavigateBefore, NavigateNext } from \"@material-ui/icons\";\nimport style from \"./style.module.scss\";\n\ninterface Props {\n headers: TableHeaderInterface[],\n paginationStore: BasePaginationStore,\n resizable?: boolean,\n rowSelection?: boolean,\n emptyPlaceholderText?: string,\n\n // callback functions\n onRowClicked?: (item: any) => void,\n onRowSelection?: (item: any) => void,\n}\n\nconst orderColumn = (columnName: string, onOrderBy: (orderBy: OrderByInterface) => void | null, orderBy: OrderByInterface | null = null) => {\n const active = orderBy?.orderBy ? orderBy.orderBy === columnName : false as boolean;\n const direction = (orderBy?.order ? orderBy.order : 'desc') as 'desc' | 'asc';\n\n return {\n active,\n direction,\n onClick: () => { onOrderBy({ orderBy: columnName, order: direction === 'asc' ? 'desc' : 'asc' }) },\n }\n}\n\nconst TablePaginationDefault = observer((props: Props) => {\n\n const { headers, paginationStore, resizable, rowSelection, onRowClicked, onRowSelection } = props;\n\n const onPageChange = (pageNumber: number) => {\n paginationStore.setCurrentPage(pageNumber + 1);\n }\n\n const onOrderBy = (orderBy: OrderByInterface) => {\n paginationStore.setOrderBy(orderBy);\n }\n\n const isItemSelected = (item: any) => {\n const found = _.find(paginationStore.selectedItems, function (selectItem) {\n if (selectItem.id === item.id) {\n return true;\n }\n });\n return found ? true : false;\n }\n\n const toggleSelectItem = (e: React.ChangeEvent, item: any) => {\n if (e.target.checked) {\n // add item to selectedItems array\n paginationStore.addSelectedItem(item);\n } else {\n // find and remove item from selectedItems array\n paginationStore.removeSelectedItem(item);\n }\n\n // callback function with selected items\n if (onRowSelection) {\n onRowSelection(paginationStore.selectedItems);\n }\n }\n\n useEffect(() => {\n paginationStore.getItems();\n }, [\n paginationStore,\n paginationStore.currentPage,\n paginationStore.orderBy,\n paginationStore.filters,\n paginationStore.endpoint,\n ]);\n\n const items = paginationStore.pagination?.results ?? [];\n const pagination = extractPagination(paginationStore.pagination);\n\n const firstPageButton = () => {\n return onPageChange(0)}>\n \n ;\n }\n\n const lastPageButton = () => {\n return pagination ? onPageChange(pagination.pageCount - 1) : null}>\n \n \n }\n\n const prevPageButton = () => {\n return pagination ? onPageChange(pagination?.currentPage - 2) : null}>\n \n \n }\n\n const nextPageButton = () => {\n return = pagination?.pageCount)}\n onClick={() => pagination ? onPageChange(pagination?.currentPage) : null}>\n \n \n }\n\n return (\n \n \n \n \n \n {\n rowSelection && \n {/* empty cell because of \"select multiple items\" checkboxes */}\n \n }\n {\n headers.map((header, index) => {\n if (header.orderColumn) {\n return (\n \n {header.title}\n {\n header.appendToHeaderCell &&
{header.appendToHeaderCell}
\n }\n
\n )\n } else {\n return \n {header.title}\n {\n header.appendToHeaderCell &&
{header.appendToHeaderCell}
\n }\n
\n }\n })\n }\n
\n
\n \n {\n items.map((row: any, index: number) => (\n \n {\n rowSelection && \n { toggleSelectItem(e, row) }} />\n \n }\n {\n headers.map((header, index) => {\n let value = '';\n if (header.formatter) {\n value = header.formatter(_.get(row, header.accessor), row);\n } else {\n value = _.get(row, header.accessor) ?? '-';\n }\n return onRowClicked ? onRowClicked(row) : {}}\n className={header.className ?? ''}\n >{value}\n })\n }\n \n ))\n }\n {\n // if data is empty\n props.emptyPlaceholderText && items.length === 0 &&\n \n \n {props.emptyPlaceholderText}\n \n \n }\n \n {\n pagination &&\n \n \n \n
\n {firstPageButton()}\n {prevPageButton()}\n \n Side {pagination.currentPage} af {pagination.pageCount} - {items.length} række(r)\n \n {nextPageButton()}\n {lastPageButton()}\n
\n
\n
\n
\n }\n
\n
\n
\n )\n})\n\nexport default TablePaginationDefault;","import { PaginationInterface } from \"types/PaginationInterface\";\n\nexport function extractPagination(paginatedResponse: any): PaginationInterface | null {\n if (paginatedResponse?.currentPage\n && paginatedResponse?.pageCount\n && paginatedResponse?.pageSize\n && paginatedResponse?.rowCount\n && paginatedResponse?.results\n ) {\n return {\n results: paginatedResponse.results as any[],\n currentPage: paginatedResponse.currentPage as number,\n pageCount: paginatedResponse.pageCount as number,\n pageSize: paginatedResponse.pageSize as number,\n rowCount: paginatedResponse.rowCount as number,\n hasNextPage: paginatedResponse.hasNextPage as boolean,\n lastRowOnPage: paginatedResponse.lastRowOnPage as number,\n }\n } else {\n return null;\n }\n}","import { UserRoleEnum } from \"types/UserRoleEnum\";\n\nexport function getUserRoleText(userRoleValue: UserRoleEnum) {\n switch (userRoleValue) {\n case UserRoleEnum.User:\n return 'Bruger';\n case UserRoleEnum.SuperUser:\n return 'Super bruger';\n case UserRoleEnum.GlobalAdmin:\n return 'Administrator';\n }\n}\n\nexport function getUserRoleValue(userRoleText: string) {\n switch (userRoleText.toLowerCase()) {\n case 'bruger':\n return UserRoleEnum.User;\n case 'super bruger':\n return UserRoleEnum.SuperUser;\n case 'administrator':\n return UserRoleEnum.GlobalAdmin;\n }\n}\n","import _ from \"lodash\";\nimport { action, makeObservable, observable } from \"mobx\";\nimport { generatePath } from \"react-router\";\nimport FilterInterface from \"types/FilterInterface\";\nimport { FilterStoreInterface } from \"types/FilterStoreInterface\";\nimport OrderByInterface from \"types/OrderByInterface\";\nimport { PaginationInterface } from \"types/PaginationInterface\";\nimport { BaseStore } from \"./BaseStore\";\n\nexport abstract class BasePaginationStore extends BaseStore implements FilterStoreInterface {\n\n abstract defaultEndpoint: string;\n defaultPageSize: number = 20;\n\n endpoint: string | null = null;\n pagination: PaginationInterface | null = null;\n orderBy: OrderByInterface | null = null;\n currentPage: number = 1;\n filters: FilterInterface[] = [];\n selectedItems: any[] = [];\n pageSize: number | null = null;\n append: boolean = false;\n\n constructor() {\n super();\n makeObservable(this,\n {\n pagination: observable,\n orderBy: observable,\n currentPage: observable,\n selectedItems: observable,\n filters: observable,\n endpoint: observable,\n pageSize: observable,\n append: observable,\n\n resetStore: action,\n getItems: action,\n setOrderBy: action,\n setCurrentPage: action,\n addSelectedItem: action,\n removeSelectedItem: action,\n setFilters: action,\n setEndpoint: action,\n generateEndpoint: action,\n }\n );\n }\n\n resetStore = () => {\n this.pagination = null;\n this.orderBy = null;\n this.currentPage = 1;\n this.setFilters([]);\n this.selectedItems = [];\n this.endpoint = null;\n this.pageSize = null;\n this.append = false;\n }\n\n getItems = () => {\n return this.paginate(\n this.endpoint ? this.endpoint : this.defaultEndpoint,\n this.currentPage,\n 'pagination',\n this.orderBy,\n this.filters,\n this.append,\n this.pageSize ? this.pageSize : this.defaultPageSize\n );\n }\n\n setOrderBy = (orderBy?: OrderByInterface | null) => {\n this.orderBy = orderBy ?? null;\n }\n\n setCurrentPage = (currentPage: number) => {\n this.currentPage = currentPage;\n }\n\n addSelectedItem = (item: any) => {\n this.selectedItems.push(item);\n }\n\n removeSelectedItem = (item: any) => {\n this.selectedItems = this.selectedItems.filter((selectedItem) => {\n return selectedItem.id !== item.id\n });\n }\n\n setPageSize = (pageSize: number) => {\n this.pageSize = pageSize;\n }\n\n setAppend = (append: boolean) => {\n this.append = append;\n }\n\n setFilters = (filters: FilterInterface[]) => {\n // only set filters if new and old filters aren't the same\n this.filters = _.isEqual(filters, this.filters) === false ? filters : this.filters;\n this.currentPage = 1;\n }\n\n setEndpoint = (endpoint: string) => {\n this.endpoint = endpoint;\n }\n\n generateEndpoint = (params: object) => {\n this.setEndpoint(generatePath(this.defaultEndpoint, params));\n }\n}","import { BasePaginationStore } from './BasePaginationStore';\n\nexport class UsersPaginationStore extends BasePaginationStore {\n defaultEndpoint = 'users';\n}\n\nexport const usersPaginationStore = new UsersPaginationStore();","import { Chip } from \"@material-ui/core\";\nimport { routes } from \"components/Routes\";\nimport TablePaginationDefault from \"components/TablePaginationDefault\";\nimport { dateFormat, dateTimeFormat } from \"helpers/DateHelper\";\nimport { getUserRoleText } from \"helpers/UserRoleHelper\";\nimport { generatePath } from \"react-router\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { usersPaginationStore } from \"stores/UsersPaginationStore\";\nimport TableHeaderInterface from \"types/TableHeaderInterface\";\nimport { UserInterface } from \"types/UserInterface\";\nimport { UserRoleEnum } from \"types/UserRoleEnum\";\n\nconst TablePaginationUsers = () => {\n\n const formatUserStatus = (status: boolean) => {\n return status\n ? Aktiv\n : Inaktiv;\n }\n\n const formatUserRoles = (roles: UserRoleEnum[]) => {\n return roles.map((role, index) => {\n return \n });\n }\n\n const formatUserNames = (firstname: string, row: { firstname: string, lastname: string, username: string }) => {\n return {[row.firstname, row.lastname].join(' ')}\n }\n\n const onRowClick = (user: UserInterface) => {\n navigationStore.redirect(generatePath(routes.pageUserEdit, { id: user.id }))\n }\n\n const headers = [\n {\n title: 'Navn',\n accessor: 'firstname',\n orderColumn: 'firstname',\n formatter: formatUserNames\n } as TableHeaderInterface,\n {\n title: 'Email',\n accessor: 'email',\n orderColumn: 'email',\n } as TableHeaderInterface,\n {\n title: 'Status',\n accessor: 'active',\n orderColumn: 'status',\n formatter: formatUserStatus\n } as TableHeaderInterface,\n {\n title: 'Rolle(r)',\n accessor: 'roles',\n formatter: formatUserRoles,\n } as TableHeaderInterface,\n {\n title: 'Oprettet',\n accessor: 'createdOn',\n orderColumn: 'createdOn',\n formatter: (value) => { return dateFormat(value) },\n } as TableHeaderInterface,\n {\n title: 'Sidst logget ind',\n accessor: 'lastSeen',\n orderColumn: 'lastSeen',\n formatter: (value) => { return value ? dateTimeFormat(value) : '-' },\n } as TableHeaderInterface\n ];\n\n return \n}\n\nexport default TablePaginationUsers;","import Error from \"components/Forms/Error\";\nimport Label from \"components/Label\";\nimport { useFormContext } from \"react-hook-form\";\nimport { SelectInterface } from \"types/SelectInterface\";\nimport style from \"./style.module.scss\";\n\nconst Select = (props: SelectInterface) => {\n const { register } = useFormContext();\n if (props.options.length === 0 && !props.showAsEmpty) return null;\n\n const handleChange = (e: any) => {\n const optionIndex = e.nativeEvent.target.selectedIndex;\n const label = e.nativeEvent.target[optionIndex].text;\n const value = e.target.value;\n\n if (props.onChange) {\n props.onChange(label, value);\n }\n }\n\n const classNameData = 'w-full ' + (props.className ?? '');\n\n return (\n
\n
\n )\n}\n\nexport default Select;","import { getUserRoleText } from \"helpers/UserRoleHelper\";\nimport { UserRoleEnum } from \"types/UserRoleEnum\";\nimport Select from \"../Select\";\n\ninterface Props {\n includeAdmin?: boolean,\n name?: string,\n label?: string,\n className?: string,\n placeholder?: string\n}\n\nconst SelectUserRole = (props: Props) => {\n let options = [\n {\n id: UserRoleEnum.User,\n value: getUserRoleText(UserRoleEnum.User)\n },\n {\n id: UserRoleEnum.SuperUser,\n value: getUserRoleText(UserRoleEnum.SuperUser)\n },\n ]\n\n if (props.includeAdmin) {\n options.push(\n {\n id: UserRoleEnum.GlobalAdmin,\n value: getUserRoleText(UserRoleEnum.GlobalAdmin)\n }\n )\n }\n\n return (\n \n )\n}\n\nexport default SelectUserRole;","import Select from \"../Select\";\n\ninterface Props {\n name?: string,\n label?: string,\n placeholder?: string\n}\n\nconst SelectUserStatus = (props: Props) => {\n const options = [\n {\n id: 1,\n value: 'Aktive'\n },\n {\n id: 2,\n value: 'Inaktive'\n }\n ]\n return (\n \n )\n}\n\nexport default SelectUserStatus;","import Form from \"components/Forms/Form\";\nimport Input from \"components/Forms/Input\";\nimport SelectUserRole from \"components/Forms/SelectUserRole\";\nimport SelectUserStatus from \"components/Forms/SelectUserStatus\";\nimport SubmitButton from \"components/Forms/SubmitButton\";\nimport { observer } from \"mobx-react-lite\";\nimport { BasePaginationStore } from \"stores/BasePaginationStore\";\nimport FilterInterface from \"types/FilterInterface\";\n\nconst UsersFilter = observer((props: { paginationStore: BasePaginationStore }) => {\n\n const filter = (formData: any) => {\n\n let filters: FilterInterface[] = [];\n\n // filter by user \"Firstname, Lastname, Company, Email\"\n if (formData.search) {\n filters.push({\n name: 'Search',\n value: formData.search,\n })\n }\n\n // filter by user role\n if (formData.role) {\n filters.push({\n name: 'Role',\n value: formData.role\n })\n }\n\n // filter by user state\n if (formData.state) {\n filters.push({\n name: 'State',\n value: formData.state\n })\n }\n\n props.paginationStore.setFilters(filters);\n props.paginationStore.selectedItems = [];\n }\n\n return
\n
\n \n \n \n
\n \n
\n
\n
\n\n});\n\nexport default UsersFilter;","import Button from \"components/Button\";\nimport { routes } from \"components/Routes\";\nimport TablePaginationUsers from \"components/TablePaginationUsers\";\nimport { observer } from \"mobx-react-lite\";\nimport { useEffect } from \"react\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { usersPaginationStore } from \"stores/UsersPaginationStore\";\nimport UsersFilter from \"./Filter\";\n\nconst PageUsers = observer(() => {\n\n useEffect(() => {\n return () => {\n usersPaginationStore.resetStore();\n }\n })\n return (\n
\n
\n
\n

Brugere

\n
\n Opret nye brugere eller rediger eksisterende.\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n )\n});\n\nexport default PageUsers;","import { navigationStore } from \"stores/NavigationStore\";\nconst BackButton = (props: { clickAction?: any }) => {\n return navigationStore.goBack()}\n >← Tilbage\n}\n\nexport default BackButton;","const LineWithBreak = (props: { children?: React.ReactNode }) => {\n\n if (props.children) {\n return <>{props.children}
;\n }\n else {\n return <>;\n }\n}\n\nexport default LineWithBreak;","/**\n * Return number formatted as string with two decimals\n * @param price \n * @returns \n */\nexport function twoDecimals(num?: number, locale: string = 'da') {\n var returnNum = '0.00';\n if (num) {\n returnNum = (num*1).toFixed(2);\n }\n return Number(returnNum).toLocaleString(locale, {maximumFractionDigits: 2, minimumFractionDigits: 2});\n}","import { BasePaginationStore } from './BasePaginationStore';\n\nexport class DeclarationLinesPaginationStore extends BasePaginationStore {\n defaultEndpoint = 'declarations/:id/lines';\n defaultPageSize = 251;\n}\n\nexport const declarationsLinesPaginationStore = new DeclarationLinesPaginationStore();","export enum DeclarationFileEnum {\n DRIVING_NOTE = 0,\n WEIGHINGS = 1,\n}","import TablePaginationDefault from \"components/TablePaginationDefault\";\nimport { dateTimeFormat } from \"helpers/DateHelper\";\nimport { twoDecimals } from \"helpers/NumberHelper\";\nimport { observer } from \"mobx-react-lite\";\nimport { useEffect } from \"react\";\nimport { declarationsLinesPaginationStore } from \"stores/DeclarationLinesPaginationStore\";\nimport TableHeaderInterface from \"types/TableHeaderInterface\";\n\nconst TablePaginationDeclarationLines = observer((props: { declarationId: string }) => {\n\n declarationsLinesPaginationStore.generateEndpoint({ id: props.declarationId });\n\n useEffect(() => {\n return () => {\n declarationsLinesPaginationStore.resetStore();\n }\n }, [props.declarationId])\n\n\n const headers = [\n {\n title: 'Vejebilagsnr.',\n accessor: 'weighInDocNo',\n orderColumn: 'weighInDocNo',\n } as TableHeaderInterface,\n {\n title: 'Dato',\n accessor: 'recievedDate',\n orderColumn: 'recievedDate',\n formatter: (value) => { return dateTimeFormat(value.toString()) },\n } as TableHeaderInterface,\n {\n title: 'Reg.nr.',\n accessor: 'weighInRegNo',\n orderColumn: 'weighInRegNo',\n } as TableHeaderInterface,\n {\n title: 'Ton',\n accessor: 'weighInQuantity',\n orderColumn: 'weighedInQuantity',\n formatter: (value) => { return twoDecimals(value) }\n } as TableHeaderInterface\n ];\n\n return \n});\n\nexport default TablePaginationDeclarationLines;","import { makeObservable, observable } from \"mobx\";\nimport { DeclarationInterface } from \"types/DeclarationInterface\";\nimport { BaseStore } from \"./BaseStore\";\n\nexport class DeclarationDetailsStore extends BaseStore {\n declaration: DeclarationInterface | null = null;\n\n constructor() {\n super();\n makeObservable(this,\n {\n declaration: observable,\n }\n );\n }\n\n resetStore = () => {\n this.declaration = null;\n }\n\n getDeclarationDetails = (id: string) => {\n return this.get(`declarations/${id}`, `declaration`);\n }\n\n}\n\nexport const declarationDetailsStore = new DeclarationDetailsStore();","import { BaseStore } from \"./BaseStore\";\nimport { action, makeObservable, observable } from \"mobx\";\n\nexport class DownloadTokenStore extends BaseStore {\n\n token: string | null = null;\n\n constructor() {\n super();\n\n makeObservable(this, {\n token: observable,\n\n resetStore: action,\n \n })\n }\n\n resetStore = () => {\n this.token = null;\n }\n\n getToken = () => {\n return this.get(`auth/download-token`, `token`, true);\n }\n}\n\nexport const downloadTokenStore = new DownloadTokenStore();","import BackButton from \"components/BackButton\";\nimport LineWithBreak from \"components/LineWithBreak\";\nimport { routes } from \"components/Routes\";\nimport TablePaginationDeclarationLines from \"components/TablePaginationDeclarationLines\";\nimport { dateFormat } from \"helpers/DateHelper\";\nimport { twoDecimals } from \"helpers/NumberHelper\";\nimport { StatusCodes } from \"http-status-codes\";\nimport { observer } from \"mobx-react-lite\";\nimport { useEffect } from \"react\";\nimport { useParams } from \"react-router\";\nimport { declarationDetailsStore } from \"stores/DeclarationDetailsStore\";\nimport { downloadTokenStore } from \"stores/DownloadToken\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { DeclarationFileEnum } from \"types/DeclarationFileEnum\";\n\nconst PageDeclarationDetails = observer(() => {\n const { id } = useParams<{ id: string }>();\n\n useEffect(() => {\n async function fetch() {\n try {\n await declarationDetailsStore.getDeclarationDetails(id)\n } catch (err: any) {\n if (err?.response?.status === StatusCodes.NOT_FOUND) {\n navigationStore.redirect(routes.pageNotFound);\n }\n }\n }\n\n // await component rendering to be able to redirect to 'page not found' if status code is 404\n fetch();\n\n return () => {\n declarationDetailsStore.resetStore();\n }\n }, [id]);\n\n const declaration = declarationDetailsStore.declaration;\n if (!declaration) {\n return null;\n }\n\n const weighedInQuantityColorClass = () => {\n if (declaration.declaredQuantity - declaration.weighedInQuantity > 0) {\n return 'border-kmc-blue text-kmc-blue'\n } else {\n return 'border-kmc-red text-kmc-red';\n }\n }\n\n const printDrivingNote = async () => {\n const token = await downloadTokenStore.getToken();\n if (token) {\n window.open(`${process.env.REACT_APP_API_BASE_URL}/declarations/${id}/file?type=${DeclarationFileEnum.DRIVING_NOTE}&token=${token}&clientKey=${process.env.REACT_APP_CLIENT_KEY}`, '_blank', 'noopener,noreferrer')\n }\n downloadTokenStore.resetStore();\n }\n\n const printWeighings = async () => {\n const token = await downloadTokenStore.getToken();\n if (token) {\n window.open(`${process.env.REACT_APP_API_BASE_URL}/declarations/${id}/file?type=${DeclarationFileEnum.WEIGHINGS}&token=${token}&clientKey=${process.env.REACT_APP_CLIENT_KEY}`, '_blank', 'noopener,noreferrer')\n }\n }\n\n return (\n
\n
\n
\n

{declarationDetailsStore.declaration?.no}

\n
\n {declaration.billToName}\n {declaration.shipToAddress}\n {declaration.shipToPostCode}\n {declaration.shipToCity}\n {declaration.shipToContact}\n
\n
\n Kørselsperiode slut: \n \n {\n dateFormat(declaration.expirationDate.toString())\n }\n \n
\n
\n Print: \n Køreseddel\n Indvejninger\n
\n
\n
\n
\n \n
\n
\n
\n
Aftalt mængde
\n
{twoDecimals(declaration.declaredQuantity)}
\n
\n
\n
Indvejet mængde
\n
{twoDecimals(declaration.weighedInQuantity)}
\n
\n
\n
\n
\n
\n
\n

Indvejninger

\n
\n \n
\n
\n )\n});\n\nexport default PageDeclarationDetails;","import { authStore } from \"stores/AuthStore\";\nimport queryString from \"query-string\";\nimport Button from \"components/Button\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport _ from \"lodash\";\nimport { routes } from \"components/Routes\";\nimport { toast } from \"react-toastify\";\nimport { useEffect } from \"react\";\nimport { errorToast } from \"helpers/ErrorMessage\";\n\nconst PageLoginAdmin = () => {\n\n const queryParsed = queryString.parse(window.location.search);\n\n useEffect(() => {\n const handleLogin = async () => {\n try {\n await authStore.authenticateAdfs(queryParsed.code as string);\n await authStore.setLoggedInUser();\n navigationStore.redirect(routes.pageDeclarations);\n } catch (err) {\n errorToast(err, 'Fejl ved ADFS log ind');\n navigationStore.redirect(routes.pageAdminLogin);\n }\n }\n\n if (_.isEmpty(queryParsed)) {\n // reset store if query string object is empty\n authStore.resetStore();\n } else if (queryParsed.code && queryParsed.state && queryParsed.state === authStore.getAdfsState()) {\n // when query string has \"code\", \"state\" and \"state\" matches session \"adfs state\" - try to get bearer token from api\n handleLogin();\n } else if (queryParsed.error) {\n // adfs error\n toast('Der skete en fejl ved ADFS log ind', { type: 'error' });\n }\n }, [queryParsed])\n\n const loginRedirect = async () => {\n window.location.href = await authStore.generateAdfsUrl();\n }\n\n return (\n
\n
\n )\n};\n\nexport default PageLoginAdmin;","import { makeObservable, observable } from \"mobx\";\nimport { UserInterface } from \"types/UserInterface\";\nimport { BaseStore } from \"./BaseStore\";\n\nexport class SelectCustomerNoStoreByUser extends BaseStore {\n user: UserInterface | null = null;\n\n constructor() {\n super();\n makeObservable(this,\n {\n user: observable,\n }\n );\n }\n\n resetStore = () => {\n this.user = null;\n }\n\n getUser = (id: string) => {\n return this.get(`users/${id}`, `user`);\n }\n}\n\nexport const selectCustomerNoStoreByUser = new SelectCustomerNoStoreByUser();","import { observer } from \"mobx-react-lite\";\nimport { useEffect } from \"react\";\nimport { selectCustomerNoStoreByUser } from \"stores/SelectCustomerNoStore\";\nimport { OptionInterface } from \"types/OptionInterface\";\nimport Select from \"../Select\";\n\ninterface Props {\n userId: string,\n name?: string,\n label?: string,\n className?: string,\n placeholder?: string\n}\n\nconst SelectCustomerNoByUser = observer((props: Props) => {\n let options: OptionInterface[] = [];\n\n useEffect(() => {\n const fetchUser = async () => {\n await selectCustomerNoStoreByUser.getUser(props.userId);\n }\n fetchUser();\n }, [props.userId])\n\n if (!selectCustomerNoStoreByUser.user?.roles) {\n return null;\n } else {\n selectCustomerNoStoreByUser.user?.roles.forEach(role => {\n options.push({\n id: role.customer.customerNo,\n value: role.customer.customerNo\n })\n })\n }\n\n return (\n \n )\n})\n\nexport default SelectCustomerNoByUser;","import style from './style.module.scss';\n\ninterface Props {\n show: boolean,\n\n children: React.ReactNode\n}\n\nconst Modal = (props: Props) => {\n const { show, children } = props;\n\n return (\n
\n
\n {children}\n
\n
\n );\n};\n\nexport default Modal;","import Modal from \"components/Modal\";\n\ninterface Props {\n confirmCallback: () => void,\n denyCallback: () => void,\n show: boolean,\n title: string,\n message: string,\n confirmBtnText?: string,\n denyBtnText?: string,\n}\n\nconst ModalConfirm = (props: Props) => {\n return (\n \n

{props.title}

\n
\n {\n props.message.split('\\n').map((item, index) => {\n return (\n \n {item}\n
\n
\n )\n })\n }\n
\n
\n \n \n
\n
\n )\n}\n\nexport default ModalConfirm;","import { UserInterface } from \"types/UserInterface\";\nimport { UserRoleEnum } from \"types/UserRoleEnum\";\n\nexport function hasRole(user: UserInterface | null, requiredRoles: UserRoleEnum[]) {\n return requiredRoles.length === 0 ||\n (\n user?.highestRole !== undefined &&\n user.highestRole in UserRoleEnum &&\n requiredRoles.includes(user?.highestRole)\n );\n}","export function removeBlankValues(formData: any, specificProperties: string[] | undefined) {\n if (specificProperties) {\n for (let prop in formData) {\n if (specificProperties.includes(prop) && isBlankValue(formData[prop])) {\n delete formData[prop]\n }\n }\n } else {\n for (let prop in formData) {\n if (isBlankValue(formData[prop])) {\n delete formData[prop]\n }\n }\n }\n return formData;\n}\n\nexport function isBlankValue(value: any) {\n return (value === null || value === undefined || value === '');\n}","import { removeBlankValues } from \"helpers/FormHelper\";\nimport { action, makeObservable, observable } from \"mobx\";\nimport { UserInterface } from \"types/UserInterface\";\nimport { UserRoleEnum } from \"types/UserRoleEnum\";\nimport { UserStoreInterface } from \"types/UserStoreInterface\";\nimport { UserUpdateInterface } from \"types/UserUpdateInterface\";\nimport { BaseStore } from \"./BaseStore\";\n\nexport class UserStore extends BaseStore {\n user: UserInterface | null = null;\n\n constructor() {\n super();\n makeObservable(this,\n {\n user: observable,\n\n resetStore: action,\n getUserDetails: action,\n updateUserDetails: action,\n storeUserDetails: action,\n addUserCustomerRole: action,\n removeUserCustomerRole: action,\n addUserDeclaration: action,\n removeUserDeclaration: action,\n deleteUser: action,\n }\n );\n }\n\n resetStore = () => {\n this.user = null;\n }\n\n getUserDetails = (userId: string) => {\n return this.get(`users/${userId}`, `user`);\n }\n\n checkUserExistence = (email: string) => {\n return this.get(`users/exists?email=${email}`, 'user')\n }\n\n updateUserDetails = (userId: string, formData: UserUpdateInterface) => {\n formData = removeBlankValues(formData, ['password', 'confirmPassword']);\n return this.put(`users/${userId}`, formData, this.user, true);\n }\n\n storeUserDetails = (formData: UserStoreInterface) => {\n return this.post(`users`, formData, this.user, true);\n }\n\n addUserCustomerRole = (userId: string, customerNo: string, role: UserRoleEnum) => {\n const data = {\n customerNo: customerNo,\n role: role,\n }\n // to be able to add response to user.roles we need it to be an array\n if (this.user && this.user?.roles === undefined) {\n this.user.roles = [];\n }\n return this.post(`users/${userId}/roles`, data, this.user?.roles, true);\n }\n\n removeUserCustomerRole = (userId: string, userCustomerRoleId: string) => {\n return this.delete(`users/${userId}/roles/${userCustomerRoleId}`, userCustomerRoleId, this.user?.roles);\n }\n\n addUserDeclaration = (userId: string, declarationNo: string) => {\n const data = {\n no: declarationNo\n }\n // to be able to add response to user.declarations we need it to be an array\n if (this.user && this.user?.declarations === undefined) {\n this.user.declarations = [];\n }\n return this.post(`users/${userId}/declarations`, data, this.user?.declarations, true);\n }\n\n removeUserDeclaration = (userId: string, declarationId: string) => {\n return this.delete(`users/${userId}/declarations/${declarationId}`, declarationId, this.user?.declarations);\n\n }\n\n deleteUser = (userId: string) => {\n return this.delete(`users/${userId}`, userId, this.user);\n }\n\n}\n\nexport const userStore = new UserStore();","import Form from \"components/Forms/Form\";\nimport Input from \"components/Forms/Input\";\nimport SelectCustomerNo from \"components/Forms/SelectCustomerNo\";\nimport SelectUserRole from \"components/Forms/SelectUserRole\";\nimport SubmitButton from \"components/Forms/SubmitButton\";\nimport ModalConfirm from \"components/Modal/ModalConfirm\";\nimport { routes } from \"components/Routes\";\nimport { errorToast } from \"helpers/ErrorMessage\";\nimport { hasRole } from \"helpers/HasRole\";\nimport { getUserRoleText } from \"helpers/UserRoleHelper\";\nimport { observer } from \"mobx-react-lite\";\nimport { useState } from \"react\";\nimport { toast } from \"react-toastify\";\nimport { authStore } from \"stores/AuthStore\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { userStore } from \"stores/UserStore\";\nimport { UserCustomerRoleInterface } from \"types/UserCustomerRoleInterface\";\nimport { UserRoleEnum } from \"types/UserRoleEnum\";\nimport { YupInterface } from \"types/YupInterface\";\n\ninterface AddCustomerRoleFormData {\n customerNo: string,\n role: UserRoleEnum\n}\n\nconst UserCustomerRoleForm = observer((props: { disabled?: boolean }) => {\n\n const [showConfirmModal, setShowConfirmModal] = useState(false);\n const [formData, setFormData] = useState(null);\n\n const removeUserCustomerRole = async (userCustomerRoleId: string) => {\n let success = false;\n if (userStore.user) {\n try {\n await userStore.removeUserCustomerRole(userStore.user?.id, userCustomerRoleId);\n success = true;\n toast('Kundenummer fjernet fra bruger', { type: 'success' });\n } catch (err) {\n errorToast(err, 'Kundenummer blev ikke fjernet');\n }\n\n if (success && !hasRole(authStore.user, [UserRoleEnum.GlobalAdmin])) {\n try {\n // re-fetch user in case of 'super user' no longer has access to edit\n await userStore.getUserDetails(userStore.user.id);\n } catch (err) {\n navigationStore.redirect(routes.pageUsers);\n }\n }\n }\n }\n\n const addUserCustomerRole = async (formData: AddCustomerRoleFormData | null) => {\n if (userStore.user && formData) {\n try {\n await userStore.addUserCustomerRole(userStore.user.id, formData.customerNo, formData.role);\n toast('Kundenummer blev tilføjet til bruger', { type: 'success' });\n } catch (err) {\n errorToast(err, 'Kundenummer blev ikke tilføjet');\n }\n }\n setShowConfirmModal(false)\n }\n\n const confirmAddCustomerRole = async (formData: { customerNo: string, role: UserRoleEnum }, e: any) => {\n setFormData(formData);\n if (formData.role === UserRoleEnum.SuperUser) {\n // when selected role is super user - confirm before \"submit\"\n setShowConfirmModal(true);\n } else {\n await addUserCustomerRole(formData);\n }\n }\n\n const validation = (yup: YupInterface) => ({\n customerNo: yup.string().required('Kundenummer skal udfyldes'),\n role: yup.number().required('Rolle skal vælges')\n });\n\n return (\n <>\n

Adgang via kundenummer

\n \n
\n
\n
\n
Kundenummer
\n
Rolle
\n
\n
\n {\n userStore.user?.roles?.map((userCustomerRole: UserCustomerRoleInterface, index) => {\n return (\n
\n
{userCustomerRole.customer.customerNo}
\n
{getUserRoleText(userCustomerRole.role)}
\n
\n { removeUserCustomerRole(userCustomerRole.id) }}\n >Fjern\n
\n
\n )\n })\n }\n
\n
\n {\n authStore.user?.highestRole === UserRoleEnum.SuperUser\n && authStore.user?.id\n && \n }\n {\n authStore.user?.highestRole === UserRoleEnum.GlobalAdmin\n && \n }\n
\n
\n
\n
\n
\n
\n \n { addUserCustomerRole(formData) }}\n denyCallback={() => { setShowConfirmModal(false) }}\n show={showConfirmModal} title={\"Super bruger rettigheder\"}\n message={\"Du er ved at give brugeren fuld rettighed til at oprette, redigere og slette brugere for kundenummer \" + formData?.customerNo}\n confirmBtnText=\"Bekræft\"\n denyBtnText=\"Fortryd\"\n />\n \n )\n});\n\nexport default UserCustomerRoleForm;","import { Chip } from \"@material-ui/core\";\nimport Form from \"components/Forms/Form\";\nimport Input from \"components/Forms/Input\";\nimport SubmitButton from \"components/Forms/SubmitButton\";\nimport { routes } from \"components/Routes\";\nimport { errorToast } from \"helpers/ErrorMessage\";\nimport { hasRole } from \"helpers/HasRole\";\nimport { observer } from \"mobx-react-lite\";\nimport { toast } from \"react-toastify\";\nimport { authStore } from \"stores/AuthStore\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { userStore } from \"stores/UserStore\";\nimport { UserRoleEnum } from \"types/UserRoleEnum\";\nimport { YupInterface } from \"types/YupInterface\";\n\nconst UserDeclarationForm = observer((props: { disabled?: boolean }) => {\n\n const removeUserDeclaration = async (declarationId: string) => {\n let success = false;\n if (userStore.user) {\n try {\n await userStore.removeUserDeclaration(userStore.user?.id, declarationId)\n success = true;\n toast('Sagsnummer fjernet fra bruger', { type: 'success' });\n } catch (err) {\n errorToast(err, 'Sagsnummer blev ikke fjernet')\n \n }\n\n if (success && !hasRole(authStore.user, [UserRoleEnum.GlobalAdmin])) {\n try {\n // re-fetch user in case of 'super user' no longer has access to edit\n await userStore.getUserDetails(userStore.user.id);\n } catch (err) {\n navigationStore.redirect(routes.pageUsers);\n }\n }\n }\n }\n\n const addUserDeclaration = async (formData: any, e: any) => {\n if (userStore.user) {\n try {\n await userStore.addUserDeclaration(userStore.user.id, formData.declarationNo);\n e.target.reset();\n toast('Sagsnummer blev tilføjet til bruger', { type: 'success' });\n } catch (err) {\n errorToast(err, 'Sagsnummer blev ikke tilføjet');\n }\n }\n }\n\n const validation = (yup: YupInterface) => ({\n declarationNo: yup.string().required('Sagsnummer skal udfyldes'),\n });\n\n return (\n <>\n

Adgang til sagsnumre

\n
\n
\n {\n userStore.user?.declarations && userStore.user?.declarations.length > 0 &&\n
\n {\n userStore.user?.declarations.map((declaration, index) => {\n return { removeUserDeclaration(declaration.id) }}\n className=\"mb-2\"\n key={index + declaration.id}\n disabled={props.disabled ?? false}\n />\n })\n }\n
\n }\n
\n
\n
\n
(Der gives \"bruger\"-adgang til tilføjede sager)
\n
\n
\n
\n \n )\n});\n\nexport default UserDeclarationForm;","import FormElementInterface from \"types/FormElementInterface\"\nimport { useFormContext } from \"react-hook-form\";\nimport Error from \"components/Forms/Error\";\nimport Label from \"components/Label\";\nimport style from \"./style.module.scss\";\n\ninterface Props extends FormElementInterface {\n defaultChecked?: boolean,\n className?: string,\n readOnlyValue?: any,\n text?: string\n}\n\nconst Checkbox = (props: Props) => {\n const { register, setValue } = useFormContext();\n\n // handle readOnly property and readOnlyValue (typically set by another element like a select).\n // we are purposely using \"setValue\" because if we populate an edit form with defaultValues it \n // conflicts when trying to conditionally set another using props.defaultValue\n const readOnly = props.readOnly || props.readOnlyValue !== undefined;\n if (props.readOnlyValue) {\n setValue(props.name, props.readOnlyValue);\n }\n\n return (\n
\n \n
\n \n \n \n
\n
\n )\n}\n\n\nexport default Checkbox;","import Checkbox from \"components/Forms/Checkbox\";\nimport Form from \"components/Forms/Form\";\nimport Input from \"components/Forms/Input\";\nimport SubmitButton from \"components/Forms/SubmitButton\";\nimport ModalConfirm from \"components/Modal/ModalConfirm\";\nimport { routes } from \"components/Routes\";\nimport { errorToast } from \"helpers/ErrorMessage\";\nimport { hasRole } from \"helpers/HasRole\";\nimport { observer } from \"mobx-react-lite\";\nimport { useEffect, useState } from \"react\";\nimport { FieldValues } from \"react-hook-form/dist/types/fields\";\nimport { DefaultValues } from \"react-hook-form/dist/types/form\";\nimport { toast } from \"react-toastify\";\nimport { authStore } from \"stores/AuthStore\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { userStore } from \"stores/UserStore\";\nimport { UserInterface } from \"types/UserInterface\";\nimport { UserRoleEnum } from \"types/UserRoleEnum\";\nimport { YupInterface } from \"types/YupInterface\";\nimport { ObjectShape } from \"yup/lib/object\";\n\ninterface Props {\n user: UserInterface | null,\n validation: (yupInstance: YupInterface) => ObjectShape,\n defaultValues: DefaultValues,\n onSubmit: any,\n}\n\nconst UserForm = observer((props: Props) => {\n\n const [showConfirmDeleteModal, setShowConfirmDeleteModal] = useState(false);\n\n useEffect(() => {\n return () => {\n setShowConfirmDeleteModal(false);\n }\n }, [])\n\n const deleteUser = async () => {\n if (props.user?.id) {\n try {\n await userStore.deleteUser(props.user.id);\n toast('Bruger blev slettet', { type: 'success' });\n navigationStore.redirect(routes.pageUsers);\n } catch (err) {\n errorToast(err, 'Bruger kunne ikke slettes');\n }\n }\n }\n\n const userCanBeCreatedOrEdited = props.user?.notEditable === undefined || props.user?.notEditable === false;\n\n return (\n
\n \n
\n
\n \n \n \n {\n userCanBeCreatedOrEdited === true && <>\n \n \n }\n \n
\n {\n userCanBeCreatedOrEdited &&
\n \n \n \n {\n !props.user && \n }\n {\n props.user && \n }\n
\n }\n {\n // if the user being edited/created is not a global admin and can be either created or edited \n (!props.user?.globalAdmin && userCanBeCreatedOrEdited) && <>\n
\n {\n // if user is being edited\n props.user?.id &&\n
\n { setShowConfirmDeleteModal(true) }}\n >Slet bruger\n
\n }\n
\n \n
\n
\n \n \n }\n\n
\n \n { setShowConfirmDeleteModal(false) }}\n show={showConfirmDeleteModal} title={\"Slet bruger\"}\n message={\"Denne handling kan ikke fortrydes - er du sikker på du vil slette brugeren?\"}\n />\n
\n )\n});\n\nexport default UserForm;","import BackButton from \"components/BackButton\";\nimport Button from \"components/Button\";\nimport { routes } from \"components/Routes\";\nimport UserCustomerRoleForm from \"components/UserCustomerRoleForm\";\nimport UserDeclarationForm from \"components/UserDeclarationForm\";\nimport UserForm from \"components/UserForm\";\nimport { errorToast } from \"helpers/ErrorMessage\";\nimport { observer } from \"mobx-react-lite\";\nimport { useEffect } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport { toast } from \"react-toastify\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { userStore } from \"stores/UserStore\";\nimport { UserUpdateInterface } from \"types/UserUpdateInterface\";\nimport { YupInterface } from \"types/YupInterface\";\n\nconst PageUserEdit = observer(() => {\n const { id } = useParams<{ id: string }>();\n\n useEffect(() => {\n userStore.getUserDetails(id);\n\n return () => {\n userStore.resetStore();\n }\n\n }, [id]);\n\n if (!userStore.user) return null;\n\n const validation = (yup: YupInterface) => ({\n firstName: yup.string().required('Fornavn skal udfyldes'),\n lastName: yup.string().required('Efternavn skal udfyldes'),\n username: yup.string().required('Brugernavn skal udfyldes'),\n company: yup.string().required('Virksomhedsnavn skal udfyldes'),\n email: yup.string().email('Indtast gyldig e-mailadresse').required('E-mailadresse skal udfyldes'),\n\n password: yup.string().test(\n 'empty-or-6-characters-check',\n 'Adgangskode skal mindst indeholde 6 karakterer/tegn',\n password => !password || password.length >= 6),\n confirmPassword: yup.string().oneOf([yup.ref('password'), null], 'Adgangskoder skal være ens'),\n\n active: yup.boolean(),\n notifyUserWithEmail: yup.boolean(),\n forceSetPassword: yup.boolean(),\n });\n\n const defaultValues = {\n id: userStore.user?.id,\n firstName: userStore.user?.firstname,\n lastName: userStore.user?.lastname,\n username: userStore.user?.username,\n company: userStore.user?.company,\n email: userStore.user?.email,\n active: userStore.user?.active,\n forceSetPassword: userStore.user?.forceSetPassword,\n };\n\n const updateUser = async (formData: UserUpdateInterface) => {\n try {\n await userStore.updateUserDetails(id, formData);\n toast('Brugeren blev opdateret', { type: 'success' });\n } catch (err) {\n errorToast(err, 'Brugeren kunne ikke opdateres');\n }\n }\n\n return (\n
\n
\n
\n

Rediger

\n
\n
\n \n
\n
\n

Bruger data

\n \n {\n !userStore.user.globalAdmin && <>\n

Adgang(e)

\n \n \n
\n
\n
\n
\n \n\n }\n
\n )\n});\n\nexport default PageUserEdit;","import Form from \"components/Forms/Form\";\nimport Input from \"components/Forms/Input\";\nimport SubmitButton from \"components/Forms/SubmitButton\";\nimport { observer } from \"mobx-react-lite\";\nimport { YupInterface } from \"types/YupInterface\";\nimport { ObjectShape } from \"yup/lib/object\";\n\ninterface Props {\n validation: (yupInstance: YupInterface) => ObjectShape,\n onSubmit: any,\n}\n\nconst UserCheckEmailForm = observer((props: Props) => {\n return (\n
\n
\n \n
\n \n
\n
\n
\n )\n});\n\nexport default UserCheckEmailForm;","import BackButton from \"components/BackButton\";\nimport Button from \"components/Button\";\nimport { routes } from \"components/Routes\";\nimport UserCheckEmailForm from \"components/UserCheckEmailForm\";\nimport UserCustomerRoleForm from \"components/UserCustomerRoleForm\";\nimport UserDeclarationForm from \"components/UserDeclarationForm\";\nimport UserForm from \"components/UserForm\";\nimport { errorToast } from \"helpers/ErrorMessage\";\nimport { hasRole } from \"helpers/HasRole\";\nimport { StatusCodes } from \"http-status-codes\";\nimport { observer } from \"mobx-react-lite\";\nimport { useEffect, useState } from \"react\";\nimport { generatePath } from \"react-router-dom\";\nimport { toast } from \"react-toastify\";\nimport { authStore } from \"stores/AuthStore\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { userStore } from \"stores/UserStore\";\nimport { UserInterface } from \"types/UserInterface\";\nimport { UserRoleEnum } from \"types/UserRoleEnum\";\nimport { UserStoreInterface } from \"types/UserStoreInterface\";\nimport { YupInterface } from \"types/YupInterface\";\n\nconst PageUserCreate = observer(() => {\n\n enum CreateUserStatusEnum {\n CheckEmail = 0,\n AssignPermission = 1,\n CreateAsNew = 2,\n }\n\n interface CreateUserState {\n status: CreateUserStatusEnum,\n email: string | null,\n user?: UserInterface | null,\n }\n\n const [createUserState, setCreateUserState] = useState({ status: CreateUserStatusEnum.CheckEmail, email: null, user: null });\n\n useEffect(() => {\n userStore.resetStore();\n }, []);\n\n const storeUserValidation = (yup: YupInterface) => ({\n firstName: yup.string().required('Fornavn skal udfyldes'),\n lastName: yup.string().required('Efternavn skal udfyldes'),\n username: yup.string().required('Brugernavn skal udfyldes'),\n company: yup.string().required('Virksomhedsnavn skal udfyldes'),\n email: yup.string().email('Indtast gyldig e-mailadresse').required('E-mailadresse skal udfyldes'),\n password: yup.string().when('notifyUserWithEmail', {\n is: (notifyUserWithEmail: boolean) => {\n return notifyUserWithEmail === false\n },\n then: yup.string().min(6, 'Adgangskode skal mindst indeholde 6 karakterer/tegn')\n }),\n confirmPassword: yup.string().oneOf([yup.ref('password'), null], 'Adgangskoder skal være ens'),\n active: yup.boolean(),\n notifyUserWithEmail: yup.boolean(),\n });\n\n const storeUser = async (formData: UserStoreInterface) => {\n try {\n const newUser = await userStore.storeUserDetails(formData) as UserInterface | null;\n toast('Brugeren blev oprettet', { type: 'success' });\n if (newUser?.id) {\n navigationStore.redirect(generatePath(routes.pageUserEdit, { id: newUser.id }));\n }\n } catch (err) {\n errorToast(err, 'Brugeren kunne ikke oprettes');\n }\n }\n\n const checkUserEmail = async (formData: { email: string }) => {\n try {\n const existingUser = await userStore.checkUserExistence(formData.email) as UserInterface | null;\n\n // if logged in user is global admin - redirect to edit user page\n if (existingUser && hasRole(authStore.user, [UserRoleEnum.GlobalAdmin])) {\n navigationStore.redirect(generatePath(routes.pageUserEdit, { id: existingUser.id }));\n return;\n }\n\n if (existingUser) {\n try {\n await userStore.getUserDetails(existingUser.id);\n // if logged in user were able to fetch user with roles or declarations - redirect to edit user page\n if (\n (userStore.user?.roles && userStore.user?.roles.length > 0) ||\n (userStore.user?.declarations && userStore.user?.declarations.length > 0)\n ) {\n navigationStore.redirect(generatePath(routes.pageUserEdit, { id: existingUser.id }));\n return;\n }\n } catch (err) {\n // ignore error\n }\n setCreateUserState({ status: CreateUserStatusEnum.AssignPermission, email: formData.email, user: existingUser })\n if (userStore.user) {\n userStore.user.notEditable = true;\n }\n } else {\n setCreateUserState({ status: CreateUserStatusEnum.CreateAsNew, email: formData.email })\n }\n } catch (err: any) {\n if (err?.response?.status === StatusCodes.NOT_FOUND) {\n setCreateUserState({ status: CreateUserStatusEnum.CreateAsNew, email: formData.email })\n } else {\n errorToast(err, 'Der skete en fejl - prøv igen om et øjeblik');\n }\n }\n }\n\n const checkUserEmailValidation = (yup: YupInterface) => ({\n email: yup.string().email('Indtast gyldig e-mailadresse').required('E-mailadresse skal udfyldes'),\n });\n\n return (\n
\n
\n
\n

Tilføj bruger

\n
\n
\n \n
\n
\n {\n createUserState.status === CreateUserStatusEnum.CheckEmail\n && <>\n

Step 1: Indtast e-mailadresse

\n \n \n }\n {\n createUserState.status === CreateUserStatusEnum.CreateAsNew\n && <>\n

Step 2: Indtast bruger data

\n \n
\n

Step 3: Tilføj adgang

\n \n \n
\n \n }\n {\n createUserState.status === CreateUserStatusEnum.AssignPermission\n && <>\n

Step 1: Bruger data

\n \n\n

Step 2: Tilføj adgang

\n \n \n
\n
\n
\n
\n \n }\n\n
\n )\n});\n\nexport default PageUserCreate;","import Button from \"components/Button\";\nimport Form from \"components/Forms/Form\";\nimport Input from \"components/Forms/Input\";\nimport SubmitButton from \"components/Forms/SubmitButton\";\nimport { routes } from \"components/Routes\";\nimport { observer } from \"mobx-react-lite\";\nimport { FieldValues } from \"react-hook-form/dist/types/fields\";\nimport { DefaultValues } from \"react-hook-form/dist/types/form\";\nimport { authStore } from \"stores/AuthStore\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { UserRoleEnum } from \"types/UserRoleEnum\";\nimport { YupInterface } from \"types/YupInterface\";\nimport { ObjectShape } from \"yup/lib/object\";\n\nconst UserProfileForm = observer(\n (props: {\n validation: (yupInstance: YupInterface) => ObjectShape,\n defaultValues: DefaultValues,\n onSubmit: any,\n }) => {\n\n const isGlobalAdmin = () => {\n return authStore.user?.highestRole === UserRoleEnum.GlobalAdmin;\n }\n\n return (\n
\n
\n \n

Detaljer

\n
\n \n \n \n {\n !isGlobalAdmin() && \n }\n \n {\n !isGlobalAdmin() && \n }\n
\n {\n !isGlobalAdmin() &&\n
\n
\n { navigationStore.redirect(routes.pageChangePassword) }}\n />\n
\n
\n \n
\n
\n }\n \n
\n
\n )\n });\n\nexport default UserProfileForm;","import { action, makeObservable, observable } from \"mobx\";\nimport { UserProfileInterface } from \"types/UserProfileInterface\";\nimport { BaseStore } from \"./BaseStore\";\n\nexport class UserProfileStore extends BaseStore {\n userProfile: UserProfileInterface | null = null;\n\n constructor() {\n super();\n makeObservable(this,\n {\n userProfile: observable,\n\n resetStore: action,\n getUserProfile: action,\n updateUserProfile: action,\n }\n );\n }\n\n resetStore = () => {\n this.userProfile = null;\n }\n\n getUserProfile = () => {\n return this.get(`users/me`, `userProfile`);\n }\n\n updateUserProfile = async (formData: UserProfileInterface & { controlPassword?: string }) => {\n this.userProfile = await this.put(`users/me`, formData, {}, true) as UserProfileInterface;\n\n }\n}\n\nexport const userProfileStore = new UserProfileStore();","import BackButton from \"components/BackButton\";\nimport UserProfileForm from \"components/UserProfileForm\";\nimport { errorToast } from \"helpers/ErrorMessage\";\nimport { observer } from \"mobx-react-lite\";\nimport { useEffect } from \"react\";\nimport { toast } from \"react-toastify\";\nimport { userProfileStore } from \"stores/UserProfileStore\";\nimport { UserProfileInterface } from \"types/UserProfileInterface\";\n\nimport { YupInterface } from \"types/YupInterface\";\n\nconst PageUserProfile = observer(() => {\n\n useEffect(() => {\n userProfileStore.getUserProfile();\n\n return () => {\n userProfileStore.resetStore();\n }\n }, []);\n\n if (!userProfileStore.userProfile) return null;\n\n const validation = (yup: YupInterface) => ({\n firstName: yup.string().required('Fornavn skal udfyldes'),\n lastName: yup.string().required('Efternavn skal udfyldes'),\n company: yup.string().required('Virksomhedsnavn skal udfyldes'),\n\n username: yup.string().required('Brugernavn skal udfyldes'),\n email: yup.string().required('Email skal udfyldes'),\n controlPassword: yup.string().when('email', {\n is: (email: string) => {\n return email !== userProfileStore.userProfile?.email\n },\n then: yup.string().required('Adgangskode skal udfyldes ved ændring af email')\n })\n });\n\n const updateUserProfile = async (formData: UserProfileInterface) => {\n try {\n await userProfileStore.updateUserProfile(formData);\n toast('Profilen blev opdateret', { type: 'success' });\n } catch (err) {\n errorToast(err, 'Profilen kunne ikke opdateres');\n }\n }\n\n return (\n
\n
\n
\n

Profil

\n
\n
\n \n
\n
\n \n
\n )\n});\n\nexport default PageUserProfile;","import Button from \"components/Button\";\nimport Form from \"components/Forms/Form\";\nimport Input from \"components/Forms/Input\";\nimport SubmitButton from \"components/Forms/SubmitButton\";\nimport { routes } from \"components/Routes\";\nimport { errorToast } from \"helpers/ErrorMessage\";\nimport { useLocation, useParams } from \"react-router-dom\";\nimport { toast } from \"react-toastify\";\nimport { authStore } from \"stores/AuthStore\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { YupInterface } from \"types/YupInterface\";\n\n// this page handles 3 password changes:\n// - force password change\n// - new login (has token)\n// - reset password (has token)\n// - change current profile password\n\nconst PageResetPassword = () => {\n\n const { token } = useParams<{ token: string | undefined }>();\n const { pathname } = useLocation();\n\n if (token) {\n authStore.resetStore();\n }\n\n const setPasswordValidation = (yup: YupInterface) => ({\n currentPassword: yup.string().min(6, 'Indtast nuværende adgangskode'),\n newPassword: yup.string()\n .test(\n 'empty-or-6-characters-check',\n 'Adgangskode skal mindst indeholde 6 karakterer',\n newPassword => !newPassword || newPassword.length >= 6\n )\n .notOneOf([yup.ref('currentPassword')], 'Nuværende og ny adgangskode må ikke være ens'),\n confirmPassword: yup.string().oneOf([yup.ref('newPassword'), null], 'Ny adgangskode og gentag adgangskode skal være ens'),\n });\n\n const resetPasswordValidation = (yup: YupInterface) => ({\n newPassword: yup.string().min(6, 'Ny adgangskode skal mindst indeholde 6 karakterer'),\n confirmPassword: yup.string().oneOf([yup.ref('newPassword'), null], 'Adgangskoder skal være ens'),\n });\n\n const resetPassword = async (formData: { newPassword: string }) => {\n if (token) {\n try {\n await authStore.resetPassword(token, formData.newPassword);\n toast('Adgangskode blev opdateret', { type: 'success' });\n navigationStore.redirect(routes.pageLogin);\n } catch (err) {\n errorToast(err, 'Adgangskode kunne ikke opdateres');\n }\n }\n }\n\n const setPassword = async (formData: { currentPassword: string, newPassword: string }) => {\n try {\n await authStore.forceSetPassword(formData.currentPassword, formData.newPassword);\n toast('Adgangskode blev opdateret', { type: 'success' });\n await authStore.setLoggedInUser();\n navigationStore.redirect(routes.pageDeclarations);\n } catch (err) {\n errorToast(err, 'Adgangskode kunne ikke opdateres');\n }\n }\n\n const logout = () => {\n authStore.resetStore();\n navigationStore.redirect(routes.pageLogin)\n }\n\n const forceNewPasswordForm = pathname === routes.pageForceNewPasssword;\n\n return (\n \n
Ny adgangskode
\n
\n {\n token || !forceNewPasswordForm\n ? 'Indtast ny adgangskode'\n : 'Adgangskoden skal opdateres - udfyld venligst nedenfor'\n }\n
\n
\n {\n !token && \n }\n \n \n {\n // willingly changing password (go back to profile page)\n (!token && !forceNewPasswordForm) &&
\n \n )\n}\n\nexport default PageResetPassword;","import LoadingIndicator from \"components/LoadingIndicator\";\nimport { routes } from \"components/Routes\";\nimport { ToastContainer } from \"react-toastify\";\nimport { navigationStore } from \"stores/NavigationStore\";\n\nconst LayoutBox = (props: { children: React.ReactNode }) => {\n return (\n
\n
\n
navigationStore.redirect(routes.pageLogin)}>\n \"Logo\"\n
\n
\n {props.children}\n
\n
Teknik- og Miljøforvaltningen | KMC Nordhavn | 33 66 30 70
\n
\n \n \n
\n )\n}\n\nexport default LayoutBox;","import { navigationStore } from \"stores/NavigationStore\";\n\nconst PageNotFound = () => {\n return (\n
\n

Siden blev ikke fundet

\n
\n Gå til hovedsiden - navigationStore.redirect('/')}>klik her\n
\n
\n )\n}\n\nexport default PageNotFound;","import { DeclarationDocumentFlowStatusEnum } from \"types/DeclarationDocumentFlowStatusEnum\";\n\nexport function getFlowStatusText(flowStatus: DeclarationDocumentFlowStatusEnum) {\n switch (flowStatus) {\n case DeclarationDocumentFlowStatusEnum.Request:\n return 'Anmodning';\n case DeclarationDocumentFlowStatusEnum.NotUsed:\n return 'Bruges ikke';\n case DeclarationDocumentFlowStatusEnum.Active:\n return 'Aktiv';\n case DeclarationDocumentFlowStatusEnum.Exceeded:\n return 'Overskredet';\n case DeclarationDocumentFlowStatusEnum.Completed:\n return 'Afsluttet';\n }\n}\n\nexport function getFlowStatusValue(flowStatusText: string) {\n switch (flowStatusText.toLowerCase()) {\n case 'anmodning':\n return DeclarationDocumentFlowStatusEnum.Request\n case 'bruges ikke':\n return DeclarationDocumentFlowStatusEnum.NotUsed\n case 'aktiv':\n return DeclarationDocumentFlowStatusEnum.Active\n case 'overskredet':\n return DeclarationDocumentFlowStatusEnum.Exceeded\n case 'afsluttet':\n return DeclarationDocumentFlowStatusEnum.Completed\n default:\n return DeclarationDocumentFlowStatusEnum.Request\n }\n}\n","import { routes } from \"components/Routes\";\nimport TablePaginationDefault from \"components/TablePaginationDefault\";\nimport { generatePath } from \"react-router\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { DeclarationListItemInterface } from \"types/DeclarationListItemInterface\";\nimport TableHeaderInterface from \"types/TableHeaderInterface\";\nimport { twoDecimals } from \"helpers/NumberHelper\";\nimport { getFlowStatusText } from \"helpers/FlowStatusHelper\";\nimport { DeclarationDocumentFlowStatusEnum } from \"types/DeclarationDocumentFlowStatusEnum\";\nimport { BasePaginationStore } from \"stores/BasePaginationStore\";\n\nconst TablePaginationDeclarations = (props: {paginationStore: BasePaginationStore}) => {\n\n const statusColor = (flowStatus: DeclarationDocumentFlowStatusEnum) => {\n switch (flowStatus) {\n case DeclarationDocumentFlowStatusEnum.Request:\n return 'text-kmc-blue';\n case DeclarationDocumentFlowStatusEnum.NotUsed:\n return 'text-kmc-blue';\n case DeclarationDocumentFlowStatusEnum.Active:\n return 'text-kmc-turk';\n case DeclarationDocumentFlowStatusEnum.Exceeded:\n return 'text-kmc-red';\n case DeclarationDocumentFlowStatusEnum.Completed:\n return 'text-kmc-blue';\n }\n }\n\n const headers = [\n {\n title: 'Sagsnummer',\n accessor: 'no',\n orderColumn: 'no',\n width: '100',\n align: 'left'\n } as TableHeaderInterface,\n {\n title: 'Aftalt mængde',\n accessor: 'declaredQuantity',\n orderColumn: 'declaredQuantity',\n formatter: (value) => { return twoDecimals(value) },\n align: 'right',\n } as TableHeaderInterface,\n {\n title: 'Total vægt',\n accessor: 'weighedInQuantity',\n orderColumn: 'weighedInQuantity',\n formatter: (value) => { return twoDecimals(value) },\n align: 'right',\n } as TableHeaderInterface,\n {\n title: 'Status',\n accessor: 'documentFlowStatus',\n orderColumn: 'documentFlowStatus',\n align: 'right',\n formatter: (value) => {\n return value ? {getFlowStatusText(value)} : '-';\n }\n } as TableHeaderInterface\n ];\n\n const onRowClicked = (declaration: DeclarationListItemInterface) => {\n navigationStore.redirect(generatePath(routes.pageDeclarationDetails, { id: declaration.id }))\n }\n\n return { }}\n rowSelection={true}\n paginationStore={props.paginationStore}\n onRowClicked={(charge) => { onRowClicked(charge) }}\n emptyPlaceholderText='Ingen sager fundet'\n />\n}\n\nexport default TablePaginationDeclarations;","import { BasePaginationStore } from './BasePaginationStore';\n\nexport class DeclarationsSearchPaginationStore extends BasePaginationStore {\n defaultEndpoint = 'declarations';\n}\n\nexport const declarationsSearchPaginationStore = new DeclarationsSearchPaginationStore();","import { observer } from \"mobx-react-lite\";\nimport { toast } from \"react-toastify\";\nimport { BasePaginationStore } from \"stores/BasePaginationStore\";\nimport { downloadTokenStore } from \"stores/DownloadToken\";\nimport { DeclarationInterface } from \"types/DeclarationInterface\";\n\nconst DeclarationsExport = observer((props: { paginationStore: BasePaginationStore }) => {\n\n enum ExportType {\n PDF = 0,\n XLS = 1,\n }\n\n const canExport = () => {\n return props.paginationStore.selectedItems.length > 0\n }\n\n const exportSelected = async (type: ExportType) => {\n if (!canExport()) {\n toast('Ingen sager markeret til eksportering', { type: 'error' })\n return;\n }\n\n // get export form and clear children elements\n const form = document.getElementById('exportForm') as HTMLFormElement;\n while (form?.firstChild) {\n form?.removeChild(form?.firstChild);\n }\n\n // foreach selected item add hidden element to form with item id \n props.paginationStore.selectedItems.forEach((item: DeclarationInterface) => {\n const input = document.createElement(\"input\");\n input.type = 'hidden';\n input.name = 'declarationIds[]';\n input.value = item.id;\n form?.appendChild(input)\n });\n\n // add hidden 'type' element to form\n const input = document.createElement(\"input\");\n input.type = 'hidden';\n input.name = 'type';\n input.value = type.toString();\n form?.appendChild(input)\n\n // create download token and set form url\n const token = await downloadTokenStore.getToken();\n form.action = `${process.env.REACT_APP_API_BASE_URL}/declarations/export?token=${token}&clientKey=${process.env.REACT_APP_CLIENT_KEY}`;\n\n // submit form\n form.submit();\n }\n\n return
\n
\n Eksporter markede til:\n exportSelected(ExportType.PDF)}>PDF\n exportSelected(ExportType.XLS)}>XLS\n
\n \n
\n})\n\nexport default DeclarationsExport;","import FormElementInterface from \"types/FormElementInterface\";\nimport Error from \"components/Forms/Error\";\nimport Label from \"components/Label\";\nimport ReactDatePicker from 'react-datepicker';\nimport 'react-datepicker/dist/react-datepicker.css';\nimport { Controller, useFormContext } from \"react-hook-form\";\n\ninterface Props extends FormElementInterface {\n className?: string,\n}\n\nconst InputDatePicker = (props: Props) => {\n const { register, control } = useFormContext();\n\n return (\n
\n
\n )\n}\n\nexport default InputDatePicker;","import { getFlowStatusText, getFlowStatusValue } from \"helpers/FlowStatusHelper\";\nimport { DeclarationDocumentFlowStatusEnum } from \"types/DeclarationDocumentFlowStatusEnum\";\nimport Select from \"../Select\";\n\ninterface Props {\n name?: string,\n label?: string\n}\n\nconst SelectDeclarationFlowStatus = (props: Props) => {\n const options = [\n {\n id: getFlowStatusValue(getFlowStatusText(DeclarationDocumentFlowStatusEnum.Request)),\n value: getFlowStatusText(DeclarationDocumentFlowStatusEnum.Request)\n },\n // Not in use\n // {\n // id: getFlowStatusValue(getFlowStatusText(DeclarationDocumentFlowStatusEnum.NotUsed)),\n // value: getFlowStatusText(DeclarationDocumentFlowStatusEnum.NotUsed)\n // },\n {\n id: getFlowStatusValue(getFlowStatusText(DeclarationDocumentFlowStatusEnum.Active)),\n value: getFlowStatusText(DeclarationDocumentFlowStatusEnum.Active)\n },\n {\n id: getFlowStatusValue(getFlowStatusText(DeclarationDocumentFlowStatusEnum.Exceeded)),\n value: getFlowStatusText(DeclarationDocumentFlowStatusEnum.Exceeded)\n },\n {\n id: getFlowStatusValue(getFlowStatusText(DeclarationDocumentFlowStatusEnum.Completed)),\n value: getFlowStatusText(DeclarationDocumentFlowStatusEnum.Completed)\n },\n ]\n return (\n \n \n \n \n
\n \n
\n \n \n\n});\n\nexport default DeclarationsFilter;","import TablePaginationDeclarations from \"components/TablePaginationDeclarations\";\nimport { observer } from \"mobx-react-lite\";\nimport { useEffect } from \"react\";\nimport { declarationsSearchPaginationStore } from \"stores/DeclarationsSearchPaginationStore\";\nimport DeclarationsExport from \"../Export\";\nimport DeclarationsFilter from \"../Filter\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport { routes } from \"components/Routes\";\n\nconst PageSearchDeclarations = observer(() => {\n useEffect(() => {\n // reset paginationStore if the last location isn't \"/declarations/:id\"\n const prevLocation = navigationStore.prevLocation();\n if (!prevLocation\n || prevLocation.pathname === routes.pageDeclarationsExpiresSoon\n || prevLocation.pathname.indexOf('/declarations') === -1\n ) {\n declarationsSearchPaginationStore.resetStore();\n }\n }, []);\n\n return
\n
\n

Sager

\n
\n
\n \n
\n \n
\n \n
\n
\n});\n\nexport default PageSearchDeclarations;","import { DeclarationDocumentFlowStatusEnum } from 'types/DeclarationDocumentFlowStatusEnum';\nimport { BasePaginationStore } from './BasePaginationStore';\n\nexport class DeclarationsExpireSoonPaginationStore extends BasePaginationStore {\n defaultEndpoint = `declarations?Status=${DeclarationDocumentFlowStatusEnum.Active}&DaysToExceeded=5&orderBy=expirationDate&orderDesc=false`;\n}\n\nexport const declarationsExpireSoonPaginationStore = new DeclarationsExpireSoonPaginationStore();","import TablePaginationDeclarations from \"components/TablePaginationDeclarations\";\nimport { observer } from \"mobx-react-lite\";\nimport { useEffect } from \"react\";\nimport { declarationsExpireSoonPaginationStore } from \"stores/DeclarationsExpireSoonPaginationStore\";\nimport DeclarationsExport from \"../Export\";\n\nconst PageExpireSoonDeclarations = observer(() => {\n\n useEffect(() => {\n return () => {\n declarationsExpireSoonPaginationStore.resetStore();\n }\n });\n\n return
\n
\n

Lukkes snart

\n
Sager som overskrider kørselsperiode inden for de næste 5 dage og dermed snart lukkes
\n
\n
\n \n
\n \n
\n
\n});\n\nexport default PageExpireSoonDeclarations;","import { Redirect, Route, Router, Switch } from \"react-router-dom\";\nimport Layout from \"components/Layout\";\nimport ScrollToTopOnPageChange from \"components/ScrollToTopOnPageChange\";\nimport PageLogin from \"components/PageLogin\";\nimport { observer } from \"mobx-react-lite\";\nimport { navigationStore } from \"stores/NavigationStore\";\nimport PageForgotPassword from \"components/PageForgotPassword\";\nimport PageUsers from \"components/PageUsers\";\nimport PageDeclarationDetails from \"components/PageDeclarationDetails\";\nimport PageLoginAdmin from \"components/PageLoginAdmin\";\nimport PageUserEdit from \"components/PageUserEdit\";\nimport PageUserCreate from \"components/PageUserCreate\";\nimport PageUserProfile from \"components/PageUserProfile\";\nimport PageResetPassword from \"components/PageResetPassword\";\nimport LayoutBox from \"components/LayoutBox\";\nimport PageNotFound from \"components/PageNotFound\";\nimport PageSearchDeclarations from \"components/PageDeclarations/PageSearch\";\nimport PageExpireSoonDeclarations from \"components/PageDeclarations/PageExpireSoon\";\nimport { UserRoleEnum } from \"types/UserRoleEnum\";\nimport { hasRole } from \"helpers/HasRole\";\nimport { authStore } from \"stores/AuthStore\";\nimport { UserInterface } from \"types/UserInterface\";\nimport { baseRequestStore } from \"stores/BaseRequestStore\";\n\nexport const routes = {\n root: '/',\n\n // declarations\n pageDeclarations: '/declarations',\n pageDeclarationDetails: '/declarations/:id',\n pageDeclarationsExpiresSoon: '/declarations/expires-soon',\n\n // users\n pageUsers: '/users',\n pageUserCreate: '/users/create',\n pageUserEdit: '/users/:id',\n pageUserProfile: '/profile',\n\n // auth\n pageLogin: '/login',\n pageForgotPassword: '/forgot-password', // form to request password change\n pageResetPassword: '/reset-password/:token', // reset password by token\n pageForceNewPasssword: '/new-password', // force user to change password\n pageChangePassword: '/change-password', // willingly profile change password\n pageNewLogin: '/new-login/:token', // force new user to change password\n\n // azure ad auth\n pageAdminLogin: '/login/admin',\n\n // page not found\n pageNotFound: '/not-found',\n}\n\n// check if user matches logged in critera\nconst isLoggedIn = (user: UserInterface | null): boolean => {\n const isValid = user?.highestRole !== undefined\n && user?.highestRole >= UserRoleEnum.User\n && user.forceSetPassword === false;\n return !!isValid;\n}\n\n// check if user matches a logged in user that needs password change\nconst isLoggedInForPasswordChange = (user: UserInterface | null): boolean => {\n const isValid = user?.highestRole !== undefined\n && user?.highestRole >= UserRoleEnum.User\n && user.forceSetPassword;\n return !!isValid;\n}\n\ninterface RouteInterface {\n name: string,\n path: string | string[],\n accessRule?: any,\n component?: any,\n layout: React.ReactNode\n}\n\nexport class RouterRoutes {\n static get = (user: UserInterface | null): RouteInterface[] => {\n return [\n {\n name: 'declarations-search',\n path: [routes.pageDeclarations],\n accessRule: isLoggedIn(user),\n component: PageSearchDeclarations,\n layout: Layout\n },\n {\n name: 'declarations-expire-soon',\n path: routes.pageDeclarationsExpiresSoon,\n accessRule: isLoggedIn(user),\n component: PageExpireSoonDeclarations,\n layout: Layout\n },\n {\n name: 'declaration-details',\n path: routes.pageDeclarationDetails,\n accessRule: isLoggedIn(user),\n component: PageDeclarationDetails,\n layout: Layout\n },\n {\n name: 'user-profile',\n path: routes.pageUserProfile,\n accessRule: isLoggedIn(user),\n component: PageUserProfile,\n layout: Layout\n },\n {\n name: 'users',\n path: routes.pageUsers,\n accessRule: isLoggedIn(user) && hasRole(user, [UserRoleEnum.GlobalAdmin, UserRoleEnum.SuperUser]),\n component: PageUsers,\n layout: Layout\n },\n {\n name: 'user-create',\n path: routes.pageUserCreate,\n accessRule: isLoggedIn(user) && hasRole(user, [UserRoleEnum.GlobalAdmin, UserRoleEnum.SuperUser]),\n component: PageUserCreate,\n layout: Layout\n },\n {\n name: 'user-details',\n path: routes.pageUserEdit,\n accessRule: isLoggedIn(user) && hasRole(user, [UserRoleEnum.GlobalAdmin, UserRoleEnum.SuperUser]),\n component: PageUserEdit,\n layout: Layout\n },\n {\n name: 'login',\n path: routes.pageLogin,\n accessRule: undefined, // no login required\n component: PageLogin,\n layout: LayoutBox\n },\n {\n name: 'login-adfs',\n path: routes.pageAdminLogin,\n accessRule: undefined, // no login required\n component: PageLoginAdmin,\n layout: LayoutBox\n },\n {\n name: 'forgot-password',\n path: routes.pageForgotPassword,\n accessRule: undefined, // no login required\n component: PageForgotPassword,\n layout: LayoutBox\n },\n {\n name: 'reset-password',\n path: routes.pageResetPassword,\n accessRule: undefined, // no login required\n component: PageResetPassword,\n layout: LayoutBox\n },\n {\n name: 'login-new',\n path: routes.pageNewLogin,\n accessRule: undefined, // no login required\n component: PageResetPassword,\n layout: LayoutBox\n },\n {\n name: 'force-password-change',\n path: routes.pageForceNewPasssword,\n accessRule: isLoggedInForPasswordChange(user) && hasRole(user, [UserRoleEnum.SuperUser, UserRoleEnum.User]),\n component: PageResetPassword,\n layout: LayoutBox\n },\n {\n name: 'change-password',\n path: routes.pageChangePassword,\n accessRule: isLoggedIn(user) && hasRole(user, [UserRoleEnum.SuperUser, UserRoleEnum.User]),\n component: PageResetPassword,\n layout: LayoutBox\n }\n ]\n }\n\n // fetch routes matching \"private\" Layout\n static getPrivateRoutes = (user: UserInterface | null) => {\n return RouterRoutes.get(user)\n .filter(route => route.layout === Layout)\n .filter(route => route.accessRule === undefined || route.accessRule === true);\n }\n\n // extract paths from routes matching \"private\" Layout \n static getPrivateRoutesPaths = (user: UserInterface | null) => {\n return this.getPrivateRoutes(user).map(route => {\n return route.path;\n }).flat(2);\n }\n\n // fetch routes matching \"public/box\" Layout\n static getPublicRoutes = (user: UserInterface | null) => {\n return RouterRoutes.get(user)\n .filter(route => route.layout === LayoutBox)\n .filter(route => route.accessRule === undefined || route.accessRule === true);\n }\n\n // extract paths from routesmatching \"public/box\" Layout\n static getPublicRoutesPaths = (user: UserInterface | null) => {\n return this.getPublicRoutes(user).map(route => {\n return route.path;\n }).flat(2);\n }\n}\n\n\nconst Routes = observer(() => {\n\n const privateRoutes = RouterRoutes.getPrivateRoutes(authStore.user);\n let privateRoutePaths = RouterRoutes.getPrivateRoutesPaths(authStore.user);\n // console.log(privateRoutePaths);\n\n const publicRoutes = RouterRoutes.getPublicRoutes(authStore.user);\n let publicRoutePaths = RouterRoutes.getPublicRoutesPaths(authStore.user);\n // console.log(publicRoutePaths);\n\n return (\n \n \n\n \n {\n // if user is logged in - redirect to declarations \n isLoggedIn(authStore.user) && \n }\n {\n // if user is logged in for password change - redirect to password change page\n !isLoggedIn(authStore.user) && isLoggedInForPasswordChange(authStore.user) && \n }\n {\n // if user is not logged in at all - redirect to login\n !isLoggedIn(authStore.user) && !isLoggedInForPasswordChange(authStore.user) && \n }\n \n \n {/* Public routes and layout */}\n \n \n \n {\n publicRoutes.map((route, index) => {\n return \n })\n }\n \n \n \n {/* Private routes and layout */}\n \n {\n // redirect if missing bearer token in private routes\n !baseRequestStore.bearerToken && \n }\n {\n // redirect if user should be forced to change password\n isLoggedInForPasswordChange(authStore.user) && \n }\n \n \n {\n privateRoutes.map((route, index) => {\n return \n })\n }\n \n \n \n \n \n \n \n \n \n \n )\n})\n\nexport default Routes;","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport Routes from 'components/Routes';\nimport 'styles/global.scss';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\n//reportWebVitals();\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"style_wrapper__3o3R6\",\"top\":\"style_top__2LSZt\",\"mainBar\":\"style_mainBar__87199\",\"mainBarContent\":\"style_mainBarContent__DjsnS\",\"logo\":\"style_logo__3T8Tu\",\"mainNavigation\":\"style_mainNavigation__9CnhO\",\"profile\":\"style_profile__3XhiC\",\"middle\":\"style_middle__ji47M\",\"content\":\"style_content__2BhmI\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"style_wrapper__ThZGH\",\"content\":\"style_content__1nENq\",\"menuHidden\":\"style_menuHidden__3hodg\",\"menuActive\":\"style_menuActive__iME3E\",\"menuItem\":\"style_menuItem__1dkJs\",\"menuItemActive\":\"style_menuItemActive__1pOU6\",\"wrapperActive\":\"style_wrapperActive__QcKmm\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"subBar\":\"style_subBar__d_olZ\",\"subBarContent\":\"style_subBarContent__wR6MQ\",\"subNavigation\":\"style_subNavigation__RbRfR\",\"badge\":\"style_badge__2JDiG\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"navigationLink\":\"style_navigationLink__xnl2X\",\"navigationLinkSub\":\"style_navigationLinkSub__3K4fP\",\"navigationLinkActive\":\"style_navigationLinkActive__39QV6\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modal\":\"style_modal__2m6kQ\",\"modalShow\":\"style_modalShow__36wBo\",\"modalHide\":\"style_modalHide__1FODs\",\"modalMain\":\"style_modalMain__1HVy8\"};"],"sourceRoot":""}