{"version":3,"file":"main-CD_7rUYk.js","sources":["C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Services/Guide/IGuideService.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Elements/Form.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Shared/SplashPage.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Account/Login/Store.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Account/Login/Styles.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Shared/SplashContent.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Services/API/Account/GetLoginInfo.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Account/Login/ChildComponents/ExternalLoginProvider.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Account/Login/Component.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Account/ExternalLogin/Store.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Account/ExternalLogin/Component.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Account/Logout/Component.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Account/AccessDenied/Customization.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Account/AccessDenied/Styles.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Shared/UserInfoCard.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Account/AccessDenied/Component.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Home/NotFound/Customization.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Home/NotFound/Styles.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Home/NotFound/Component.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/iRadUI/ClientApp/Components/Pages/Account/Login.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Account/Register/Store.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Account/Register/Customization.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Services/API/Account/GetRegister.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Services/API/Account/PostRegister.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Account/Register/Styles.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Account/Register/Component.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/iRadUI/Resources/Logos/SoPLogoMask.svg?asset","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/iRadUI/ClientApp/Components/Pages/Account/Register.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Composite/SessionCookieLink/index.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Home/Start/Customization.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Home/Start/Styles.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Types/IdentifierConverter.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Home/Start/Functions.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Home/Start/Store.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Services/API/Session/GetStartInfo.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Services/API/Subject/GetSubjectByIdentifier.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Services/API/Subject/CreateSubject.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Services/API/Subject/EnsureSubject.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Services/API/Session/CreateSession.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Services/API/Session/GetSessions.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Utilities/ExtIntractionIdentifier.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Composite/PromptOverlay/Component.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Services/API/Session/ResumeSession.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Composite/VersionInfo/index.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Home/Start/Component.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/iRadUI/ClientApp/Components/Pages/Home/Start/index.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Services/API/DataGathering/GetOperation.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Services/API/DataGathering/Model.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/iRadUI/ClientApp/Components/Pages/Tink/Store.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/iRadUI/ClientApp/Components/Pages/Tink/Component.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Account/ExternalLoginByCookieCallback/Component.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/iRadUI/ClientApp/Components/Pages/Home/SessionInvite/Store.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/iRadUI/ClientApp/Services/API/Invite/PostAcceptInvite.ts","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/iRadUI/ClientApp/Components/Pages/Home/SessionInvite/Component.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/ConsilioUIBase/ClientApp/Components/Pages/Shared/PageRoute.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/iRadUI/ClientApp/MainRoutes.tsx","C:/4D73AEDF-AC74-411B-AA37-245506DBADBC/buildagentv2a03-64499db45f-fgdjp/3/s/Source/iRadUI/ClientApp/Main.tsx"],"sourcesContent":["\r\n// ----------------------------------------------------------------------------------------------------\r\n// Linting\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\nimport { TransitionStyle } from \"~base/Styling/Transitions/TransitionGroupTypes\";\r\nimport { ApiError } from \"../API\";\r\nimport { StepResponse } from \"../API/Steps/Model\";\r\n\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\n// Used by mock implementation\r\n/* eslint-disable @typescript-eslint/no-empty-function */\r\n \r\n\r\nexport type UIPart = \"Navigation\" | \"BackButton\" | \"ForwardButton\" | \"History\";\r\n\r\nexport interface IGuideService {\r\n disableUI(uiPart: UIPart): void;\r\n enableUI(uiPart: UIPart): void;\r\n setStep(stepData: StepResponse, readOnlyFromStep?: number): void;\r\n focusElement(root?: React.MutableRefObject): void;\r\n restoreLastFocus(): void;\r\n reorderTabs(root?: React.MutableRefObject): void;\r\n unregisterPostAction(id: string);\r\n clearPostAction(id: string);\r\n suppressPostAction(id: string);\r\n registerPostAction(id: string, value: unknown, filter: () => boolean, dispatch: React.Dispatch);\r\n getDispRes(): unknown;\r\n updateNextButtonState(value: boolean);\r\n setStepInput(i: any, a?:any);\r\n /**\r\n * Navigate to an existing step.\r\n * @param stepNumber Step to navigate to.\r\n * @param transition Transition to use instead of the default.\r\n */\r\n goToStep(stepNumber: number, transition?: TransitionStyle): void;\r\n listServices(sessionID: number, stepNumber: number);\r\n postService(sessionID: number, stepNumber: number, serviceName: string, input: I)\r\n frameworkVersion: number\r\n setClientError: (error: ApiError) => void;\r\n}\r\n\r\nexport const guideServiceMock = {\r\n focusElement: (root?: React.MutableRefObject) => { },\r\n setStep: (stepData: StepResponse, readOnlyFromStep?: number) => { },\r\n restoreLastFocus: () => { },\r\n reorderTabs: (root?: React.MutableRefObject) => { },\r\n unregisterPostAction: (id: string) => { },\r\n clearPostAction:(id: string) => { },\r\n suppressPostAction:(id: string) => { },\r\n registerPostAction: (id: string, value: any, filter: () => boolean, dispatch: React.Dispatch) => { },\r\n getDispRes: () => { },\r\n updateNextButtonState: (value: boolean) => { },\r\n setStepInput: (i: unknown) => { },\r\n disableUI: (uiPart: UIPart) => { },\r\n frameworkVersion: 2\r\n} as IGuideService;\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Data model - Views\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\nexport interface ViewSpec {\r\n __consilioType__: string;\r\n guideStegID: string;\r\n guideStegSubID?: any;\r\n guideStegÅteranvänd: boolean;\r\n processPanelID: string;\r\n processPanelStegID: number;\r\n metaPanelID: string;\r\n metaPanelData: any;\r\n procentKlart: number;\r\n uppdaterad: boolean;\r\n}\r\n\r\nexport interface NavigationSpec {\r\n SessionID: number;\r\n BranchNumber: number;\r\n StepNumber: number;\r\n ReadOnlyFromStepNumber: number;\r\n SessionBranches: any;\r\n}\r\n\r\nexport interface InputSpec {\r\n GLIIA: string;\r\n Type: string;\r\n FromThisSessionFlag: boolean;\r\n FromThisBranchFlag: boolean;\r\n}\r\n\r\nexport interface TraceInfo {\r\n WatchedMembers?: any;\r\n}\r\n\r\nexport interface DispRes {\r\n DispResultCode: string;\r\n revision: string;\r\n ViewID: string;\r\n SubViewID?: any;\r\n Locale: string;\r\n ViewSpec: ViewSpec;\r\n NavigationSpec: NavigationSpec;\r\n InputSpec: InputSpec;\r\n o: any;\r\n i: any;\r\n iDef: any;\r\n iDefPrec: number;\r\n iPrev: any;\r\n iPrevPrec?: any;\r\n InfPartContributions?: any;\r\n RequestVerificationToken: string;\r\n TraceInfo: TraceInfo;\r\n}\r\n\r\nexport interface ConsilioBaseType {\r\n __consilioType__: string;\r\n revision: string;\r\n}\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Data model - API\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\nexport interface GuideApiResponseBase {\r\n statusCode: number\r\n}\r\n\r\nexport interface GuideServicesGetResponse extends GuideApiResponseBase {\r\n\r\n _links: any;\r\n _embedded: any;\r\n offset: number;\r\n limit: number;\r\n totalSize: number;\r\n items: Array;\r\n}\r\n\r\nexport interface Service {\r\n ServiceName: string;\r\n InputParameters: Array\r\n}\r\n\r\nexport interface ServiceParam {\r\n ParameterName: string;\r\n}\r\n\r\nexport interface GuideServicesPostResponse extends GuideApiResponseBase {\r\n\r\n _links: any;\r\n _embedded: any;\r\n Input: I;\r\n Output: O;\r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// The form component allows us to wrap a set of input fields and capture any button or form submit \r\n// (through i.e. in input field) event using a singel onSubmit action on the form.\r\n\r\nimport * as React from 'react';\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Props\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\ninterface FormProps {\r\n onSubmit: (e: React.FormEvent) => void\r\n isValid?: boolean\r\n className?: string\r\n children?: React.ReactNode\r\n}\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Component\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\nconst Form: React.FunctionComponent = ({ onSubmit, children, className, isValid = true }) => {\r\n\r\n const formRef = React.useRef(undefined);\r\n\r\n const onFormSubmit = (e: React.FormEvent) => {\r\n\r\n e.preventDefault();\r\n if (isValid) {\r\n const formElem = e.target as HTMLFormElement;\r\n if (formElem.contains(document.activeElement)) {\r\n\r\n const submitActive = (document.activeElement as HTMLInputElement)?.type == \"submit\";\r\n if (submitActive) {\r\n\r\n onSubmit(e);\r\n }\r\n else {\r\n\r\n (document.activeElement as HTMLElement)?.blur();\r\n const submitButton: HTMLButtonElement = formRef.current.querySelector('[type=\"submit\"]');\r\n setTimeout(() => submitButton.click(), 0);\r\n }\r\n }\r\n else {\r\n onSubmit(e);\r\n }\r\n }\r\n }\r\n\r\n return
onFormSubmit(x)}>{children}
;\r\n};\r\n\r\nexport default Form;\r\nexport { Form }\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// An application page with centered content.\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Imports\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\nimport { applyThemeStyles } from '~base/Styling';\r\nimport * as React from 'react';\r\nimport { createUseStyles, useTheme } from 'react-jss';\r\nimport { JssClass } from '~base/Styling';\r\nimport { ConsilioBaseTheme } from '~base/Styling/ConsilioTheme';\r\nimport { CenterContent } from '~base/Components/Layout/CenterContent';\r\nimport { PageLoading } from './PageLoading';\r\nimport { LoadingPinsColor } from '~base/Components/Composite/LoadingPins/Types';\r\nimport { useTransitionStyles } from '~base/Styling/Transitions/TransitionGroup';\r\nimport { useGlobalStyles } from './GlobalStyles';\r\nimport { useServerContext } from '~base/Services/ServerContext';\r\nimport { User } from '~base/Services/API/Account/Model';\r\nimport { useAdaptiveViewport } from '~base/Utilities/AdaptiveViewport';\r\nimport { textCodesAreStored } from '~base/Services/TextCodeService';\r\nimport { ConsilioSingleTransition } from '~base/Styling/Transitions/ConsilioSingleTransition';\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Props\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\ninterface SplashPageProps {\r\n isLoading: boolean,\r\n showSplashScreen: boolean,\r\n splashScreen?: React.ReactNode\r\n children?: React.ReactNode\r\n}\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Styling\r\n//-------------------------------------------------------------------------------------\r\n\r\n\r\nexport interface ConsilioThemePagesSharedSplashPageStyles {\r\n splashScreen?: JssClass\r\n background?: JssClass\r\n backgroundImage?: React.ReactNode\r\n backgroundImageFunc?: (user?: User) => React.ReactNode\r\n loadingPinsStyle?: LoadingPinsColor\r\n loadingContent?: JssClass\r\n\r\n}\r\n\r\n\r\nconst useStyles = createUseStyles((theme: ConsilioBaseTheme) => {\r\n\r\n return {\r\n background: applyThemeStyles(theme.components.pages.shared.splashPage.background\r\n , {\r\n\r\n backgroundImage: (user: User) => {\r\n\r\n const backgroundImageFromFunc = theme.components.pages.shared.splashPage.backgroundImageFunc && `url(\"${theme.components.pages.shared.splashPage.backgroundImageFunc(user)}\")`;\r\n const backgroundImage = theme.components.pages.shared.splashPage.backgroundImage ? `url(\"${theme.components.pages.shared.splashPage.backgroundImage}\")` : null;\r\n\r\n return backgroundImageFromFunc ? backgroundImageFromFunc : backgroundImage\r\n },\r\n }),\r\n loadingContent: {\r\n visibility: \"hidden\"\r\n }\r\n\r\n }\r\n}, { name: \"SplashPage\" });\r\n\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Component\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\nconst SplashPage: React.FunctionComponent = ({ children, isLoading, showSplashScreen, splashScreen }) => {\r\n\r\n const theme: ConsilioBaseTheme = useTheme();\r\n useGlobalStyles(theme);\r\n useAdaptiveViewport();\r\n const [fadeClasses, timeout] = useTransitionStyles(\"FadeIn\", false);\r\n const userContext = useServerContext();\r\n\r\n const textCodesLoaded = textCodesAreStored();\r\n const pageIsLoading = isLoading;\r\n\r\n const classes = useStyles(userContext.user as unknown);\r\n\r\n const animationDivStyles = textCodesLoaded ? \"\" : classes.loadingContent;\r\n\r\n return (\r\n <>\r\n \r\n \r\n
{children}
\r\n \r\n
\r\n \r\n {showSplashScreen && textCodesLoaded && splashScreen}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default SplashPage;\r\nexport { SplashPage }\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\nimport { TokenRequestMode, TokenRequestStatus } from \"~base/Services/API/AuthToken\"\r\nimport { GetLoginInfoResponse } from \"~base/Services/API/Account/Model\"\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// State\r\n//-------------------------------------------------------------------------------------\r\n\r\ntype UpdateFormCredentials = { type: \"updateFormCredentials\", username: string, password: string }\r\ntype TryFormLogin = { type: \"tryFormLogin\" }\r\ntype ToggleLoginPanel = { type: \"toggleLoginPanel\", show: boolean }\r\ntype CompletedLoginAttempt = { type: \"completedLoginAttempt\", requestMode: TokenRequestMode, status: TokenRequestStatus, errorMessage: string, redirectUri: string, interactiveLogin?: boolean }\r\ntype RequestAspxSession = { type: \"requestServerSession\" }\r\ntype Navigate = { type: \"navigate\", uri: string, replace?: boolean }\r\ntype SetFetchError = { type: \"fetchError\", message: string }\r\ntype SetLoginInfo = { type: \"setLoginInfo\", data: GetLoginInfoResponse }\r\n\r\nexport type LoginPageViewAction =\r\n UpdateFormCredentials\r\n | ToggleLoginPanel\r\n | CompletedLoginAttempt\r\n | TryFormLogin\r\n | RequestAspxSession\r\n | Navigate\r\n | SetFetchError\r\n | SetLoginInfo;\r\n\r\n\r\nexport interface LoginPageState {\r\n\r\n clearToken: boolean\r\n username: string\r\n password: string\r\n showLoginPanel: boolean\r\n tryResolveFromAppStorage: boolean\r\n tryResolveFromCookie: boolean\r\n tryFormLogin: boolean\r\n errorMessage: string\r\n isLoading: boolean\r\n requestServerSession: boolean\r\n navigateUri: string\r\n isNavigating?: boolean\r\n interactiveLogin?: boolean\r\n loginInfo?: GetLoginInfoResponse\r\n}\r\n\r\n\r\nexport function reducer(state: LoginPageState, action: LoginPageViewAction): LoginPageState {\r\n\r\n switch (action.type) {\r\n\r\n case \"updateFormCredentials\": {\r\n return { ...state, username: action.username, password: action.password };\r\n }\r\n case \"toggleLoginPanel\": {\r\n return { ...state, showLoginPanel: action.show };\r\n }\r\n case \"completedLoginAttempt\": {\r\n\r\n return {\r\n ...state,\r\n tryResolveFromAppStorage: false,\r\n tryResolveFromCookie: action.requestMode == \"ApplicationStorage\" && action.status == \"Failed\" ? state.tryResolveFromCookie : false,\r\n tryFormLogin: false,\r\n requestServerSession: false,\r\n isLoading: action.redirectUri != null,\r\n navigateUri: action.redirectUri,\r\n errorMessage: action.errorMessage,\r\n clearToken: false,\r\n interactiveLogin: state.interactiveLogin || action.requestMode === \"Forms\",\r\n };\r\n }\r\n case \"tryFormLogin\": {\r\n return { ...state, tryFormLogin: true, errorMessage: null };\r\n }\r\n case \"requestServerSession\": {\r\n return { ...state, isLoading: true, requestServerSession: true };\r\n }\r\n case \"navigate\": {\r\n return { ...state, isLoading: true, navigateUri: action.uri, isNavigating: true };\r\n }\r\n case \"fetchError\": {\r\n return {\r\n ...state,\r\n errorMessage: action.message\r\n }\r\n }\r\n case \"setLoginInfo\": {\r\n return {\r\n ...state,\r\n loginInfo: action.data\r\n }\r\n }\r\n }\r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport { JssClass, applyThemeStyles } from '~base/Styling';\r\nimport { createUseStyles } from 'react-jss';\r\nimport { ConsilioBaseTheme } from '~base/Styling/ConsilioTheme';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Styling\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface LoginPageClasses {\r\n splashButton: string\r\n loginButton: string\r\n loginTypeSeparator: string\r\n}\r\n\r\nexport interface LoginPageStyles {\r\n splashButton?: JssClass\r\n loginButton?: JssClass\r\n loginTypeSeparator: string\r\n}\r\n\r\nexport const useStyles = (customStyles: LoginPageStyles): LoginPageClasses =>\r\n createUseStyles((theme: ConsilioBaseTheme) => ({\r\n splashButton: applyThemeStyles(theme.components.pages.shared.splashPage.splashScreen, applyThemeStyles(customStyles?.splashButton, {\r\n \r\n })),\r\n loginButton: applyThemeStyles(customStyles?.loginButton, {\r\n \r\n }),\r\n loginTypeSeparator: { \r\n width: \"100%\",\r\n marginTop: \"10px\",\r\n marginBottom: \"10px\"\r\n }\r\n }))();","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// A component for the content section of a splash page.\r\n\r\nimport { applyThemeStyles } from '~base/Styling';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { createUseStyles } from 'react-jss';\r\nimport { JssClass } from '~base/Styling';\r\nimport { ConsilioBaseTheme } from '~base/Styling/ConsilioTheme';\r\nimport { RouteLink } from '~base/Components/Elements/Link';\r\nimport { Icon } from '~base/Components/Elements/Icon';\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Props\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\ninterface SplashContentProps {\r\n closeRouteUri?: string\r\n close?: React.ReactNode\r\n header: React.ReactNode\r\n children: React.ReactNode\r\n footer: React.ReactNode\r\n constWidth?: boolean\r\n}\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Styling\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface ConsilioThemePagesSharedSplashContentStyles {\r\n\r\n separator?: JssClass\r\n headerSeparator?: JssClass\r\n allContent?: JssClass\r\n allContentConstWidth?: JssClass\r\n headerContent?: JssClass\r\n mainContent?: JssClass\r\n footerContent?: JssClass\r\n closeButton?: JssClass\r\n closeIcon?: JssClass\r\n}\r\n\r\nconst useStyles = createUseStyles((theme: ConsilioBaseTheme) => ({\r\n\r\n allContent: applyThemeStyles(theme.components.pages.shared.splashContent.allContent\r, { \r\n position: \"relative\",\r\n background: \"#FFF\",\r\n maxWidth: \"340px\",\r\n }),\r\n\r\n allContentConstWidth: applyThemeStyles(theme.components.pages.shared.splashContent.allContentConstWidth\r, {\r\n width: \"340px\",\r\n }),\r\n\r\n separator: applyThemeStyles(theme.components.pages.shared.splashContent.separator\r, {\r\n margin: \"20px 36px\",\r\n height: \"1px\",\r\n background: \"#e1e1e1\",\r\n border: \"none\",\r\n }),\r\n\r\n headerSeparator: applyThemeStyles(theme.components.pages.shared.splashContent.headerSeparator\r, {\r\n /*display: \"none\",*/\r\n }),\r\n headerContent: applyThemeStyles(theme.components.pages.shared.splashContent.headerContent\r, {\r\n\r\n paddingTop: \"1px\",\r\n }),\r\n\r\n mainContent: applyThemeStyles(theme.components.pages.shared.splashContent.mainContent\r, {\r\n background: \"#FFF\",\r\n padding: \"0px 25px 0px 25px\",\r\n }),\r\n\r\n footerContent: applyThemeStyles(theme.components.pages.shared.splashContent.footerContent\r, {\r\n background: \"#F7F7F7\",\r\n padding: \"25px\",\r\n }),\r\n closeButton: applyThemeStyles(theme.components.pages.shared.splashContent.closeButton\r, {\r\n top: 0,\r\n right: 0,\r\n position: \"absolute\",\r\n padding: \"8px\",\r\n borderTopRightRadius: \"5px\",\r\n borderBottomLeftRadius: \"5px\",\r\n backgroundColor: \"#F7F7F7\",\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n boxSizing: \"border-box\",\r\n marginRight: \"8px\",\r\n height: \"34px\",\r\n width: \"34px\",\r\n }),\r\n\r\n closeIcon: applyThemeStyles(theme.components.pages.shared.splashContent.closeIcon\r, {\r\n height: \"30px\",\r\n width: \"30px\",\r\n \r\n })\r\n}), { name: \"SplashContent\" });\r\n\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Component\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\nconst SplashContent: React.FunctionComponent = ({ header, children, footer, closeRouteUri, close, constWidth = false }) => {\r\n \r\n const classes = useStyles();\r\n return
\r\n\r\n
\r\n {header}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {children}\r\n
\r\n\r\n
\r\n {footer}\r\n
\r\n\r\n {closeRouteUri && }\r\n {close &&
{close}
}\r\n
;\r\n};\r\n\r\nexport default SplashContent;\r\nexport { SplashContent }\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as api from \"~base/Services/API\";\r\nimport * as accountModel from \"~base/Services/API/Account/Model\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Http Contract\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst uri = (tenantName?: string): string => {\r\n\r\n let uri = \"api/account/v1/user/login-info\";\r\n\r\n if (tenantName) {\r\n uri += `?tenantName=${encodeURIComponent(tenantName)}`\r\n }\r\n\r\n return uri;\r\n}\r\n\r\nconst method = \"GET\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Types\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface GetLoginInfoContext {\r\n tenantName: string\r\n}\r\n\r\ninterface GetLoginInfoProps extends GetLoginInfoContext, api.ApiHookBaseProps {} \r\n\r\n//-------------------------------------------------------------------------------------\r\n// API Hook\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport function useGetLoginInfo(props: GetLoginInfoProps): [boolean, (params: GetLoginInfoContext) => Promise] {\r\n\r\n const apiParams: api.ApiHookProps = {\r\n ...props,\r\n uri: uri(props.tenantName),\r\n method: method,\r\n };\r\n\r\n const [loading, invoker] = api.useApi(apiParams);\r\n return [loading, (params: GetLoginInfoContext) => invoker(uri(), undefined)];\r\n}\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// The default control for an external login provider.\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport { createUseStyles } from 'react-jss';\r\nimport React from \"react\"\r\nimport { ActionLink, RouteLink } from \"~base/Components/Elements/Link\"\r\nimport { LoginPageCustomizations } from \"../Customization\"\r\nimport { ConsilioBaseTheme } from \"~base/Styling/ConsilioTheme\"\r\nimport Button from '~base/Components/Elements/Button';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Props\r\n//-------------------------------------------------------------------------------------\r\n\r\n\r\ninterface ExternalLoginProviderProps {\r\n\r\n name: string\r\n customizations: LoginPageCustomizations\r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Component\r\n//-------------------------------------------------------------------------------------\r\n\r\n\r\nexport const ExternalLoginProvider: React.FunctionComponent = ({ name, customizations }) => {\r\n\r\n const classes = useAdditionalStyles(customizations);\r\n\r\n const separator = window.location.href.includes(\"?\") ? \"&\" : \"?\";\r\n const target = window.location.href + separator + \"provider=\" + name;\r\n\r\n const control = customizations.externalLoginControls?.[name];\r\n\r\n if (control) {\r\n return control;\r\n }\r\n\r\n const displayName = customizations.externalLoginDisplayNames?.[name] ?? name;\r\n\r\n return \r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Styles\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst useAdditionalStyles = (customizations?: LoginPageCustomizations) =>\r\n createUseStyles((theme: ConsilioBaseTheme) => {\r\n\r\n return {\r\n button: {\r\n marginBottom: \"20px\",\r\n minWidth: \"306px\"\r\n }\r\n }\r\n }, { name: \"ExternalLoginProvider\" })();\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// The default login page. This page handles login through form username/password, loading of credentials\r\n// from existing authentication token and loading of credentials from server side session (used by most\r\n// SSO solutions).\r\n\r\n// Can be tested for all customers. It's the default page when not yet authenticated.\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { useSearchParams } from 'react-router-dom';\r\nimport classnames from 'classnames';\r\nimport { useIntl } from '~base/Internationalization/IntlContext';\r\nimport { buildReducerId, useConsilioReducer } from \"~base/Utilities/ConsilioReducer\";\r\nimport { useSettings } from '~base/Settings/SettingsContext';\r\nimport { ConsilioApiToken, ServerSessionState, TokenRequestMode, TokenRequestStatus, useAuthToken } from '~base/Services/API/AuthToken';\r\nimport { TitleText } from \"~base/Components/Elements/TitleText\";\r\nimport { Button } from \"~base/Components/Elements/Button\";\r\nimport Grid from '~base/Components/Layout/Grid';\r\nimport { Rubrik } from '~base/Components/Elements/Rubrik';\r\nimport { RouteLink } from '~base/Components/Elements/Link';\r\nimport { getSpacingClasses, useJssSpacingStyles } from '~base/Components/Layout/JssSpacing';\r\nimport { horizontalCenterPadding } from '~base/Components/Elements/TitleContainerStyles';\r\nimport PoweredByConsilio from '~base/Components/Composite/PoweredByConsilio';\r\nimport IconButton from '~base/Components/Elements/IconButton';\r\nimport { LoginPageCustomizations } from './Customization';\r\nimport Form from '~base/Components/Elements/Form';\r\nimport { SplashPage } from '~base/Components/Pages/Shared/SplashPage';\r\nimport { LoginPageState, reducer } from './Store';\r\nimport TitlePassword from '~base/Components/Elements/TitlePassword';\r\nimport { useStyles } from './Styles';\r\nimport { SplashContent } from '../../Shared/SplashContent';\r\nimport { Logo } from '~base/Components/Composite/Logo';\r\nimport { useNavigateService } from '~base/Services/NavigateService';\r\nimport TextBlock from '~base/Components/Elements/TextBlock';\r\nimport log from 'loglevel';\r\nimport { useGetLoginInfo } from '~base/Services/API/Account/GetLoginInfo';\r\nimport { getErrorMessage } from '~base/Services/API';\r\nimport { ExternalLoginProvider } from './ChildComponents/ExternalLoginProvider';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Props\r\n//-------------------------------------------------------------------------------------\r\n\r\ntype LoginProps = {\r\n customizations: LoginPageCustomizations\r\n};\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Component\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport const LoginPage: React.FunctionComponent = (props: LoginProps) => {\r\n\r\n const intl = useIntl();\r\n const navigate = useNavigateService();\r\n const [searchParams] = useSearchParams();\r\n const settings = useSettings();\r\n const serverVirtualPath = settings.valueAsString(\"serverVirtualPath\");\r\n const tenantName = settings.valueAsString(\"detectedTenantName\");\r\n const usernameFromQs = searchParams.get(\"username\");\r\n const forms = searchParams.get(\"forms\");\r\n\r\n const sessionless = settings.valueAsBool(\"Sessionless\");\r\n\r\n const paramReturnUrl = searchParams.get(\"ReturnUrl\") ?? searchParams.get(\"returnUrl\");\r\n\r\n const [state, dispatch, _] = useConsilioReducer(buildReducerId(\"LoginPage\"), reducer,\r\n {\r\n username: usernameFromQs ?? \"\",\r\n password: \"\",\r\n showLoginPanel: false,\r\n tryResolveFromAppStorage: paramReturnUrl !== null,\r\n tryResolveFromCookie: !sessionless && paramReturnUrl !== null,\r\n clearToken: !paramReturnUrl,\r\n tryFormLogin: false,\r\n errorMessage: null,\r\n isLoading: false,\r\n requestServerSession: false,\r\n navigateUri: null\r\n });\r\n\r\n const callLoginInfo = props.customizations.queryLoginInfo && !state.errorMessage && !state.loginInfo;\r\n const [loadingProviders, ___] = useGetLoginInfo({\r\n tenantName: tenantName,\r\n call: callLoginInfo,\r\n anonymous: true,\r\n throwError: false,\r\n callback: async (status, response, responseData) => {\r\n\r\n if (status == \"Success\") {\r\n dispatch({ type: \"setLoginInfo\", data: responseData });\r\n }\r\n else {\r\n dispatch({ type: 'fetchError', message: await getErrorMessage(intl, response) });\r\n }\r\n }\r\n });\r\n\r\n const [tokenLoading, token, apiTokenState, serverSessionState] = useAuthToken(\r\n {\r\n clearToken: state.clearToken,\r\n resolveFromAppStorage: state.tryResolveFromAppStorage,\r\n resolveFromCookie: state.tryResolveFromCookie,\r\n resolveFromFormCredentials: state.tryFormLogin,\r\n requestServerSession: state.requestServerSession,\r\n setSessionCookie: !sessionless,\r\n username: state.username,\r\n password: state.password,\r\n tenantName: tenantName,\r\n callback: (status: TokenRequestStatus, mode: TokenRequestMode, _: ConsilioApiToken) => {\r\n\r\n log.info(`Token callback - status: ${status} - mode: ${mode}`);\r\n const redirectUrl = tokenLoadedRedirectUrl(paramReturnUrl, serverVirtualPath, sessionless, status, state, serverSessionState, tenantName);\r\n\r\n // .NET 8 token provider returns 401 while .net 4.8 contains a response body with invalid_grant.\r\n const errorMessage = status == \"invalid_grant\" || (status == \"Failed\" && mode == \"Forms\") ? intl.formatText(\"VisiFinance.UI.Login.OgiltigaInloggningsuppgifter\") : null;\r\n\r\n dispatch({ type: 'completedLoginAttempt', errorMessage: errorMessage, redirectUri: redirectUrl, requestMode: mode, status: status });\r\n }\r\n });\r\n\r\n\r\n useEffect(() => {\r\n\r\n if (token) {\r\n\r\n const returnUrl = paramReturnUrl ?? `${serverVirtualPath}Home/Start`;\r\n if (returnUrl) {\r\n\r\n const completedLoadingAuthentication = apiTokenState != 'Unknown' && serverSessionState != \"Unknown\";\r\n const refreshedAuthentication = apiTokenState != 'ApplicationStorage' || serverSessionState != \"ExistingSession\";\r\n\r\n if (completedLoadingAuthentication && refreshedAuthentication && !state.isNavigating) {\r\n dispatch({ type: \"navigate\", uri: returnUrl });\r\n }\r\n else if (completedLoadingAuthentication && !refreshedAuthentication && !state.isNavigating) {\r\n \r\n const referrer = document.referrer;\r\n const qsIndex = referrer.indexOf(\"?\")\r\n const referrerQs = qsIndex != -1 ? referrer.substr(qsIndex) : null;\r\n const params = new URLSearchParams(referrerQs);\r\n const referrerReturnUrl = params.get(\"ReturnUrl\"); \r\n\r\n if (referrerReturnUrl != returnUrl) {\r\n dispatch({ type: \"navigate\", uri: returnUrl });\r\n }\r\n else {\r\n // We're probably being sent back and forth due to unauthorized (should be forbidden?).\r\n // Block the request and show Unauthorized page.\r\n dispatch({ type: \"navigate\", uri: `${serverVirtualPath}Account/Unauthorized` });\r\n }\r\n }\r\n else if (!state.isLoading && !state.requestServerSession && serverSessionState == \"Unknown\" && !sessionless) {\r\n dispatch({ type: 'requestServerSession' });\r\n }\r\n }\r\n }\r\n\r\n }, [paramReturnUrl, token, serverVirtualPath, dispatch, serverSessionState, apiTokenState, state.requestServerSession, state.isLoading, state.isNavigating, sessionless]);\r\n\r\n\r\n useEffect(() => {\r\n\r\n if (state.navigateUri) {\r\n navigate.current(state.navigateUri, { replace: !state.interactiveLogin });\r\n }\r\n\r\n }, [navigate, state.navigateUri, state.interactiveLogin]);\r\n\r\n const loading = tokenLoading || state.isLoading || loadingProviders || callLoginInfo;\r\n const showPasswordReset = settings.valueAsBool(\"account.enablePasswordReset\");\r\n\r\n const classes = useStyles(props.customizations.styles);\r\n const jssSpacingStyles = useJssSpacingStyles();\r\n const elementBottomSpacingClasses = getSpacingClasses(jssSpacingStyles, null, { dir: \"Bottom\", size: \"Large\" });\r\n const formVerticalSpacingClasses = getSpacingClasses(jssSpacingStyles, null, horizontalCenterPadding);\r\n\r\n const isNotLoading = !loading && !token && (state.showLoginPanel || !props.customizations.useLoginSplashScreen);\r\n const showSplashScreen = !loading && !state.showLoginPanel && props.customizations.useLoginSplashScreen;\r\n\r\n const headerContent = props.customizations.useLogoAsTitle ?\r\n \r\n :\r\n ;\r\n\r\n const isFormValid = state.username.length > 0 && state.password.length > 0;\r\n\r\n const detectedTenant = settings.valueAsString(\"detectedTenantName\");\r\n const resetUrl = \"/Account/Reset\" + (detectedTenant ? `/${detectedTenant}` : \"\");\r\n\r\n const showLoginForm = forms?.toLowerCase() === \"true\" || !state.loginInfo || state.loginInfo.forms || state.loginInfo.externalProviders.length == 0;\r\n\r\n const showExternalLogin = state.loginInfo?.externalProviders && state.loginInfo.externalProviders.length > 0;\r\n const showBothExternalAndInternalLogin = state.loginInfo?.externalProviders && state.loginInfo.externalProviders.length > 0 && showLoginForm;\r\n\r\n return (\r\n dispatch({ type: \"toggleLoginPanel\", show: !state.showLoginPanel })}\r\n />\r\n }\r\n >\r\n
dispatch({ type: 'tryFormLogin' })} isValid={isFormValid}>\r\n \r\n {intl.formatText(\"VisiFinance.UI.Login.LoggaIn\")}\r\n \r\n }\r\n >\r\n \r\n {showExternalLogin && state.loginInfo.externalProviders.map(x => )}\r\n {showBothExternalAndInternalLogin &&
}\r\n {showLoginForm && <>\r\n dispatch({ type: 'updateFormCredentials', username: x, password: state.password })}\r\n required={true}\r\n />\r\n\r\n dispatch({ type: 'updateFormCredentials', username: state.username, password: x })}\r\n required={true}\r\n />\r\n\r\n {state.errorMessage && (\r\n \r\n )}\r\n\r\n {showPasswordReset ?\r\n \r\n : []\r\n }\r\n }\r\n
\r\n \r\n \r\n\r\n \r\n \r\n );\r\n}\r\n\r\n\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Functions\r\n//-------------------------------------------------------------------------------------\r\n\r\n\r\nconst tokenLoadedRedirectUrl = (returnUrl: string, serverVirtualPath: string, sessionless: boolean, status: TokenRequestStatus, state: LoginPageState, hasServerSession: ServerSessionState, tenantName: string) => {\r\n\r\n\r\n const isSuccessfull = status == \"account_confirmation\" || status == \"Cleared\" || status == \"Success\" || status == \"SuccessAlreadyAuthenticated\";\r\n\r\n if (returnUrl && isSuccessfull && (sessionless || (hasServerSession == 'ExistingSession' || hasServerSession == \"NewSession\")))\r\n return returnUrl;\r\n if (status == \"account_confirmation\") {\r\n\r\n const tenantPart = tenantName ? `/${tenantName}` : \"\";\r\n\r\n return `${serverVirtualPath}Account/Confirm${tenantPart}?username=${encodeURIComponent(state.username)}`;\r\n }\r\n\r\n return null;\r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\nimport { TokenRequestMode, TokenRequestStatus } from \"~base/Services/API/AuthToken\"\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// State\r\n//-------------------------------------------------------------------------------------\r\n\r\n\r\ntype CompletedLoginAttempt = { type: \"completedLoginAttempt\", requestMode: TokenRequestMode, status: TokenRequestStatus, redirectUri: string}\r\ntype Navigate = { type: \"navigate\", uri: string, replace?: boolean }\r\n\r\nexport type LoginPageViewAction = CompletedLoginAttempt | Navigate;\r\n\r\n\r\nexport interface LoginPageState {\r\n\r\n tryResolveFromHiddenField: boolean\r\n navigateUri: string\r\n isNavigating?: boolean\r\n}\r\n\r\n\r\nexport function reducer(state: LoginPageState, action: LoginPageViewAction): LoginPageState {\r\n\r\n switch (action.type) {\r\n\r\n \r\n case \"completedLoginAttempt\": {\r\n\r\n return {\r\n ...state,\r\n tryResolveFromHiddenField: false,\r\n navigateUri: action.redirectUri\r\n };\r\n }\r\n case \"navigate\": {\r\n return { ...state,navigateUri: action.uri, isNavigating: true };\r\n }\r\n }\r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// \r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { useSearchParams } from 'react-router-dom';\r\nimport { buildReducerId, useConsilioReducer } from \"~base/Utilities/ConsilioReducer\";\r\nimport { useSettings } from '~base/Settings/SettingsContext';\r\nimport { ConsilioApiToken, TokenRequestMode, TokenRequestStatus, useAuthToken } from '~base/Services/API/AuthToken';\r\nimport { SplashPage } from '~base/Components/Pages/Shared/SplashPage';\r\nimport { reducer } from './Store';\r\nimport { ensureSameSiteUrl, useNavigateService } from '~base/Services/NavigateService';\r\nimport log from 'loglevel';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Props\r\n//-------------------------------------------------------------------------------------\r\n\r\ntype ExternalLoginProps = unknown;\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Component\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport const ExternalLoginPage: React.FunctionComponent = (props: ExternalLoginProps) => {\r\n\r\n const navigate = useNavigateService();\r\n const [searchParams] = useSearchParams();\r\n const settings = useSettings();\r\n const serverVirtualPath = settings.valueAsString(\"serverVirtualPath\");\r\n const paramReturnUrl = searchParams.get(\"ReturnUrl\") ?? searchParams.get(\"returnUrl\");\r\n\r\n const [state, dispatch, _] = useConsilioReducer(buildReducerId(\"ExternalLoginPage\"), reducer,\r\n {\r\n tryResolveFromHiddenField: true,\r\n isNavigating: false,\r\n navigateUri: null\r\n });\r\n\r\n const [tokenLoading, __, ___, ____] = useAuthToken(\r\n {\r\n resolveFromHiddenField: state.tryResolveFromHiddenField,\r\n resolveFromAppStorage: false,\r\n \r\n callback: (status: TokenRequestStatus, mode: TokenRequestMode, _: ConsilioApiToken) => {\r\n\r\n log.info(`Token callback - status: ${status} - mode: ${mode}`);\r\n\r\n const returnUrl = paramReturnUrl ? ensureSameSiteUrl(paramReturnUrl) : serverVirtualPath;\r\n\r\n const redirectUrl = status == \"Success\" ? returnUrl : `${serverVirtualPath}Account/Login?ReturnUrl=${encodeURIComponent(paramReturnUrl)}`;\r\n dispatch({ type: 'completedLoginAttempt', redirectUri: redirectUrl, requestMode: mode, status: status });\r\n }\r\n });\r\n\r\n useEffect(() => {\r\n\r\n if (state.navigateUri) {\r\n navigate.current(state.navigateUri, { replace: true });\r\n }\r\n\r\n }, [navigate, state.navigateUri]);\r\n\r\n const loading = tokenLoading || state.isNavigating;\r\n return \r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// The logout page. Clears the current API token (from browser sessions storage) and then redirects\r\n// to clear the session from the server.\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as React from 'react';\r\nimport { TokenRequestStatus, useAuthToken } from '~base/Services/API/AuthToken';\r\nimport { SplashPage } from '~base/Components/Pages/Shared/SplashPage';\r\nimport { useServerContext } from '~base/Services/ServerContext';\r\nimport { triggerLogoutBroadcast } from '~base/Services/LogoutBroadcastListener';\r\nimport { useSearchParams } from 'react-router-dom';\r\nimport { LogoutPageCustomizations } from './Customization';\r\nimport { useGetUser } from '~base/Services/API/Account/GetUser';\r\nimport { User } from '~base/Services/API/Account/Model';\r\nimport { SettingsContext, useSettings } from '~base/Settings/SettingsContext';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Props\r\n//-------------------------------------------------------------------------------------\r\n\r\ntype LogoutProps = {\r\n customizations?: LogoutPageCustomizations\r\n};\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Component\r\n//-------------------------------------------------------------------------------------\r\n\r\n\r\nexport const LogoutPage: React.FunctionComponent = ({ customizations }) => {\r\n\r\n const [redirected, setRedirected] = React.useState(false);\r\n const [user, setUser] = React.useState(null);\r\n const [loadUserFailed, setLoadUserFailed] = React.useState(false);\r\n\r\n const [_, token] = useAuthToken({});\r\n const [searchParams] = useSearchParams();\r\n const serverContext = useServerContext();\r\n const settings = useSettings();\r\n\r\n const serverVirtualPath = settings.valueAsString(\"serverVirtualPath\");\r\n\r\n const formRef = React.useRef(undefined);\r\n\r\n const tenantFromUser = serverContext.user?.Tenant?.Name ?? user?.Tenant?.Name;\r\n\r\n const logoutPathEnd = window.location.pathname.toLowerCase().indexOf(\"/account/logout\") + \"/account/logout/\".length;\r\n const tenantFromPath = window.location.pathname.length > logoutPathEnd ? window.location.pathname.substring(logoutPathEnd) : null;\r\n\r\n const paramBroadcast = searchParams.get(\"broadcast\");\r\n const tenantFromQuery = searchParams.get('tenantName');\r\n\r\n const tenantName = ((tenantFromUser ?? tenantFromPath) ?? tenantFromQuery);\r\n const tenantNameContainsEncodedData = tenantName != null && tenantName.indexOf(\"%\") > -1;\r\n\r\n const callGetUser =\r\n customizations?.requiresUser === true\r\n && loadUserFailed == false\r\n && token?.access_token != null\r\n && new Date(token.absolute_expiration).getTime() > new Date().getTime()\r\n && serverContext.user == null\r\n && user == null;\r\n\r\n const [__, loadUserApi] = useGetUser({\r\n fromToken: true,\r\n throwError: false,\r\n callback: async (status, response, responseData) => {\r\n\r\n if (status == \"Success\") {\r\n setUser(responseData);\r\n }\r\n else {\r\n setLoadUserFailed(true);\r\n }\r\n }\r\n });\r\n\r\n const loadUserRef = React.useRef(loadUserApi);\r\n\r\n React.useEffect(() => {\r\n\r\n if (callGetUser) {\r\n loadUserRef.current();\r\n }\r\n\r\n }, [callGetUser, loadUserRef]);\r\n\r\n\r\n const state = customizations?.getState && customizations?.getState(serverContext.user ?? user);\r\n const search = window.location.search ? `${window.location.search}` : \"\";\r\n const method = state ? \"post\" : \"get\";\r\n\r\n const logoutFromOtherTab = paramBroadcast == \"1\";\r\n \r\n if (!logoutFromOtherTab) {\r\n\r\n triggerLogoutBroadcast();\r\n }\r\n\r\n const redirectDelay = logoutFromOtherTab ? 5000 : 0;\r\n \r\n\r\n useAuthToken(\r\n {\r\n clearToken: !callGetUser,\r\n callback: (status: TokenRequestStatus) => {\r\n\r\n setTimeout(() => {\r\n\r\n document.cookie = 'CON.access_token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';\r\n\r\n if (status == \"Cleared\" && redirected == false) {\r\n\r\n setRedirected(true);\r\n\r\n // Slight delay to let React finish render updates (otherwise we will cause errors by navigating this way)\r\n setTimeout(() => {\r\n formRef.current.submit();\r\n }, 500);\r\n }\r\n }, redirectDelay);\r\n }\r\n });\r\n\r\n return <>\r\n \r\n
\r\n \r\n \r\n {!tenantNameContainsEncodedData && }\r\n
\r\n \r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\nimport { JssClass } from \"~base/Styling\"\r\nimport { getSize } from \"~base/Components/Layout/JssSpacing\"\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Customizations\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface CustomStyles {\r\n header?: JssClass\r\n bottom?: JssClass\r\n radioPadding?: JssClass\r\n}\r\n\r\nexport const defaultStyling = {\r\n header: {\r\n padding: `25px ${25 + getSize(\"HalfMedium\")}px 0px ${25 + getSize(\"HalfMedium\")}px`,\r\n },\r\n bottom: {\r\n display: \"flex\",\r\n flexDirection: \"row-reverse\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\"\r\n },\r\n}\r\n\r\n\r\nexport interface AccessDeniedPageCustomizations {\r\n customStyles?: CustomStyles\r\n logoutButtonUrl?: string\r\n logoutButtonTextCode?: string\r\n}\r\n\r\nexport const AccessDeniedPageDefaultCustomization = {\r\n customStyles: defaultStyling,\r\n} as AccessDeniedPageCustomizations;\r\n\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport { applyThemeStyles } from '~base/Styling';\r\nimport { createUseStyles } from 'react-jss';\r\nimport { AccessDeniedPageCustomizations, AccessDeniedPageDefaultCustomization } from './Customization';\r\nimport { JssClass } from '~base/Styling';\r\nimport { ConsilioBaseTheme } from '~base/Styling/ConsilioTheme';\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Styling\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface ReactComponentClasses {\r\n header: string\r\n bottom: string\r\n splashButton: string\r\n}\r\n\r\nexport interface ReactComponentStyles {\r\n header: JssClass\r\n bottom: JssClass\r\n splashButton: JssClass\r\n}\r\n\r\nexport const useAdditionalStyles = (customization?: AccessDeniedPageCustomizations): () => ReactComponentClasses => createUseStyles((theme: ConsilioBaseTheme): ReactComponentStyles => {\r\n\r\n const styles = {\r\n\r\n header: applyThemeStyles(AccessDeniedPageDefaultCustomization.customStyles.header, {}, customization.customStyles?.header),\r\n\r\n bottom: applyThemeStyles(AccessDeniedPageDefaultCustomization.customStyles.bottom, {}, customization.customStyles?.bottom),\r\n splashButton: applyThemeStyles(theme.components.pages.shared.splashPage.splashScreen\r\n, {\r\n })\r\n };\r\n\r\n return styles;\r\n}) as () => ReactComponentClasses;\r\n\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// A component to display a \"card\" with information about a user.\r\n\r\nimport { applyThemeStyles } from '~base/Styling';\r\nimport * as React from 'react';\r\nimport { createUseStyles } from 'react-jss';\r\nimport { JssClass } from '~base/Styling';\r\nimport { ConsilioBaseTheme } from '~base/Styling/ConsilioTheme';\r\nimport { useIntl } from '~base/Internationalization/IntlContext';\r\nimport { useNavigateService } from '~base/Services/NavigateService';\r\nimport { LegacyIcon } from '~base/Components/Elements/LegacyIcon';\r\nimport IconButton from '~base/Components/Elements/IconButton';\r\nimport Grid from '~base/Components/Layout/Grid';\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Props\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\ninterface UserInfoProps {\r\n className?: string\r\n displayName: string\r\n role: string\r\n editLink?: string\r\n customization?: UserInfoCustomizations\r\n}\r\n\r\nexport interface UserInfoCustomizations {\r\n pictureFrame?: React.ReactNode\r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Styling\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface ConsilioThemePagesSharedUserInfoStyles {\r\n\r\n userInfo?: JssClass\r\n displayName?: JssClass\r\n editButton?: JssClass\r\n \r\n}\r\n\r\nconst useStyles = createUseStyles((theme: ConsilioBaseTheme) => ({\r\n\r\n userInfo: applyThemeStyles(theme.components.pages.shared.userInfo.userInfo\r\n, {\r\n fontSize: \"13px\",\r\n lineHeight: \"16px\",\r\n fontFamily: theme.constants.defaultFont,\r\n listStyle: \"none\",\r\n paddingInlineStart: \"16px\",\r\n textAlign: \"left\",\r\n }),\r\n loggedInAs: {\r\n opacity: 0.5\r\n },\r\n displayName: applyThemeStyles(theme.components.pages.shared.userInfo.displayName\r\n, {\r\n fontWeight: \"bold\",\r\n }),\r\n role: {\r\n\r\n },\r\n genericUser: {\r\n position: \"relative\",\r\n width: \"66px\",\r\n height: \"66px\",\r\n fontSize: \"66px\",\r\n color: \"#ECECEC\",\r\n },\r\n genericUserOverlay: {\r\n\r\n fontSize: \"66px\",\r\n color: \"#BABABA\"\r\n\r\n },\r\n editButton: applyThemeStyles(theme.components.pages.shared.userInfo.editButton\r\n, {\r\n fontSize: \"24px\",\r\n margin: \"-10px 0px 0px 0px\",\r\n })\r\n \r\n}), { name: \"UserInfoCard\" });\r\n\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Component\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\nconst UserInfoCard: React.FunctionComponent = ({ editLink, displayName, role, className, customization }) => {\r\n\r\n const intl = useIntl();\r\n const classes = useStyles();\r\n const navigate = useNavigateService();\r\n\r\n const customizedPictureFrame = customization && customization.pictureFrame;\r\n const pictureFrame = customizedPictureFrame ? customizedPictureFrame : \r\n\r\n return \r\n {pictureFrame}\r\n
    \r\n
  • {intl.formatText(\"VisiFinance.UI.Start.InloggadSom\")}
  • \r\n
  • \r\n {displayName}\r\n  \r\n {editLink && { navigate.current(editLink) }} />}\r\n
  • \r\n
  • {intl.tryFormatText(role)}
  • \r\n
\r\n
;\r\n};\r\n\r\n\r\nexport default UserInfoCard;\r\nexport { UserInfoCard }\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// The default AccessDenied page. This page handles AccessDenied through form username/password, loading of credentials\r\n// from existing authentication token and loading of credentials from server side session (used by most\r\n// SSO solutions).\r\n\r\n// Can be tested for all customers. It's the default page when not yet authenticated.\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { useSearchParams } from 'react-router-dom';\r\nimport classnames from 'classnames';\r\n\r\nimport { useIntl, IntlContext } from '~base/Internationalization/IntlContext';\r\nimport { useSettings } from '~base/Settings/SettingsContext';\r\nimport { useAuthToken } from '~base/Services/API/AuthToken';\r\nimport { Button } from \"~base/Components/Elements/Button\";\r\nimport { RouteLink } from '~base/Components/Elements/Link';\r\nimport { getSpacingClasses, useJssSpacingStyles } from '~base/Components/Layout/JssSpacing';\r\nimport { horizontalCenterPadding } from '~base/Components/Elements/TitleContainerStyles';\r\nimport PoweredByConsilio from '~base/Components/Composite/PoweredByConsilio';\r\nimport { AccessDeniedPageCustomizations, AccessDeniedPageDefaultCustomization } from './Customization';\r\nimport { SplashPage } from '~base/Components/Pages/Shared/SplashPage';\r\nimport { useAdditionalStyles } from './Styles';\r\nimport { SplashContent } from '../../Shared/SplashContent';\r\nimport { useNavigateService } from '~base/Services/NavigateService';\r\nimport TextBlock from '~base/Components/Elements/TextBlock';\r\nimport UserInfoCard from '../../Shared/UserInfoCard';\r\nimport { useServerContext } from '~base/Services/ServerContext';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Props\r\n//-------------------------------------------------------------------------------------\r\n\r\ntype AccessDeniedProps = {\r\n customizations?: AccessDeniedPageCustomizations\r\n};\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Component\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport const AccessDeniedPage: React.FunctionComponent = (props: AccessDeniedProps) => {\r\n\r\n\r\n const customization = {\r\n ...AccessDeniedPageDefaultCustomization, ...props.customizations\r\n };\r\n\r\n const intl = useIntl();\r\n const navigate = useNavigateService();\r\n const [searchParams] = useSearchParams();\r\n const settings = useSettings();\r\n\r\n\r\n const hideLogout = settings.valueAsBool(\"Account.HideLogout\");\r\n const extLogoutUrl = settings.valueAsString(\"account.externalLogoutUrl\");\r\n const logoutUrl = customization?.logoutButtonUrl ?? extLogoutUrl ?? \"/Account/Logout\";\r\n const logoutButtonTextCode = customization?.logoutButtonTextCode ?? \"VisiFinance.UI.Main.LoggaUt\";\r\n\r\n const userService = useServerContext();\r\n const user = userService.user;\r\n\r\n const name = user?.Name ?? user?.UserName ?? intl.formatText(\"VisiFinance.UI.Start.Obehörig\");\r\n const role = user?.Roles?.find(x => true)?.Name;\r\n const roleTextCode = role ? resolveRoleName(intl, role) : null;\r\n\r\n const serverVirtualPath = settings.valueAsString(\"serverVirtualPath\");\r\n const paramReturnUrl = searchParams.get(\"ReturnUrl\") ?? searchParams.get(\"returnUrl\");\r\n\r\n const jssSpacingStyles = useJssSpacingStyles();\r\n const formVerticalSpacingClasses = getSpacingClasses(jssSpacingStyles, null, horizontalCenterPadding);\r\n\r\n\r\n const [_, token] = useAuthToken({});\r\n\r\n useEffect(() => {\r\n\r\n if (token == null && paramReturnUrl) {\r\n redirectToLogin(serverVirtualPath, paramReturnUrl);\r\n }\r\n\r\n }, [token, serverVirtualPath, paramReturnUrl]);\r\n\r\n\r\n const classes = useAdditionalStyles(customization)();\r\n\r\n const headerContent = ;\r\n\r\n const footerContent = hideLogout != true ? \r\n {intl.formatText(logoutButtonTextCode)}\r\n : <>\r\n\r\n const isSessionlessFeature = isSessionlessFeatureUrl(paramReturnUrl);\r\n\r\n return \r\n\r\n \r\n\r\n \r\n {isSessionlessFeature && }\r\n\r\n \r\n \r\n \r\n}\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Functions\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst getErrorMessage = (intl: IntlContext, role: string) => {\r\n\r\n const roleSpecificMessage = intl.tryFormatText(`VisiFinance.UI.AccessDenied.DefaultMessage.${role}`);\r\n if (roleSpecificMessage) {\r\n return roleSpecificMessage\r\n }\r\n return intl.formatText(\"VisiFinance.UI.AccessDenied.DefaultMessage\");\r\n}\r\n\r\nconst isSessionlessFeatureUrl = (url: string) => {\r\n\r\n if (!url)\r\n return false;\r\n\r\n if (url.toLowerCase().indexOf(\"/swagger\") != -1) {\r\n return true;\r\n }\r\n\r\n if (url.toLowerCase().indexOf(\"/hangfire\") != -1) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nconst redirectToLogin = (serverVirtualPath: string, returnUrl: string) => {\r\n\r\n const redirectUrl = `${serverVirtualPath}Account/Login?ReturnUrl=${encodeURIComponent(returnUrl)}`;\r\n window.location.href = redirectUrl;\r\n}\r\n\r\nconst resolveRoleName = (intl: IntlContext, role: string) => {\r\n switch (role) {\r\n case \"customeranonymous\":\r\n return \"VisiFinance.UI.Start.Roll.AnonymKund\";\r\n case \"customer\":\r\n return \"VisiFinance.UI.Start.Roll.Kund\";\r\n case \"advisor\":\r\n return \"VisiFinance.UI.Start.Roll.Rådgivare\";\r\n case \"support\":\r\n return \"VisiFinance.UI.Start.Roll.Support\";\r\n case \"sysadmin\":\r\n return \"VisiFinance.UI.Start.Roll.Systemadministratör\";\r\n case \"tenantadmin\":\r\n return \"VisiFinance.UI.Start.Roll.Tenantadministratör\";\r\n case \"developer\":\r\n return \"VisiFinance.UI.Start.Roll.Utvecklare\";\r\n case \"assistant\":\r\n return \"VisiFinance.UI.Start.Roll.Assistent\"\r\n default:\r\n return null;\r\n }\r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\nimport { JssClass } from \"~base/Styling\"\r\nimport { getSize } from \"~base/Components/Layout/JssSpacing\"\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Customizations\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface CustomStyles {\r\n header?: JssClass\r\n bottom?: JssClass\r\n radioPadding?: JssClass\r\n}\r\n\r\nexport const defaultStyling = {\r\n header: {\r\n padding: `25px ${25 + getSize(\"HalfMedium\")}px 0px ${25 + getSize(\"HalfMedium\")}px`,\r\n },\r\n bottom: {\r\n display: \"flex\",\r\n flexDirection: \"row-reverse\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\"\r\n },\r\n}\r\n\r\n\r\nexport interface NotFoundPageCustomizations {\r\n customStyles?: CustomStyles\r\n}\r\n\r\nexport const NotFoundPageDefaultCustomization = {\r\n customStyles: defaultStyling,\r\n} as NotFoundPageCustomizations;\r\n\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport { applyThemeStyles } from '~base/Styling';\r\nimport { createUseStyles } from 'react-jss';\r\nimport { ConsilioBaseTheme } from '~base/Styling/ConsilioTheme';\r\nimport { NotFoundPageCustomizations, NotFoundPageDefaultCustomization } from './Customization';\r\nimport { JssClass } from '~base/Styling';\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Styling\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface ReactComponentClasses {\r\n header: string\r\n bottom: string\r\n splashButton: string\r\n}\r\n\r\n\r\n\r\nexport interface ReactComponentStyles {\r\n header: JssClass\r\n bottom: JssClass\r\n splashButton: JssClass\r\n}\r\n\r\nexport const useAdditionalStyles = (customization?: NotFoundPageCustomizations): () => ReactComponentClasses => createUseStyles((theme: ConsilioBaseTheme): ReactComponentStyles => {\r\n\r\n const styles = {\r\n\r\n header: applyThemeStyles(NotFoundPageDefaultCustomization.customStyles?.header, {}, customization.customStyles?.header),\r\n bottom: applyThemeStyles(NotFoundPageDefaultCustomization.customStyles?.bottom, {}, customization.customStyles?.bottom),\r\n splashButton: applyThemeStyles(theme.components.pages.shared.splashPage.splashScreen, { })\r\n };\r\n\r\n return styles;\r\n}) as () => ReactComponentClasses;\r\n\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n//\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as React from 'react';\r\nimport PoweredByConsilio from '~base/Components/Composite/PoweredByConsilio';\r\nimport { NotFoundPageCustomizations, NotFoundPageDefaultCustomization } from './Customization';\r\nimport { SplashPage } from '~base/Components/Pages/Shared/SplashPage';\r\nimport { useAdditionalStyles } from './Styles';\r\nimport { SplashContent } from '../../Shared/SplashContent';\r\nimport TextBlock from '~base/Components/Elements/TextBlock';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Props\r\n//-------------------------------------------------------------------------------------\r\n\r\ntype NotFoundProps = {\r\n customizations?: NotFoundPageCustomizations\r\n};\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Component\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport const NotFoundPage: React.FunctionComponent = (props: NotFoundProps) => {\r\n\r\n const customization = {\r\n ...NotFoundPageDefaultCustomization, ...props.customizations\r\n };\r\n\r\n const classes = useAdditionalStyles(customization)();\r\n\r\n const headerContent = \r\n\r\n return \r\n\r\n }>\r\n\r\n \r\n\r\n \r\n \r\n \r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport { LoginPageCustomizations } from '~base/Components/Pages/Account/Login';\r\n\r\nexport default {\r\n useLoginSplashScreen: false\r\n} as LoginPageCustomizations;\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\nimport * as accountModel from '~base/Services/API/Account/Model';\r\nimport { v4 as uuid } from 'uuid';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\n//-------------------------------------------------------------------------------------\r\n// State\r\n//-------------------------------------------------------------------------------------\r\n\r\ntype SetLoading = { type: \"setLoading\" }\r\ntype InitDataLoadedState = { type: \"initDataLoaded\", data: accountModel.GetRegisterResponse, defaultLanguage: string }\r\ntype Save = { type: \"save\" }\r\ntype SetField = { type: \"setField\", name: string, value: string | boolean }\r\ntype ChangeRådgivarKod = { type: \"changeRådgivarKod\", code: string, id: string, isChosen: boolean }\r\ntype AddRådgivarKod = { type: \"addRådgivarKod\" }\r\ntype RemoveRådgivarKod = { type: \"removeRådgivarKod\", code: string, id: string }\r\ntype SetFetchError = { type: \"fetchError\", message: string }\r\ntype Navigate = { type: \"navigate\", uri: string }\r\n\r\nexport type RegisterPageViewAction =\r\n SetLoading\r\n | InitDataLoadedState\r\n | SetField\r\n | ChangeRådgivarKod\r\n | AddRådgivarKod\r\n | RemoveRådgivarKod\r\n | SetFetchError\r\n | Save\r\n | Navigate;\r\n\r\n\r\nexport interface RegisterPageState {\r\n registerInfo?: accountModel.GetRegisterResponse\r\n postData?: accountModel.PostRegisterRequest\r\n phone?: string\r\n email?: string\r\n uiCulture?: string\r\n\r\n arbetarMedDistansrådgivning?: boolean\r\n verksamhetsort?: string\r\n rådgivarkod?: string\r\n rådgivarKoder?: RådgivarKod[]\r\n\r\n errorMessage?: string\r\n loading: boolean\r\n navigateUri?: string\r\n}\r\n\r\nexport interface RådgivarKod {\r\n rådgivarKod: string,\r\n id: string,\r\n}\r\n\r\nexport function reducer(state: RegisterPageState, action: RegisterPageViewAction): RegisterPageState {\r\n switch (action.type) {\r\n\r\n case \"setLoading\": {\r\n return {\r\n ...state,\r\n errorMessage: null,\r\n loading: true\r\n };\r\n }\r\n case \"initDataLoaded\": {\r\n const koder: RådgivarKod[] = action.data.RådgivarKoder?.length > 0 ? \r\n action.data.RådgivarKoder.map((x) => { return { rådgivarKod: x, id: uuid() } }) :\r\n [{ rådgivarKod: \"\", id: uuid() }]\r\n\r\n return {\r\n ...state,\r\n registerInfo: action.data,\r\n arbetarMedDistansrådgivning: action.data.JobbarMedDistansRådgivning,\r\n email: action.data.Email,\r\n phone: action.data.Phone,\r\n rådgivarkod: action.data.RådgivarKodDefault ?? action.data.RådgivarKod ?? koder[0].rådgivarKod,\r\n rådgivarKoder: koder,\r\n verksamhetsort: action.data.Verksamhetsort,\r\n uiCulture: action.data.PreferredUICulture ?? action.defaultLanguage,\r\n loading: false,\r\n errorMessage: null\r\n }\r\n }\r\n case \"setField\": {\r\n\r\n const newState = { ...state };\r\n newState[action.name] = action.value;\r\n return newState;\r\n }\r\n case \"changeRådgivarKod\": {\r\n\r\n const newRådgivarKoder = [...state.rådgivarKoder];\r\n const kodToChange = newRådgivarKoder.find(x => x.id === action.id);\r\n kodToChange.rådgivarKod = action.code;\r\n return {\r\n ...state,\r\n rådgivarKoder: newRådgivarKoder,\r\n rådgivarkod: action.isChosen ? action.code : state.rådgivarkod,\r\n }\r\n }\r\n case \"addRådgivarKod\": {\r\n const kodToAdd: RådgivarKod = {\r\n rådgivarKod: \"\",\r\n id: uuid(),\r\n }\r\n const newRådgivarKoder = [...state.rådgivarKoder, kodToAdd];\r\n return {\r\n ...state,\r\n rådgivarKoder: newRådgivarKoder,\r\n }\r\n }\r\n case \"removeRådgivarKod\": {\r\n const newRådgivarKoder: RådgivarKod[] = state.rådgivarKoder.filter(x => x.id != action.id);\r\n const potentialNewKod = action.code === state.rådgivarkod ? newRådgivarKoder[0].rådgivarKod : state.rådgivarkod;\r\n return {\r\n ...state,\r\n rådgivarKoder: newRådgivarKoder,\r\n rådgivarkod: potentialNewKod\r\n }\r\n }\r\n case \"fetchError\": {\r\n return {\r\n ...state,\r\n errorMessage: action.message,\r\n }\r\n }\r\n case \"save\": {\r\n return {\r\n ...state,\r\n errorMessage: null,\r\n postData: {\r\n Email: state.email,\r\n JobbarMedDistansRådgivning: state.arbetarMedDistansrådgivning,\r\n Phone: state.phone,\r\n PreferredUICulture: null,\r\n RådgivarKod: state.rådgivarkod,\r\n Verksamhetsort: state.verksamhetsort\r\n }\r\n }\r\n }\r\n case \"navigate\": {\r\n return {\r\n ...state,\r\n errorMessage: null,\r\n postData: null,\r\n loading: true,\r\n navigateUri: action.uri,\r\n }\r\n }\r\n }\r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport { JssClass } from '~base/Styling';\r\nimport { getSize } from '~base/Components/Layout/JssSpacing';\r\nimport { UserInfoCustomizations } from \"~base/Components/Pages/Shared/UserInfoCard\";\r\nimport { RegisterPageStyles } from './Styles';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Customizations\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface RegisterPageCustomizations {\r\n showEmail: boolean;\r\n showPhoneNumber: boolean;\r\n showVerksamhetsort: boolean;\r\n verksamhetsortObligatory: boolean;\r\n phoneObligatory: boolean;\r\n emailObligatory: boolean;\r\n showRådgivarkod: boolean;\r\n validateRådgivarkod: (rådgivarKod: string) => boolean;\r\n showArbetarMedDistansrådgivning: boolean;\r\n allowMultipleAdvisorCodes: boolean;\r\n customStyles?: RegisterPageStyles;\r\n userInfoCustomization?: UserInfoCustomizations;\r\n languageFilterFunction?: (languages: string[]) => string[];\r\n}\r\n\r\nexport const defaultStyling = {\r\n header: {\r\n padding: `25px ${25 + getSize(\"HalfMedium\")}px 0px ${25 + getSize(\"HalfMedium\")}px`,\r\n },\r\n gridAlignment: {\r\n alignItems: \"flex-end\",\r\n },\r\n radioPadding: {\r\n marginBottom: \"32px\",\r\n marginLeft: \"3px\",\r\n justifySelf: \"center\"\r\n }\r\n}\r\n\r\nconst validateRådgivarkod: (rådgivarKod: string) => boolean = (rådgivarKod: string) => { return true; }\r\n\r\nconst filterFunc: (languages: string[]) => string[] = (languages: string[]) => { return languages; }\r\n\r\nexport const RegisterPageDefaultCustomization = {\r\n showEmail: true,\r\n showPhoneNumber: true,\r\n showVerksamhetsort: false,\r\n verksamhetsortObligatory: false,\r\n phoneObligatory: false,\r\n emailObligatory: false,\r\n showRådgivarkod: false,\r\n validateRådgivarkod: validateRådgivarkod,\r\n showArbetarMedDistansrådgivning: false,\r\n allowMultipleAdvisorCodes: false,\r\n customStyles: defaultStyling,\r\n languageFilterFunction: filterFunc\r\n\r\n} as RegisterPageCustomizations;","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as api from \"~base/Services/API\";\r\nimport * as accountModel from './Model';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Http Contract\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst uri = \"api/account/v1/user/register\";\r\nconst method = \"GET\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Types\r\n//-------------------------------------------------------------------------------------\r\n\r\ninterface GetRegisterProps extends api.ApiHookBaseProps { }\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// API Hook\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport function useGetAccountRegister(props: GetRegisterProps): [boolean, () => Promise] {\r\n\r\n const apiParams: api.ApiHookProps = {\r\n ...props,\r\n uri: uri,\r\n method: method,\r\n };\r\n\r\n const [loading, invoker] = api.useApi(apiParams);\r\n return [loading, () => invoker(apiParams.uri, undefined)];\r\n}\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as api from \"~base/Services/API\";\r\nimport * as accountModel from './Model';\r\n//-------------------------------------------------------------------------------------\r\n// Constants\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst uri = \"api/account/v1/user/register\";\r\nconst method = \"POST\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Types\r\n//-------------------------------------------------------------------------------------\r\n\r\n\r\ninterface PostRegisterProps extends api.ApiHookBaseProps { }\r\n\r\n//-------------------------------------------------------------------------------------\r\n// API Hook\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport function usePostAccountRegister(props: PostRegisterProps): [boolean, (data: accountModel.PostRegisterRequest) => Promise] {\r\n\r\n const apiParams: api.ApiHookProps = {\r\n ...props,\r\n uri: uri,\r\n method: method,\r\n skipResponseParsing: true\r\n };\r\n\r\n const [loading, invoker] = api.useApi(apiParams);\r\n return [loading, (data) => invoker(apiParams.uri, data)];\r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport { createUseStyles } from 'react-jss';\r\nimport { applyThemeStyles, JssClass } from '~base/Styling';\r\nimport { ConsilioBaseTheme } from '~base/Styling/ConsilioTheme';\r\nimport { RegisterPageCustomizations, RegisterPageDefaultCustomization } from './Customization';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Styling\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface RegisterPageClasses {\r\n header: string;\r\n gridAlignment: string;\r\n radioPadding: string;\r\n button: string;\r\n}\r\n\r\nexport interface RegisterPageStyles {\r\n header?: JssClass;\r\n gridAlignment?: JssClass;\r\n radioPadding?: JssClass;\r\n button?: JssClass;\r\n}\r\n\r\nexport const useAdditionalStyles = (customization?: RegisterPageCustomizations): RegisterPageClasses => \r\n\r\n createUseStyles((theme: ConsilioBaseTheme) => {\r\n const customStyles = customization.customStyles ?? RegisterPageDefaultCustomization.customStyles\r\n\r\n const styles = {\r\n header: applyThemeStyles(customStyles.header, {\r\n\r\n }),\r\n gridAlignment: applyThemeStyles(customStyles.gridAlignment, {\r\n\r\n }),\r\n radioPadding: applyThemeStyles(customStyles.radioPadding, {\r\n }),\r\n button: applyThemeStyles(customStyles.button, {\r\n\r\n })\r\n }\r\n\r\n return styles;\r\n })();","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// The page used to register additional information about a user account, such as locale, email, phone nr,\r\n// location and \"rådgivarkod\".\r\n\r\n// Can be tested in iRåd, sRåd and hRåd.\r\n// Login to the account and click on the \"pen\" icon on the Home/Start page (for iRåd this is hidden and \r\n// you have to manually navigate to the url).\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as React from 'react';\r\nimport Grid from '~base/Components/Layout/Grid';\r\nimport { buildReducerId, useConsilioReducer } from \"~base/Utilities/ConsilioReducer\";\r\nimport classnames from 'classnames';\r\nimport { reducer, RegisterPageState, RegisterPageViewAction } from './Store';\r\nimport Form from '~base/Components/Elements/Form';\r\nimport SplashPage from '~base/Components/Pages/Shared/SplashPage';\r\nimport SplashContent from '~base/Components/Pages/Shared/SplashContent';\r\nimport { Button } from '~base/Components/Elements/Button';\r\nimport { useIntl } from '~base/Internationalization/IntlContext';\r\nimport { getSpacingClasses, useJssSpacingStyles } from '~base/Components/Layout/JssSpacing';\r\nimport { horizontalCenterPadding } from '~base/Components/Elements/TitleContainerStyles';\r\nimport { useNavigateService, ensureSameSiteUrl } from '~base/Services/NavigateService';\r\nimport { useEffect } from 'react';\r\nimport { RegisterPageCustomizations, RegisterPageDefaultCustomization } from './Customization';\r\nimport { PoweredByConsilio } from '~base/Components/Composite/PoweredByConsilio';\r\nimport UserInfoCard from '~base/Components/Pages/Shared/UserInfoCard';\r\nimport TitleText from '~base/Components/Elements/TitleText';\r\nimport TitlePhone from '~base/Components/Elements/TitlePhone';\r\nimport TitleEmail from '~base/Components/Elements/TitleEmail';\r\nimport LabelCheckbox from '~base/Components/Elements/LabelCheckbox';\r\nimport TitleIconButton from '~base/Components/Elements/TitleIconButton';\r\nimport RadioButton from '~base/Components/Elements/RadioButton';\r\nimport { useGetAccountRegister } from '~base/Services/API/Account/GetRegister';\r\nimport { usePostAccountRegister } from '~base/Services/API/Account/PostRegister';\r\nimport * as accountModel from '~base/Services/API/Account/Model';\r\nimport { getErrorMessage } from '~base/Services/API';\r\nimport { useSettings } from '~base/Settings/SettingsContext';\r\nimport { TitleSelect } from '~base/Components/Elements/TitleSelect';\r\nimport { localeSelectValues } from '~base/Components/Pages/Shared/LocalePicker';\r\nimport TextBlock from '~base/Components/Elements/TextBlock';\r\nimport { RegisterPageClasses, useAdditionalStyles } from './Styles';\r\nimport { useSearchParams } from 'react-router-dom';\r\nimport * as phone from '~base/Types/Phone';\r\nimport * as email from '~base/Types/Email';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Props\r\n//-------------------------------------------------------------------------------------\r\n\r\ntype StartProps = {\r\n customizations?: RegisterPageCustomizations\r\n};\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Component\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport const RegisterPage: React.FunctionComponent = (props: StartProps) => {\r\n \r\n const customization = props.customizations ?? RegisterPageDefaultCustomization;\r\n // Init hooks\r\n const navigate = useNavigateService();\r\n const [searchParams] = useSearchParams();\r\n const intl = useIntl();\r\n const settings = useSettings();\r\n const defaultLanguage = settings.valueAsString(\"account.defaultLanguage\");\r\n\r\n const [state, dispatch, _] = useConsilioReducer(buildReducerId(\"RegisterPage\"), reducer, { loading: true });\r\n const stateUiCulture = state.uiCulture ?? defaultLanguage;\r\n\r\n const classes: RegisterPageClasses = useAdditionalStyles(customization);\r\n \r\n const serverVirtualPath = settings.valueAsString(\"serverVirtualPath\");\r\n\r\n const returnUrl = ensureSameSiteUrl(searchParams.get(\"ReturnUrl\")) ?? `${serverVirtualPath}Home/Start`;\r\n\r\n // API hooks\r\n\r\n const callGetRegisterInfo = state.registerInfo == null && state.errorMessage == null;\r\n\r\n const [loadingGetRegisterRegisterApi, __] = useGetAccountRegister({\r\n call: callGetRegisterInfo,\r\n callback: async (status, response, data) => {\r\n\r\n if (status == \"Success\") {\r\n dispatch({ type: 'initDataLoaded', data: data, defaultLanguage: defaultLanguage });\r\n }\r\n else {\r\n dispatch({ type: 'fetchError', message: await getErrorMessage(intl, response) });\r\n }\r\n }\r\n });\r\n\r\n const [loadingPostRegisterInfo, invokePostRegisterApi] = usePostAccountRegister({\r\n\r\n callback: async (status, response) => {\r\n\r\n if (status == \"Success\") {\r\n\r\n dispatch({ type: 'navigate', uri: returnUrl });\r\n }\r\n else {\r\n dispatch({ type: 'fetchError', message: await getErrorMessage(intl, response) });\r\n }\r\n }\r\n });\r\n\r\n const regCulture = state.registerInfo?.PreferredUICulture;\r\n useEffect(() => {\r\n\r\n if (state.navigateUri) {\r\n const loadAsExternal = regCulture !== state.uiCulture; // new UI culture requires page refresh.\r\n navigate.current(state.navigateUri, undefined, loadAsExternal);\r\n }\r\n\r\n }, [navigate, state.navigateUri, regCulture, state.uiCulture]);\r\n\r\n // Rendering\r\n const hideLogout = settings.valueAsBool(\"Account.HideLogout\");\r\n const languages = settings.valueAsStringArray(\"cultures\");\r\n const showLanguageSelection = languages.length > 1;\r\n\r\n // Setting languages\r\n const localesFromLanguages = localeSelectValues(customization.languageFilterFunction(languages));\r\n const uiSelectCultures = localesFromLanguages.length > 0 ? localesFromLanguages : [defaultLanguage];\r\n \r\n\r\n const radgivarkodReadOnly = !customization.allowMultipleAdvisorCodes && state?.registerInfo?.RådgivarKoder != null && state?.registerInfo?.RådgivarKoder.length > 0;\r\n\r\n const pageLoading = state.loading || loadingGetRegisterRegisterApi;\r\n const formLoading = pageLoading || loadingPostRegisterInfo;\r\n\r\n const jssSpacingStyles = useJssSpacingStyles();\r\n const formVerticalSpacingClasses = getSpacingClasses(jssSpacingStyles, null, horizontalCenterPadding);\r\n\r\n const formIsValid = !formLoading && state.uiCulture != null &&\r\n (!customization.verksamhetsortObligatory || !!state.verksamhetsort) &&\r\n (!customization.phoneObligatory || (!!state.phone && phone.validate(intl, state.phone).isValid)) &&\r\n (!customization.emailObligatory || (!!state.email && email.validate(intl, state.email).isValid)) &&\r\n (!customization.allowMultipleAdvisorCodes ||\r\n (\r\n state.rådgivarkod &&\r\n state.rådgivarKoder.length > 0 &&\r\n state.rådgivarKoder.find(c => !customization.validateRådgivarkod(c.rådgivarKod)) === undefined &&\r\n (new Set(state.rådgivarKoder.map(c => c.rådgivarKod))).size == state.rådgivarKoder.length // check that rådgivarKoder are unique\r\n ));\r\n\r\n const headerContent = state.registerInfo && ;\r\n\r\n const footerContent = (\r\n \r\n {intl.formatText(\"VisiFinance.UI.Register.Spara\")}\r\n \r\n );\r\n\r\n\r\n return \r\n
onFormSubmit(state, dispatch, invokePostRegisterApi)} isValid={formIsValid}>\r\n \r\n\r\n {customization.showVerksamhetsort &&\r\n dispatch({ type: \"setField\", name: 'verksamhetsort', value: x })}\r\n value={state.verksamhetsort}\r\n enabled={!formLoading}\r\n />\r\n }\r\n\r\n {customization.showRådgivarkod &&\r\n customization.allowMultipleAdvisorCodes ?\r\n state.rådgivarKoder?.map((code, i) =>\r\n \r\n \r\n dispatch({ type: \"changeRådgivarKod\", code: x, id: code.id, isChosen: state.rådgivarkod === code.rådgivarKod })}\r\n enabled={!formLoading && !radgivarkodReadOnly}\r\n isValid={customization.validateRådgivarkod}\r\n />\r\n dispatch({ type: \"setField\", name: \"rådgivarkod\", value: code.rådgivarKod })}\r\n testIdentifier={\"rgKod option\" + i}\r\n className={classes.radioPadding}\r\n />\r\n { dispatch({ type: \"removeRådgivarKod\", code: code.rådgivarKod, id: code.id }) }}\r\n styleType={\"FormControl\"}\r\n enabled={state.rådgivarKoder.length > 1}\r\n />\r\n {\r\n i === state.rådgivarKoder.length - 1 ?\r\n { dispatch({ type: \"addRådgivarKod\" }) }}\r\n styleType={\"FormControl\"}\r\n /> : \r\n }\r\n \r\n \r\n ) :\r\n customization.showRådgivarkod &&\r\n dispatch({ type: \"setField\", name: 'rådgivarkod', value: x })}\r\n enabled={!formLoading && !radgivarkodReadOnly}\r\n />\r\n }\r\n\r\n {customization.showPhoneNumber &&\r\n dispatch({ type: \"setField\", name: 'phone', value: x })}\r\n enabled={!formLoading}\r\n />\r\n }\r\n\r\n {customization.showEmail &&\r\n dispatch({ type: \"setField\", name: 'email', value: x })}\r\n enabled={!formLoading}\r\n />\r\n }\r\n\r\n {showLanguageSelection &&\r\n dispatch({ type: \"setField\", name: 'uiCulture', value: x })}\r\n />\r\n }\r\n\r\n {customization.showArbetarMedDistansrådgivning &&\r\n dispatch({ type: \"setField\", name: 'arbetarMedDistansrådgivning', value: x })}\r\n enabled={!formLoading}\r\n />\r\n }\r\n\r\n {state.errorMessage && }\r\n \r\n
\r\n \r\n
;\r\n}\r\n\r\n\r\nconst onFormSubmit = (state: RegisterPageState, dispatch: React.Dispatch, invokeSaveAction: (data: accountModel.PostRegisterRequest) => Promise) => {\r\n\r\n invokeSaveAction({\r\n Email: state.email,\r\n JobbarMedDistansRådgivning: state.arbetarMedDistansrådgivning,\r\n Phone: state.phone,\r\n PreferredUICulture: state.uiCulture,\r\n RådgivarKod: state.rådgivarkod,\r\n Verksamhetsort: state.verksamhetsort,\r\n RådgivarKoder: state.rådgivarKoder?.map(x => { return x.rådgivarKod }),\r\n });\r\n\r\n}","export default \"__VITE_ASSET__CsKQNuMk__$_?asset__\"","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as React from 'react';\r\nimport { RegisterPageCustomizations, RegisterPageDefaultCustomization } from '~base/Components/Pages/Account/Register';\r\nimport SoPLogo from '~irad-resources/Logos/SoPLogoMask.svg?asset';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Exports\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst customStyling = {\r\n \r\n header: {\r\n padding: \"25px 33px 0px 8px\",\r\n },\r\n}\r\n\r\nexport default {\r\n ...RegisterPageDefaultCustomization,\r\n showEmail: false,\r\n showPhoneNumber: false,\r\n showArbetarMedDistansrådgivning: false,\r\n showRådgivarkod: false,\r\n showVerksamhetsort: false,\r\n customStyles: customStyling,\r\n userInfoCustomization: {\r\n pictureFrame: \r\n }\r\n \r\n} as RegisterPageCustomizations;","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// This file contains link that ensure the proper authentication and redirects to Hangfire.\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Imports\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\nimport * as React from 'react';\r\nimport { ActionLink } from '~base/Components/Elements/Link';\r\nimport { ConsilioApiToken, useAuthToken } from '~base/Services/API/AuthToken';\r\nimport { SettingsContext, useSettings } from '~base/Settings/SettingsContext';\r\nimport { SessionCookieLinkProps } from './Types';\r\nimport { useServerContext } from '~base/Services/ServerContext';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Style\r\n//-------------------------------------------------------------------------------------\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Components\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\nexport const SessionCookieLink: React.FunctionComponent = ({ roles, userAccessViaProperty, children, uri, className }) => {\r\n\r\n \r\n const userService = useServerContext();\r\n const [_, token] = useAuthToken({});\r\n const settings = useSettings();\r\n\r\n if (userService.user == null)\r\n return <>;\r\n\r\n const hasRole = roles == null || userService.user.Roles.some(x => roles.some(y => y == x.Name));\r\n\r\n if (!hasRole) {\r\n if (!userAccessViaProperty) return <>;\r\n const hasAccessViaAdditionalProperty =\r\n userService.user.AdditionalProperties?.some(x =>\r\n x.Key === userAccessViaProperty && x.Value === true);\r\n if (!hasAccessViaAdditionalProperty) return <>;\r\n }\r\n\r\n return addSessionAndRedirect(token, settings, uri)}>{children}\r\n}\r\n\r\nconst addSessionAndRedirect = (accessToken: ConsilioApiToken, settings: SettingsContext, uri: string) => {\r\n\r\n const sessionless = settings.valueAsBool(\"Sessionless\");\r\n const serverVirtualPath = settings.valueAsString(\"serverVirtualPath\");\r\n if (sessionless) {\r\n\r\n // A possible optimization would be to generate a HF unique token that only contains the data we actually need.\r\n // It would also be good to fetch a new token since we might be closing in on the expiration.\r\n // Keepalive is not handled here, maybe we should do that in the auth filter? In that case we would also need the refresh token.\r\n\r\n document.cookie = `CON.access_token=${accessToken.absolute_expiration + \"|\" + accessToken.access_token}; path=/`;\r\n }\r\n\r\n const actualUri = uri.startsWith(\"/\") ? uri.substring(1) : uri;\r\n\r\n window.location.href = `${serverVirtualPath}${actualUri}`;\r\n\r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport { IdentifierFormat, OrganizationIdentifierSubTypes } from \"~base/Internationalization/ConfigurationInfo\";\r\nimport { UserInfoCustomizations } from \"~base/Components/Pages/Shared/UserInfoCard\";\r\nimport { JssClass } from '~base/Styling';\r\nimport * as sessionModel from '~base/Services/API/Session/Model';\r\nimport { getSize } from '~base/Components/Layout/JssSpacing';\r\nimport * as React from \"react\";\r\nimport { SessionCookieLink } from \"~base/Components/Composite/SessionCookieLink\";\r\nimport { IntlContext } from \"~base/Internationalization/IntlContext\";\r\nimport { StartPageStyles } from \"./Styles\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Customizations\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface StartPageCustomizations {\r\n individualIdentifierFormat?: IdentifierFormat;\r\n organizationIdentifierFormat?: IdentifierFormat;\r\n identifierTextCode?: string;\r\n hideRegistrationLink?: boolean;\r\n tryForPreferredUiCulture?: boolean;\r\n allowSelfServiceLanguageSelection?: boolean\r\n hideSessionModelSelectWhenSingleChoice?: boolean;\r\n adminMenu?: (userRole: string) => React.ReactNode;\r\n userInfoCustomization?: UserInfoCustomizations;\r\n makeSubjectIdReadOnlyIfFromQS?: boolean;\r\n allowMultipleCodes?: boolean;\r\n customStyles?: StartPageStyles;\r\n filerSessionsResume: (session: sessionModel.Session) => boolean;\r\n identifierPlaceholder?: string;\r\n additionalAllowedOrganizationTypes?: Array;\r\n waitForTextCodesToLoad?: boolean;\r\n formatSessionDisplayName?: (intl: IntlContext, sessionModel: sessionModel.Session, sessionModelInfo: sessionModel.GetStartInfoSessionModel) => string;\r\n}\r\n\r\nexport const defaultStyling = {\r\n header: {\r\n padding: `25px ${25 + getSize(\"HalfMedium\")}px 0px ${25 + getSize(\"HalfMedium\")}px`,\r\n },\r\n bottom: {\r\n display: \"flex\",\r\n flexDirection: \"row-reverse\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\"\r\n },\r\n errorText: {\r\n overflow: 'auto'\r\n }\r\n}\r\n\r\nexport const StartPageDefaultCustomization = {\r\n hideSessionModelSelectWhenSingleChoice: false,\r\n allowMultipleCodes: false,\r\n customStyles: defaultStyling,\r\n tryForPreferredUiCulture: false,\r\n allowSelfServiceLanguageSelection: false,\r\n filerSessionsResume: s => true,\r\n adminMenu: (role: string) =>
\r\n Hangfire\r\n Swagger\r\n
,\r\n additionalAllowedOrganizationTypes: [],\r\n formatSessionDisplayName: (intl: IntlContext, session: sessionModel.Session, sessionModelInfo: sessionModel.GetStartInfoSessionModel) => {\r\n const displayValue = intl.formatDateMonthTimeLong(session.creationDate);\r\n\r\n if (session.access == 'Read') {\r\n return displayValue + \" *\";\r\n }\r\n\r\n return displayValue;\r\n\r\n }\r\n} as StartPageCustomizations;","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport { createUseStyles } from 'react-jss';\r\nimport { applyThemeStyles, JssClass } from '~base/Styling';\r\nimport { ConsilioBaseTheme } from '~base/Styling/ConsilioTheme';\r\nimport { StartPageCustomizations, StartPageDefaultCustomization } from './Customization';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Styling\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface StartPageClasses {\r\n header: string;\r\n bottom: string;\r\n radioPadding: string;\r\n button: string;\r\n errorText: string;\r\n}\r\n\r\nexport interface StartPageStyles {\r\n header?: JssClass;\r\n bottom?: JssClass;\r\n radioPadding?: JssClass;\r\n button?: JssClass;\r\n errorText?: JssClass;\r\n}\r\n\r\nexport const useAdditionalStyles = (customizations?: StartPageCustomizations): StartPageClasses =>\r\n createUseStyles((theme: ConsilioBaseTheme) => {\r\n\r\n const customStyles = customizations.customStyles ?? StartPageDefaultCustomization.customStyles;\r\n\r\n return {\r\n header: applyThemeStyles(customStyles?.header, {\r\n\r\n }),\r\n bottom: applyThemeStyles(customStyles?.bottom, {\r\n\r\n }),\r\n radioPadding: applyThemeStyles(customStyles?.radioPadding, {\r\n\r\n }),\r\n button: applyThemeStyles(customStyles?.button, {\r\n\r\n }),\r\n errorText: applyThemeStyles(customStyles?.errorText, {\r\n\r\n })\r\n }\r\n })();\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport { IndividualIdentifierTypes, OrganizationIdentifierTypes } from \"~base/Internationalization/ConfigurationInfo\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Exports\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport function getSubjectType(conIdentifier: string): IndividualIdentifierTypes | OrganizationIdentifierTypes {\r\n switch (conIdentifier) {\r\n case \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson.Personnummer.SWE\":\r\n return \"PersonnummerSE\";\r\n case \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson.Epost\":\r\n return \"Email\";\r\n case \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.JuridiskPerson.Organisationsnummer.SWE\":\r\n return \"OrganisationsnummerSE\";\r\n case \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson.ExterntRegisterId\":\r\n return \"ExterntRegisterId\";\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\nexport function getSubjectIdentifierConType(subjectType: IndividualIdentifierTypes | OrganizationIdentifierTypes): string {\r\n switch (subjectType) {\r\n case \"PersonnummerSE\":\r\n return \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson.Personnummer.SWE\";\r\n case \"Email\":\r\n return \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson.Epost\";\r\n case \"OrganisationsnummerSE\":\r\n return \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.JuridiskPerson.Organisationsnummer.SWE\";\r\n case \"ExterntRegisterId\":\r\n return \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson.ExterntRegisterId\";\r\n default:\r\n return null;\r\n }\r\n}\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport { IndividualIdentifierTypes, OrganizationIdentifierTypes } from \"~base/Internationalization/ConfigurationInfo\";\r\nimport * as sessionModel from \"~base/Services/API/Session/Model\";\r\nimport { getSubjectIdentifierConType, getSubjectType } from \"~base/Types/IdentifierConverter\";\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Exports\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport function getIdentifierTypesForModels(allowedSubjectIdentifierTypes: string[]): [IndividualIdentifierTypes[], OrganizationIdentifierTypes[]] {\r\n\r\n const individualTypes = new Array();\r\n const orgTypes = new Array();\r\n\r\n if (allowedSubjectIdentifierTypes) {\r\n\r\n for (const i in allowedSubjectIdentifierTypes) {\r\n\r\n switch (allowedSubjectIdentifierTypes[i]) {\r\n case \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson.Personnummer.SWE\":\r\n individualTypes.push(\"PersonnummerSE\");\r\n break;\r\n case \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson.Epost\":\r\n individualTypes.push(\"Email\");\r\n break;\r\n case \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.JuridiskPerson.Organisationsnummer.SWE\":\r\n orgTypes.push(\"OrganisationsnummerSE\");\r\n break;\r\n case \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson.ExterntRegisterId\":\r\n individualTypes.push(\"ExterntRegisterId\");\r\n break;\r\n default:\r\n }\r\n }\r\n }\r\n\r\n return [individualTypes, orgTypes];\r\n}\r\n\r\nexport function getSessionModelForSubjectTypes(matchingSubjectTypes: (IndividualIdentifierTypes | OrganizationIdentifierTypes)[], sessionModels: sessionModel.GetStartInfoSessionModel[]): sessionModel.GetStartInfoSessionModel[] {\r\n\r\n const filteredModels = new Array();\r\n\r\n for (const i in sessionModels) {\r\n\r\n const sessionModel = sessionModels[i];\r\n\r\n for (const j in sessionModel.SessionModelSubjectIdentifiers) {\r\n\r\n const sessionModelSubjectIdentifier = sessionModel.SessionModelSubjectIdentifiers[j];\r\n\r\n const supportedIdType = getSubjectType(sessionModelSubjectIdentifier)\r\n if (matchingSubjectTypes.some(x => x == supportedIdType)) {\r\n filteredModels.push(sessionModel);\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n return filteredModels;\r\n\r\n}\r\n\r\nexport function getExpectedSubjectType(matchingSubjectTypes: Array, sessionModels: sessionModel.GetStartInfoSessionModel[]): string {\r\n\r\n for (const i in sessionModels) {\r\n const sm = sessionModels[i];\r\n\r\n if (sm.SessionModelSubjectType == \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.JuridiskPerson\") {\r\n if (matchingSubjectTypes.some(x => x == \"OrganisationsnummerSE\"))\r\n return getSubjectIdentifierConType(\"OrganisationsnummerSE\")\r\n if (matchingSubjectTypes.some(x => x == \"PersonnummerSE\"))\r\n return getSubjectIdentifierConType(\"PersonnummerSE\")\r\n }\r\n if (sm.SessionModelSubjectType == \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson\") {\r\n if (matchingSubjectTypes.some(x => x == \"PersonnummerSE\"))\r\n return getSubjectIdentifierConType(\"PersonnummerSE\")\r\n if (matchingSubjectTypes.some(x => x == \"Email\"))\r\n return getSubjectIdentifierConType(\"Email\")\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n\r\nexport const sortSessionItemsDescending = (x: sessionModel.Session, y: sessionModel.Session): number => new Date(y?.creationDate).getTime() - new Date(x?.creationDate).getTime();","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\nimport { IndividualIdentifierTypes, OrganizationIdentifierSubTypes, OrganizationIdentifierTypes } from \"~base/Internationalization/ConfigurationInfo\";\r\nimport { IdentifierParseTypes } from \"~base/Types/Identifier\";\r\nimport * as sessionModel from \"~base/Services/API/Session/Model\";\r\nimport { getIdentifierTypesForModels, getSessionModelForSubjectTypes, sortSessionItemsDescending } from \"./Functions\";\r\nimport { getSubjectIdentifierConType } from \"~base/Types/IdentifierConverter\";\r\nimport { IntlContext } from \"~base/Internationalization/IntlContext\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\n//-------------------------------------------------------------------------------------\r\n// State\r\n//-------------------------------------------------------------------------------------\r\n\r\ntype SetLoading = { type: \"setLoading\" }\r\ntype SetSessionState = { type: \"setSessionState\", state: SessionState }\r\ntype InitDataLoadedState = { type: \"initDataLoaded\", data: sessionModel.GetStartInfoResponse, subjectIdentifierFromQs: string, subjectIdentifierTypes: IdentifierParseTypes }\r\ntype SessionsForSubjectLoaded = { type: \"sessionsForSubjectLoaded\", subjectidentifier: string, data: sessionModel.SessionsResponse }\r\ntype setSubjectIdentifier = { type: \"setSubjectIdentifier\", value: string, parsedValue: IdentifierParseTypes }\r\ntype SetFetchError = { type: \"fetchError\", message: string }\r\ntype SelectSessionModel = { type: \"selectSessionModel\", sessionModel: sessionModel.GetStartInfoSessionModel }\r\ntype SelectSessionModelLanguage = { type: \"selectSessionModelLanguage\", id: string }\r\ntype SelectOngoingSession = { type: \"selectOngoingSession\", id: number }\r\ntype SelectCompletedSession = { type: \"selectCompletedSession\", id: number }\r\ntype CreateNewSession = { type: \"createNewSession\" }\r\ntype Navigate = { type: \"navigate\", uri: string, replace?: boolean }\r\ntype PageRefresh = { type: \"pageRefresh\" }\r\ntype SetAcceptMessage = { type: \"setAcceptMessage\", titleTextCode: string, messageTextCode: string }\r\ntype ClearAcceptMessage = { type: \"clearAcceptMessage\", suppressed?: boolean }\r\ntype SelectRådgivarKod = { type: \"selectRådgivarKod\", kod: string }\r\ntype SetHasLoadedTextCodes = { type: \"setHasLoadedTextCodes\", value: boolean }\r\n\r\nexport type StartPageViewAction =\r\n SetLoading\r\n | SetSessionState\r\n | InitDataLoadedState\r\n | SetFetchError\r\n | setSubjectIdentifier\r\n | SelectSessionModel\r\n | SelectSessionModelLanguage\r\n | SessionsForSubjectLoaded\r\n | SelectOngoingSession\r\n | SelectCompletedSession\r\n | CreateNewSession\r\n | Navigate\r\n | PageRefresh\r\n | SetAcceptMessage\r\n | ClearAcceptMessage\r\n | SelectRådgivarKod\r\n | SetHasLoadedTextCodes\r\n\r\n\r\nexport interface StartPageState {\r\n startInfo?: sessionModel.GetStartInfoResponse\r\n subjectSessions?: Array\r\n loadedSessionsForSubjectIdentifier?: string\r\n selectedSessionModelLanguage?: string\r\n selectedSessionModelId?: number\r\n selectedOngoingSessionId?: number\r\n selectedCompletedSessionId?: number\r\n subjectIdentifier: string\r\n subjectIdentifierType: string\r\n subjectIdComesFromQS?: boolean\r\n matchingSubjectTypes: Array\r\n selectedSessionState: SessionState\r\n errorMessage?: string\r\n /** A message that will be displayed and accepted by the user before creating/resuming a session. */\r\n acceptMessageBodyTextCode?: string\r\n /** Title of the message that will be displayed and accepted by the user before creating/resuming a session. */\r\n acceptMessageTitleTextCode?: string\r\n acceptMessageSuppressed?: boolean\r\n loading: boolean\r\n navigateUri?: string\r\n navigateReplace?: boolean\r\n selectedRådgivarKod?: string,\r\n availableRådgivarKoder?: string[],\r\n salesOpportunity?: string\r\n hasLoadedTextCodes?: boolean\r\n enableLanguageSelect?: boolean\r\n}\r\n\r\nexport interface ReducerContext { intl: IntlContext }\r\nexport type SessionState = \"New\" | \"Ongoing\" | \"Completed\";\r\n\r\nexport function reducer(state: StartPageState, action: StartPageViewAction, context: ReducerContext): StartPageState {\r\n\r\n switch (action.type) {\r\n\r\n case \"setLoading\": {\r\n return {\r\n ...state,\r\n errorMessage: null,\r\n loading: true\r\n };\r\n }\r\n case \"setSessionState\": {\r\n return {\r\n ...state,\r\n selectedSessionState: action.state,\r\n errorMessage: null\r\n }\r\n }\r\n case \"initDataLoaded\": {\r\n\r\n const sessionModel = action.data.SessionModels?.find(_ => true);\r\n const subjectId = action.data.RestrictToSubject ? action.data.RestrictedSubjectIdentifier : action.subjectIdentifierFromQs;\r\n const matchingSubjectTypes = action.data.RestrictToSubject ? getIdentifierTypesForModels([action.data.RestrictedSubjectIdentifierType]).flat() : action.subjectIdentifierTypes?.matchingTypes;\r\n const subjectIdentifierType = action.data.RestrictToSubject ? action.data.RestrictedSubjectIdentifierType : null;\r\n const availableRådgivarKoder = action.data.RådgivarKoder ?? [];\r\n const selectedRådgivarKod = action.data.RådgivarKodDefault ?? availableRådgivarKoder[0];\r\n\r\n return {\r\n ...state,\r\n startInfo: action.data,\r\n loading: false,\r\n selectedSessionModelId: sessionModel?.SessionModelId,\r\n selectedSessionModelLanguage: sessionModel?.Locales?.find(_ => true)?.Id,\r\n subjectIdentifier: subjectId ?? state.subjectIdentifier,\r\n subjectIdentifierType: subjectIdentifierType,\r\n subjectIdComesFromQS: subjectId ? true : false,\r\n matchingSubjectTypes: matchingSubjectTypes ?? state.matchingSubjectTypes,\r\n selectedRådgivarKod: selectedRådgivarKod,\r\n availableRådgivarKoder: availableRådgivarKoder,\r\n errorMessage: context.intl.tryFormatText(sessionModel?.SessionModelRestrictedWithMessage),\r\n salesOpportunity: action.data.SalesOpportunity\r\n }\r\n }\r\n case \"fetchError\": {\r\n return {\r\n ...state,\r\n errorMessage: action.message\r\n }\r\n }\r\n case \"setSubjectIdentifier\": {\r\n\r\n const matchingSubTypes = action.parsedValue.matchingTypes;\r\n const subjectIdType = getSubjectIdentifierConType(matchingSubTypes[0]);\r\n const sessionModels = getSessionModelForSubjectTypes(matchingSubTypes, state.startInfo?.SessionModels);\r\n const sessionModel = sessionModels?.find(_ => true);\r\n const sessionModelLanguage = sessionModel?.Locales?.find(_ => true)?.Id;\r\n\r\n return {\r\n ...state,\r\n subjectIdentifier: action.value,\r\n subjectIdentifierType: subjectIdType,\r\n subjectIdComesFromQS: false,\r\n matchingSubjectTypes: matchingSubTypes,\r\n selectedSessionModelId: sessionModel?.SessionModelId,\r\n selectedSessionModelLanguage: sessionModelLanguage,\r\n errorMessage: null\r\n }\r\n }\r\n case \"selectSessionModel\": {\r\n return {\r\n ...state,\r\n selectedSessionModelId: action.sessionModel.SessionModelId,\r\n selectedSessionModelLanguage: action.sessionModel.Locales.find(x => x.Id == state.selectedSessionModelLanguage)?.Id ?? action.sessionModel.Locales?.find(_ => true)?.Id,\r\n errorMessage: context.intl.tryFormatText(action.sessionModel.SessionModelRestrictedWithMessage)\r\n }\r\n }\r\n case \"selectSessionModelLanguage\": {\r\n return {\r\n ...state,\r\n selectedSessionModelLanguage: action.id,\r\n errorMessage: null\r\n }\r\n }\r\n case \"sessionsForSubjectLoaded\": {\r\n return {\r\n ...state,\r\n loadedSessionsForSubjectIdentifier: action.subjectidentifier,\r\n subjectSessions: action.data.items,\r\n selectedOngoingSessionId: action.data.items.sort(sortSessionItemsDescending).find(x => x.state == \"Active\")?.id,\r\n selectedCompletedSessionId: action.data.items.sort(sortSessionItemsDescending).find(x => x.state == \"Completed\")?.id,\r\n errorMessage: null\r\n }\r\n }\r\n case \"selectOngoingSession\": {\r\n return {\r\n ...state,\r\n selectedOngoingSessionId: action.id,\r\n errorMessage: null\r\n }\r\n }\r\n case \"selectCompletedSession\": {\r\n return {\r\n ...state,\r\n selectedCompletedSessionId: action.id,\r\n errorMessage: null\r\n }\r\n }\r\n case \"navigate\": {\r\n return {\r\n ...state,\r\n errorMessage: null,\r\n loading: action.uri ? true : false,\r\n navigateUri: action.uri,\r\n navigateReplace: action.replace,\r\n }\r\n }\r\n case \"pageRefresh\": {\r\n if (state.navigateUri) {\r\n return { ...state, loading: false, navigateUri: null };\r\n }\r\n return state;\r\n }\r\n case \"setAcceptMessage\": {\r\n return {\r\n ...state,\r\n acceptMessageTitleTextCode: action.titleTextCode,\r\n acceptMessageBodyTextCode: action.messageTextCode\r\n };\r\n }\r\n case \"clearAcceptMessage\": {\r\n return {\r\n ...state,\r\n acceptMessageSuppressed: action.suppressed == null ? state.acceptMessageSuppressed : action.suppressed,\r\n acceptMessageBodyTextCode: null,\r\n acceptMessageTitleTextCode: null\r\n };\r\n }\r\n case \"selectRådgivarKod\": {\r\n return {\r\n ...state,\r\n selectedRådgivarKod: action.kod\r\n }\r\n }\r\n\r\n case \"setHasLoadedTextCodes\": {\r\n return {\r\n ...state,\r\n hasLoadedTextCodes: action.value\r\n };\r\n }\r\n }\r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as api from \"~base/Services/API\";\r\nimport * as sessionModel from \"~base/Services/API/Session/Model\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Http Contract\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst uri = (salesOpportunity?: string): string => {\r\n\r\n let uri = \"api/Guide/v1/Sessions/StartInfo\";\r\n\r\n if (salesOpportunity) {\r\n uri += `?salesOpportunity=${salesOpportunity}`;\r\n }\r\n\r\n return uri;\r\n}\r\n\r\nconst method = \"GET\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Types\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface GetStartInfoContext {\r\n salesOpportunity?: string\r\n}\r\n\r\ninterface GetStartInfoProps extends GetStartInfoContext, api.ApiHookBaseProps {} \r\n\r\n//-------------------------------------------------------------------------------------\r\n// API Hook\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport function useGetSessionStartInfo(props: GetStartInfoProps): [boolean, (params: GetStartInfoContext) => Promise] {\r\n\r\n const apiParams: api.ApiHookProps = {\r\n ...props,\r\n uri: uri(props.salesOpportunity),\r\n method: method,\r\n };\r\n\r\n const [loading, invoker] = api.useApi(apiParams);\r\n return [loading, (params: GetStartInfoContext) => invoker(uri(params.salesOpportunity), undefined)];\r\n}\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Http Contract\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport const uri = (subjectIdentifier: string, subjectIdentifierType: string): string => {\r\n\r\n return `api/Guide/v1/Subjects?subjectIdentifier=${encodeURIComponent(subjectIdentifierType + \"|\" + subjectIdentifier)}`;\r\n}\r\n\r\nexport const method = \"GET\";","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Http Contract\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport const uri = \"api/Guide/v1/Subjects\";\r\nexport const method = \"POST\";\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as subjectModel from \"~base/Services/API/Subject/Model\";\r\nimport * as getSubjectByIdentifier from \"~base/Services/API/Subject/GetSubjectByIdentifier\";\r\nimport * as createSubject from \"~base/Services/API/Subject/CreateSubject\";\r\nimport * as api from \"~base/Services/API\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// API Methods\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport const ensureSubject = async (apiAdapter: api.ApiAdapter, subjectType: string, subjectIdentifier: string, subjectIdentifierType: string): Promise<[ subjectId?: number, errorResponse?: Response ]> => {\r\n\r\n const getSubjectsResponse = await api.invokeApi(apiAdapter, getSubjectByIdentifier.uri(subjectIdentifier, subjectIdentifierType), getSubjectByIdentifier.method, false);\r\n if (getSubjectsResponse.status == 200) {\r\n\r\n const getSubjectsResponseData: subjectModel.GetSubjectsResponse = await getSubjectsResponse.json();\r\n\r\n const matchingSubject = getSubjectsResponseData.items.find(x => x.subjectIdentifiers.some(y => y.type == subjectIdentifierType));\r\n\r\n if (!matchingSubject) {\r\n\r\n const createSubjectRequest: subjectModel.CreateSubjectRequest = {\r\n subjectType: subjectType,\r\n subjectIdentifiers: [{ type: subjectIdentifierType, value: subjectIdentifier }],\r\n };\r\n const createdSubjectResponse = await api.invokeApi(apiAdapter, createSubject.uri, createSubject.method, false, createSubjectRequest)\r\n if (createdSubjectResponse.status == 201) {\r\n\r\n const createdSubjectResponseData: subjectModel.CreateSubjectResponse = await createdSubjectResponse.json();\r\n\r\n return [ createdSubjectResponseData.id, null ];\r\n\r\n }\r\n else {\r\n return [null, createdSubjectResponse];\r\n }\r\n }\r\n else {\r\n return [matchingSubject.id, null];\r\n }\r\n\r\n }\r\n\r\n return [null, getSubjectsResponse];\r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { ensureSubject } from \"~base/Services/API/Subject/EnsureSubject\";\r\nimport { useService } from \"~base/Services/ServiceContext\";\r\nimport * as api from \"~base/Services/API\";\r\nimport * as sessionModel from \"~base/Services/API/Session/Model\";\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Http Contract\r\n//-------------------------------------------------------------------------------------\r\nconst uri = \"api/Guide/v1/Sessions\";\r\nconst method = \"POST\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Types\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface CreateSessionEnsureSubjectRequest {\r\n sessionTemplateId: number,\r\n subjectIdentifierType: string\r\n subjectIdentifier: string,\r\n subjectType: string,\r\n locale: string,\r\n externalSessionIdentifier?: string,\r\n initialInfRules?: Array,\r\n salesOpportunity?: string\r\n}\r\n\r\ninterface CreateSessionProps extends api.ApiHookBaseProps { } \r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// API Hook\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport function useCreateSessionEnsureSubject(props: CreateSessionProps): [boolean, (data: CreateSessionEnsureSubjectRequest) => Promise] {\r\n\r\n const { call, callback } = props;\r\n const { apiContext } = useService();\r\n\r\n const [loading, setLoading] = useState(false);\r\n\r\n const mounted = useRef(false);\r\n useEffect(() => {\r\n mounted.current = true;\r\n return () => { mounted.current = false; };\r\n }, []);\r\n\r\n const postSessions = useCallback(async (calledExternally: boolean, extData: CreateSessionEnsureSubjectRequest) => {\r\n\r\n if ((call || calledExternally) && loading == false) {\r\n\r\n setLoading(true);\r\n const data = calledExternally ? extData : props.data;\r\n const [status, response, errorResponse] = await createSessionEnsureSubject(apiContext.adapter, data);\r\n\r\n if (mounted.current)\r\n await callback(status, errorResponse, response, data, null, props.traceContext);\r\n if (mounted.current)\r\n setLoading(false);\r\n \r\n }\r\n }, [apiContext.adapter, loading, call, callback, props.data, props.traceContext]);\r\n\r\n useEffect(() => {\r\n\r\n postSessions(false, null);\r\n\r\n }, [postSessions]);\r\n\r\n\r\n return [loading, (data) => postSessions(true, data)];\r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n// API methods\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport const createSessionEnsureSubject = async (apiAdapter: api.ApiAdapter, data: CreateSessionEnsureSubjectRequest): Promise<[status: api.ApiStatus, response: sessionModel.CreateSessionResponse, errorResponse?: Response]> => {\r\n\r\n const [subjectId, ensureSubjectError] = await ensureSubject(apiAdapter, data.subjectType, data.subjectIdentifier, data.subjectIdentifierType);\r\n\r\n if (ensureSubjectError) {\r\n return [\"Failed\", null, ensureSubjectError];\r\n }\r\n else {\r\n\r\n const createSessionRequest: sessionModel.CreateSessionRequest = {\r\n subjectId: subjectId,\r\n externalSessionIdentifier: data.externalSessionIdentifier,\r\n locale: data.locale,\r\n sessionTemplateId: data.sessionTemplateId,\r\n initialInfRules: data.initialInfRules,\r\n salesOpportunity: data.salesOpportunity,\r\n };\r\n const response = await api.invokeApi(apiAdapter, uri, method, false, createSessionRequest);\r\n\r\n if (response.status >= 200 && response.status <= 299) {\r\n\r\n const responseData: sessionModel.CreateSessionResponse = await response.json();\r\n return [\"Success\", responseData, response];\r\n }\r\n else {\r\n return [\"Failed\", null, response];\r\n }\r\n }\r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as api from \"~base/Services/API\";\r\nimport * as sessionModel from \"~base/Services/API/Session/Model\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Http Contract\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst uri = (\r\n subjectIdentifier: string,\r\n sessionTemplateFqn: string,\r\n state?: sessionModel.SessionState,\r\n orderBy?: sessionModel.SessionOrderBy,\r\n orderDir?: sessionModel.SessionOrderDir,\r\n offset?: number,\r\n limit?: number,\r\n salesOpportunity?: string): string => {\r\n\r\n let uri = `api/Guide/v1/Sessions?offset=${offset ?? \"0\"}`;\r\n\r\n if (limit) {\r\n uri += `&limit=${limit}`;\r\n }\r\n\r\n if (subjectIdentifier) {\r\n\r\n // There should be a better way to handle this. Currently the API assumes that the primary subject identifier is the one to use.\r\n // In jRåd we should phase out fake civic registration number and replace the primary (in config) with Email. For now we rely on this instead.\r\n if (subjectIdentifier.indexOf(\"|\") == -1 && subjectIdentifier.indexOf(\"@\") != -1) {\r\n\r\n uri += `&subjectIdentifier=${encodeURIComponent(\"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson.Epost|\" + subjectIdentifier)}`;\r\n }\r\n\r\n uri += `&subjectIdentifier=${encodeURIComponent(subjectIdentifier)}`;\r\n }\r\n\r\n if (sessionTemplateFqn) {\r\n uri += `&sessionTemplateFqn=${encodeURIComponent(sessionTemplateFqn)}`;\r\n }\r\n\r\n if (state) {\r\n uri += `&state=${encodeURIComponent(state)}`;\r\n }\r\n\r\n if (orderBy) {\r\n uri += `&orderBy=${encodeURIComponent(orderBy)}`;\r\n }\r\n\r\n if (orderDir) {\r\n uri += `&orderDir=${encodeURIComponent(orderDir)}`;\r\n }\r\n\r\n if (salesOpportunity) {\r\n uri += `&salesOpportunity=${encodeURIComponent(salesOpportunity)}`\r\n }\r\n\r\n return uri;\r\n}\r\nconst method = \"GET\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Types\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface GetSessionsContext {\r\n subjectIdentifier?: string\r\n sessionTemplateFqn?: string\r\n state?: sessionModel.SessionState\r\n orderBy?: sessionModel.SessionOrderBy\r\n orderDir?: sessionModel.SessionOrderDir,\r\n offset?: number\r\n limit?: number\r\n salesOpportunity?: string\r\n \r\n}\r\n\r\n\r\ninterface GetSessionsProps extends GetSessionsContext, api.ApiHookBaseProps {\r\n\r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n// API Hook\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport function useGetSessions(props: GetSessionsProps): [boolean, (params: GetSessionsContext) => Promise] {\r\n\r\n const apiParams: api.ApiHookProps = {\r\n ...props,\r\n uri: uri(\r\n props.subjectIdentifier, \r\n props.sessionTemplateFqn, \r\n props.state, \r\n props.orderBy, \r\n props.orderDir,\r\n props.offset,\r\n props.limit,\r\n props.salesOpportunity\r\n ),\r\n method: method\r\n };\r\n\r\n const [loading, invoker] = api.useApi(apiParams);\r\n return [loading, (params: GetSessionsContext) =>\r\n invoker(uri(\r\n params.subjectIdentifier,\r\n params.sessionTemplateFqn,\r\n params.state,\r\n params.orderBy,\r\n params.orderDir,\r\n params.offset,\r\n params.limit,\r\n params.salesOpportunity), undefined, params)];\r\n}\r\n","\r\n\r\nimport { useEffect } from \"react\";\r\n\r\nexport function useExtInteractionIdentifier(value: string): void {\r\n\r\n useEffect(() => {\r\n\r\n const expiery = value ? \"expires=0\" : \"Max-Age=0\";\r\n const secure = document.location.protocol == \"https:\" ? \"secure\" : \"\";\r\n\r\n document.cookie = `Consilio.ExtInteractionId=${value}; ${expiery}; path=/; SameSite=Strict; ${secure}`;\r\n\r\n }, [value]);\r\n\r\n}\r\n","//==========================================================================================================\r\n// Copyright (C) NoreTechnology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// This file contains a simple overlay to display a message and save/cancel/close buttons.\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from '~base/Internationalization/IntlContext';\r\nimport Overlay from '~base/Components/Composite/Overlay';\r\nimport useOverlayStyles from '~base/Components/Composite/Overlay/OverlayStyle';\r\nimport { PromptOverlayProps } from './Types';\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Component\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst Component: React.FunctionComponent = ({ open, portalContainer, onClose, onCancel, onSave, title, titleTextCode, bodyTextCode, bodyTextCodeL, bodyTextString, showSave = false, showClose = true, saveButtonEnabled = true, saveButtonTextCode = \"VisiFinance.UI.Main.Overlay.SparaKnapp.Text\", closeButtonTextCode = \"VisiFinance.UI.Main.Overlay.StängKnapp.Text\", style = { whiteSpace: \"break-spaces\" }, children }) => {\r\n\r\n const intl = useIntl();\r\n const classes = useOverlayStyles();\r\n\r\n const key = React.useRef(undefined);\r\n\r\n const actualTitle = titleTextCode ? intl.formatText(titleTextCode) : title;\r\n\r\n const actualBodyText = bodyTextString ?? (bodyTextCode ? intl.formatText(bodyTextCode) : null)\r\n\r\n const actualBodyTextFromL = bodyTextCodeL ? bodyTextCodeL.map((fqn, i) =>
{intl.formatText(fqn)}
) : null\r\n\r\n const closeWrapper = () => {\r\n\r\n if (onClose) {\r\n onClose();\r\n }\r\n };\r\n\r\n const cancelWrapper = () => {\r\n if (onCancel) {\r\n onCancel();\r\n }\r\n };\r\n\r\n const saveWrapper = () => {\r\n if (onSave) {\r\n onSave();\r\n }\r\n };\r\n\r\n return closeWrapper()}\r\n onCancel={() => cancelWrapper()}\r\n onSave={() => saveWrapper()}\r\n title={actualTitle}\r\n saveButtonTitle={intl.formatText(saveButtonTextCode)}\r\n showSaveButton={showSave}\r\n abortButtonTitle={intl.formatText(closeButtonTextCode)}\r\n showAbortButton={showClose}\r\n overlayContainer={portalContainer}\r\n saveButtonEnabled={saveButtonEnabled}\r\n contentPadding={[{ dir: \"All\", size: \"XL\" }]}\r\n contentStyle={style}\r\n contentClassName={classes.defaultWidth}\r\n >\r\n
{actualBodyText}{actualBodyTextFromL}
\r\n {children}\r\n \r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Exports\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport default Component;\r\nexport { Component }","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as api from \"~base/Services/API\";\r\nimport * as sessionModel from \"~base/Services/API/Session/Model\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Http Contract\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst uri = (sessionId: number): string => {\r\n\r\n return `api/Guide/v1/Sessions/${sessionId}/Resume`;\r\n}\r\nconst method = \"POST\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Types\r\n//-------------------------------------------------------------------------------------\r\n\r\n\r\ninterface ResumeSessionsProps extends api.ApiHookBaseProps {\r\n sessionId?: number\r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n// API Hook\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport function useResumeSession(props: ResumeSessionsProps): [boolean, (sessionId?: number) => Promise] {\r\n\r\n const apiParams: api.ApiHookProps = {\r\n ...props,\r\n uri: uri(props.sessionId),\r\n method: method\r\n };\r\n\r\n const [loading, invoker] = api.useApi(apiParams);\r\n return [loading, (sessionId?: number) => invoker(sessionId != 0 ? uri(sessionId) : apiParams.uri, undefined)];\r\n}\r\n","//==========================================================================================================\r\n// Copyright (C) NoreTechnology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// This file contains a component with the customers VersionInfo.\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Imports\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\nimport { applyThemeStyles } from '~base/Styling';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { createUseStyles } from \"react-jss\";\r\nimport { ConsilioBaseTheme } from \"~base/Styling/ConsilioTheme\";\r\nimport { useDiscoveryGetAPIs, GetAPIs } from '~base/Services/API/Discovery/GetAPIs';\r\nimport { ApiStatus } from '~base/Services/API';\r\nimport { useSettings } from '~base/Settings/SettingsContext';\r\nimport { JssClass } from '~base/Styling';\r\nimport { ContainerProps } from '~base/Components/Layout/ContainerTypes';\r\nimport { useAuthToken } from '~base/Services/API/AuthToken';\r\n\r\nexport interface VersionInfoStyles {\r\n p?: JssClass\r\n\r\n}\r\n\r\ninterface VersionInfoClasses {\r\n p?: string\r\n}\r\n\r\n\r\nconst useStyles: () => VersionInfoClasses = createUseStyles((theme: ConsilioBaseTheme) => ({\r\n p: applyThemeStyles(theme.components.composite.versionInfo.p\r, {\r\n whiteSpace: \"pre-line\",\r\n textAlign: \"left\",\r\n color: \"#9c9c9c\",\r\n fontSize: \"11px\",\r\n fontFamily: theme.constants.defaultFont,\r\n })\r\n}), { name: \"VersionInfo\" });\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Props\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\ninterface VersionInfoProps extends ContainerProps {\r\n\r\n className?: string\r\n}\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Component\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\nexport const VersionInfo: React.FunctionComponent = (props: VersionInfoProps) => {\r\n\r\n\r\n const [version, setVersion] = React.useState(null);\r\n const { className, onScroll, ...containerProps } = props;\r\n\r\n const settings = useSettings();\r\n const displayVersionInfo = settings.valueAsBool(\"dev.displayVersionInfo\");\r\n const [_, token] = useAuthToken({});\r\n\r\n const api = useDiscoveryGetAPIs({\r\n call: token !== null && version === null && displayVersionInfo === true,\r\n callback: async (status: ApiStatus, _: Response, responseData: GetAPIs) => {\r\n\r\n if (status != \"Success\") {\r\n setVersion(\"-\");\r\n }\r\n else {\r\n setVersion(responseData.SystemVersion);\r\n }\r\n }\r\n });\r\n\r\n const classes = useStyles();\r\n return version ?

{version}

: <>;\r\n}\r\n\r\nexport default VersionInfo;\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// The page where the user enters an identifier and selects a flow to start a session.\r\n\r\n// Can be tested for all customers.\r\n// It's the first page displayed after logging in.\r\n\r\n// There are a bunch of different use cases and features to consider:\r\n// * An advisor interacts with the page to select subject and then create or resume a session.\r\n// * External session id is provided as a query string parameter, the page will then try to resolve and\r\n// start the session. No user interaction is required.\r\n// * Interaction id is specified as a query string paramter. A session cookie will be set to track\r\n// transactions for that interaction.\r\n// * Subject identifier is specified as a query string parameter. The input value will be pre-filled.\r\n// * Some users (customers) are restricted to start advisory sessions for them selves. Identifier\r\n// field will be pre-filled and grayed out.\r\n\r\n// SKIP-ApplyThemeStyleCode.ps1\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as React from 'react';\r\nimport Grid from '~base/Components/Layout/Grid';\r\nimport { buildReducerId, useConsilioReducer } from \"~base/Utilities/ConsilioReducer\";\r\nimport classnames from 'classnames';\r\nimport { useAdditionalStyles } from './Styles';\r\nimport { reducer, ReducerContext, SessionState, StartPageState } from './Store';\r\nimport { useSettings } from '~base/Settings/SettingsContext';\r\nimport Form from '~base/Components/Elements/Form';\r\nimport SplashPage from '~base/Components/Pages/Shared/SplashPage';\r\nimport SplashContent from '~base/Components/Pages/Shared/SplashContent';\r\nimport { Button } from '~base/Components/Elements/Button';\r\nimport { IntlContext, useIntl } from '~base/Internationalization/IntlContext';\r\nimport { getSpacingClasses, useJssSpacingStyles } from '~base/Components/Layout/JssSpacing';\r\nimport { horizontalCenterPadding } from '~base/Components/Elements/TitleContainerStyles';\r\nimport { LabelRadioButton } from '~base/Components/Elements/LabelRadioButton';\r\nimport { TitleSelect } from '~base/Components/Elements/TitleSelect';\r\nimport Expander from '~base/Components/Layout/Expander';\r\nimport Container from '~base/Components/Layout/Container';\r\nimport { useGetSessionStartInfo } from '~base/Services/API/Session/GetStartInfo';\r\nimport TitleIdentifier from '~base/Components/Elements/TitleIdentifier';\r\nimport { IdentifierConfigurationInfo, IndividualIdentifierTypes, OrganizationIdentifierTypes } from '~base/Internationalization/ConfigurationInfo';\r\nimport * as sessionModel from '~base/Services/API/Session/Model';\r\nimport { tryFormat } from '~base/Types/Identifier';\r\nimport { useNavigateService } from '~base/Services/NavigateService';\r\nimport { useCreateSessionEnsureSubject } from '~base/Services/API/Session/CreateSession';\r\nimport { useEffect } from 'react';\r\nimport { StartPageCustomizations, StartPageDefaultCustomization } from './Customization';\r\nimport { getExpectedSubjectType, getIdentifierTypesForModels, getSessionModelForSubjectTypes, sortSessionItemsDescending } from './Functions';\r\nimport { getErrorMessage } from '~base/Services/API';\r\nimport { PoweredByConsilio } from '~base/Components/Composite/PoweredByConsilio';\r\nimport UserInfoCard from '~base/Components/Pages/Shared/UserInfoCard';\r\nimport { useGetSessions } from '~base/Services/API/Session/GetSessions';\r\nimport TextBlock from '~base/Components/Elements/TextBlock';\r\nimport { useExtInteractionIdentifier } from '~base/Utilities/ExtIntractionIdentifier';\r\nimport { useSearchParams } from 'react-router-dom';\r\nimport * as identifier from '~base/Types/Identifier';\r\nimport PromptOverlay from '~base/Components/Composite/PromptOverlay';\r\nimport { useResumeSession } from '~base/Services/API/Session/ResumeSession';\r\nimport VersionInfo from '~base/Components/Composite/VersionInfo';\r\nimport { useServerContext } from '~base/Services/ServerContext';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Props\r\n//-------------------------------------------------------------------------------------\r\n\r\ntype StartProps = {\r\n customizations?: StartPageCustomizations\r\n};\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Component\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport const StartPage: React.FunctionComponent = (props: StartProps) => {\r\n\r\n // Init hooks\r\n\r\n const customization = {\r\n ...StartPageDefaultCustomization, ...props.customizations\r\n };\r\n const intl = useIntl();\r\n const classes = useAdditionalStyles(customization);\r\n const navigate = useNavigateService();\r\n const settings = useSettings();\r\n const [searchParams] = useSearchParams();\r\n const serverContext = useServerContext();\r\n const userLanguage = serverContext.user?.PreferredUiCulture;\r\n\r\n const reducerContext: ReducerContext = {\r\n intl: intl,\r\n }\r\n\r\n const contextWrappedReducer = (reducerContext: ReducerContext) => {\r\n return (state, action) => reducer(state, action, reducerContext);\r\n }\r\n\r\n // Init state\r\n\r\n const [state, dispatch, _] = useConsilioReducer(buildReducerId(\"StartPage\"), contextWrappedReducer(reducerContext), { selectedSessionState: \"New\", subjectIdentifier: \"\", subjectIdentifierType: \"\", loading: true, enableLanguageSelect: true, matchingSubjectTypes: [] });\r\n\r\n // Variables\r\n\r\n const serverVirtualPath = settings.valueAsString(\"serverVirtualPath\") ?? '/';\r\n const allowEditProfile = settings.valueAsBool(\"Account.AllowEditProfile\");\r\n const hideLogout = settings.valueAsBool(\"Account.HideLogout\");\r\n const extLogoutUrl = settings.valueAsString(\"account.externalLogoutUrl\");\r\n const logoutUrl = extLogoutUrl ?? `${serverVirtualPath}Account/Logout`;\r\n\r\n const isRoleSupport = state?.startInfo?.Role?.Value == \"support\";\r\n const defaultTenantSid = settings.valueAsString(\"defaultTenantSid\");\r\n const selectedSessionModel = state.startInfo?.SessionModels?.find(x => x.SessionModelId == state.selectedSessionModelId);\r\n const [individualTypes, organizationTypes] = getIdentifierTypesForModels(state.startInfo?.AllowedSubjectIdentifierTypes);\r\n\r\n const idConfig = getIdConfig(intl, customization, individualTypes, organizationTypes);\r\n\r\n const formattedSubjectIdentifier = state.matchingSubjectTypes?.length == 1 ? tryFormat(intl, state.subjectIdentifier, idConfig) : state.subjectIdentifier;\r\n\r\n const sessionModels = getSessionModelForSubjectTypes(state.matchingSubjectTypes, state.startInfo?.SessionModels);\r\n const sessionModelSelectOptions = sessionModels.map(x => { return { value: x.SessionModelId.toString(), displayName: intl.formatText(x.SessionModelFqn) } });\r\n const selectedSessionModelHasMultipleLanguages = selectedSessionModel?.Locales?.length > 1;\r\n const selectedSessionModelLanguages = selectedSessionModel?.Locales?.map(x => { return { value: x.Id, displayName: x.DisplayName } });\r\n\r\n const expectedSubjectType = getExpectedSubjectType(state.matchingSubjectTypes, sessionModels);\r\n\r\n const subjectIdentifierFqn = `${expectedSubjectType}|${formattedSubjectIdentifier}`;\r\n\r\n const userSessions = state.loadedSessionsForSubjectIdentifier == formattedSubjectIdentifier && state.subjectSessions ?\r\n state.subjectSessions : new Array();\r\n\r\n const completeSessions = userSessions.filter(x => x.state == \"Completed\").sort(sortSessionItemsDescending).map(session => { return { value: session.id.toString(), displayName: customization.formatSessionDisplayName(intl, session, sessionModels.find(sessionModel => sessionModel.SessionModelId === session.sessionTemplateId)) } });\r\n const ongoingSessions = userSessions.filter(x => x.state == \"Active\").sort(sortSessionItemsDescending).map(session => { return { value: session.id.toString(), displayName: customization.formatSessionDisplayName(intl, session, sessionModels.find(sessionModel => sessionModel.SessionModelId === session.sessionTemplateId)) } });\r\n\r\n // Currently selected ongoing or completed session.\r\n const selectedSessionId = getSelectedSessionId(state);\r\n const selectedSession = state.subjectSessions && state.subjectSessions.find(x => x.id == selectedSessionId);\r\n\r\n // Sales opportunity\r\n const salesOpportunityFromQuery: string = searchParams.get(\"SalesOpportunity\");\r\n\r\n // control calling of hooks\r\n const callStartInfo = state.startInfo == null && state.errorMessage == null && !state.navigateUri;\r\n const calLoadSessions = state.errorMessage == null && formattedSubjectIdentifier != state.loadedSessionsForSubjectIdentifier && state.matchingSubjectTypes?.length > 0 && state.startInfo.SessionModels.length > 0;\r\n\r\n // Reset back state for Firefox.\r\n useEffect(() => {\r\n\r\n // When navigating back in firefox the previous page is displayed from memory.\r\n // This causes the page to be in \"loading\" state, since we were navigating to a new page\r\n // when the page was last displayed. We dispatch an action to reset the state.\r\n\r\n window.addEventListener(\"pageshow\", () => {\r\n dispatch({ type: 'pageRefresh' });\r\n });\r\n }, [dispatch]);\r\n\r\n useEffect(() => {\r\n\r\n const tenantName = serverContext.user?.Tenant.Name;\r\n\r\n if (tenantName === \"root\" || (!!tenantName && intl.areTextCodesLoaded(intl.cultureInfo.id, tenantName))) {\r\n dispatch({ type: \"setHasLoadedTextCodes\", value: true });\r\n }\r\n\r\n }, [dispatch, intl, serverContext.user]);\r\n\r\n // API hooks\r\n\r\n const [loadingStartInfo, __] = useGetSessionStartInfo({\r\n call: callStartInfo,\r\n salesOpportunity: salesOpportunityFromQuery,\r\n throwError: false,\r\n callback: async (status, response, responseData) => {\r\n\r\n if (status == \"Success\") {\r\n\r\n if (responseData.RequiresRegistration) {\r\n const encodedRelativeUrl = getReturnUrlParam();\r\n dispatch({ type: 'navigate', uri: `${serverVirtualPath}Account/Register?ReturnUrl=${encodedRelativeUrl}` });\r\n }\r\n else {\r\n\r\n // Optionally get a subject identifier from QS params.\r\n const subjectIdentifierParam = searchParams.get(\"SubjectIdentifier\");\r\n const [subjectIdentifier, subjectIdentifierTypesFromQs] = getMatchingSubjectTypes(intl, customization, subjectIdentifierParam, responseData);\r\n\r\n dispatch({ type: 'initDataLoaded', data: responseData, subjectIdentifierFromQs: subjectIdentifier, subjectIdentifierTypes: subjectIdentifierTypesFromQs });\r\n\r\n if (responseData.SessionModels.length == 0) {\r\n\r\n dispatch({ type: 'fetchError', message: intl.formatText(\"VisiFinance.UI.Start.StartaRådgivningSaknarSessionsmodeller\") });\r\n }\r\n }\r\n }\r\n else {\r\n\r\n if (response.status == 401) {\r\n dispatch({ type: 'navigate', uri: `${serverVirtualPath}Account/AccessDenied?ReturnUrl=${getReturnUrlParam()}` });\r\n }\r\n else {\r\n\r\n // At this point the loading spinner is active, so we throw an error and show the generic dialog instead.\r\n throw new Error(await getErrorMessage(intl, response));\r\n }\r\n }\r\n }\r\n });\r\n\r\n const [loadingGetSessions, ___] = useGetSessions({\r\n call: calLoadSessions,\r\n subjectIdentifier: subjectIdentifierFqn,\r\n limit: 1000,\r\n salesOpportunity: salesOpportunityFromQuery,\r\n callback: async (status, response, responseData) => {\r\n\r\n if (status == \"Success\") {\r\n const resDataFiltered = { ...responseData, items: responseData.items.filter(customization.filerSessionsResume) }\r\n dispatch({ type: 'sessionsForSubjectLoaded', subjectidentifier: formattedSubjectIdentifier, data: resDataFiltered });\r\n }\r\n else {\r\n dispatch({ type: 'fetchError', message: await getErrorMessage(intl, response) });\r\n }\r\n }\r\n });\r\n\r\n const [loadingCreateSession, createSessionEnsureSubjectApi] = useCreateSessionEnsureSubject({\r\n\r\n callback: async (status, errorResponse, response) => {\r\n\r\n if (status == \"Success\") {\r\n\r\n const sessionGuideUrl = `${serverVirtualPath}Home/Main/${response.id}`;\r\n dispatch({ type: 'navigate', uri: sessionGuideUrl });\r\n }\r\n else {\r\n\r\n dispatch({ type: 'fetchError', message: await getErrorMessage(intl, errorResponse) });\r\n }\r\n }\r\n });\r\n\r\n const [loadinResumeSession, resumeSessionApi] = useResumeSession({\r\n sessionId: selectedSessionId,\r\n callback: async (status, errorResponse, response) => {\r\n\r\n if (status == \"Success\") {\r\n\r\n const sessionGuideUrl = `${serverVirtualPath}Home/Main/${response.sessionId}`;\r\n dispatch({ type: 'navigate', uri: sessionGuideUrl });\r\n }\r\n else {\r\n\r\n dispatch({ type: 'fetchError', message: await getErrorMessage(intl, errorResponse) });\r\n }\r\n }\r\n });\r\n\r\n\r\n // Set external interaction identifier.\r\n\r\n const extInteractionParam = searchParams.get(\"ExtInteractionId\");\r\n useExtInteractionIdentifier(extInteractionParam);\r\n\r\n // Navigate to session based on external identifier provided in url.\r\n\r\n const extSessionIdParam = searchParams.get(\"ExtSessionId\");\r\n\r\n useEffect(() => {\r\n\r\n // Dont trigger on back or forward navigation.\r\n if (window.performance.navigation.type != 2 && state.subjectSessions != null && extSessionIdParam != null) {\r\n\r\n const loadSessionWithId = state.subjectSessions.find(x => x.externalIdentifier == extSessionIdParam)?.id;\r\n if (loadSessionWithId) {\r\n dispatch({ type: 'navigate', uri: `${serverVirtualPath}Home/Main/${loadSessionWithId}`, replace: true });\r\n }\r\n\r\n }\r\n\r\n }, [dispatch, state.loading, state.subjectSessions, extSessionIdParam, serverVirtualPath]);\r\n\r\n // Change URL if a navigation has been dispatched.\r\n\r\n useEffect(() => {\r\n\r\n if (state.navigateUri) {\r\n navigate.current(state.navigateUri, { replace: state.navigateReplace });\r\n }\r\n\r\n }, [navigate, state.navigateUri, state.navigateReplace]);\r\n\r\n // Rendering\r\n\r\n const portalRoot = document.getElementById(\"react-portal-root\");\r\n\r\n const loadingRedirectToSession = loadingGetSessions && extSessionIdParam != null;\r\n\r\n const loadingTenantTextCodes = customization.waitForTextCodesToLoad && !state.hasLoadedTextCodes;\r\n\r\n const pageLoading = state.loading || loadingStartInfo || loadingCreateSession || loadingRedirectToSession || loadinResumeSession || loadingTenantTextCodes;\r\n const formLoading = pageLoading || loadingGetSessions;\r\n\r\n const jssSpacingStyles = useJssSpacingStyles();\r\n const formVerticalSpacingClasses = getSpacingClasses(jssSpacingStyles, null, horizontalCenterPadding);\r\n\r\n const identifierLabelTextCode = getIdentifierLabelTextCode(customization, individualTypes, organizationTypes);\r\n\r\n const identifierReadOnly = state.startInfo?.RestrictToSubject === true || customization.makeSubjectIdReadOnlyIfFromQS && state.subjectIdComesFromQS;\r\n\r\n // Language & locale.\r\n const preferredUiCulture = customization.tryForPreferredUiCulture ?? serverContext.user?.PreferredUiCulture;\r\n const enableLanguageSelect = !(preferredUiCulture !== undefined && preferredUiCulture !== null);\r\n\r\n const displayLanguageSelectOption = state?.startInfo?.Role?.Value == \"advisor\"\r\n || enableLanguageSelect || customization.allowSelfServiceLanguageSelection;\r\n\r\n const chooseUserLocale = !displayLanguageSelectOption && customization.tryForPreferredUiCulture;\r\n const sessionLocale = chooseUserLocale ? userLanguage : state.selectedSessionModelLanguage;\r\n\r\n const formIsValid =\r\n state.matchingSubjectTypes.length > 0 &&\r\n !formLoading &&\r\n identifier.validate(intl, formattedSubjectIdentifier, idConfig).isValid &&\r\n ((state.selectedSessionState == \"New\" && selectedSessionModel != null && (!customization.allowMultipleCodes && !isRoleSupport || !!state.selectedRådgivarKod))\r\n || (state.selectedSessionState == \"Ongoing\" && state.selectedOngoingSessionId != null)\r\n || (state.selectedSessionState == \"Completed\" && state.selectedCompletedSessionId != null))\r\n && !selectedSessionModel?.SessionModelRestrictedWithMessage;\r\n \r\n\r\n const headerContent = state.startInfo && ;\r\n\r\n const footerContent = (\r\n \r\n {intl.formatText(footerButtonTextCode(state.selectedSessionState))}\r\n \r\n );\r\n\r\n const initialInfRules: Array = [{\r\n ident: \"this.sessionStartInput\", // Glii\r\n type: \"VisiFinance.Consilio.Rådgivningssession.SessionStartInput\", // the type of the member\r\n value: { associeradRådgivarKod: state.selectedRådgivarKod } // the value to be assigned\r\n }];\r\n\r\n return \r\n
{\r\n\r\n if (state.selectedSessionState == 'New') {\r\n\r\n let subjectType = \"\";\r\n switch (state.subjectIdentifierType) {\r\n case \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson.Personnummer.SWE\":\r\n subjectType = \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson\";\r\n break;\r\n case \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson.Epost\":\r\n subjectType = \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson\";\r\n break;\r\n case \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.JuridiskPerson.Organisationsnummer.SWE\":\r\n subjectType = \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.JuridiskPerson\";\r\n break;\r\n case \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson.ExterntRegisterId\":\r\n subjectType = \"VisiFinance.Consilio.Rådgivningssubjekt.Identifierare.FysiskPerson\";\r\n break;\r\n }\r\n\r\n const createSessionData = {\r\n locale: sessionLocale,\r\n sessionTemplateId: state.selectedSessionModelId,\r\n subjectIdentifier: formattedSubjectIdentifier,\r\n subjectType: subjectType,\r\n subjectIdentifierType: state.subjectIdentifierType,\r\n externalSessionIdentifier: null,\r\n initialInfRules: customization.allowMultipleCodes ? initialInfRules : null,\r\n salesOpportunity: state.salesOpportunity\r\n };\r\n if (state.errorMessage)\r\n dispatch({ type: 'fetchError', message: null });\r\n\r\n createSessionEnsureSubjectApi(createSessionData);\r\n }\r\n else if (state.selectedSessionState == \"Ongoing\" || state.selectedSessionState == \"Completed\") {\r\n\r\n if (selectedSession.access == \"Read\" && !state.acceptMessageSuppressed) {\r\n\r\n dispatch({\r\n type: \"setAcceptMessage\",\r\n titleTextCode: \"VisiFinance.UI.Start.ÅterupptaRådgivningSaknarSkrivrättigheter.Title\",\r\n messageTextCode: \"VisiFinance.UI.Start.ÅterupptaRådgivningSaknarSkrivrättigheter.Meddelande\"\r\n });\r\n }\r\n else {\r\n\r\n if (state.selectedSessionState == \"Completed\") {\r\n\r\n resumeSessionApi(state.selectedCompletedSessionId);\r\n }\r\n else if (state.selectedSessionState == \"Ongoing\") {\r\n\r\n resumeSessionApi(state.selectedOngoingSessionId);\r\n }\r\n }\r\n }\r\n\r\n }} isValid={formIsValid}>\r\n \r\n \r\n\r\n dispatch({ type: 'setSubjectIdentifier', value: value, parsedValue: parsedValue })}\r\n selectValues={state.startInfo?.PreviousSubjectIdentifiers}\r\n placeholder={customization.identifierPlaceholder}\r\n />\r\n\r\n 0}>\r\n\r\n {state.startInfo && state.startInfo.SessionModels.length > 0 && !isRoleSupport && (\r\n { if (x) dispatch({ type: \"setSessionState\", state: \"New\" }) }}\r\n />\r\n )}\r\n\r\n {ongoingSessions.length > 0 &&\r\n \r\n { if (x) dispatch({ type: \"setSessionState\", state: \"Ongoing\" }) }} />\r\n \r\n }\r\n\r\n {completeSessions.length > 0 &&\r\n \r\n { if (x) dispatch({ type: \"setSessionState\", state: \"Completed\" }) }} />\r\n \r\n }\r\n\r\n \r\n\r\n {state.selectedSessionState == \"New\" &&\r\n state.startInfo &&\r\n sessionModels?.length > (customization.hideSessionModelSelectWhenSingleChoice ? 1 : 0) &&\r\n !isRoleSupport &&\r\n\r\n dispatch({ type: \"selectSessionModel\", sessionModel: sessionModels.find(y => y.SessionModelId?.toString() == x) })}\r\n />\r\n }\r\n\r\n {state.selectedSessionState == \"Ongoing\" && ongoingSessions.length > 0 &&\r\n dispatch({ type: \"selectOngoingSession\", id: parseInt(x, 10) })}\r\n />\r\n }\r\n\r\n {state.selectedSessionState == \"Completed\" && completeSessions.length > 0 &&\r\n {\r\n dispatch({ type: \"selectCompletedSession\", id: parseInt(x, 10) });\r\n\r\n //if (formattedSubjectIdentifier.startsWith(\"19930101-0105\")) {\r\n // throw \"Test of error boundary during event.\";\r\n //}\r\n }}\r\n />\r\n }\r\n\r\n \r\n dispatch({ type: \"selectSessionModelLanguage\", id: x })}\r\n />\r\n \r\n\r\n = 2 && state.selectedSessionState == \"New\"}>\r\n dispatch({ type: \"selectRådgivarKod\", kod: x })}\r\n />\r\n \r\n \r\n\r\n \r\n\r\n {state.errorMessage && }\r\n \r\n \r\n\r\n {\r\n dispatch({ type: \"clearAcceptMessage\", suppressed: true });\r\n\r\n if (state.selectedSessionState == \"Ongoing\") {\r\n\r\n resumeSessionApi(state.selectedOngoingSessionId);\r\n }\r\n else if (state.selectedSessionState == \"Completed\") {\r\n\r\n resumeSessionApi(state.selectedCompletedSessionId);\r\n }\r\n }}\r\n onCancel={() => dispatch({ type: \"clearAcceptMessage\" })}\r\n onClose={() => dispatch({ type: \"clearAcceptMessage\" })}\r\n />\r\n \r\n
\r\n \r\n {customization.adminMenu && state.startInfo && customization.adminMenu(state.startInfo.Role.Value)}\r\n \r\n
\r\n
;\r\n}\r\n\r\nconst footerButtonTextCode = (selectedSessionState: SessionState) => {\r\n\r\n if (selectedSessionState == \"Ongoing\")\r\n return \"VisiFinance.UI.Start.ÅterupptaRådgivning\";\r\n\r\n if (selectedSessionState == \"Completed\")\r\n return \"VisiFinance.UI.Start.AvslutadRådgivning\";\r\n\r\n return \"VisiFinance.UI.Start.StartaRådgivning\"\r\n};\r\n\r\n\r\n\r\nconst getMatchingSubjectTypes = (intl: IntlContext, customization: StartPageCustomizations, subjectIdentifierParam: string, startInfo: sessionModel.GetStartInfoResponse): [string, identifier.IdentifierParseTypes] => {\r\n\r\n if (!subjectIdentifierParam) {\r\n return [null, null];\r\n }\r\n\r\n const [individualTypes, organizationTypes] = getIdentifierTypesForModels(startInfo?.AllowedSubjectIdentifierTypes);\r\n const idConfig = getIdConfig(intl, customization, individualTypes, organizationTypes)\r\n const builtInResult = identifier.validate(intl, subjectIdentifierParam, idConfig);\r\n\r\n const formattedSubjectIdentifier = builtInResult.parsedValue.matchingTypes?.length == 1 ? tryFormat(intl, subjectIdentifierParam, idConfig) : subjectIdentifierParam;\r\n\r\n return [formattedSubjectIdentifier, builtInResult.parsedValue];\r\n}\r\n\r\n\r\nconst getReturnUrlParam = () => {\r\n const relativeUrl = window.location.pathname + window.location.search + window.location.hash;\r\n const encodedRelativeUrl = encodeURIComponent(relativeUrl);\r\n return encodedRelativeUrl;\r\n}\r\n\r\nfunction getIdentifierLabelTextCode(customization: StartPageCustomizations, individualTypes: IndividualIdentifierTypes[], organizationTypes: OrganizationIdentifierTypes[]) {\r\n\r\n if (customization.identifierTextCode) {\r\n return customization.identifierTextCode;\r\n }\r\n\r\n if (individualTypes.length > 0 && organizationTypes.length > 0)\r\n return \"VisiFinance.UI.Start.PersonEllerOrgNr\";\r\n\r\n if (organizationTypes.length > 0)\r\n return \"VisiFinance.UI.Start.OrgNr\";\r\n\r\n return \"VisiFinance.UI.Start.PersonNr\";\r\n}\r\n\r\n\r\nfunction getSelectedSessionId(state: StartPageState) {\r\n\r\n if (state.selectedSessionState == \"Ongoing\")\r\n return state.selectedOngoingSessionId;\r\n\r\n if (state.selectedSessionState == \"Completed\")\r\n return state.selectedCompletedSessionId;\r\n\r\n return null;\r\n}\r\n\r\nconst getIdConfig = (intl: IntlContext, customization: StartPageCustomizations, individualIdTypes: IndividualIdentifierTypes[], orgIdTypes: OrganizationIdentifierTypes[]): IdentifierConfigurationInfo => {\r\n return {\r\n ...intl.configInfo.identifier,\r\n individualFormat: customization.individualIdentifierFormat ?? intl.configInfo.identifier.individualFormat,\r\n organizationFormat: customization.organizationIdentifierFormat ?? intl.configInfo.identifier.organizationFormat,\r\n individualTypes: individualIdTypes,\r\n organizationTypes: orgIdTypes,\r\n organizationSubTypes: [...intl.configInfo.identifier.organizationSubTypes,\r\n ...customization.additionalAllowedOrganizationTypes]\r\n };\r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\nimport SoPLogo from '~irad-resources/Logos/SoPLogoMask.svg?asset';\r\nimport * as React from 'react';\r\nimport { StartPageCustomizations, StartPageDefaultCustomization } from '~base/Components/Pages/Home/Start';\r\nimport { OrganizationIdentifierSubTypes } from '~base/Internationalization/ConfigurationInfo';\r\nimport { IntlContext } from '~base/Internationalization/IntlContext';\r\nimport * as sessionModel from '~base/Services/API/Session/Model';\r\n\r\nconst customStyling = {\r\n\r\n header: {\r\n padding: \"25px 33px 0px 8px\",\r\n },\r\n}\r\n\r\nexport default {\r\n userInfoCustomization: {\r\n pictureFrame: \r\n },\r\n customStyles: {\r\n ...StartPageDefaultCustomization.customStyles,\r\n ...customStyling\r\n },\r\n allowSelfServiceLanguageSelection: true,\r\n additionalAllowedOrganizationTypes: [\"DödsboSE\", \"UtländsktBolagSE\"] as Array,\r\n formatSessionDisplayName: (intl: IntlContext, session: sessionModel.Session, sessionModelInfo: sessionModel.GetStartInfoSessionModel) => {\r\n const displayValue = intl.formatDateWithTime(session.creationDate)\r\n\r\n if (session.access == 'Read') {\r\n return displayValue + \" *\";\r\n }\r\n return displayValue;\r\n\r\n }\r\n} as StartPageCustomizations;","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as api from \"~base/Services/API\";\r\nimport * as dataGatheringModel from \"~base/Services/API/DataGathering/Model\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Http Contract\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst uri = (operationId: string): string => {\r\n\r\n return `api/DataGathering/v1/Operations/${operationId}`;\r\n\r\n}\r\n\r\nconst method = \"GET\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Types\r\n//-------------------------------------------------------------------------------------\r\n\r\ninterface GetOperationQsParams {\r\n operationId?: string\r\n}\r\n\r\ninterface GetOperationProps extends GetOperationQsParams, api.ApiHookBaseProps {\r\n\r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n// API Hook\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport function useGetOperation(props: GetOperationProps): [boolean, () => Promise] {\r\n\r\n const apiParams: api.ApiHookProps = {\r\n ...props,\r\n uri: uri(props.operationId),\r\n method: method\r\n };\r\n\r\n const [loading, invoker] = api.useApi(apiParams);\r\n return [loading, () => invoker(apiParams.uri, undefined)];\r\n}\r\n","//-------------------------------------------------------------------------------------\r\n// Get Operation\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface GetOperationResponse extends Operation {\r\n\r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Get Operations\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface GetOperationsResponse {\r\n Operations?: Array\r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Shared\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface Operation {\r\n Id: string;\r\n Created: string;\r\n Status: GatheringStatus;\r\n Items?: Array;\r\n SubjectIdentifier?: string;\r\n SubjectIdentifierType?: string;\r\n ContextIdentifier?: string;\r\n ContextIdentifierType?: string;\r\n}\r\n\r\nexport interface Item {\r\n Id: string;\r\n Type?: string;\r\n TypeParameters?: string;\r\n TypeParametersVersion?: string;\r\n Source?: string;\r\n Status: GatheringStatus;\r\n Updated: string;\r\n DeviceIdentifier?: string;\r\n}\r\n\r\nexport enum GatheringStatus {\r\n Pending = \"Pending\",\r\n InProgress = \"InProgress\",\r\n Collected = \"Collected\",\r\n Skipped = \"Skipped\",\r\n Success = \"Success\",\r\n Warning = \"Warning\",\r\n Error = \"Error\"\r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\nimport { ApiStatus } from \"~base/Services/API\";\r\nimport * as dataGatheringModel from \"~base/Services/API/DataGathering/Model\";\r\nimport { GatheringStatus } from \"~base/Services/API/DataGathering/Model\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\n//-------------------------------------------------------------------------------------\r\n// State\r\n//-------------------------------------------------------------------------------------\r\n\r\ntype SetOperationInfo = { type: \"setOperationInfo\", data: dataGatheringModel.GetOperationResponse, status: ApiStatus }\r\n\r\nexport type TinkPageViewAction = SetOperationInfo\r\n\r\nexport interface TinkPageState {\r\n operationInfo?: dataGatheringModel.GetOperationResponse;\r\n loading: boolean;\r\n}\r\n\r\nexport function reducer(state: TinkPageState, action: TinkPageViewAction): TinkPageState {\r\n\r\n switch (action.type) {\r\n case \"setOperationInfo\": {\r\n let operationInfo;\r\n let isLoading;\r\n\r\n // Stop calling API if something went wrong\r\n if (action.status !== \"Success\") {\r\n isLoading = false;\r\n operationInfo = {\r\n Status: GatheringStatus.Error,\r\n Items: [{ Status: GatheringStatus.Error } as dataGatheringModel.Item]\r\n } as dataGatheringModel.GetOperationResponse;\r\n } else {\r\n // Otherwise, check item status and continue calling API if status is Pending\r\n const itemStatus = (action.data?.Items ?? [])[0]?.Status;\r\n isLoading = itemStatus === GatheringStatus.Pending;\r\n operationInfo = { ...action.data };\r\n }\r\n\r\n return {\r\n ...state,\r\n operationInfo: operationInfo,\r\n loading: isLoading\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport const initialState = (): TinkPageState => {\r\n return { loading: true };\r\n};\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\nimport * as React from 'react';\r\nimport { createUseStyles } from 'react-jss';\r\nimport { useSearchParams } from 'react-router-dom';\r\nimport { Icon } from '~base/Components/Elements/Icon';\r\nimport { Ingress } from '~base/Components/Elements/Ingress';\r\nimport { Rubrik } from '~base/Components/Elements/Rubrik';\r\nimport Container from '~base/Components/Layout/Container';\r\nimport SplashPage from '~base/Components/Pages/Shared/SplashPage';\r\nimport { useGetOperation } from '~base/Services/API/DataGathering/GetOperation';\r\nimport { GatheringStatus } from '~base/Services/API/DataGathering/Model';\r\nimport { buildReducerId, useConsilioReducer } from '~base/Utilities/ConsilioReducer';\r\nimport { SoPConsilioTheme } from '~irad/Styling/SoPConsilioTheme';\r\nimport { initialState, reducer } from './Store';\r\nimport classnames from 'classnames';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Styling\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst useStyles = createUseStyles((theme: SoPConsilioTheme) => ({\r\n container: {\r\n width: '100vw',\r\n height: '100vh',\r\n backgroundColor: theme.constants.secondaryBorderColor,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n },\r\n text: {\r\n color: '#66C5EC'\r\n },\r\n title: {\r\n marginTop: '0px',\r\n fontSize: '48px'\r\n },\r\n ingress: {\r\n fontSize: '16px'\r\n },\r\n sopLogo: {\r\n position: 'absolute',\r\n top: '50px',\r\n left: '83px',\r\n width: 'auto',\r\n height: 'unset',\r\n marginBottom: 'unset',\r\n opacity: '0.3'\r\n },\r\n iconSuccess: {\r\n width: '70px',\r\n height: '70px'\r\n },\r\n iconError: {\r\n width: '61px',\r\n height: '61px'\r\n }\r\n}));\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Component\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst TinkPageComponent: React.FunctionComponent = () => {\r\n\r\n const [state, dispatch, _] = useConsilioReducer(buildReducerId(\"TinkPage\"), reducer, initialState());\r\n\r\n // Init hooks\r\n const classes = useStyles();\r\n const [searchParams] = useSearchParams();\r\n\r\n const requestId = searchParams.get(\"requestId\");\r\n\r\n // API hooks\r\n const callGetOperation = (requestId !== null &&\r\n state?.operationInfo?.Status !== GatheringStatus.Error &&\r\n state?.operationInfo?.Status !== GatheringStatus.Success);\r\n\r\n const [loadingGetOperation, ______] = useGetOperation({\r\n operationId: requestId,\r\n call: callGetOperation,\r\n callback: async (status, _, responseData) => {\r\n dispatch({ type: 'setOperationInfo', data: responseData, status: status });\r\n },\r\n });\r\n\r\n // Rendering\r\n const pageLoading = state.loading || loadingGetOperation;\r\n const itemStatus = (state.operationInfo?.Items ?? [])[0]?.Status;\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n {itemStatus === GatheringStatus.Success ?\r\n \r\n \r\n \r\n \r\n :\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n
\r\n
\r\n \r\n );\r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Exports\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport default TinkPageComponent;","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// When arriving from an external login provider when server side cookies are used, we want to make sure\r\n// that there are no old accessTokens left in the browsers local storage. Therefore external logins that's not \r\n// \"sessionless\" will be redirected through this page.\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as React from 'react';\r\nimport { TokenRequestStatus, useAuthToken } from '~base/Services/API/AuthToken';\r\nimport { SplashPage } from '~base/Components/Pages/Shared/SplashPage';\r\nimport { ensureSameSiteUrl } from '~base/Services/NavigateService';\r\nimport { useSettings } from '~base/Settings/SettingsContext';\r\nimport { useSearchParams } from 'react-router-dom';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Props\r\n//-------------------------------------------------------------------------------------\r\n\r\ntype ExternalLoginByCookieCallbackProps = unknown;\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Component\r\n//-------------------------------------------------------------------------------------\r\n\r\n\r\nexport const ExternalLoginByCookieCallbackPage: React.FunctionComponent = (_: ExternalLoginByCookieCallbackProps) => {\r\n\r\n const settings = useSettings();\r\n const [searchParams] = useSearchParams();\r\n const paramReturnUrl = searchParams.get(\"ReturnUrl\") ?? searchParams.get(\"returnUrl\");\r\n const [hasRedirected, setHasRedirected] = React.useState(false);\r\n\r\n const serverVirtualPath = settings.valueAsString(\"serverVirtualPath\");\r\n\r\n useAuthToken(\r\n {\r\n clearToken: true,\r\n callback: (status: TokenRequestStatus) => {\r\n\r\n if (status == \"Cleared\" && !hasRedirected) {\r\n setHasRedirected(true);\r\n const returnUrl = paramReturnUrl ? ensureSameSiteUrl(paramReturnUrl) : serverVirtualPath;\r\n window.location.href = returnUrl;\r\n }\r\n }\r\n });\r\n\r\n return \r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\nimport { IndividualIdentifierTypes, OrganizationIdentifierSubTypes, OrganizationIdentifierTypes } from \"~base/Internationalization/ConfigurationInfo\";\r\nimport { IdentifierParseTypes } from \"~base/Types/Identifier\";\r\nimport * as sessionModel from \"~base/Services/API/Session/Model\";\r\nimport { getSubjectIdentifierConType } from \"~base/Types/IdentifierConverter\";\r\nimport { IntlContext } from \"~base/Internationalization/IntlContext\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\n//-------------------------------------------------------------------------------------\r\n// State\r\n//-------------------------------------------------------------------------------------\r\n\r\ntype SetLoading = { type: \"setLoading\" }\r\ntype SetFetchError = { type: \"fetchError\", message: string }\r\ntype Navigate = { type: \"navigate\", uri: string, replace?: boolean }\r\n\r\nexport type SessionInvitePageViewAction =\r\n SetLoading\r\n | SetFetchError\r\n | Navigate\r\n\r\nexport interface SessionInvitePageState {\r\n\r\n errorMessage?: string\r\n loading: boolean\r\n navigateUri?: string\r\n navigateReplace?: boolean\r\n}\r\n\r\n\r\nexport function reducer(state: SessionInvitePageState, action: SessionInvitePageViewAction): SessionInvitePageState {\r\n\r\n switch (action.type) {\r\n\r\n case \"setLoading\": {\r\n return {\r\n ...state,\r\n errorMessage: null,\r\n loading: true\r\n };\r\n }\r\n case \"fetchError\": {\r\n return {\r\n ...state,\r\n errorMessage: action.message\r\n }\r\n }\r\n case \"navigate\": {\r\n return {\r\n ...state,\r\n errorMessage: null,\r\n loading: action.uri ? true : false,\r\n navigateUri: action.uri,\r\n navigateReplace: action.replace,\r\n }\r\n }\r\n }\r\n}","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as api from \"~base/Services/API\";\r\nimport { ApiHookFuncReturnProps } from \"~base/Services/API\";\r\nimport * as sessionModel from \"~base/Services/API/Steps/Model\";\r\nimport { GuideDataStepSpec, GuideDataViewSpec, MetaSpecModel, ProcessSpecModel } from \"~base/Services/API/Steps/Model\";\r\nimport { DispResBase } from \"~base/Components/Guide/GuideStepTypes\";\r\nimport { RecordedApiCall } from \"~base/Services/MockContext\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Http Contract\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst uri = (extSessionId: string, sessionModelFqn: string, locale: string, subjectIdentifier: string, subjectIdentifierType: string): string => {\r\n\r\n let uri = `Api/SoPInvite/v1/Accept?extSessionId=${encodeURIComponent(extSessionId)}&sessionModelFqn=${encodeURIComponent(sessionModelFqn)}&locale=${encodeURIComponent(locale)}`;\r\n\r\n if (subjectIdentifier) {\r\n uri += `&subjectIdentifier=${encodeURIComponent(subjectIdentifier)}`\r\n }\r\n\r\n if (subjectIdentifierType) {\r\n uri += `&subjectIdentifierType=${encodeURIComponent(subjectIdentifierType)}`\r\n }\r\n\r\n return uri;\r\n}\r\nconst method = \"POST\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Types\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface PostAcceptInviteRequest {\r\n\r\n\r\n}\r\n\r\nexport interface PostAcceptInviteResponse {\r\n sessionId: number\r\n}\r\n\r\nexport interface PostAcceptInviteProps extends api.ApiHookBaseProps {\r\n extSessionId: string\r\n sessionModelFqn: string\r\n locale: string\r\n subjectIdentifier?: string,\r\n subjectIdentifierType?: string\r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n// API Hook\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport interface PostAcceptInviteFuncResponse extends ApiHookFuncReturnProps {\r\n\r\n}\r\n\r\nexport function usePostAcceptInvite(props: PostAcceptInviteProps): [boolean, (data: PostAcceptInviteProps) => Promise] {\r\n\r\n const apiParams: api.ApiHookProps = {\r\n ...props,\r\n uri: uri(props.extSessionId, props.sessionModelFqn, props.locale, props.subjectIdentifier, props.subjectIdentifierType),\r\n method: method\r\n };\r\n\r\n const [loading, invoker] = api.useApi(apiParams);\r\n return [loading, (data: PostAcceptInviteProps) => invoker(uri(props.extSessionId, props.sessionModelFqn, props.locale, props.subjectIdentifier, props.subjectIdentifierType), null)];\r\n}\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n// \r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as React from 'react';\r\nimport Grid from '~base/Components/Layout/Grid';\r\nimport { buildReducerId, useConsilioReducer } from \"~base/Utilities/ConsilioReducer\";\r\nimport classnames from 'classnames';\r\nimport { useAdditionalStyles } from './Styles';\r\nimport { reducer, SessionInvitePageState } from './Store';\r\nimport { useSettings } from '~base/Settings/SettingsContext';\r\nimport Form from '~base/Components/Elements/Form';\r\nimport SplashPage from '~base/Components/Pages/Shared/SplashPage';\r\nimport SplashContent from '~base/Components/Pages/Shared/SplashContent';\r\nimport { Button } from '~base/Components/Elements/Button';\r\nimport { IntlContext, useIntl } from '~base/Internationalization/IntlContext';\r\nimport { getSpacingClasses, useJssSpacingStyles } from '~base/Components/Layout/JssSpacing';\r\nimport { horizontalCenterPadding } from '~base/Components/Elements/TitleContainerStyles';\r\nimport { LabelRadioButton } from '~base/Components/Elements/LabelRadioButton';\r\nimport { TitleSelect } from '~base/Components/Elements/TitleSelect';\r\nimport Expander from '~base/Components/Layout/Expander';\r\nimport Container from '~base/Components/Layout/Container';\r\nimport { useGetSessionStartInfo } from '~base/Services/API/Session/GetStartInfo';\r\nimport TitleIdentifier from '~base/Components/Elements/TitleIdentifier';\r\nimport { IdentifierConfigurationInfo, IndividualIdentifierTypes, OrganizationIdentifierTypes } from '~base/Internationalization/ConfigurationInfo';\r\nimport * as sessionModel from '~base/Services/API/Session/Model';\r\nimport { tryFormat } from '~base/Types/Identifier';\r\nimport { useNavigateService } from '~base/Services/NavigateService';\r\nimport { useCreateSessionEnsureSubject } from '~base/Services/API/Session/CreateSession';\r\nimport { useEffect } from 'react';\r\nimport { getErrorMessage } from '~base/Services/API';\r\nimport { PoweredByConsilio } from '~base/Components/Composite/PoweredByConsilio';\r\nimport UserInfoCard from '~base/Components/Pages/Shared/UserInfoCard';\r\nimport { useGetSessions } from '~base/Services/API/Session/GetSessions';\r\nimport TextBlock from '~base/Components/Elements/TextBlock';\r\nimport { useExtInteractionIdentifier } from '~base/Utilities/ExtIntractionIdentifier';\r\nimport { useSearchParams } from 'react-router-dom';\r\nimport * as identifier from '~base/Types/Identifier';\r\nimport PromptOverlay from '~base/Components/Composite/PromptOverlay';\r\nimport { useResumeSession } from '~base/Services/API/Session/ResumeSession';\r\nimport VersionInfo from '~base/Components/Composite/VersionInfo';\r\nimport { useServerContext } from '~base/Services/ServerContext';\r\nimport { usePostAcceptInvite } from '~irad/Services/API/Invite/PostAcceptInvite';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Props\r\n//-------------------------------------------------------------------------------------\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Component\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport const SessionInvitePage: React.FunctionComponent = (props: unknown) => {\r\n\r\n // Init hooks\r\n\r\n const intl = useIntl();\r\n const settings = useSettings();\r\n\r\n const navigate = useNavigateService();\r\n\r\n const [searchParams] = useSearchParams();\r\n\r\n const extSessionId = searchParams.get(\"extSessionId\");\r\n const sessionModelFqn = searchParams.get(\"sessionModelFqn\");\r\n const locale = searchParams.get(\"locale\");\r\n const subjectIdentifier = searchParams.get(\"subjectIdentifier\");\r\n const subjectIdentifierType = searchParams.get(\"subjectIdentifierType\");\r\n\r\n // Init state\r\n\r\n const [state, dispatch, _] = useConsilioReducer(buildReducerId(\"SessionInvitePage\"), reducer, { loading: true });\r\n\r\n // Variables\r\n\r\n const serverVirtualPath = settings.valueAsString(\"serverVirtualPath\");\r\n\r\n const callApi = !state.errorMessage && !state.navigateUri;\r\n\r\n const [loadingApi, __] = usePostAcceptInvite({\r\n extSessionId: extSessionId,\r\n sessionModelFqn: sessionModelFqn,\r\n locale: locale,\r\n subjectIdentifier: subjectIdentifier,\r\n subjectIdentifierType: subjectIdentifierType,\r\n call: callApi,\r\n callback: async (status, response, responseData) => { \r\n\r\n if (status == \"Success\") {\r\n if (response) {\r\n dispatch({ type: \"navigate\", replace: true, uri: `/Home/Main/${responseData.sessionId}` });\r\n }\r\n }\r\n else {\r\n dispatch({ type: \"fetchError\", message: await getErrorMessage(intl, response) });\r\n }\r\n\r\n }\r\n });\r\n\r\n useEffect(() => {\r\n\r\n if (state.navigateUri) {\r\n navigate.current(state.navigateUri, { replace: state.navigateReplace });\r\n }\r\n\r\n }, [navigate, state.navigateUri, state.navigateReplace]);\r\n\r\n const pageLoading = state.loading || loadingApi || !!state.navigateUri;\r\n\r\n return \r\n
\r\n \r\n \r\n {state.errorMessage && }\r\n \r\n \r\n\r\n
\r\n
\r\n \r\n \r\n
\r\n
;\r\n}\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as React from \"react\";\r\nimport { Route, useLocation, useMatch } from \"react-router-dom\";\r\nimport { ConsilioTransitionGroup } from \"~base/Styling/Transitions/ConsilioTransitionGroup\";\r\nimport { useTransitionStyles } from \"~base/Styling/Transitions/TransitionGroup\";\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Props\r\n//-------------------------------------------------------------------------------------\r\n\r\ninterface PageRouteProps {\r\n path: string\r\n children?: React.ReactNode\r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Component\r\n//-------------------------------------------------------------------------------------\r\n\r\n\r\nexport const PageRoute: React.FunctionComponent = (props): React.ReactNode => {\r\n\r\n const { children, path, ...otherProps } = props;\r\n\r\n const location = useLocation();\r\n const routeMatch = useMatch(window.location.pathname);\r\n const match = routeMatch != null && `/${path}`.startsWith(routeMatch.pathname);\r\n\r\n const [transitionClasses, timeout] = useTransitionStyles(\"FadeInFast\", false);\r\n\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n};\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Types\r\n//-------------------------------------------------------------------------------------\r\n\r\n\r\nexport interface PageRouteInfo {\r\n path: string\r\n component: React.ReactNode\r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Methods\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport const createPageRoute = (x: PageRouteInfo): React.ReactNode => {\r\n return (\r\n \r\n {x.component}\r\n \r\n }\r\n />\r\n );\r\n}\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as React from \"react\";\r\nimport { ProtectedRoute } from \"~base/Components/Pages/Shared/ProtectedRoute\";\r\nimport { LoginPage } from \"~base/Components/Pages/Account/Login\";\r\nimport { ExternalLoginPage } from \"~base/Components/Pages/Account/ExternalLogin\";\r\nimport { LogoutPage } from \"~base/Components/Pages/Account/Logout\";\r\nimport { AccessDeniedPage } from \"~base/Components/Pages/Account/AccessDenied\";\r\nimport { NotFoundPage } from \"~base/Components/Pages/Home/NotFound\";\r\nimport { BrowserRouter, Route, Routes } from \"react-router-dom\";\r\n\r\nimport LoginPageCustomization from '~irad/Components/Pages/Account/Login';\r\nimport RegisterPageCustomization from '~irad/Components/Pages/Account/Register';\r\nimport StartPageCustomization from '~irad/Components/Pages/Home/Start';\r\nimport { StartPage } from \"~base/Components/Pages/Home/Start\";\r\nimport { RegisterPage } from \"~base/Components/Pages/Account/Register\";\r\nimport TinkPage from \"./Components/Pages/Tink\";\r\nimport { ExternalLoginByCookieCallbackPage } from \"~base/Components/Pages/Account/ExternalLoginByCookieCallback\";\r\nimport { SessionInvitePage } from \"./Components/Pages/Home/SessionInvite\";\r\nimport { PageRouteInfo, createPageRoute } from '~base/Components/Pages/Shared/PageRoute';\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Props\r\n//-------------------------------------------------------------------------------------\r\n\r\ntype MainRouterProps = {\r\n children?: JSX.Element\r\n};\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Routes\r\n//-------------------------------------------------------------------------------------\r\n\r\n\r\nconst account: PageRouteInfo[] = [\r\n { path: \"Account/Login/*\", component: },\r\n { path: \"Account/ExternalLoginCallback/*\", component: },\r\n { path: \"Account/Logout/*\", component: },\r\n { path: \"Account/Register/*\", component: },\r\n { path: \"Account/AccessDenied/*\", component: },\r\n { path: \"Account/ExternalLoginByCookieCallback/*\", component: },\r\n];\r\n\r\nconst home: PageRouteInfo[] = [\r\n { path: \"Home/Start/*\", component: },\r\n { path: \"Home/SessionInviteAdvisor/*\", component: },\r\n { path: \"Home/SessionInvite/*\", component: },\r\n { path: \"/\", component: },\r\n { path: \"/*\", component: }\r\n];\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Component\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst MainRouter: React.FunctionComponent = (props: MainRouterProps) => {\r\n\r\n const customer: PageRouteInfo[] = [\r\n { path: \"DataGathering/Tink\", component: }\r\n ];\r\n\r\n return (\r\n \r\n \r\n {account.map(x => createPageRoute(x))}\r\n {customer.map(x => createPageRoute(x))}\r\n {home.map(x => createPageRoute(x))}\r\n \r\n \r\n );\r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Exports\r\n//-------------------------------------------------------------------------------------\r\n\r\nexport default MainRouter;\r\n\r\n","//==========================================================================================================\r\n// Copyright (C) Nore Technology AB. All Rights Reserved.\r\n//==========================================================================================================\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Imports\r\n//-------------------------------------------------------------------------------------\r\n\r\nimport * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\nimport * as fonts from '~irad/Styling/SoPFonts';\r\nimport { getServiceContext } from '~base/Services/ConsilioServiceContext';\r\nimport { getSettingsContext } from '~base/Settings/ConsilioSettingsContext';\r\nimport { getSoPIntlContext } from '~irad/Internationalization/SoPIntlContext';\r\nimport { getSoPValidationContext } from '~irad/Validation/SoPValidationContext';\r\nimport { getSoPNormalizerContext } from '~irad/Validation/SoPNormalizerContext';\r\nimport { guideServiceMock } from '~base/Services/Guide/IGuideService';\r\nimport { ContextWrapper } from '~base/ContextWrapper';\r\nimport SoPTheme from '~irad/Styling/SoPConsilioTheme';\r\nimport { defaultConfig } from '~base/Internationalization/ConfigurationInfo';\r\nimport MainRouter from './MainRoutes';\r\nimport * as textCodeService from '~base/Services/TextCodeService';\r\nimport { ErrorBoundary } from '~base/Components/Pages/Shared/ErrorBoundary';\r\nimport { createRoot } from 'react-dom/client';\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// Setup dependencies\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\n\r\ntextCodeService.initialize(\r\n [\"sv-SE\"],\r\n [\r\n \"VisiFinance.*\",\r\n \"SoP.*\",\r\n ]\r\n);\r\nfonts.attachCss();\r\n\r\ntype MainProps = {\r\n children?: JSX.Element\r\n};\r\n\r\n//-------------------------------------------------------------------------------------\r\n// Component\r\n//-------------------------------------------------------------------------------------\r\n\r\nconst MainContainer: React.FunctionComponent = (props: MainProps) => {\r\n\r\n return \r\n \r\n \r\n \r\n \r\n ;\r\n}\r\n\r\nconst root = document.getElementById(\"react-main-root\");\r\nconst reactRoot = createRoot(root);\r\nreactRoot.render();"],"names":["guideServiceMock","root","stepData","readOnlyFromStep","id","value","filter","dispatch","i","uiPart","Form","onSubmit","children","className","isValid","formRef","React.useRef","onFormSubmit","e","_a","_b","submitButton","jsx","x","useStyles","createUseStyles","theme","applyThemeStyles","user","backgroundImageFromFunc","backgroundImage","SplashPage","isLoading","showSplashScreen","splashScreen","useTheme","useGlobalStyles","useAdaptiveViewport","fadeClasses","timeout","useTransitionStyles","userContext","useServerContext","textCodesLoaded","textCodesAreStored","pageIsLoading","classes","animationDivStyles","jsxs","Fragment","CenterContent","ConsilioSingleTransition","PageLoading","reducer","state","action","customStyles","SplashContent","header","footer","closeRouteUri","close","constWidth","classnames","RouteLink","Icon","uri","tenantName","method","useGetLoginInfo","props","apiParams","loading","invoker","api.useApi","params","ExternalLoginProvider","name","customizations","useAdditionalStyles","separator","target","control","displayName","Button","LoginPage","intl","useIntl","navigate","useNavigateService","searchParams","useSearchParams","settings","useSettings","serverVirtualPath","usernameFromQs","forms","sessionless","paramReturnUrl","_","useConsilioReducer","buildReducerId","callLoginInfo","loadingProviders","___","status","response","responseData","getErrorMessage","tokenLoading","token","apiTokenState","serverSessionState","useAuthToken","mode","log","redirectUrl","tokenLoadedRedirectUrl","errorMessage","useEffect","returnUrl","completedLoadingAuthentication","refreshedAuthentication","referrer","qsIndex","referrerQs","showPasswordReset","jssSpacingStyles","useJssSpacingStyles","elementBottomSpacingClasses","getSpacingClasses","formVerticalSpacingClasses","horizontalCenterPadding","isNotLoading","headerContent","Logo","Rubrik","isFormValid","detectedTenant","resetUrl","showLoginForm","showExternalLogin","showBothExternalAndInternalLogin","IconButton","Grid","TitleText","TitlePassword","TextBlock","PoweredByConsilio","hasServerSession","isSuccessfull","tenantPart","ExternalLoginPage","__","____","ensureSameSiteUrl","LogoutPage","redirected","setRedirected","React.useState","setUser","loadUserFailed","setLoadUserFailed","serverContext","tenantFromUser","_c","logoutPathEnd","tenantFromPath","paramBroadcast","tenantFromQuery","tenantNameContainsEncodedData","callGetUser","loadUserApi","useGetUser","loadUserRef","React.useEffect","search","logoutFromOtherTab","triggerLogoutBroadcast","redirectDelay","defaultStyling","getSize","AccessDeniedPageDefaultCustomization","customization","UserInfoCard","editLink","role","customizedPictureFrame","pictureFrame","LegacyIcon","AccessDeniedPage","hideLogout","extLogoutUrl","logoutUrl","logoutButtonTextCode","roleTextCode","resolveRoleName","redirectToLogin","footerContent","isSessionlessFeature","isSessionlessFeatureUrl","roleSpecificMessage","url","NotFoundPageDefaultCustomization","_d","NotFoundPage","LoginPageCustomization","koder","uuid","newState","newRådgivarKoder","kodToChange","kodToAdd","potentialNewKod","validateRådgivarkod","rådgivarKod","filterFunc","languages","RegisterPageDefaultCustomization","useGetAccountRegister","usePostAccountRegister","data","RegisterPage","defaultLanguage","callGetRegisterInfo","loadingGetRegisterRegisterApi","loadingPostRegisterInfo","invokePostRegisterApi","regCulture","loadAsExternal","showLanguageSelection","localesFromLanguages","localeSelectValues","uiSelectCultures","radgivarkodReadOnly","pageLoading","formLoading","formIsValid","phone.validate","email.validate","c","code","React.Fragment","RadioButton","TitleIconButton","TitlePhone","TitleEmail","TitleSelect","LabelCheckbox","invokeSaveAction","SoPLogo","customStyling","RegisterPageCustomization","SessionCookieLink","roles","userAccessViaProperty","userService","y","ActionLink","addSessionAndRedirect","accessToken","actualUri","StartPageDefaultCustomization","s","session","sessionModelInfo","displayValue","getSubjectType","conIdentifier","getSubjectIdentifierConType","subjectType","getIdentifierTypesForModels","allowedSubjectIdentifierTypes","individualTypes","orgTypes","getSessionModelForSubjectTypes","matchingSubjectTypes","sessionModels","filteredModels","sessionModel","j","sessionModelSubjectIdentifier","supportedIdType","getExpectedSubjectType","sm","sortSessionItemsDescending","context","subjectId","subjectIdentifierType","availableRådgivarKoder","selectedRådgivarKod","matchingSubTypes","subjectIdType","_e","sessionModelLanguage","_h","_j","_i","_k","_l","salesOpportunity","useGetSessionStartInfo","subjectIdentifier","ensureSubject","apiAdapter","getSubjectsResponse","api.invokeApi","getSubjectByIdentifier.uri","getSubjectByIdentifier.method","matchingSubject","createdSubjectResponse","createSubject.uri","createSubject.method","useCreateSessionEnsureSubject","call","callback","apiContext","useService","setLoading","useState","mounted","useRef","postSessions","useCallback","calledExternally","extData","errorResponse","createSessionEnsureSubject","ensureSubjectError","createSessionRequest","sessionTemplateFqn","orderBy","orderDir","offset","limit","useGetSessions","useExtInteractionIdentifier","expiery","secure","Component","open","portalContainer","onClose","onCancel","onSave","title","titleTextCode","bodyTextCode","bodyTextCodeL","bodyTextString","showSave","showClose","saveButtonEnabled","saveButtonTextCode","closeButtonTextCode","style","useOverlayStyles","key","actualTitle","actualBodyText","actualBodyTextFromL","fqn","closeWrapper","cancelWrapper","saveWrapper","Overlay","sessionId","useResumeSession","VersionInfo","version","setVersion","onScroll","containerProps","displayVersionInfo","useDiscoveryGetAPIs","StartPage","userLanguage","reducerContext","contextWrappedReducer","allowEditProfile","isRoleSupport","selectedSessionModel","organizationTypes","_f","idConfig","getIdConfig","formattedSubjectIdentifier","_g","tryFormat","sessionModelSelectOptions","selectedSessionModelHasMultipleLanguages","selectedSessionModelLanguages","subjectIdentifierFqn","userSessions","completeSessions","ongoingSessions","selectedSessionId","getSelectedSessionId","selectedSession","salesOpportunityFromQuery","callStartInfo","calLoadSessions","loadingStartInfo","encodedRelativeUrl","getReturnUrlParam","subjectIdentifierParam","subjectIdentifierTypesFromQs","getMatchingSubjectTypes","loadingGetSessions","resDataFiltered","loadingCreateSession","createSessionEnsureSubjectApi","sessionGuideUrl","loadinResumeSession","resumeSessionApi","extInteractionParam","extSessionIdParam","loadSessionWithId","portalRoot","loadingRedirectToSession","loadingTenantTextCodes","identifierLabelTextCode","getIdentifierLabelTextCode","identifierReadOnly","preferredUiCulture","_m","enableLanguageSelect","displayLanguageSelectOption","_o","_n","sessionLocale","identifier.validate","footerButtonTextCode","initialInfRules","createSessionData","TitleIdentifier","parsedValue","_p","Expander","LabelRadioButton","Container","_q","_r","PromptOverlay","selectedSessionState","startInfo","builtInResult","relativeUrl","individualIdTypes","orgIdTypes","StartPageCustomization","operationId","useGetOperation","GatheringStatus","operationInfo","initialState","TinkPageComponent","requestId","callGetOperation","loadingGetOperation","______","itemStatus","Ingress","ExternalLoginByCookieCallbackPage","hasRedirected","setHasRedirected","extSessionId","sessionModelFqn","locale","usePostAcceptInvite","SessionInvitePage","callApi","loadingApi","PageRoute","path","otherProps","location","useLocation","routeMatch","useMatch","transitionClasses","ConsilioTransitionGroup","createPageRoute","Route","account","ProtectedRoute","home","MainRouter","customer","TinkPage","BrowserRouter","Routes","textCodeService.initialize","fonts.attachCss","MainContainer","ContextWrapper","SoPTheme","getServiceContext","getSettingsContext","textCodeService.textCodes","getSoPIntlContext","defaultConfig","getSoPValidationContext","getSoPNormalizerContext","ErrorBoundary","reactRoot","createRoot"],"mappings":"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"}